Import Cobalt 2.10571 2016-09-08
diff --git a/src/base/sys_info_starboard.cc b/src/base/sys_info_starboard.cc
index 30b5f75..552a8ce 100644
--- a/src/base/sys_info_starboard.cc
+++ b/src/base/sys_info_starboard.cc
@@ -37,7 +37,7 @@
// static
int64 SysInfo::AmountOfPhysicalMemory() {
- return SbSystemGetTotalMemory();
+ return SbSystemGetTotalCPUMemory();
}
} // namespace base
diff --git a/src/cobalt/bindings/testing/dom_string_bindings_test.cc b/src/cobalt/bindings/testing/dom_string_bindings_test.cc
index 06a9595..4e99c1c 100644
--- a/src/cobalt/bindings/testing/dom_string_bindings_test.cc
+++ b/src/cobalt/bindings/testing/dom_string_bindings_test.cc
@@ -45,6 +45,22 @@
EXPECT_STREQ("mock_value", result.c_str());
}
+TEST_F(DOMStringBindingsTest, SetPropertyWithJapanese) {
+ EXPECT_CALL(test_mock(), set_property(std::string("かわいいです")));
+
+ std::string result;
+ EXPECT_TRUE(EvaluateScript("test.property = \"かわいいです\";", &result));
+ EXPECT_STREQ("かわいいです", result.c_str());
+}
+
+TEST_F(DOMStringBindingsTest, SetPropertyWithChinese) {
+ EXPECT_CALL(test_mock(), set_property(std::string("的")));
+
+ std::string result;
+ EXPECT_TRUE(EvaluateScript("test.property = \"\xe7\x9a\x84\";", &result));
+ EXPECT_STREQ("的", result.c_str());
+}
+
TEST_F(DOMStringBindingsTest, GetReadOnlyProperty) {
EXPECT_CALL(test_mock(), read_only_property()).WillOnce(Return("mock_value"));
@@ -53,6 +69,14 @@
EXPECT_STREQ("mock_value", result.c_str());
}
+TEST_F(DOMStringBindingsTest, GetReadOnlyPropertyWithKorean) {
+ EXPECT_CALL(test_mock(), read_only_property()).WillOnce(Return("대박"));
+
+ std::string result;
+ EXPECT_TRUE(EvaluateScript("test.readOnlyProperty;", &result));
+ EXPECT_STREQ("대박", result.c_str());
+}
+
TEST_F(DOMStringBindingsTest, SetReadOnlyProperty) {
// Script executes with no error, but interface is not called.
EXPECT_TRUE(EvaluateScript("test.readOnlyProperty = \"foo\";", NULL));
diff --git a/src/cobalt/bindings/testing/object_type_bindings_test.cc b/src/cobalt/bindings/testing/object_type_bindings_test.cc
index 3747719..7c5cbf0 100644
--- a/src/cobalt/bindings/testing/object_type_bindings_test.cc
+++ b/src/cobalt/bindings/testing/object_type_bindings_test.cc
@@ -257,6 +257,12 @@
EXPECT_THAT(result.c_str(), StartsWith("TypeError:"));
}
+TEST_F(UserObjectBindingsTest, SetUndefinedObject) {
+ std::string result;
+ EXPECT_FALSE(EvaluateScript("test.arbitraryObject = undefined;", &result));
+ EXPECT_THAT(result.c_str(), StartsWith("TypeError:"));
+}
+
TEST_F(UserObjectBindingsTest, SetWrongObjectType) {
std::string result;
EXPECT_FALSE(EvaluateScript("test.arbitraryObject = new Object()", &result));
diff --git a/src/cobalt/bindings/testing/stack_trace_test.cc b/src/cobalt/bindings/testing/stack_trace_test.cc
index 34c4629..b8c1304 100644
--- a/src/cobalt/bindings/testing/stack_trace_test.cc
+++ b/src/cobalt/bindings/testing/stack_trace_test.cc
@@ -66,6 +66,22 @@
EXPECT_TRUE(position != std::string::npos);
}
+TEST_F(StackTraceTest, UnnamedFunction) {
+ std::string result;
+
+ // There should be a stack entry for the anonymous function.
+ std::string script =
+ "function foo(fun) {\n"
+ " return fun();\n"
+ "}\n"
+ "foo(function() { return getStackTrace();})";
+ EXPECT_TRUE(EvaluateScript(script, &result));
+
+ std::string match_line = "[object BindingsTestBase]:4";
+ size_t position = result.find(match_line);
+ EXPECT_TRUE(position != std::string::npos);
+}
+
#if defined(ENGINE_SUPPORTS_STACK_TRACE_COLUMNS)
// Test for column numbers in stack trace. Behavior varies somewhat
// across engines & versions so, don't check actual column values.
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 4327e96..ff3ddef 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -53,9 +53,6 @@
namespace browser {
namespace {
-const int kDefaultViewportWidth = 1920;
-const int kDefaultViewportHeight = 1080;
-
const int kStatUpdatePeriodMs = 1000;
const char kDefaultURL[] = "https://www.youtube.com/tv";
@@ -318,8 +315,6 @@
// The main web module's stat tracker tracks event stats.
options.web_module_options.track_event_stats = true;
- math::Size viewport_size(kDefaultViewportWidth, kDefaultViewportHeight);
-
#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
if (command_line->HasSwitch(browser::switches::kProxy)) {
options.network_module_options.custom_proxy =
@@ -352,6 +347,10 @@
EnableUsingStubImageDecoderIfRequired();
+ if (command_line->HasSwitch(browser::switches::kDisableWebmVp9)) {
+ DLOG(INFO) << "Webm/Vp9 disabled";
+ options.media_module_options.disable_webm_vp9 = true;
+ }
if (command_line->HasSwitch(switches::kAudioDecoderStub)) {
DLOG(INFO) << "Use ShellRawAudioDecoderStub";
options.media_module_options.use_audio_decoder_stub = true;
@@ -366,40 +365,34 @@
}
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+ base::optional<math::Size> viewport_size;
if (command_line->HasSwitch(browser::switches::kViewport)) {
const std::string switchValue =
command_line->GetSwitchValueASCII(browser::switches::kViewport);
std::vector<std::string> lengths;
base::SplitString(switchValue, 'x', &lengths);
if (lengths.size() >= 1) {
- int width;
- if (!base::StringToInt(lengths[0], &width) || width < 1) {
- DLOG(ERROR) << "Invalid value specified for viewport width: "
- << switchValue
- << ". Using default viewport: " << viewport_size.width()
- << "x" << viewport_size.height();
- } else {
- viewport_size.set_width(width);
- if (lengths.size() >= 2) {
- int height;
- if (!base::StringToInt(lengths[1], &height) || height < 1) {
- DLOG(ERROR) << "Invalid value specified for viewport height: "
- << switchValue << ". Using default viewport height: "
- << viewport_size.width() << "x"
- << viewport_size.height();
- } else {
- viewport_size.set_height(height);
- }
- } else {
+ int width = -1;
+ if (base::StringToInt(lengths[0], &width) && width >= 1) {
+ int height = -1;
+ if (lengths.size() < 2) {
// Allow shorthand specification of the viewport by only giving the
// width. This calculates the height at 4:3 aspect ratio for smaller
// viewport widths, and 16:9 for viewports 1280 pixels wide or larger.
- if (viewport_size.width() >= 1280) {
- viewport_size.set_height(9 * viewport_size.width() / 16);
+ if (width >= 1280) {
+ viewport_size.emplace(width, 9 * width / 16);
} else {
- viewport_size.set_height(3 * viewport_size.width() / 4);
+ viewport_size.emplace(width, 3 * width / 4);
}
+ } else if (base::StringToInt(lengths[1], &height) && height >= 1) {
+ viewport_size.emplace(width, height);
+ } else {
+ DLOG(ERROR) << "Invalid value specified for viewport height: "
+ << switchValue << ". Using default viewport size.";
}
+ } else {
+ DLOG(ERROR) << "Invalid value specified for viewport width: "
+ << switchValue << ". Using default viewport size.";
}
}
}
@@ -558,9 +551,9 @@
Application::CValStats::CValStats()
: free_memory("Memory.CPU.Free", 0,
"Total free application memory remaining."),
-#if !defined(__LB_SHELL__FOR_RELEASE__)
used_memory("Memory.CPU.Used", 0,
"Total memory allocated via the app's allocators."),
+#if !defined(__LB_SHELL__FOR_RELEASE__)
exe_memory("Memory.CPU.Exe", 0,
"Total memory occupied by the size of the executable."),
#endif
@@ -634,9 +627,14 @@
if (!memory_stats_updated) {
available_memory_ = lb_get_unallocated_memory();
c_val_stats_.free_memory = static_cast<size_t>(available_memory_);
+ c_val_stats_.used_memory =
+ lb_get_total_system_memory() - lb_get_unallocated_memory();
}
#elif defined(OS_STARBOARD)
-// TODO: Need to expose memory tracking through starboard.
+ int64_t used_memory = SbSystemGetUsedCPUMemory();
+ available_memory_ = SbSystemGetTotalCPUMemory() - used_memory;
+ c_val_stats_.free_memory = available_memory_;
+ c_val_stats_.used_memory = used_memory;
#endif
lifetime_in_ms_ = (base::TimeTicks::Now() - start_time_).InMilliseconds();
diff --git a/src/cobalt/browser/application.h b/src/cobalt/browser/application.h
index 4ed944a..870e87f 100644
--- a/src/cobalt/browser/application.h
+++ b/src/cobalt/browser/application.h
@@ -128,8 +128,8 @@
CValStats();
base::CVal<size_t, base::CValPublic> free_memory;
-#if !defined(__LB_SHELL__FOR_RELEASE__)
base::CVal<size_t, base::CValPublic> used_memory;
+#if !defined(__LB_SHELL__FOR_RELEASE__)
base::CVal<size_t, base::CValPublic> exe_memory;
#endif
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 668f3c7..9dfbf01 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -174,7 +174,7 @@
debug_console_.reset(new DebugConsole(
base::Bind(&BrowserModule::OnDebugConsoleRenderTreeProduced,
base::Unretained(this)),
- media_module_.get(), &network_module_, system_window->window_size(),
+ media_module_.get(), &network_module_, system_window->GetWindowSize(),
renderer_module_.pipeline()->GetResourceProvider(),
kLayoutMaxRefreshFrequencyInHz,
base::Bind(&BrowserModule::GetDebugServer, base::Unretained(this))));
@@ -285,6 +285,14 @@
void BrowserModule::OnRenderTreeProduced(
const browser::WebModule::LayoutResults& layout_results) {
TRACE_EVENT0("cobalt::browser", "BrowserModule::OnRenderTreeProduced()");
+ if (MessageLoop::current() != self_message_loop_) {
+ self_message_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&BrowserModule::OnRenderTreeProduced, weak_this_,
+ layout_results));
+ return;
+ }
+
renderer::Submission renderer_submission(layout_results.render_tree,
layout_results.layout_time);
#if defined(OS_STARBOARD)
@@ -323,6 +331,14 @@
const browser::WebModule::LayoutResults& layout_results) {
TRACE_EVENT0("cobalt::browser",
"BrowserModule::OnDebugConsoleRenderTreeProduced()");
+ if (MessageLoop::current() != self_message_loop_) {
+ self_message_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&BrowserModule::OnDebugConsoleRenderTreeProduced, weak_this_,
+ layout_results));
+ return;
+ }
+
render_tree_combiner_.UpdateDebugConsoleRenderTree(renderer::Submission(
layout_results.render_tree, layout_results.layout_time));
}
diff --git a/src/cobalt/browser/debug_console/debug_console.css b/src/cobalt/browser/debug_console/debug_console.css
index 41d695a..afac884 100644
--- a/src/cobalt/browser/debug_console/debug_console.css
+++ b/src/cobalt/browser/debug_console/debug_console.css
@@ -1,3 +1,7 @@
+body {
+ font-size: 1.4815vh; /* Corresponds to 16px at 1080p. */
+}
+
#hudFrame {
position: absolute;
top: 85%;
@@ -10,16 +14,16 @@
#hud {
position: absolute;
- top: 10px;
- left: 10px;
- bottom: 10px;
- right: 10px;
+ top: 0.625em;
+ left: 0.625em;
+ bottom: 0.625em;
+ right: 0.625em;
background-color: rgba(0, 0, 0, 0.6);
color: #FFFFFF;
- border: 1px;
+ border: 0.0625em;
border-color: #606060;
border-style: solid;
- padding: 10px;
+ padding: 0.625em;
}
#consoleFrame {
@@ -35,37 +39,37 @@
#messageContainerFrame {
position: absolute;
- top: 10px;
- left: 10px;
- bottom: 40px;
- right: 10px;
+ top: 0.625em;
+ left: 0.625em;
+ bottom: 2.5em;
+ right: 0.625em;
background-color: rgba(0, 0, 0, 0.6);
color: #FFFFFF;
overflow: hidden;
- border: 1px;
+ border: 0.0625em;
border-color: #606060;
border-style: solid;
- padding: 10px;
+ padding: 0.625em;
}
#messageContainer {
position: absolute;
- bottom: 10px;
+ bottom: 0.625em;
font-family: monospace;
}
#in {
position: absolute;
- left: 10px;
+ left: 0.625em;
bottom: 0;
- right: 10px;
- height: 20px;
+ right: 0.625em;
+ height: 1.25em;
background-color: rgba(0, 0, 0, 0.6);
color: #FFFFFF;
white-space: pre;
font-family: monospace;
- border: 1px;
+ border: 0.0625em;
border-color: #606060;
border-style: solid;
- padding: 10px;
+ padding: 0.625em;
}
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index d9d0abf..7ebcce6 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -36,6 +36,9 @@
// Switches different debug console modes: on | hud | off
const char kDebugConsoleMode[] = "debug_console";
+// Disable webm/vp9.
+const char kDisableWebmVp9[] = "disable_webm_vp9";
+
// Create WebDriver server.
const char kEnableWebDriver[] = "enable_webdriver";
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 75dc57d..025841b 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -26,6 +26,7 @@
extern const char kAudioDecoderStub[];
extern const char kCspMode[];
extern const char kDebugConsoleMode[];
+extern const char kDisableWebmVp9[];
extern const char kEnableWebDriver[];
extern const char kExtraWebFileDir[];
extern const char kIgnoreCertificateErrors[];
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 307b437..073f8b7 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -84,6 +84,10 @@
const base::SourceLocation& script_location,
base::WaitableEvent* got_result, std::string* result);
+ // Clears disables timer related objects
+ // so that the message loop can easily exit
+ void ClearAllIntervalsAndTimeouts();
+
#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
void OnPartialLayoutConsoleCommandReceived(const std::string& message);
#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
@@ -288,8 +292,9 @@
data.window_dimensions.width(), data.window_dimensions.height(),
css_parser_.get(), dom_parser_.get(), fetcher_factory_.get(),
data.resource_provider, image_cache_.get(), remote_typeface_cache_.get(),
- local_storage_database_.get(), data.media_module, execution_state_.get(),
- script_runner_.get(), media_source_registry_.get(),
+ local_storage_database_.get(), data.media_module, data.media_module,
+ execution_state_.get(), script_runner_.get(),
+ media_source_registry_.get(),
web_module_stat_tracker_->dom_stat_tracker(), data.initial_url,
data.network_module->GetUserAgent(),
data.network_module->preferred_language(),
@@ -415,6 +420,12 @@
got_result->Signal();
}
+void WebModule::Impl::ClearAllIntervalsAndTimeouts() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(window_);
+ window_->DestroyTimers();
+}
+
void WebModule::Impl::OnRenderTreeProduced(
const LayoutResults& layout_results) {
// Notify the stat tracker that a render tree has been produced. This signals
@@ -608,6 +619,9 @@
base::Unretained(&did_register_shutdown_observer)));
did_register_shutdown_observer.Wait();
+ // This will cancel the timers for tasks, which help the thread exit
+ ClearAllIntervalsAndTimeouts();
+
// Stop the thread. This will cause the destruction observer to be notified.
thread_.Stop();
}
@@ -645,6 +659,18 @@
return result;
}
+void WebModule::ClearAllIntervalsAndTimeouts() {
+ TRACE_EVENT0("cobalt::browser", "WebModule::ClearAllIntervalsAndTimeouts()");
+ DCHECK(message_loop());
+ DCHECK(impl_);
+
+ if (impl_) {
+ message_loop()->PostTask(
+ FROM_HERE, base::Bind(&WebModule::Impl::ClearAllIntervalsAndTimeouts,
+ base::Unretained(impl_.get())));
+ }
+}
+
#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
void WebModule::OnPartialLayoutConsoleCommandReceived(
const std::string& message) {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 826df99..3aeb2e2 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -225,6 +225,8 @@
// perform any other initialization required on the dedicated thread.
void Initialize(const ConstructionData& data);
+ void ClearAllIntervalsAndTimeouts();
+
#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
void OnPartialLayoutConsoleCommandReceived(const std::string& message);
#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
diff --git a/src/cobalt/build/all.gyp b/src/cobalt/build/all.gyp
index b822bbc..8352629 100644
--- a/src/cobalt/build/all.gyp
+++ b/src/cobalt/build/all.gyp
@@ -87,43 +87,7 @@
'target_name': 'in_progress_targets',
'type': 'none',
'dependencies': [
- '<(DEPTH)/base/base.gyp:base_unittests',
- '<(DEPTH)/cobalt/audio/audio.gyp:*',
- '<(DEPTH)/cobalt/base/base.gyp:*',
- '<(DEPTH)/cobalt/bindings/testing/testing.gyp:*',
- '<(DEPTH)/cobalt/browser/browser.gyp:*',
- '<(DEPTH)/cobalt/browser/cobalt.gyp:*',
- '<(DEPTH)/cobalt/csp/csp.gyp:*',
- '<(DEPTH)/cobalt/css_parser/css_parser.gyp:*',
- '<(DEPTH)/cobalt/cssom/cssom.gyp:*',
- '<(DEPTH)/cobalt/cssom/cssom_test.gyp:*',
- '<(DEPTH)/cobalt/debug/debug.gyp:*',
- '<(DEPTH)/cobalt/dom/dom.gyp:*',
- '<(DEPTH)/cobalt/dom/dom_test.gyp:*',
- '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:*',
- '<(DEPTH)/cobalt/h5vcc/h5vcc.gyp:*',
- '<(DEPTH)/cobalt/input/input.gyp:*',
- '<(DEPTH)/cobalt/layout/layout.gyp:*',
- '<(DEPTH)/cobalt/layout_tests/layout_tests.gyp:*',
- '<(DEPTH)/cobalt/loader/image/sandbox/sandbox.gyp:*',
- '<(DEPTH)/cobalt/loader/loader.gyp:*',
- '<(DEPTH)/cobalt/math/math.gyp:*',
- '<(DEPTH)/cobalt/media/sandbox/sandbox.gyp:*',
- '<(DEPTH)/cobalt/network/network.gyp:*',
- '<(DEPTH)/cobalt/render_tree/render_tree.gyp:*',
- '<(DEPTH)/cobalt/renderer/renderer.gyp:*',
- '<(DEPTH)/cobalt/renderer/sandbox/sandbox.gyp:*',
- '<(DEPTH)/cobalt/samples/samples.gyp:*',
- '<(DEPTH)/cobalt/script/script.gyp:*',
- '<(DEPTH)/cobalt/speech/speech.gyp:*',
- '<(DEPTH)/cobalt/storage/storage.gyp:*',
- '<(DEPTH)/cobalt/trace_event/trace_event.gyp:*',
- '<(DEPTH)/cobalt/web_animations/web_animations.gyp:*',
- '<(DEPTH)/cobalt/webdriver/webdriver.gyp:*',
- '<(DEPTH)/cobalt/xhr/xhr.gyp:*',
- '<(DEPTH)/crypto/crypto.gyp:crypto_unittests',
- '<(DEPTH)/sql/sql.gyp:sql_unittests',
- '<(DEPTH)/starboard/nplb/nplb.gyp:nplb',
+ '<(DEPTH)/cobalt/browser/cobalt.gyp:cobalt',
],
},
],
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index d57c218..2eed42f 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-10373
\ No newline at end of file
+10571
\ No newline at end of file
diff --git a/src/cobalt/css_parser/background_shorthand_property_parse_structures.h b/src/cobalt/css_parser/background_shorthand_property_parse_structures.h
index 8ab19ba..5c66272 100644
--- a/src/cobalt/css_parser/background_shorthand_property_parse_structures.h
+++ b/src/cobalt/css_parser/background_shorthand_property_parse_structures.h
@@ -27,12 +27,15 @@
// This helps parsing and verifying syntax of background shorthand property
// values.
struct BackgroundShorthandLayer {
+ BackgroundShorthandLayer() : error(false) {}
+
bool IsBackgroundPropertyOverlapped(
const BackgroundShorthandLayer& that) const;
void IntegrateNonOverlapped(const BackgroundShorthandLayer& that);
void ReplaceNullWithInitialValues();
+ bool error;
scoped_refptr<cssom::PropertyValue> background_color;
scoped_refptr<cssom::PropertyValue> background_image;
scoped_refptr<cssom::PropertyValue> background_position;
diff --git a/src/cobalt/css_parser/border_shorthand_property_parse_structures.h b/src/cobalt/css_parser/border_shorthand_property_parse_structures.h
index 7a7cb67..c30b75c 100644
--- a/src/cobalt/css_parser/border_shorthand_property_parse_structures.h
+++ b/src/cobalt/css_parser/border_shorthand_property_parse_structures.h
@@ -25,6 +25,9 @@
// This helps parsing and verifying syntax of border shorthand property values.
struct BorderShorthand {
+ BorderShorthand() : error(false) {}
+
+ bool error;
scoped_refptr<cssom::PropertyValue> border_color;
scoped_refptr<cssom::PropertyValue> border_style;
scoped_refptr<cssom::PropertyValue> border_width;
diff --git a/src/cobalt/css_parser/grammar.y b/src/cobalt/css_parser/grammar.y
index 09e7f2d..34a7143 100644
--- a/src/cobalt/css_parser/grammar.y
+++ b/src/cobalt/css_parser/grammar.y
@@ -955,8 +955,7 @@
$$ = AddRef(new cssom::MediaFeature($1, $4));
}
| kZeroOrOneMediaFeatureTypeToken maybe_whitespace colon zero_or_one {
- $$ = AddRef(new cssom::MediaFeature($1,
- AddRef(new cssom::NumberValue($4))));
+ $$ = AddRef(new cssom::MediaFeature($1, new cssom::IntegerValue($4)));
}
;
@@ -967,8 +966,7 @@
}
| kNonNegativeIntegerMediaFeatureTypeToken maybe_whitespace colon
non_negative_integer {
- $$ = AddRef(new cssom::MediaFeature($1,
- AddRef(new cssom::NumberValue($4))));
+ $$ = AddRef(new cssom::MediaFeature($1, new cssom::IntegerValue($4)));
}
| kRatioMediaFeatureTypeToken maybe_whitespace colon ratio {
$$ = AddRef(new cssom::MediaFeature($1, MakeScopedRefPtrAndRelease($4)));
@@ -2246,7 +2244,7 @@
positive_length:
length {
- scoped_refptr<cssom::LengthValue> length = MakeScopedRefPtrAndRelease($1);
+ scoped_refptr<cssom::LengthValue> length(MakeScopedRefPtrAndRelease($1));
if (length && length->value() < 0) {
parser_impl->LogError(@1, "negative values of length are illegal");
YYERROR;
@@ -2489,25 +2487,28 @@
background_property_element:
color {
+ scoped_refptr<cssom::PropertyValue> color(MakeScopedRefPtrAndRelease($1));
if (!$<background_shorthand_layer>0->background_color) {
- $<background_shorthand_layer>0->background_color =
- MakeScopedRefPtrAndRelease($1);
+ $<background_shorthand_layer>0->background_color = color;
} else {
parser_impl->LogError(
@1, "background-color value declared twice in background.");
+ $<background_shorthand_layer>0->error = true;
}
}
| background_image_property_list_element {
+ scoped_refptr<cssom::PropertyValue> image(MakeScopedRefPtrAndRelease($1));
if (!$<background_shorthand_layer>0->background_image) {
scoped_ptr<cssom::PropertyListValue::Builder>
background_image_builder(new cssom::PropertyListValue::Builder());
background_image_builder->reserve(1);
- background_image_builder->push_back(MakeScopedRefPtrAndRelease($1));
+ background_image_builder->push_back(image);
$<background_shorthand_layer>0->background_image =
new cssom::PropertyListValue(background_image_builder.Pass());
} else {
parser_impl->LogError(
@1, "background-image value declared twice in background.");
+ $<background_shorthand_layer>0->error = true;
}
}
;
@@ -2600,7 +2601,8 @@
parser_impl->LogError(
@1, "background-position or background-repeat declared twice in "
"background.");
- $$ = NULL;
+ $$ = new BackgroundShorthandLayer();
+ $$->error = true;
}
}
| final_background_layer background_property_element {
@@ -2988,7 +2990,7 @@
| position_list
position_list_element {
scoped_ptr<PositionParseStructure> position_info($1);
- scoped_refptr<cssom::PropertyValue> element = MakeScopedRefPtrAndRelease($2);
+ scoped_refptr<cssom::PropertyValue> element(MakeScopedRefPtrAndRelease($2));
if (position_info &&
!position_info->PushBackElement(element)) {
parser_impl->LogWarning(@2, "invalid background position value");
@@ -3267,27 +3269,35 @@
// different values on the four borders.
border_property_element:
color {
+ scoped_refptr<cssom::PropertyValue> color(MakeScopedRefPtrAndRelease($1));
if (!$<border_shorthand>0->border_color) {
- $<border_shorthand>0->border_color = MakeScopedRefPtrAndRelease($1);
+ $<border_shorthand>0->border_color = color;
} else {
parser_impl->LogError(
@1, "border-color value declared twice in border.");
+ $<border_shorthand>0->error = true;
}
}
| line_style {
+ scoped_refptr<cssom::PropertyValue> line_style =
+ MakeScopedRefPtrAndRelease($1);
if (!$<border_shorthand>0->border_style) {
- $<border_shorthand>0->border_style = MakeScopedRefPtrAndRelease($1);
+ $<border_shorthand>0->border_style = line_style;
} else {
parser_impl->LogError(
@1, "border-style value declared twice in border.");
+ $<border_shorthand>0->error = true;
}
}
| positive_length {
+ scoped_refptr<cssom::PropertyValue> positive_length =
+ MakeScopedRefPtrAndRelease($1);
if (!$<border_shorthand>0->border_width) {
- $<border_shorthand>0->border_width = MakeScopedRefPtrAndRelease($1);
+ $<border_shorthand>0->border_width = positive_length;
} else {
parser_impl->LogError(
@1, "border-width value declared twice in border.");
+ $<border_shorthand>0->error = true;
}
}
;
@@ -3335,7 +3345,7 @@
// Negative values are not allowed for blur radius.
if (length && length->value() < 0) {
parser_impl->LogError(@1, "negative values of blur radius are illegal");
- YYERROR;
+ $<shadow_info>0->error = true;
}
$<shadow_info>0->length_vector.push_back(length);
} else {
@@ -3344,19 +3354,20 @@
}
}
| color {
+ scoped_refptr<cssom::RGBAColorValue> color(MakeScopedRefPtrAndRelease($1));
if (!$<shadow_info>0->color) {
- $<shadow_info>0->color = MakeScopedRefPtrAndRelease($1);
+ $<shadow_info>0->color = color;
} else {
- parser_impl->LogError(
- @1, "color value declared twice in box shadow.");
+ parser_impl->LogError(@1, "color value declared twice in box shadow.");
+ $<shadow_info>0->error = true;
}
}
| kInsetToken maybe_whitespace {
if (!$<shadow_info>0->has_inset) {
$<shadow_info>0->has_inset = true;
} else {
- parser_impl->LogError(
- @1, "inset value declared twice in box shadow.");
+ parser_impl->LogError(@1, "inset value declared twice in box shadow.");
+ $<shadow_info>0->error = true;
}
}
;
@@ -3386,14 +3397,14 @@
comma_separated_box_shadow_list:
validated_box_shadow_list {
- $$ = new cssom::PropertyListValue::Builder();
if ($1) {
+ $$ = new cssom::PropertyListValue::Builder();
$$->push_back(MakeScopedRefPtrAndRelease($1));
}
}
| comma_separated_box_shadow_list comma validated_box_shadow_list {
$$ = $1;
- if ($3) {
+ if ($$ && $3) {
$$->push_back(MakeScopedRefPtrAndRelease($3));
}
}
@@ -3404,8 +3415,10 @@
// https://www.w3.org/TR/css3-background/#box-shadow
box_shadow_property_value:
comma_separated_box_shadow_list {
- scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
- $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
+ if ($1) {
+ scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
+ $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
+ }
}
| kNoneToken maybe_whitespace {
$$ = AddRef(cssom::KeywordValue::GetNone().get());
@@ -3892,7 +3905,7 @@
margin_property_value:
// If there is only one component value, it applies to all sides.
margin_width {
- scoped_refptr<cssom::PropertyValue> width = MakeScopedRefPtrAndRelease($1);
+ scoped_refptr<cssom::PropertyValue> width(MakeScopedRefPtrAndRelease($1));
$$ = MarginOrPaddingShorthand::TryCreate(
width, width, width, width).release();
}
@@ -4155,7 +4168,7 @@
// Negative values are not allowed for blur radius.
if (length && length->value() < 0) {
parser_impl->LogError(@1, "negative values of blur radius are illegal");
- YYERROR;
+ $<shadow_info>0->error = true;
}
$<shadow_info>0->length_vector.push_back(length);
} else {
@@ -4164,11 +4177,13 @@
}
}
| color {
+ scoped_refptr<cssom::RGBAColorValue> color(MakeScopedRefPtrAndRelease($1));
if (!$<shadow_info>0->color) {
- $<shadow_info>0->color = MakeScopedRefPtrAndRelease($1);
+ $<shadow_info>0->color = color;
} else {
parser_impl->LogError(
- @1, "color value declared twice in box shadow.");
+ @1, "color value declared twice in text shadow.");
+ $<shadow_info>0->error = true;
}
}
;
@@ -4198,14 +4213,14 @@
comma_separated_text_shadow_list:
validated_text_shadow_list {
- $$ = new cssom::PropertyListValue::Builder();
if ($1) {
+ $$ = new cssom::PropertyListValue::Builder();
$$->push_back(MakeScopedRefPtrAndRelease($1));
}
}
| comma_separated_text_shadow_list comma validated_text_shadow_list {
$$ = $1;
- if ($3) {
+ if ($$ && $3) {
$$->push_back(MakeScopedRefPtrAndRelease($3));
}
}
@@ -4216,8 +4231,10 @@
// https://www.w3.org/TR/css-text-decor-3/#text-shadow-property
text_shadow_property_value:
comma_separated_text_shadow_list {
- scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
- $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
+ if ($1) {
+ scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
+ $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
+ }
}
| kNoneToken maybe_whitespace {
$$ = AddRef(cssom::KeywordValue::GetNone().get());
@@ -5072,19 +5089,26 @@
scoped_ptr<TransitionShorthand> transition(new TransitionShorthand());
- if (property_list_builder.size() == 1 &&
- property_list_builder[0] == cssom::kNoneProperty) {
+ if (property_list_builder.empty() ||
+ (property_list_builder.size() == 1 &&
+ property_list_builder[0] == cssom::kNoneProperty)) {
transition->property_list = cssom::KeywordValue::GetNone();
} else {
transition->property_list = new cssom::PropertyKeyListValue(
transition_builder->property_list_builder.Pass());
}
- transition->duration_list = new cssom::TimeListValue(
- transition_builder->duration_list_builder.Pass());
- transition->timing_function_list = new cssom::TimingFunctionListValue(
- transition_builder->timing_function_list_builder.Pass());
- transition->delay_list = new cssom::TimeListValue(
- transition_builder->delay_list_builder.Pass());
+ if (!transition_builder->duration_list_builder->empty()) {
+ transition->duration_list = new cssom::TimeListValue(
+ transition_builder->duration_list_builder.Pass());
+ }
+ if (!transition_builder->timing_function_list_builder->empty()) {
+ transition->timing_function_list = new cssom::TimingFunctionListValue(
+ transition_builder->timing_function_list_builder.Pass());
+ }
+ if (!transition_builder->delay_list_builder->empty()) {
+ transition->delay_list = new cssom::TimeListValue(
+ transition_builder->delay_list_builder.Pass());
+ }
$$ = transition.release();
}
@@ -5306,7 +5330,7 @@
| kBackgroundToken maybe_whitespace colon background_property_value
maybe_important {
scoped_ptr<BackgroundShorthandLayer> background($4);
- if (background) {
+ if (background && !background->error) {
background->ReplaceNullWithInitialValues();
scoped_ptr<PropertyDeclaration> property_declaration(
new PropertyDeclaration($5));
@@ -5372,74 +5396,82 @@
maybe_important {
scoped_ptr<BorderShorthand> border($4);
DCHECK(border);
+ if (!border->error) {
+ scoped_ptr<PropertyDeclaration> property_declaration(
+ new PropertyDeclaration($5));
- scoped_ptr<PropertyDeclaration> property_declaration(
- new PropertyDeclaration($5));
+ // Unpack border color.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftColorProperty, border->border_color));
- // Unpack border color.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftColorProperty, border->border_color));
+ // Unpack border style.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftStyleProperty, border->border_style));
- // Unpack border style.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftStyleProperty, border->border_style));
+ // Unpack border width.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopWidthProperty, border->border_width));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightWidthProperty, border->border_width));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomWidthProperty, border->border_width));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftWidthProperty, border->border_width));
- // Unpack border width.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopWidthProperty, border->border_width));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightWidthProperty, border->border_width));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomWidthProperty, border->border_width));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftWidthProperty, border->border_width));
-
- $$ = property_declaration.release();
+ $$ = property_declaration.release();
+ } else {
+ parser_impl->LogWarning(@1, "invalid border");
+ $$ = NULL;
+ }
}
| kBorderBottomToken maybe_whitespace colon border_property_value
maybe_important {
scoped_ptr<BorderShorthand> border($4);
DCHECK(border);
+ if (!border->error) {
+ scoped_ptr<PropertyDeclaration> property_declaration(
+ new PropertyDeclaration($5));
- scoped_ptr<PropertyDeclaration> property_declaration(
- new PropertyDeclaration($5));
+ // Unpack border bottom.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderBottomWidthProperty, border->border_width));
- // Unpack border bottom.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderBottomWidthProperty, border->border_width));
-
- $$ = property_declaration.release();
+ $$ = property_declaration.release();
+ } else {
+ parser_impl->LogWarning(@1, "invalid border-bottom");
+ $$ = NULL;
+ }
}
| kBorderBottomColorToken maybe_whitespace colon color_property_value
maybe_important {
@@ -5498,22 +5530,26 @@
maybe_important {
scoped_ptr<BorderShorthand> border($4);
DCHECK(border);
+ if (!border->error) {
+ scoped_ptr<PropertyDeclaration> property_declaration(
+ new PropertyDeclaration($5));
- scoped_ptr<PropertyDeclaration> property_declaration(
- new PropertyDeclaration($5));
+ // Unpack border left.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderLeftWidthProperty, border->border_width));
- // Unpack border left.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderLeftWidthProperty, border->border_width));
-
- $$ = property_declaration.release();
+ $$ = property_declaration.release();
+ } else {
+ parser_impl->LogWarning(@1, "invalid border-left");
+ $$ = NULL;
+ }
}
| kBorderLeftColorToken maybe_whitespace colon color_property_value
maybe_important {
@@ -5543,22 +5579,26 @@
maybe_important {
scoped_ptr<BorderShorthand> border($4);
DCHECK(border);
+ if (!border->error) {
+ scoped_ptr<PropertyDeclaration> property_declaration(
+ new PropertyDeclaration($5));
- scoped_ptr<PropertyDeclaration> property_declaration(
- new PropertyDeclaration($5));
+ // Unpack border right.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderRightWidthProperty, border->border_width));
- // Unpack border right.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderRightWidthProperty, border->border_width));
-
- $$ = property_declaration.release();
+ $$ = property_declaration.release();
+ } else {
+ parser_impl->LogWarning(@1, "invalid border-right");
+ $$ = NULL;
+ }
}
| kBorderRightColorToken maybe_whitespace colon color_property_value
maybe_important {
@@ -5617,22 +5657,26 @@
maybe_important {
scoped_ptr<BorderShorthand> border($4);
DCHECK(border);
+ if (!border->error) {
+ scoped_ptr<PropertyDeclaration> property_declaration(
+ new PropertyDeclaration($5));
- scoped_ptr<PropertyDeclaration> property_declaration(
- new PropertyDeclaration($5));
+ // Unpack border top.
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopColorProperty, border->border_color));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopStyleProperty, border->border_style));
+ property_declaration->property_values.push_back(
+ PropertyDeclaration::PropertyKeyValuePair(
+ cssom::kBorderTopWidthProperty, border->border_width));
- // Unpack border top.
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopColorProperty, border->border_color));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopStyleProperty, border->border_style));
- property_declaration->property_values.push_back(
- PropertyDeclaration::PropertyKeyValuePair(
- cssom::kBorderTopWidthProperty, border->border_width));
-
- $$ = property_declaration.release();
+ $$ = property_declaration.release();
+ } else {
+ parser_impl->LogWarning(@1, "invalid border-right");
+ $$ = NULL;
+ }
}
| kBorderTopColorToken maybe_whitespace colon color_property_value
maybe_important {
@@ -6307,7 +6351,7 @@
}
// Parses the rule.
| kRuleEntryPointToken maybe_whitespace rule {
- scoped_refptr<cssom::CSSRule> rule = MakeScopedRefPtrAndRelease($3);
+ scoped_refptr<cssom::CSSRule> rule(MakeScopedRefPtrAndRelease($3));
parser_impl->set_rule(rule);
}
// Parses the contents of a HTMLElement.style attribute.
diff --git a/src/cobalt/css_parser/parser_test.cc b/src/cobalt/css_parser/parser_test.cc
index 77b4874..0aaf421 100644
--- a/src/cobalt/css_parser/parser_test.cc
+++ b/src/cobalt/css_parser/parser_test.cc
@@ -1352,6 +1352,53 @@
EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundSizeProperty));
}
+TEST_F(ParserTest, InvalidBackgroundWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:38: error: background-color value "
+ "declared twice in background."));
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "background: 0 0 rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundImageProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundPositionProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundRepeatProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundSizeProperty));
+}
+
+TEST_F(ParserTest, InvalidBackgroundWithTwoImages) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:26: error: background-image value "
+ "declared twice in background."));
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("background: url(foo.png) url(bar.png)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundImageProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundPositionProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundRepeatProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundSizeProperty));
+}
+
+TEST_F(ParserTest, InvalidBackgroundWithTwoPositionsAndTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:11: error: background-position or "
+ "background-repeat declared twice in background."));
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "background: 0 0 rgba(255,255,255,.1) 100% rgba(255,255,255,.1) 100%",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundImageProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundPositionProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundRepeatProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBackgroundSizeProperty));
+}
+
TEST_F(ParserTest, LinearGradientWithOneColorStopIsError) {
EXPECT_CALL(
parser_observer_,
@@ -2957,6 +3004,159 @@
parser_.ParseStyleDeclarationList("border: foo, bar;", source_location_);
}
+TEST_F(ParserTest, InvalidBorderWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:30: error: border-color value "
+ "declared twice in border."));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "border: rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomColorProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomStyleProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderBottomWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:37: error: border-color value "
+ "declared twice in border."));
+ EXPECT_CALL(
+ parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border-bottom"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "border-bottom: rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderLeftWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:35: error: border-color value "
+ "declared twice in border."));
+ EXPECT_CALL(
+ parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border-left"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "border-left: rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderRightWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:36: error: border-color value "
+ "declared twice in border."));
+ EXPECT_CALL(
+ parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border-right"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "border-right: rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderTopWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:34: error: border-color value "
+ "declared twice in border."));
+ EXPECT_CALL(
+ parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border-right"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "border-top: rgba(255,255,255,.1) rgba(255,255,255,.1)",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderWithTwoStyles) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:15: error: border-style value "
+ "declared twice in border."));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("border: solid hidden",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomColorProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomStyleProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomWidthProperty));
+}
+
+TEST_F(ParserTest, InvalidBorderWithTwoWidths) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:7: error: border-width value "
+ "declared twice in border."));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:1: warning: invalid border"));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("border: 10px 20px", source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopColorProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomColorProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopStyleProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomStyleProperty));
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderLeftWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderRightWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderTopWidthProperty));
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBorderBottomWidthProperty));
+}
+
TEST_F(ParserTest, ParsesBorderColorWidth) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("border: gray 20px;", source_location_);
@@ -3610,7 +3810,37 @@
style->GetPropertyValue(cssom::kBoxShadowProperty));
}
-TEST_F(ParserTest, ParsesBoxShadowWith2Lengths) {
+TEST_F(ParserTest, InvalidBoxShadowWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:18: error: color value declared "
+ "twice in box shadow."));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:11: warning: invalid box shadow "
+ "property."));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "box-shadow: gray green .2em 20px .3em;", source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBoxShadowProperty));
+}
+
+TEST_F(ParserTest, InvalidBoxShadowWithNegativeBlurRadius) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:23: error: negative values of "
+ "blur radius are illegal"));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:11: warning: invalid box shadow "
+ "property."));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("box-shadow: .2em 20px -10px;",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kBoxShadowProperty));
+}
+
+TEST_F(ParserTest, ParsesBoxShadowWithTwoLengths) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("box-shadow: .2em 20px;",
source_location_);
@@ -3638,7 +3868,7 @@
EXPECT_FALSE(box_shadow->has_inset());
}
-TEST_F(ParserTest, ParsesBoxShadowWith3LengthsAndColor) {
+TEST_F(ParserTest, ParsesBoxShadowWithThreeLengthsAndColor) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("box-shadow: gray .2em 20px .3em;",
source_location_);
@@ -3670,7 +3900,7 @@
EXPECT_FALSE(box_shadow->has_inset());
}
-TEST_F(ParserTest, ParsesBoxShadowWith4LengthsInsetAndColor) {
+TEST_F(ParserTest, ParsesBoxShadowWithFourLengthsInsetAndColor) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList(
"box-shadow: .2em 20px .3em 0 "
@@ -5689,7 +5919,37 @@
style->GetPropertyValue(cssom::kTextShadowProperty));
}
-TEST_F(ParserTest, ParsesTextShadowWith2Lengths) {
+TEST_F(ParserTest, InvalidTextShadowWithTwoColors) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:19: error: color value declared "
+ "twice in text shadow."));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:12: warning: invalid text "
+ "shadow property."));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList(
+ "text-shadow: gray green .2em 20px .3em;", source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kTextShadowProperty));
+}
+
+TEST_F(ParserTest, InvalidTextShadowWithNegativeBlurRadius) {
+ EXPECT_CALL(parser_observer_,
+ OnError("[object ParserTest]:1:24: error: negative values of "
+ "blur radius are illegal"));
+ EXPECT_CALL(parser_observer_,
+ OnWarning("[object ParserTest]:1:12: warning: invalid text "
+ "shadow property."));
+
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("text-shadow: .2em 20px -10px;",
+ source_location_);
+
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kTextShadowProperty));
+}
+
+TEST_F(ParserTest, ParsesTextShadowWithTwoLengths) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("text-shadow: 0.04em 1px;",
source_location_);
@@ -5717,7 +5977,7 @@
EXPECT_FALSE(text_shadow->has_inset());
}
-TEST_F(ParserTest, ParsesTextShadowWith3LengthsAndColor) {
+TEST_F(ParserTest, ParsesTextShadowWithThreeLengthsAndColor) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("text-shadow: 0.04em 1px .2em #123;",
source_location_);
@@ -7370,34 +7630,19 @@
parser_.ParseStyleDeclarationList(
"transition: 1s voodoo-magic; display: inline;", source_location_);
- // Test transition-property was set properly.
- scoped_refptr<cssom::PropertyKeyListValue> property_name_list =
- dynamic_cast<cssom::PropertyKeyListValue*>(
- style->GetPropertyValue(cssom::kTransitionPropertyProperty).get());
- ASSERT_TRUE(property_name_list.get());
- ASSERT_EQ(0, property_name_list->value().size());
+ // Test transition-property was not set.
+ EXPECT_EQ(cssom::KeywordValue::GetNone(),
+ style->GetPropertyValue(cssom::kTransitionPropertyProperty));
- // Test transition-duration was set properly.
- scoped_refptr<cssom::TimeListValue> duration_list =
- dynamic_cast<cssom::TimeListValue*>(
- style->GetPropertyValue(cssom::kTransitionDurationProperty).get());
- ASSERT_TRUE(duration_list.get());
- ASSERT_EQ(0, duration_list->value().size());
+ // Test transition-duration was not set.
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kTransitionDurationProperty));
- // Test transition-timing-function was set properly.
- scoped_refptr<cssom::TimingFunctionListValue> timing_function_list =
- dynamic_cast<cssom::TimingFunctionListValue*>(
- style->GetPropertyValue(cssom::kTransitionTimingFunctionProperty)
- .get());
- ASSERT_TRUE(timing_function_list.get());
- ASSERT_EQ(0, timing_function_list->value().size());
+ // Test transition-timing-function was not set.
+ EXPECT_FALSE(
+ style->GetPropertyValue(cssom::kTransitionTimingFunctionProperty));
- // Test transition-delay was set properly.
- scoped_refptr<cssom::TimeListValue> delay_list =
- dynamic_cast<cssom::TimeListValue*>(
- style->GetPropertyValue(cssom::kTransitionDelayProperty).get());
- ASSERT_TRUE(delay_list.get());
- ASSERT_EQ(0, delay_list->value().size());
+ // Test transition-delay was not set.
+ EXPECT_FALSE(style->GetPropertyValue(cssom::kTransitionDelayProperty));
// Test that despite the error, display inline was still set correctly.
EXPECT_EQ(cssom::KeywordValue::GetInline(),
@@ -7414,34 +7659,20 @@
parser_.ParseStyleDeclarationList("transition: 1s voodoo-magic 2s;",
source_location_);
- // Test transition-property was set properly.
- scoped_refptr<cssom::PropertyKeyListValue> property_name_list =
- dynamic_cast<cssom::PropertyKeyListValue*>(
- style->GetPropertyValue(cssom::kTransitionPropertyProperty).get());
- ASSERT_TRUE(property_name_list.get());
- ASSERT_EQ(0, property_name_list->value().size());
+ // Test transition-property was not set.
+ EXPECT_EQ(cssom::KeywordValue::GetNone(),
+ style->GetPropertyValue(cssom::kTransitionPropertyProperty).get());
- // Test transition-duration was set properly.
- scoped_refptr<cssom::TimeListValue> duration_list =
- dynamic_cast<cssom::TimeListValue*>(
- style->GetPropertyValue(cssom::kTransitionDurationProperty).get());
- ASSERT_TRUE(duration_list.get());
- ASSERT_EQ(0, duration_list->value().size());
+ // Test transition-duration was not set.
+ EXPECT_FALSE(
+ style->GetPropertyValue(cssom::kTransitionDurationProperty).get());
- // Test transition-timing-function was set properly.
- scoped_refptr<cssom::TimingFunctionListValue> timing_function_list =
- dynamic_cast<cssom::TimingFunctionListValue*>(
- style->GetPropertyValue(cssom::kTransitionTimingFunctionProperty)
- .get());
- ASSERT_TRUE(timing_function_list.get());
- ASSERT_EQ(0, timing_function_list->value().size());
+ // Test transition-timing-function was not set.
+ EXPECT_FALSE(
+ style->GetPropertyValue(cssom::kTransitionTimingFunctionProperty).get());
- // Test transition-delay was set properly.
- scoped_refptr<cssom::TimeListValue> delay_list =
- dynamic_cast<cssom::TimeListValue*>(
- style->GetPropertyValue(cssom::kTransitionDelayProperty).get());
- ASSERT_TRUE(delay_list.get());
- ASSERT_EQ(0, delay_list->value().size());
+ // Test transition-delay was not set.
+ ASSERT_FALSE(style->GetPropertyValue(cssom::kTransitionDelayProperty).get());
}
TEST_F(ParserTest,
@@ -8005,5 +8236,31 @@
ASSERT_EQ(media_list->media_text(), ", ");
}
+TEST_F(ParserTest, ParsesValidMediaQueryWithIntegers) {
+ scoped_refptr<cssom::MediaQuery> media_query =
+ parser_.ParseMediaQuery(
+ "(color: 8) and (grid:0) and (color) and (scan: progressive)",
+ source_location_)
+ .get();
+ ASSERT_TRUE(media_query.get());
+
+ // TODO: Update when media query serialization is implemented.
+ ASSERT_EQ(media_query->media_query(), "");
+ math::Size size;
+ EXPECT_TRUE(media_query->EvaluateConditionValue(size));
+}
+
+TEST_F(ParserTest, ParsesValidMediaListWithIntegers) {
+ scoped_refptr<cssom::MediaList> media_list =
+ parser_.ParseMediaList("(color: 0), (grid:0)", source_location_).get();
+ ASSERT_TRUE(media_list.get());
+ EXPECT_EQ(media_list->length(), 2);
+
+ // TODO: Update when media query serialization is implemented.
+ ASSERT_EQ(media_list->media_text(), ", ");
+ math::Size size;
+ EXPECT_TRUE(media_list->EvaluateConditionValue(size));
+}
+
} // namespace css_parser
} // namespace cobalt
diff --git a/src/cobalt/css_parser/scanner.cc b/src/cobalt/css_parser/scanner.cc
index 7d594d9..fadfebb 100644
--- a/src/cobalt/css_parser/scanner.cc
+++ b/src/cobalt/css_parser/scanner.cc
@@ -418,6 +418,10 @@
// Return all prepended tokens before actual input.
if (!prepended_tokens_.empty()) {
Token prepended_token = prepended_tokens_.front();
+ if ((prepended_token == kMediaListEntryPointToken) ||
+ (prepended_token == kMediaQueryEntryPointToken)) {
+ parsing_mode_ = kMediaQueryMode;
+ }
prepended_tokens_.pop_front();
return prepended_token;
}
diff --git a/src/cobalt/css_parser/shadow_property_parse_structures.cc b/src/cobalt/css_parser/shadow_property_parse_structures.cc
index a690d6d..e0baf60 100644
--- a/src/cobalt/css_parser/shadow_property_parse_structures.cc
+++ b/src/cobalt/css_parser/shadow_property_parse_structures.cc
@@ -20,6 +20,7 @@
namespace css_parser {
bool ShadowPropertyInfo::IsShadowPropertyValid(ShadowType type) {
+ if (error) return false;
switch (type) {
case kBoxShadow:
// https://www.w3.org/TR/css3-background/#box-shadow
diff --git a/src/cobalt/css_parser/shadow_property_parse_structures.h b/src/cobalt/css_parser/shadow_property_parse_structures.h
index 3075bda..4347ef6 100644
--- a/src/cobalt/css_parser/shadow_property_parse_structures.h
+++ b/src/cobalt/css_parser/shadow_property_parse_structures.h
@@ -35,10 +35,11 @@
};
struct ShadowPropertyInfo {
- ShadowPropertyInfo() : has_inset(false) {}
+ ShadowPropertyInfo() : error(false), has_inset(false) {}
bool IsShadowPropertyValid(ShadowType type);
+ bool error;
std::vector<scoped_refptr<cssom::LengthValue> > length_vector;
scoped_refptr<cssom::RGBAColorValue> color;
bool has_inset;
diff --git a/src/cobalt/cssom/computed_style.cc b/src/cobalt/cssom/computed_style.cc
index ea15228..9d5d0c9 100644
--- a/src/cobalt/cssom/computed_style.cc
+++ b/src/cobalt/cssom/computed_style.cc
@@ -2701,7 +2701,9 @@
return true;
} else if (*value == KeywordValue::GetInitial()) {
*value = GetPropertyInitialValue(key);
- return true;
+ // If the initial value is current color, it still requires to do further
+ // processing.
+ return *value == KeywordValue::GetCurrentColor() ? false : true;
} else {
return false;
}
diff --git a/src/cobalt/cssom/computed_style_test.cc b/src/cobalt/cssom/computed_style_test.cc
index 2637dfa..f9745eb 100644
--- a/src/cobalt/cssom/computed_style_test.cc
+++ b/src/cobalt/cssom/computed_style_test.cc
@@ -792,6 +792,27 @@
EXPECT_EQ(kPixelsUnit, border_radius->unit());
}
+TEST(PromoteToComputedStyle, BorderColorWithInitialValue) {
+ scoped_refptr<CSSComputedStyleData> computed_style(
+ new CSSComputedStyleData());
+ computed_style->set_border_bottom_color(KeywordValue::GetInitial());
+ computed_style->set_color(RGBAColorValue::GetAqua());
+
+ scoped_refptr<CSSComputedStyleData> parent_computed_style(
+ new CSSComputedStyleData());
+ scoped_refptr<CSSComputedStyleDeclaration> parent_computed_style_declaration(
+ CreateComputedStyleDeclaration(parent_computed_style));
+
+ PromoteToComputedStyle(computed_style, parent_computed_style_declaration,
+ parent_computed_style, math::Size(), NULL);
+
+ scoped_refptr<RGBAColorValue> border_bottom_color =
+ dynamic_cast<RGBAColorValue*>(
+ computed_style->border_bottom_color().get());
+ ASSERT_TRUE(border_bottom_color);
+ EXPECT_EQ(0x00FFFFFF, border_bottom_color->value());
+}
+
TEST(PromoteToComputedStyle, BorderColorWithCurrentColorValue) {
scoped_refptr<CSSComputedStyleData> computed_style(
new CSSComputedStyleData());
diff --git a/src/cobalt/cssom/list_value.h b/src/cobalt/cssom/list_value.h
index aeea7f3..df0a5a0 100644
--- a/src/cobalt/cssom/list_value.h
+++ b/src/cobalt/cssom/list_value.h
@@ -40,6 +40,7 @@
explicit ListValue(scoped_ptr<Builder> value) : value_(value.Pass()) {
DCHECK(value_.get());
+ DCHECK(!value_->empty());
}
const T& get_item_modulo_size(int index) const {
diff --git a/src/cobalt/cssom/media_feature.cc b/src/cobalt/cssom/media_feature.cc
index c54da9c..88db75c 100644
--- a/src/cobalt/cssom/media_feature.cc
+++ b/src/cobalt/cssom/media_feature.cc
@@ -123,7 +123,11 @@
base::polymorphic_downcast<LengthValue*>(value_.get());
// TODO: Support 'em' units for media features.
// https://www.w3.org/TR/css3-mediaqueries/#units
- DCHECK_EQ(kPixelsUnit, specified_value->unit());
+ if (kPixelsUnit != specified_value->unit()) {
+ DLOG(WARNING)
+ << "Media feature length value only supported in pixel units.";
+ return false;
+ }
switch (operator_) {
case kEquals:
diff --git a/src/cobalt/cssom/property_value_visitor_test.cc b/src/cobalt/cssom/property_value_visitor_test.cc
index 2884f13..953dd12 100644
--- a/src/cobalt/cssom/property_value_visitor_test.cc
+++ b/src/cobalt/cssom/property_value_visitor_test.cc
@@ -36,6 +36,7 @@
#include "cobalt/cssom/ratio_value.h"
#include "cobalt/cssom/resolution_value.h"
#include "cobalt/cssom/rgba_color_value.h"
+#include "cobalt/cssom/rotate_function.h"
#include "cobalt/cssom/shadow_value.h"
#include "cobalt/cssom/string_value.h"
#include "cobalt/cssom/time_list_value.h"
@@ -185,9 +186,11 @@
}
TEST(PropertyValueVisitorTest, VisitsPropertyKeyListValue) {
+ scoped_ptr<ListValue<PropertyKey>::Builder> builder(
+ new PropertyKeyListValue::Builder());
+ builder->push_back(kWidthProperty);
scoped_refptr<PropertyKeyListValue> property_key_list_value =
- new PropertyKeyListValue(
- make_scoped_ptr(new PropertyKeyListValue::Builder()));
+ new PropertyKeyListValue(builder.Pass());
MockPropertyValueVisitor mock_visitor;
EXPECT_CALL(mock_visitor,
VisitPropertyKeyList(property_key_list_value.get()));
@@ -195,8 +198,11 @@
}
TEST(PropertyValueVisitorTest, VisitsPropertyListValue) {
- scoped_refptr<PropertyListValue> property_list_value = new PropertyListValue(
- make_scoped_ptr(new ScopedRefListValue<PropertyValue>::Builder()));
+ scoped_ptr<ScopedRefListValue<PropertyValue>::Builder> builder(
+ new ScopedRefListValue<PropertyValue>::Builder());
+ builder->push_back(cssom::KeywordValue::GetNone());
+ scoped_refptr<PropertyListValue> property_list_value =
+ new PropertyListValue(builder.Pass());
MockPropertyValueVisitor mock_visitor;
EXPECT_CALL(mock_visitor, VisitPropertyList(property_list_value.get()));
property_list_value->Accept(&mock_visitor);
@@ -252,17 +258,21 @@
}
TEST(PropertyValueVisitorTest, VisitsTimeListValue) {
+ scoped_ptr<TimeListValue::Builder> builder(new TimeListValue::Builder());
+ builder->push_back(base::TimeDelta());
scoped_refptr<TimeListValue> time_list_value =
- new TimeListValue(make_scoped_ptr(new TimeListValue::Builder()));
+ new TimeListValue(builder.Pass());
MockPropertyValueVisitor mock_visitor;
EXPECT_CALL(mock_visitor, VisitTimeList(time_list_value.get()));
time_list_value->Accept(&mock_visitor);
}
TEST(PropertyValueVisitorTest, VisitsTimingFunctionListValue) {
+ scoped_ptr<TimingFunctionListValue::Builder> builder(
+ new TimingFunctionListValue::Builder());
+ builder->push_back(TimingFunction::GetLinear());
scoped_refptr<TimingFunctionListValue> timing_function_list_value =
- new TimingFunctionListValue(
- make_scoped_ptr(new TimingFunctionListValue::Builder()));
+ new TimingFunctionListValue(builder.Pass());
MockPropertyValueVisitor mock_visitor;
EXPECT_CALL(mock_visitor,
VisitTimingFunctionList(timing_function_list_value.get()));
@@ -270,8 +280,10 @@
}
TEST(PropertyValueVisitorTest, VisitsTransformListValue) {
+ TransformFunctionListValue::Builder builder;
+ builder.push_back(new RotateFunction(0.0f));
scoped_refptr<TransformFunctionListValue> transform_list_value =
- new TransformFunctionListValue(TransformFunctionListValue::Builder());
+ new TransformFunctionListValue(builder.Pass());
MockPropertyValueVisitor mock_visitor;
EXPECT_CALL(mock_visitor,
VisitTransformFunctionList(transform_list_value.get()));
diff --git a/src/cobalt/cssom/scoped_list_value.h b/src/cobalt/cssom/scoped_list_value.h
index 044740e..48d004c 100644
--- a/src/cobalt/cssom/scoped_list_value.h
+++ b/src/cobalt/cssom/scoped_list_value.h
@@ -35,7 +35,9 @@
public:
typedef ScopedVector<T> Builder;
- explicit ScopedListValue(Builder value) : value_(value.Pass()) {}
+ explicit ScopedListValue(Builder value) : value_(value.Pass()) {
+ DCHECK(!value_.empty());
+ }
const T& get_item_modulo_size(int index) const {
return *value_[index % value_.size()];
diff --git a/src/cobalt/cssom/scoped_ref_list_value.h b/src/cobalt/cssom/scoped_ref_list_value.h
index 9a06c8f..eb03137 100644
--- a/src/cobalt/cssom/scoped_ref_list_value.h
+++ b/src/cobalt/cssom/scoped_ref_list_value.h
@@ -40,6 +40,7 @@
explicit ScopedRefListValue(scoped_ptr<Builder> value)
: value_(value.Pass()) {
DCHECK(value_.get());
+ DCHECK(!value_->empty());
}
const scoped_refptr<T>& get_item_modulo_size(int index) const {
diff --git a/src/cobalt/dom/comment_test.cc b/src/cobalt/dom/comment_test.cc
index e05b477..2b8773d 100644
--- a/src/cobalt/dom/comment_test.cc
+++ b/src/cobalt/dom/comment_test.cc
@@ -42,7 +42,7 @@
CommentTest::CommentTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, "") {
+ NULL, NULL, NULL, "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
document_ = new Document(&html_element_context_);
}
diff --git a/src/cobalt/dom/document_test.cc b/src/cobalt/dom/document_test.cc
index c56714f..39e118d 100644
--- a/src/cobalt/dom/document_test.cc
+++ b/src/cobalt/dom/document_test.cc
@@ -66,7 +66,8 @@
: css_parser_(css_parser::Parser::Create()),
dom_stat_tracker_(new DomStatTracker("DocumentTest")),
html_element_context_(NULL, css_parser_.get(), NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, dom_stat_tracker_.get(), "") {
+ NULL, NULL, NULL, NULL, dom_stat_tracker_.get(),
+ "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
}
diff --git a/src/cobalt/dom/document_type_test.cc b/src/cobalt/dom/document_type_test.cc
index f19fa27..1fc4b6a 100644
--- a/src/cobalt/dom/document_type_test.cc
+++ b/src/cobalt/dom/document_type_test.cc
@@ -27,7 +27,7 @@
protected:
DocumentTypeTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, ""),
+ NULL, NULL, NULL, ""),
document_(new Document(&html_element_context_)) {}
~DocumentTypeTest() OVERRIDE {}
diff --git a/src/cobalt/dom/dom_parser_test.cc b/src/cobalt/dom/dom_parser_test.cc
index 5d392e1..d3dd079 100644
--- a/src/cobalt/dom/dom_parser_test.cc
+++ b/src/cobalt/dom/dom_parser_test.cc
@@ -46,10 +46,11 @@
dom_parser_parser_(new dom_parser::Parser()),
html_element_context_(
&fetcher_factory_, &stub_css_parser_, dom_parser_parser_.get(),
- NULL /* web_media_player_factory */, &stub_script_runner_,
- NULL /* media_source_registry */, NULL /* resource_provider */,
- NULL /* image_cache */, NULL /* remote_typeface_cache */,
- NULL /* dom_stat_tracker */, "" /* language */),
+ NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
+ &stub_script_runner_, NULL /* media_source_registry */,
+ NULL /* resource_provider */, NULL /* image_cache */,
+ NULL /* remote_typeface_cache */, NULL /* dom_stat_tracker */,
+ "" /* language */),
dom_parser_(new DOMParser(&html_element_context_)) {}
TEST_F(DOMParserTest, ParsesXML) {
diff --git a/src/cobalt/dom/dom_string_map_test.cc b/src/cobalt/dom/dom_string_map_test.cc
index 0851497..5faca86 100644
--- a/src/cobalt/dom/dom_string_map_test.cc
+++ b/src/cobalt/dom/dom_string_map_test.cc
@@ -45,7 +45,7 @@
DOMStringMapTest::DOMStringMapTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, ""),
+ NULL, NULL, NULL, ""),
document_(new Document(&html_element_context_)),
element_(new Element(document_, base::Token("element"))),
dom_string_map_(new DOMStringMap(element_)) {}
diff --git a/src/cobalt/dom/dom_token_list_test.cc b/src/cobalt/dom/dom_token_list_test.cc
index c763eb1..49c58dd 100644
--- a/src/cobalt/dom/dom_token_list_test.cc
+++ b/src/cobalt/dom/dom_token_list_test.cc
@@ -40,7 +40,7 @@
DOMTokenListTest::DOMTokenListTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, "") {
+ NULL, NULL, NULL, "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
document_ = new Document(&html_element_context_);
}
diff --git a/src/cobalt/dom/element_test.cc b/src/cobalt/dom/element_test.cc
index affdd02..f2ea69d 100644
--- a/src/cobalt/dom/element_test.cc
+++ b/src/cobalt/dom/element_test.cc
@@ -61,7 +61,7 @@
dom_parser_(new dom_parser::Parser()),
dom_stat_tracker_(new DomStatTracker("ElementTest")),
html_element_context_(NULL, css_parser_.get(), dom_parser_.get(), NULL,
- NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
dom_stat_tracker_.get(), "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
document_ = new Document(&html_element_context_);
diff --git a/src/cobalt/dom/event_target.cc b/src/cobalt/dom/event_target.cc
index f8af5a2..87553ff 100644
--- a/src/cobalt/dom/event_target.cc
+++ b/src/cobalt/dom/event_target.cc
@@ -193,10 +193,10 @@
iter != event_listener_infos_.end(); ++iter) {
if ((*iter)->type == type &&
(*iter)->listener.referenced_object().EqualTo(listener) &&
- (*iter)->use_capture == use_capture) {
+ (*iter)->use_capture == use_capture &&
+ (*iter)->listener_type == listener_type) {
// Attribute listeners should have already been removed.
DCHECK_EQ(listener_type, EventListener::kNotAttribute);
- DCHECK_EQ(listener_type, (*iter)->listener_type);
return;
}
}
diff --git a/src/cobalt/dom/event_target_test.cc b/src/cobalt/dom/event_target_test.cc
index 57a092a..1a1ffe5 100644
--- a/src/cobalt/dom/event_target_test.cc
+++ b/src/cobalt/dom/event_target_test.cc
@@ -308,6 +308,58 @@
EXPECT_TRUE(event_target->DispatchEvent(event, &exception_state));
}
+TEST(EventTargetTest, AddSameListenerMultipleTimes) {
+ StrictMock<MockExceptionState> exception_state;
+ scoped_refptr<EventTarget> event_target = new EventTarget;
+ scoped_refptr<Event> event = new Event(base::Token("fired"));
+ scoped_ptr<MockEventListener> event_listener = MockEventListener::Create();
+ FakeScriptObject script_object(event_listener.get());
+
+ InSequence in_sequence;
+ event_listener->ExpectHandleEventCall(event, event_target);
+
+ // The same listener should only get added once.
+ event_target->AddEventListener("fired", script_object, false);
+ event_target->AddEventListener("fired", script_object, false);
+ event_target->AddEventListener("fired", script_object, false);
+ EXPECT_TRUE(event_target->DispatchEvent(event, &exception_state));
+}
+
+TEST(EventTargetTest, AddSameAttributeListenerMultipleTimes) {
+ StrictMock<MockExceptionState> exception_state;
+ scoped_refptr<EventTarget> event_target = new EventTarget;
+ scoped_refptr<Event> event = new Event(base::Token("fired"));
+ scoped_ptr<MockEventListener> event_listener = MockEventListener::Create();
+ FakeScriptObject script_object(event_listener.get());
+
+ InSequence in_sequence;
+ event_listener->ExpectHandleEventCall(event, event_target);
+
+ // The same listener should only get added once.
+ event_target->SetAttributeEventListener(base::Token("fired"), script_object);
+ event_target->SetAttributeEventListener(base::Token("fired"), script_object);
+ event_target->SetAttributeEventListener(base::Token("fired"), script_object);
+ EXPECT_TRUE(event_target->DispatchEvent(event, &exception_state));
+}
+
+TEST(EventTargetTest, SameEventListenerAsAttribute) {
+ StrictMock<MockExceptionState> exception_state;
+ scoped_refptr<EventTarget> event_target = new EventTarget;
+ scoped_refptr<Event> event = new Event(base::Token("fired"));
+ scoped_ptr<MockEventListener> event_listener = MockEventListener::Create();
+ FakeScriptObject script_object(event_listener.get());
+
+ InSequence in_sequence;
+ event_listener->ExpectHandleEventCall(event, event_target);
+ event_listener->ExpectHandleEventCall(event, event_target);
+
+ // The same script object can be registered as both an attribute and
+ // non-attribute listener. Both should be fired.
+ event_target->AddEventListener("fired", script_object, false);
+ event_target->SetAttributeEventListener(base::Token("fired"), script_object);
+ EXPECT_TRUE(event_target->DispatchEvent(event, &exception_state));
+}
+
} // namespace
} // namespace dom
} // namespace cobalt
diff --git a/src/cobalt/dom/html_element_context.cc b/src/cobalt/dom/html_element_context.cc
index f9363e0..25d74f7 100644
--- a/src/cobalt/dom/html_element_context.cc
+++ b/src/cobalt/dom/html_element_context.cc
@@ -23,7 +23,8 @@
HTMLElementContext::HTMLElementContext(
loader::FetcherFactory* fetcher_factory, cssom::CSSParser* css_parser,
- Parser* dom_parser, media::WebMediaPlayerFactory* web_media_player_factory,
+ Parser* dom_parser, media::CanPlayTypeHandler* can_play_type_handler,
+ media::WebMediaPlayerFactory* web_media_player_factory,
script::ScriptRunner* script_runner,
MediaSource::Registry* media_source_registry,
render_tree::ResourceProvider* resource_provider,
@@ -33,6 +34,7 @@
: fetcher_factory_(fetcher_factory),
css_parser_(css_parser),
dom_parser_(dom_parser),
+ can_play_type_handler_(can_play_type_handler),
web_media_player_factory_(web_media_player_factory),
script_runner_(script_runner),
media_source_registry_(media_source_registry),
diff --git a/src/cobalt/dom/html_element_context.h b/src/cobalt/dom/html_element_context.h
index b1c9847..642a4a0 100644
--- a/src/cobalt/dom/html_element_context.h
+++ b/src/cobalt/dom/html_element_context.h
@@ -28,6 +28,7 @@
#include "cobalt/loader/fetcher_factory.h"
#include "cobalt/loader/font/remote_typeface_cache.h"
#include "cobalt/loader/image/image_cache.h"
+#include "cobalt/media/can_play_type_handler.h"
#include "cobalt/media/web_media_player_factory.h"
#include "cobalt/script/script_runner.h"
@@ -43,6 +44,7 @@
public:
HTMLElementContext(loader::FetcherFactory* fetcher_factory,
cssom::CSSParser* css_parser, Parser* dom_parser,
+ media::CanPlayTypeHandler* can_play_type_handler,
media::WebMediaPlayerFactory* web_media_player_factory,
script::ScriptRunner* script_runner,
MediaSource::Registry* media_source_registry,
@@ -59,6 +61,9 @@
Parser* dom_parser() { return dom_parser_; }
+ media::CanPlayTypeHandler* can_play_type_handler() {
+ return can_play_type_handler_;
+ }
media::WebMediaPlayerFactory* web_media_player_factory() {
return web_media_player_factory_;
}
@@ -92,6 +97,7 @@
loader::FetcherFactory* const fetcher_factory_;
cssom::CSSParser* const css_parser_;
Parser* const dom_parser_;
+ media::CanPlayTypeHandler* can_play_type_handler_;
media::WebMediaPlayerFactory* const web_media_player_factory_;
script::ScriptRunner* const script_runner_;
MediaSource::Registry* const media_source_registry_;
diff --git a/src/cobalt/dom/html_element_factory_test.cc b/src/cobalt/dom/html_element_factory_test.cc
index 8008245..94b421f 100644
--- a/src/cobalt/dom/html_element_factory_test.cc
+++ b/src/cobalt/dom/html_element_factory_test.cc
@@ -55,6 +55,7 @@
dom_stat_tracker_(new DomStatTracker("HTMLElementFactoryTest")),
html_element_context_(
&fetcher_factory_, &stub_css_parser_, dom_parser_.get(),
+ NULL /* can_play_type_handler */,
NULL /* web_media_player_factory */, &stub_script_runner_,
NULL /* media_source_registry */, NULL /* resource_provider */,
NULL /* image_cache */, NULL /* remote_typeface_cache */,
diff --git a/src/cobalt/dom/html_element_test.cc b/src/cobalt/dom/html_element_test.cc
index 1e8bceb..4561437 100644
--- a/src/cobalt/dom/html_element_test.cc
+++ b/src/cobalt/dom/html_element_test.cc
@@ -110,7 +110,7 @@
HTMLElementTest()
: dom_stat_tracker_(new DomStatTracker("HTMLElementTest")),
html_element_context_(NULL, &css_parser_, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, dom_stat_tracker_.get(), ""),
+ NULL, NULL, NULL, dom_stat_tracker_.get(), ""),
document_(new Document(&html_element_context_)) {}
~HTMLElementTest() OVERRIDE {}
diff --git a/src/cobalt/dom/html_media_element.cc b/src/cobalt/dom/html_media_element.cc
index 12a4e8e..4f1bb38 100644
--- a/src/cobalt/dom/html_media_element.cc
+++ b/src/cobalt/dom/html_media_element.cc
@@ -168,13 +168,15 @@
LoadInternal();
}
-std::string HTMLMediaElement::CanPlayType(const std::string& mime_type) const {
+std::string HTMLMediaElement::CanPlayType(const std::string& mime_type) {
return CanPlayType(mime_type, "");
}
std::string HTMLMediaElement::CanPlayType(const std::string& mime_type,
- const std::string& key_system) const {
- std::string result = ::media::CanPlayType(mime_type, key_system);
+ const std::string& key_system) {
+ std::string result =
+ html_element_context()->can_play_type_handler()->CanPlayType(mime_type,
+ key_system);
DLOG(INFO) << "HTMLMediaElement::canPlayType(" << mime_type << ", "
<< key_system << ") -> " << result;
return result;
diff --git a/src/cobalt/dom/html_media_element.h b/src/cobalt/dom/html_media_element.h
index 823e006..300874f 100644
--- a/src/cobalt/dom/html_media_element.h
+++ b/src/cobalt/dom/html_media_element.h
@@ -69,9 +69,9 @@
scoped_refptr<TimeRanges> buffered() const;
void Load();
- std::string CanPlayType(const std::string& mimeType) const;
+ std::string CanPlayType(const std::string& mimeType);
std::string CanPlayType(const std::string& mimeType,
- const std::string& key_system) const;
+ const std::string& key_system);
void GenerateKeyRequest(
const std::string& key_system,
const base::optional<scoped_refptr<Uint8Array> >& init_data,
diff --git a/src/cobalt/dom/node_dispatch_event_test.cc b/src/cobalt/dom/node_dispatch_event_test.cc
index 5db9eaa..d3368ef 100644
--- a/src/cobalt/dom/node_dispatch_event_test.cc
+++ b/src/cobalt/dom/node_dispatch_event_test.cc
@@ -59,7 +59,7 @@
NodeDispatchEventTest::NodeDispatchEventTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, "") {
+ NULL, NULL, NULL, "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
document_ = new Document(&html_element_context_);
diff --git a/src/cobalt/dom/node_list_live_test.cc b/src/cobalt/dom/node_list_live_test.cc
index bf041b3..b8e6702 100644
--- a/src/cobalt/dom/node_list_live_test.cc
+++ b/src/cobalt/dom/node_list_live_test.cc
@@ -30,7 +30,7 @@
NodeListLiveTest()
: dom_stat_tracker_("NodeListLiveTest"),
html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, &dom_stat_tracker_, ""),
+ NULL, NULL, &dom_stat_tracker_, ""),
document_(new Document(&html_element_context_)) {}
~NodeListLiveTest() OVERRIDE {}
diff --git a/src/cobalt/dom/node_list_test.cc b/src/cobalt/dom/node_list_test.cc
index 999d442..a93339a 100644
--- a/src/cobalt/dom/node_list_test.cc
+++ b/src/cobalt/dom/node_list_test.cc
@@ -30,7 +30,7 @@
NodeListTest()
: dom_stat_tracker_(new DomStatTracker("NodeListTest")),
html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, dom_stat_tracker_.get(), ""),
+ NULL, NULL, dom_stat_tracker_.get(), ""),
document_(new Document(&html_element_context_)) {}
~NodeListTest() OVERRIDE {}
diff --git a/src/cobalt/dom/rule_matching_test.cc b/src/cobalt/dom/rule_matching_test.cc
index 3be7b17..2d1b118 100644
--- a/src/cobalt/dom/rule_matching_test.cc
+++ b/src/cobalt/dom/rule_matching_test.cc
@@ -45,7 +45,7 @@
dom_parser_(new dom_parser::Parser()),
dom_stat_tracker_(new DomStatTracker("RuleMatchingTest")),
html_element_context_(NULL, css_parser_.get(), dom_parser_.get(), NULL,
- NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
dom_stat_tracker_.get(), ""),
document_(new Document(&html_element_context_)),
root_(document_->CreateElement("html")->AsHTMLElement()) {
diff --git a/src/cobalt/dom/serializer_test.cc b/src/cobalt/dom/serializer_test.cc
index 678cd45..ec16354 100644
--- a/src/cobalt/dom/serializer_test.cc
+++ b/src/cobalt/dom/serializer_test.cc
@@ -47,7 +47,7 @@
: dom_parser_(new dom_parser::Parser()),
dom_stat_tracker_(new DomStatTracker("SerializerTest")),
html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, dom_stat_tracker_.get(), ""),
+ NULL, NULL, dom_stat_tracker_.get(), ""),
document_(new Document(&html_element_context_)),
root_(new Element(document_, base::Token("root"))),
source_location_(base::SourceLocation("[object SerializerTest]", 1, 1)) {}
diff --git a/src/cobalt/dom/text_test.cc b/src/cobalt/dom/text_test.cc
index 799c3dd..536b42f 100644
--- a/src/cobalt/dom/text_test.cc
+++ b/src/cobalt/dom/text_test.cc
@@ -41,7 +41,7 @@
TextTest::TextTest()
: html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, "") {
+ NULL, NULL, NULL, "") {
EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
document_ = new Document(&html_element_context_);
}
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index cdab450..e901752 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -66,6 +66,7 @@
loader::image::ImageCache* image_cache,
loader::font::RemoteTypefaceCache* remote_typeface_cache,
LocalStorageDatabase* local_storage_database,
+ media::CanPlayTypeHandler* can_play_type_handler,
media::WebMediaPlayerFactory* web_media_player_factory,
script::ExecutionState* execution_state,
script::ScriptRunner* script_runner,
@@ -83,9 +84,10 @@
: width_(width),
height_(height),
html_element_context_(new HTMLElementContext(
- fetcher_factory, css_parser, dom_parser, web_media_player_factory,
- script_runner, media_source_registry, resource_provider, image_cache,
- remote_typeface_cache, dom_stat_tracker, language)),
+ fetcher_factory, css_parser, dom_parser, can_play_type_handler,
+ web_media_player_factory, script_runner, media_source_registry,
+ resource_provider, image_cache, remote_typeface_cache,
+ dom_stat_tracker, language)),
performance_(new Performance(new base::SystemMonotonicClock())),
ALLOW_THIS_IN_INITIALIZER_LIST(document_(new Document(
html_element_context_.get(),
@@ -214,23 +216,51 @@
DLOG_IF(WARNING, timeout < 0)
<< "Window::SetTimeout received negative timeout: " << timeout;
timeout = std::max(timeout, 0);
- return window_timers_->SetTimeout(handler, timeout);
+
+ int return_value = 0;
+ if (window_timers_) {
+ return_value = window_timers_->SetTimeout(handler, timeout);
+ } else {
+ DLOG(WARNING) << "window_timers_ does not exist. Already destroyed?";
+ }
+
+ return return_value;
}
-void Window::ClearTimeout(int handle) { window_timers_->ClearTimeout(handle); }
+void Window::ClearTimeout(int handle) {
+ if (window_timers_) {
+ window_timers_->ClearTimeout(handle);
+ } else {
+ DLOG(WARNING) << "window_timers_ does not exist. Already destroyed?";
+ }
+}
int Window::SetInterval(const WindowTimers::TimerCallbackArg& handler,
int timeout) {
DLOG_IF(WARNING, timeout < 0)
<< "Window::SetInterval received negative timeout: " << timeout;
timeout = std::max(timeout, 0);
- return window_timers_->SetInterval(handler, timeout);
+
+ int return_value = 0;
+ if (window_timers_) {
+ return_value = window_timers_->SetInterval(handler, timeout);
+ } else {
+ DLOG(WARNING) << "window_timers_ does not exist. Already destroyed?";
+ }
+
+ return return_value;
}
void Window::ClearInterval(int handle) {
- window_timers_->ClearInterval(handle);
+ if (window_timers_) {
+ window_timers_->ClearInterval(handle);
+ } else {
+ DLOG(WARNING) << "window_timers_ does not exist. Already destroyed?";
+ }
}
+void Window::DestroyTimers() { window_timers_.reset(); }
+
scoped_refptr<Storage> Window::local_storage() const { return local_storage_; }
scoped_refptr<Storage> Window::session_storage() const {
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h
index 196c987..2bb6c07 100644
--- a/src/cobalt/dom/window.h
+++ b/src/cobalt/dom/window.h
@@ -46,6 +46,7 @@
#include "cobalt/loader/font/remote_typeface_cache.h"
#include "cobalt/loader/image/image_cache.h"
#include "cobalt/loader/loader.h"
+#include "cobalt/media/can_play_type_handler.h"
#include "cobalt/media/web_media_player_factory.h"
#include "cobalt/script/callback_function.h"
#include "cobalt/script/environment_settings.h"
@@ -90,6 +91,7 @@
loader::image::ImageCache* image_cache,
loader::font::RemoteTypefaceCache* remote_typeface_cache,
LocalStorageDatabase* local_storage_database,
+ media::CanPlayTypeHandler* can_play_type_handler,
media::WebMediaPlayerFactory* web_media_player_factory,
script::ExecutionState* execution_state,
script::ScriptRunner* script_runner,
@@ -202,6 +204,8 @@
void ClearInterval(int handle);
+ void DestroyTimers();
+
// Web API: Storage (implements)
scoped_refptr<Storage> local_storage() const;
scoped_refptr<Storage> session_storage() const;
diff --git a/src/cobalt/dom/window_test.cc b/src/cobalt/dom/window_test.cc
index 926a308..2a5db90 100644
--- a/src/cobalt/dom/window_test.cc
+++ b/src/cobalt/dom/window_test.cc
@@ -54,8 +54,8 @@
window_(new Window(
1920, 1080, css_parser_.get(), dom_parser_.get(),
fetcher_factory_.get(), NULL, NULL, NULL, &local_storage_database_,
- stub_media_module_.get(), NULL, NULL, NULL, NULL, url_, "", "en-US",
- base::Callback<void(const GURL &)>(),
+ stub_media_module_.get(), stub_media_module_.get(), NULL, NULL,
+ NULL, NULL, url_, "", "en-US", base::Callback<void(const GURL &)>(),
base::Bind(&MockErrorCallback::Run,
base::Unretained(&mock_error_callback_)),
NULL, network_bridge::PostSender(),
diff --git a/src/cobalt/dom/window_timers.cc b/src/cobalt/dom/window_timers.cc
index df784cd..54f19ff 100644
--- a/src/cobalt/dom/window_timers.cc
+++ b/src/cobalt/dom/window_timers.cc
@@ -27,6 +27,12 @@
int WindowTimers::SetTimeout(const TimerCallbackArg& handler, int timeout) {
int handle = GetFreeTimerHandle();
DCHECK(handle);
+
+ if (handle == 0) { // unable to get a free timer handle
+ // avoid accidentally overwriting existing timers
+ return 0;
+ }
+
scoped_ptr<base::Timer> timer(new base::OneShotTimer<TimerInfo>());
timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
base::Bind(&WindowTimers::RunTimerCallback,
@@ -40,6 +46,12 @@
int WindowTimers::SetInterval(const TimerCallbackArg& handler, int timeout) {
int handle = GetFreeTimerHandle();
DCHECK(handle);
+
+ if (handle == 0) { // unable to get a free timer handle
+ // avoid accidentally overwriting existing timers
+ return 0;
+ }
+
scoped_ptr<base::Timer> timer(new base::RepeatingTimer<TimerInfo>());
timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
base::Bind(&WindowTimers::RunTimerCallback,
@@ -50,6 +62,8 @@
void WindowTimers::ClearInterval(int handle) { timers_.erase(handle); }
+void WindowTimers::ClearAllIntervalsAndTimeouts() { timers_.clear(); }
+
int WindowTimers::GetFreeTimerHandle() {
int next_timer_index = current_timer_index_;
while (true) {
diff --git a/src/cobalt/dom/window_timers.h b/src/cobalt/dom/window_timers.h
index 412f613..aa63575 100644
--- a/src/cobalt/dom/window_timers.h
+++ b/src/cobalt/dom/window_timers.h
@@ -44,6 +44,8 @@
void ClearInterval(int handle);
+ void ClearAllIntervalsAndTimeouts();
+
private:
class TimerInfo : public base::RefCounted<TimerInfo> {
public:
diff --git a/src/cobalt/dom_parser/html_decoder_test.cc b/src/cobalt/dom_parser/html_decoder_test.cc
index a3c5a22..d9ca19a 100644
--- a/src/cobalt/dom_parser/html_decoder_test.cc
+++ b/src/cobalt/dom_parser/html_decoder_test.cc
@@ -64,10 +64,11 @@
: fetcher_factory_(NULL /* network_module */),
dom_parser_(new Parser()),
dom_stat_tracker_(new dom::DomStatTracker("HTMLDecoderTest")),
- html_element_context_(
- &fetcher_factory_, &stub_css_parser_, dom_parser_.get(),
- NULL /* web_media_player_factory */, &stub_script_runner_, NULL, NULL,
- NULL, NULL, dom_stat_tracker_.get(), ""),
+ html_element_context_(&fetcher_factory_, &stub_css_parser_,
+ dom_parser_.get(), NULL /* can_play_type_handler */,
+ NULL /* web_media_player_factory */,
+ &stub_script_runner_, NULL, NULL, NULL, NULL,
+ dom_stat_tracker_.get(), ""),
document_(
new dom::Document(&html_element_context_, dom::Document::Options())),
root_(new dom::Element(document_, base::Token("element"))),
diff --git a/src/cobalt/dom_parser/libxml_parser_wrapper.cc b/src/cobalt/dom_parser/libxml_parser_wrapper.cc
index b6e09a7..993e453 100644
--- a/src/cobalt/dom_parser/libxml_parser_wrapper.cc
+++ b/src/cobalt/dom_parser/libxml_parser_wrapper.cc
@@ -159,8 +159,17 @@
element->SetAttribute(attributes[i].name.as_string(),
attributes[i].value.as_string());
}
- element->OnParserStartTag(GetSourceLocation());
- node_stack_.top()->InsertBefore(element, reference_node_);
+
+ if (node_stack_.size() < kMaxStackDepth) {
+ element->OnParserStartTag(GetSourceLocation());
+ node_stack_.top()->InsertBefore(element, reference_node_);
+ } else {
+ if (!depth_limit_exceeded_) {
+ depth_limit_exceeded_ = true;
+ LOG(WARNING) << "Parser discarded deeply nested elements.";
+ }
+ }
+
node_stack_.push(element);
}
@@ -168,7 +177,11 @@
while (!node_stack_.empty()) {
scoped_refptr<dom::Element> element = node_stack_.top()->AsElement();
node_stack_.pop();
- element->OnParserEndTag();
+
+ if (node_stack_.size() < kMaxStackDepth) {
+ element->OnParserEndTag();
+ }
+
if (element->node_name() == name) {
return;
}
diff --git a/src/cobalt/dom_parser/libxml_parser_wrapper.h b/src/cobalt/dom_parser/libxml_parser_wrapper.h
index 8114403..4f39651 100644
--- a/src/cobalt/dom_parser/libxml_parser_wrapper.h
+++ b/src/cobalt/dom_parser/libxml_parser_wrapper.h
@@ -78,6 +78,10 @@
};
typedef std::vector<ParserAttribute> ParserAttributeVector;
+ // This restricts the depth of the nodes in the DOM tree. All elements at a
+ // depth deeper than this will be discarded.
+ static const size_t kMaxStackDepth = 32;
+
LibxmlParserWrapper(
const scoped_refptr<dom::Document>& document,
const scoped_refptr<dom::Node>& parent_node,
@@ -89,6 +93,7 @@
reference_node_(reference_node),
first_chunk_location_(first_chunk_location),
error_callback_(error_callback),
+ depth_limit_exceeded_(false),
issue_level_(kNoIssue) {}
virtual ~LibxmlParserWrapper() {}
@@ -137,6 +142,7 @@
const scoped_refptr<dom::Node> reference_node_;
const base::SourceLocation first_chunk_location_;
const base::Callback<void(const std::string&)> error_callback_;
+ bool depth_limit_exceeded_;
IssueSeverity issue_level_;
std::stack<scoped_refptr<dom::Node> > node_stack_;
diff --git a/src/cobalt/h5vcc/h5vcc_account_manager.cc b/src/cobalt/h5vcc/h5vcc_account_manager.cc
index 69dd9db..0d239fa 100644
--- a/src/cobalt/h5vcc/h5vcc_account_manager.cc
+++ b/src/cobalt/h5vcc/h5vcc_account_manager.cc
@@ -17,6 +17,7 @@
#include "cobalt/h5vcc/h5vcc_account_manager.h"
#include "base/memory/scoped_ptr.h"
+#include "starboard/ps4/application_linking.h"
#include "starboard/user.h"
namespace cobalt {
diff --git a/src/cobalt/layout/anonymous_block_box.cc b/src/cobalt/layout/anonymous_block_box.cc
index 281cc70..4be8d5f 100644
--- a/src/cobalt/layout/anonymous_block_box.cc
+++ b/src/cobalt/layout/anonymous_block_box.cc
@@ -150,46 +150,42 @@
while (child_box_iterator != child_boxes().end()) {
Box* child_box = *child_box_iterator;
- if (child_box->IsAbsolutelyPositioned()) {
- inline_formatting_context->BeginEstimateStaticPosition(child_box);
- } else {
- // Attempt to add the child box to the inline formatting context.
- Box* child_box_before_wrap =
- inline_formatting_context->TryAddChildAndMaybeWrap(child_box);
- // If |child_box_before_wrap| is non-NULL, then trying to add the child
- // box caused a line wrap to occur, and |child_box_before_wrap| is set to
- // the last box that was successfully placed on the line. This can
- // potentially be any of the child boxes previously added. Any boxes
- // following the returned box, including ones that were previously
- // added, still need to be added to the inline formatting context.
- if (child_box_before_wrap) {
- // Iterate backwards until the last box added to the line is found, and
- // then increment the iterator, so that it is pointing at the location
- // of the first box to add the next time through the loop.
- while (*child_box_iterator != child_box_before_wrap) {
- --child_box_iterator;
- }
+ // Attempt to add the child box to the inline formatting context.
+ Box* child_box_before_wrap =
+ inline_formatting_context->TryAddChildAndMaybeWrap(child_box);
+ // If |child_box_before_wrap| is non-NULL, then trying to add the child
+ // box caused a line wrap to occur, and |child_box_before_wrap| is set to
+ // the last box that was successfully placed on the line. This can
+ // potentially be any of the child boxes previously added. Any boxes
+ // following the returned box, including ones that were previously
+ // added, still need to be added to the inline formatting context.
+ if (child_box_before_wrap) {
+ // Iterate backwards until the last box added to the line is found, and
+ // then increment the iterator, so that it is pointing at the location
+ // of the first box to add the next time through the loop.
+ while (*child_box_iterator != child_box_before_wrap) {
+ --child_box_iterator;
+ }
- // If |child_box_before_wrap| has a split sibling, then this potentially
- // means that a split occurred during the wrap, and a new box needs to
- // be added to the container (this will also need to be the first box
- // added to the inline formatting context).
- //
- // If the split sibling is from a previous split, then it would have
- // already been added to the line and |child_box_iterator| should
- // be currently pointing at it. If this is not the case, then we know
- // that this is a new box produced during the wrap, and it must be
- // added to the container. This will be the first box added during
- // the next iteration of the loop.
- Box* split_child_after_wrap = child_box_before_wrap->GetSplitSibling();
- Boxes::const_iterator next_child_box_iterator = child_box_iterator + 1;
- if (split_child_after_wrap &&
- (next_child_box_iterator == child_boxes().end() ||
- *next_child_box_iterator != split_child_after_wrap)) {
- child_box_iterator =
- InsertSplitSiblingOfDirectChild(child_box_iterator);
- continue;
- }
+ // If |child_box_before_wrap| has a split sibling, then this potentially
+ // means that a split occurred during the wrap, and a new box needs to
+ // be added to the container (this will also need to be the first box
+ // added to the inline formatting context).
+ //
+ // If the split sibling is from a previous split, then it would have
+ // already been added to the line and |child_box_iterator| should
+ // be currently pointing at it. If this is not the case, then we know
+ // that this is a new box produced during the wrap, and it must be
+ // added to the container. This will be the first box added during
+ // the next iteration of the loop.
+ Box* split_child_after_wrap = child_box_before_wrap->GetSplitSibling();
+ Boxes::const_iterator next_child_box_iterator = child_box_iterator + 1;
+ if (split_child_after_wrap &&
+ (next_child_box_iterator == child_boxes().end() ||
+ *next_child_box_iterator != split_child_after_wrap)) {
+ child_box_iterator =
+ InsertSplitSiblingOfDirectChild(child_box_iterator);
+ continue;
}
}
diff --git a/src/cobalt/layout/box.cc b/src/cobalt/layout/box.cc
index c8739ee..4a57476 100644
--- a/src/cobalt/layout/box.cc
+++ b/src/cobalt/layout/box.cc
@@ -989,6 +989,13 @@
}
}
+namespace {
+bool AllBorderSidesShareSameProperties(const Border& border) {
+ return border.left == border.top && border.left == border.right &&
+ border.left == border.bottom;
+}
+} // namespace
+
void Box::RenderAndAnimateBorder(
const base::optional<RoundedCorners>& rounded_corners,
CompositionNode::Builder* border_node_builder,
@@ -1004,6 +1011,14 @@
SetupBorderNodeFromStyle(rounded_corners, computed_style(),
&rect_node_builder);
+ if (rounded_corners &&
+ !AllBorderSidesShareSameProperties(*rect_node_builder.border)) {
+ LOG(WARNING)
+ << "Cobalt does not support rounded corners borders whose edges do not "
+ "all share the same properties.";
+ return;
+ }
+
scoped_refptr<RectNode> border_node(new RectNode(rect_node_builder.Pass()));
border_node_builder->AddChild(border_node);
diff --git a/src/cobalt/layout/box_generator.cc b/src/cobalt/layout/box_generator.cc
index 99f2b2c..2cfb06b 100644
--- a/src/cobalt/layout/box_generator.cc
+++ b/src/cobalt/layout/box_generator.cc
@@ -26,6 +26,7 @@
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_value_visitor.h"
+#include "cobalt/cssom/url_value.h"
#include "cobalt/dom/html_br_element.h"
#include "cobalt/dom/html_element.h"
#include "cobalt/dom/html_video_element.h"
@@ -631,6 +632,12 @@
is_element_generated_ = true;
}
+ void VisitURL(cssom::URLValue* url_value) OVERRIDE {
+ // TODO: Implement support for 'content: url(foo)'.
+ DLOG(ERROR) << "Unsupported content property value: "
+ << url_value->ToString();
+ }
+
void VisitKeyword(cssom::KeywordValue* keyword) OVERRIDE {
switch (keyword->value()) {
case cssom::KeywordValue::kNone:
diff --git a/src/cobalt/layout/inline_container_box.cc b/src/cobalt/layout/inline_container_box.cc
index 4ce8255..2215a46 100644
--- a/src/cobalt/layout/inline_container_box.cc
+++ b/src/cobalt/layout/inline_container_box.cc
@@ -109,12 +109,7 @@
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()) {
- line_box.BeginEstimateStaticPosition(child_box);
- } else {
- line_box.BeginAddChildAndMaybeOverflow(child_box);
- }
+ line_box.BeginAddChildAndMaybeOverflow(*child_box_iterator);
}
line_box.EndUpdates();
diff --git a/src/cobalt/layout/inline_formatting_context.cc b/src/cobalt/layout/inline_formatting_context.cc
index a1d4098..eb739e2 100644
--- a/src/cobalt/layout/inline_formatting_context.cc
+++ b/src/cobalt/layout/inline_formatting_context.cc
@@ -48,8 +48,6 @@
InlineFormattingContext::~InlineFormattingContext() {}
Box* InlineFormattingContext::TryAddChildAndMaybeWrap(Box* child_box) {
- DCHECK(child_box->GetLevel() == Box::kInlineLevel);
-
// When an inline box exceeds the width of a line box, it is split into
// several boxes and these boxes are distributed across several line boxes.
// https://www.w3.org/TR/CSS21/visuren.html#inline-formatting
@@ -65,10 +63,6 @@
return child_box_before_wrap;
}
-void InlineFormattingContext::BeginEstimateStaticPosition(Box* child_box) {
- line_box_->BeginEstimateStaticPosition(child_box);
-}
-
void InlineFormattingContext::EndUpdates() {
// Treat the end of child boxes almost as an explicit line break,
// but don't create the new line box.
diff --git a/src/cobalt/layout/inline_formatting_context.h b/src/cobalt/layout/inline_formatting_context.h
index 1611dd2..d19cca5 100644
--- a/src/cobalt/layout/inline_formatting_context.h
+++ b/src/cobalt/layout/inline_formatting_context.h
@@ -79,10 +79,6 @@
// child boxes. The used values will be undefined until |EndUpdates| is
// called.
Box* TryAddChildAndMaybeWrap(Box* child_box);
- // Asynchronously estimates the static position of the given child box.
- // In CSS 2.1 the static position is only defined for absolutely positioned
- // boxes. The position is undefined until |EndUpdates| is called.
- void BeginEstimateStaticPosition(Box* child_box);
// Ensures that the calculation of used values for all previously seen child
// boxes is completed.
void EndUpdates();
diff --git a/src/cobalt/layout/line_box.cc b/src/cobalt/layout/line_box.cc
index 9012f31..7a72a16 100644
--- a/src/cobalt/layout/line_box.cc
+++ b/src/cobalt/layout/line_box.cc
@@ -55,6 +55,7 @@
ellipsis_width_(ellipsis_width),
has_overflowed_(false),
at_end_(false),
+ num_absolutely_positioned_boxes_before_first_box_justifying_line_(0),
shrink_to_fit_width_(indent_offset_),
height_(0),
baseline_offset_from_top_(0),
@@ -62,9 +63,13 @@
placed_ellipsis_offset_(0) {}
Box* LineBox::TryAddChildAndMaybeWrap(Box* child_box) {
- DCHECK(!child_box->IsAbsolutelyPositioned());
DCHECK(!at_end_);
+ if (child_box->IsAbsolutelyPositioned()) {
+ BeginEstimateStaticPositionForAbsolutelyPositionedChild(child_box);
+ return NULL;
+ }
+
UpdateSizePreservingTrailingWhiteSpace(child_box);
// If the line box hasn't already overflowed the line, then attempt to add it
@@ -131,52 +136,15 @@
}
void LineBox::BeginAddChildAndMaybeOverflow(Box* child_box) {
- DCHECK(!child_box->IsAbsolutelyPositioned());
+ if (child_box->IsAbsolutelyPositioned()) {
+ BeginEstimateStaticPositionForAbsolutelyPositionedChild(child_box);
+ return;
+ }
UpdateSizePreservingTrailingWhiteSpace(child_box);
BeginAddChildInternal(child_box);
}
-void LineBox::BeginEstimateStaticPosition(Box* child_box) {
- DCHECK(child_box->IsAbsolutelyPositioned());
-
- // The term "static position" (of an element) refers, roughly, to the position
- // an element would have had in the normal flow. More precisely:
- //
- // The static-position containing block is the containing block of a
- // hypothetical box that would have been the first box of the element if its
- // specified 'position' value had been 'static'.
- //
- // The static position for 'left' is the distance from the left edge of the
- // containing block to the left margin edge of a hypothetical box that would
- // have been the first box of the element if its 'position' property had been
- // 'static' and 'float' had been 'none'. The value is negative if the
- // hypothetical box is to the left of the containing block.
- // https://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width
-
- // For the purposes of this section and the next, the term "static position"
- // (of an element) refers, roughly, to the position an element would have had
- // in the normal flow. More precisely, the static position for 'top' is the
- // distance from the top edge of the containing block to the top margin edge
- // of a hypothetical box that would have been the first box of the element if
- // its specified 'position' value had been 'static'.
- // https://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height
-
- switch (child_box->GetLevel()) {
- case Box::kInlineLevel:
- // NOTE: This case is never reached due to a bug.
- child_box->SetStaticPositionLeftFromParent(shrink_to_fit_width_);
- break;
- case Box::kBlockLevel:
- child_box->SetStaticPositionLeftFromParent(LayoutUnit());
- break;
- default:
- NOTREACHED();
- break;
- }
- child_box->SetStaticPositionTopFromParent(LayoutUnit());
-}
-
void LineBox::EndUpdates() {
at_end_ = true;
@@ -186,6 +154,12 @@
CollapseTrailingWhiteSpace();
}
+ // Set the leading and trailing white space flags now. This ensures that the
+ // values returned by HasLeadingWhiteSpace() and HasTrailingWhiteSpace()
+ // remain valid even after bidi reversals.
+ has_leading_white_space_ = HasLeadingWhiteSpace();
+ has_trailing_white_space_ = HasTrailingWhiteSpace();
+
ReverseChildBoxesByBidiLevels();
UpdateChildBoxLeftPositions();
SetLineBoxHeightFromChildBoxes();
@@ -194,15 +168,31 @@
}
bool LineBox::HasLeadingWhiteSpace() const {
- return first_non_collapsed_child_box_index_ &&
- child_boxes_[*first_non_collapsed_child_box_index_]
- ->HasLeadingWhiteSpace();
+ // |has_leading_white_space_| should only ever be set by EndUpdates() after
+ // |at_end_| has been set to true;
+ DCHECK(at_end_ || !has_leading_white_space_);
+
+ // If |has_leading_white_space_| has been set, then use it. Otherwise, grab
+ // the leading white space state from the first non-collapsed child box.
+ return has_leading_white_space_
+ ? *has_leading_white_space_
+ : first_non_collapsed_child_box_index_ &&
+ child_boxes_[*first_non_collapsed_child_box_index_]
+ ->HasLeadingWhiteSpace();
}
bool LineBox::HasTrailingWhiteSpace() const {
- return last_non_collapsed_child_box_index_ &&
- child_boxes_[*last_non_collapsed_child_box_index_]
- ->HasTrailingWhiteSpace();
+ // |has_trailing_white_space_| should only ever be set by EndUpdates() after
+ // |at_end_| has been set to true;
+ DCHECK(at_end_ || !has_trailing_white_space_);
+
+ // If |has_trailing_white_space_| has been set, then use it. Otherwise, grab
+ // the trailing white space state from the last non-collapsed child box.
+ return has_trailing_white_space_
+ ? *has_trailing_white_space_
+ : last_non_collapsed_child_box_index_ &&
+ child_boxes_[*last_non_collapsed_child_box_index_]
+ ->HasTrailingWhiteSpace();
}
bool LineBox::IsCollapsed() const {
@@ -215,7 +205,8 @@
size_t LineBox::GetFirstBoxJustifyingLineExistenceIndex() const {
return first_box_justifying_line_existence_index_.value_or(
- child_boxes_.size());
+ child_boxes_.size()) +
+ num_absolutely_positioned_boxes_before_first_box_justifying_line_;
}
bool LineBox::IsEllipsisPlaced() const { return is_ellipsis_placed_; }
@@ -474,6 +465,49 @@
return false;
}
+void LineBox::BeginEstimateStaticPositionForAbsolutelyPositionedChild(
+ Box* child_box) {
+ if (!first_box_justifying_line_existence_index_) {
+ ++num_absolutely_positioned_boxes_before_first_box_justifying_line_;
+ }
+
+ // The term "static position" (of an element) refers, roughly, to the position
+ // an element would have had in the normal flow. More precisely:
+ //
+ // The static-position containing block is the containing block of a
+ // hypothetical box that would have been the first box of the element if its
+ // specified 'position' value had been 'static'.
+ //
+ // The static position for 'left' is the distance from the left edge of the
+ // containing block to the left margin edge of a hypothetical box that would
+ // have been the first box of the element if its 'position' property had been
+ // 'static' and 'float' had been 'none'. The value is negative if the
+ // hypothetical box is to the left of the containing block.
+ // https://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width
+
+ // For the purposes of this section and the next, the term "static position"
+ // (of an element) refers, roughly, to the position an element would have had
+ // in the normal flow. More precisely, the static position for 'top' is the
+ // distance from the top edge of the containing block to the top margin edge
+ // of a hypothetical box that would have been the first box of the element if
+ // its specified 'position' value had been 'static'.
+ // https://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height
+
+ switch (child_box->GetLevel()) {
+ case Box::kInlineLevel:
+ // NOTE: This case is never reached due to a bug.
+ child_box->SetStaticPositionLeftFromParent(shrink_to_fit_width_);
+ break;
+ case Box::kBlockLevel:
+ child_box->SetStaticPositionLeftFromParent(LayoutUnit());
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ child_box->SetStaticPositionTopFromParent(LayoutUnit());
+}
+
void LineBox::BeginAddChildInternal(Box* child_box) {
if (!first_box_justifying_line_existence_index_ &&
child_box->JustifiesLineExistence()) {
diff --git a/src/cobalt/layout/line_box.h b/src/cobalt/layout/line_box.h
index a330f96..af97faa 100644
--- a/src/cobalt/layout/line_box.h
+++ b/src/cobalt/layout/line_box.h
@@ -84,10 +84,6 @@
// Asynchronously adds the given child box to the line, ignoring any possible
// overflow. The used values will be undefined until |EndUpdates| is called.
void BeginAddChildAndMaybeOverflow(Box* child_box);
- // Asynchronously estimates the static position of the given child box.
- // In CSS 2.1 the static position is only defined for absolutely positioned
- // boxes. The used values will be undefined until |EndUpdates| is called.
- void BeginEstimateStaticPosition(Box* child_box);
// Ensures that the calculation of used values for all previously seen child
// boxes is completed.
void EndUpdates();
@@ -108,6 +104,8 @@
// treated as not existing for any other purpose.
// https://www.w3.org/TR/CSS21/visuren.html#inline-formatting
bool LineExists() const;
+ // Returns the first box justifing the line's existence.
+ // NOTE: This includes absolutely positioned children.
size_t GetFirstBoxJustifyingLineExistenceIndex() const;
bool IsEllipsisPlaced() const;
@@ -147,6 +145,11 @@
bool TryWrapChildrenAtLastOpportunity(
WrapOpportunityPolicy wrap_opportunity_policy);
+ // Asynchronously estimates the static position of the given child box.
+ // In CSS 2.1 the static position is only defined for absolutely positioned
+ // boxes. The used values will be undefined until |EndUpdates| is called.
+ void BeginEstimateStaticPositionForAbsolutelyPositionedChild(Box* child_box);
+
void BeginAddChildInternal(Box* child_box);
void ReverseChildBoxesByBidiLevels();
@@ -183,10 +186,21 @@
typedef std::vector<Box*> ChildBoxes;
ChildBoxes child_boxes_;
+ int num_absolutely_positioned_boxes_before_first_box_justifying_line_;
+
+ // Accessing boxes indicated by these indices are only valid before
+ // EndUpdates() is called, because the positions of the boxes may change
+ // during bidirectional sorting.
base::optional<size_t> first_box_justifying_line_existence_index_;
base::optional<size_t> first_non_collapsed_child_box_index_;
base::optional<size_t> last_non_collapsed_child_box_index_;
+ // These flags are set when EndUpdates() is called. This allows the leading
+ // and trailing white space state of the line to be accessible even after
+ // the boxes have been moved as a result of bidirectional sorting.
+ base::optional<bool> has_leading_white_space_;
+ base::optional<bool> has_trailing_white_space_;
+
LayoutUnit shrink_to_fit_width_;
LayoutUnit height_;
LayoutUnit baseline_offset_from_top_;
diff --git a/src/cobalt/layout/replaced_box.cc b/src/cobalt/layout/replaced_box.cc
index 15f0d6a..d8a694c 100644
--- a/src/cobalt/layout/replaced_box.cc
+++ b/src/cobalt/layout/replaced_box.cc
@@ -420,20 +420,32 @@
// Constraint: (w < min-width) and (h < min-height), where
// (min-width/w > min-height/h)
set_width(min_width);
- set_height(std::min(*max_height,
- min_width * (h.toFloat() / w.toFloat())));
+ LayoutUnit height = min_width * (h.toFloat() / w.toFloat());
+ if (max_height) {
+ set_height(std::min(*max_height, height));
+ } else {
+ set_height(height);
+ }
} else {
// Constraint: (w < min-width) and (h < min-height), where
// (min-width/w <= min-height/h)
- set_width(std::min(*max_width,
- min_height * (w.toFloat() / h.toFloat())));
+ LayoutUnit width = min_height * (w.toFloat() / h.toFloat());
+ if (max_width) {
+ set_width(std::min(*max_width, width));
+ } else {
+ set_width(width);
+ }
set_height(min_height);
}
} else { // not h < min-height
// Constraint: w < min-width
set_width(min_width);
- set_height(
- std::min(min_width * (h.toFloat() / w.toFloat()), *max_height));
+ LayoutUnit height = min_width * (h.toFloat() / w.toFloat());
+ if (max_height) {
+ set_height(std::min(height, *max_height));
+ } else {
+ set_height(height);
+ }
}
}
} else { // not w < min_width
@@ -445,8 +457,12 @@
} else { // not h_greater_than_max_height
if (h < min_height) {
// Constraint: h < min-height
- set_width(
- std::min(min_height * (w.toFloat() / h.toFloat()), *max_width));
+ LayoutUnit width = min_height * (w.toFloat() / h.toFloat());
+ if (max_width) {
+ set_width(std::min(width, *max_width));
+ } else {
+ set_width(width);
+ }
set_height(min_height);
} else { // not h < min_height
// Constraint: none
diff --git a/src/cobalt/layout/used_style.cc b/src/cobalt/layout/used_style.cc
index b8ca707..02227e0 100644
--- a/src/cobalt/layout/used_style.cc
+++ b/src/cobalt/layout/used_style.cc
@@ -757,14 +757,23 @@
}
}
+// Compares ColorStops by position.
+bool ColorStopPositionComparator(const render_tree::ColorStop& x,
+ const render_tree::ColorStop& y) {
+ return x.position < y.position;
+}
+
render_tree::ColorStopList ConvertToRenderTreeColorStopList(
const cssom::ColorStopList& css_color_stop_list,
float gradient_line_length) {
render_tree::ColorStopList ret;
+ ret.reserve(css_color_stop_list.size());
+
// The description of this process is defined here:
// https://www.w3.org/TR/css3-images/#color-stop-syntax
float largest_position = 0.0f;
+ const float kMaxPositionSupported = 1.0f;
for (size_t i = 0; i < css_color_stop_list.size(); ++i) {
const cssom::ColorStop& css_color_stop = *css_color_stop_list[i];
@@ -791,6 +800,10 @@
// Ensure that it is larger than all previous stop positions.
render_tree_position = std::max(largest_position, render_tree_position);
+ DLOG_IF(WARNING, render_tree_position > kMaxPositionSupported)
+ << "Color stop's position which is larger than 1.0 is not supported";
+ render_tree_position =
+ std::min(render_tree_position, kMaxPositionSupported);
largest_position = render_tree_position;
} else {
// If the position is not specified, fill it in as 0 if it is the first,
@@ -812,6 +825,11 @@
InterpolateUnspecifiedColorStopPositions(&ret);
+ // According to the spec @ https://www.w3.org/TR/css3-images/#linear-gradients
+ // the color-stops can be in unsorted order. The color-stops are sorted
+ // to make the rendering code easier to write and faster to execute.
+ std::sort(ret.begin(), ret.end(), ColorStopPositionComparator);
+
return ret;
}
} // namespace
diff --git a/src/cobalt/layout_tests/layout_tests.cc b/src/cobalt/layout_tests/layout_tests.cc
index 9ceb258..c2e63c0 100644
--- a/src/cobalt/layout_tests/layout_tests.cc
+++ b/src/cobalt/layout_tests/layout_tests.cc
@@ -89,21 +89,20 @@
browser::WebModule::LayoutResults layout_results = SnapshotURL(
GetParam().url, viewport_size, pixel_tester.GetResourceProvider());
- render_tree::animations::AnimateNode* animated_node =
- base::polymorphic_downcast<render_tree::animations::AnimateNode*>(
- layout_results.render_tree.get());
+ scoped_refptr<render_tree::animations::AnimateNode> animate_node =
+ new render_tree::animations::AnimateNode(layout_results.render_tree);
+ scoped_refptr<render_tree::Node> animated_tree =
+ animate_node->Apply(layout_results.layout_time);
bool results =
- pixel_tester.TestTree(animated_node->Apply(layout_results.layout_time),
- GetParam().base_file_path);
+ pixel_tester.TestTree(animated_tree, GetParam().base_file_path);
EXPECT_TRUE(results);
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kRebaseline) ||
(!results &&
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kRebaselineFailedTests))) {
- pixel_tester.Rebaseline(layout_results.render_tree,
- GetParam().base_file_path);
+ pixel_tester.Rebaseline(animated_tree, GetParam().base_file_path);
}
}
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt b/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt
new file mode 100644
index 0000000..e5af5b3
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt
@@ -0,0 +1 @@
+youtube-2015-q3-initial-layout:1920x1080, file:///cobalt/layout_tests/benchmarks/youtube-2015-q3/index.html
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg
new file mode 100644
index 0000000..fc5fc1c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg
new file mode 100644
index 0000000..0b1dda7
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg
new file mode 100644
index 0000000..5abfe0e
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg
new file mode 100644
index 0000000..429bdae
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg
new file mode 100644
index 0000000..861caa9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg
new file mode 100644
index 0000000..75357d6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg
new file mode 100644
index 0000000..e8b0b20
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg
new file mode 100644
index 0000000..40edb65
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg
new file mode 100644
index 0000000..e686f50
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/index.html b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/index.html
new file mode 100644
index 0000000..5d33c44
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/index.html
@@ -0,0 +1,1751 @@
+<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/youtube-2015-q3/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff
new file mode 100644
index 0000000..6ab1ca1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff
new file mode 100644
index 0000000..71b2e76
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/Handlee-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/Handlee-Regular.woff
new file mode 100644
index 0000000..c8f2418
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/Handlee-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff
new file mode 100644
index 0000000..1740d4f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PTM55FT.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PTM55FT.woff
new file mode 100644
index 0000000..e7e96d1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PTM55FT.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff
new file mode 100644
index 0000000..c0e6a2f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff
new file mode 100644
index 0000000..f5599f7
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css
new file mode 100644
index 0000000..c78c202
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css
@@ -0,0 +1 @@
+.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/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png
new file mode 100644
index 0000000..14a8c41
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png
new file mode 100644
index 0000000..79b4fbb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png
new file mode 100644
index 0000000..1022073
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png
new file mode 100644
index 0000000..a1cb606
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png
new file mode 100644
index 0000000..6e017dc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png
new file mode 100644
index 0000000..2efdf75
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png
new file mode 100644
index 0000000..bae7f19
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg
new file mode 100644
index 0000000..4cf9844
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png
new file mode 100644
index 0000000..fdd416d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png
new file mode 100644
index 0000000..da20b33
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png
new file mode 100644
index 0000000..9222c60
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg
new file mode 100644
index 0000000..a55be3c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png
new file mode 100644
index 0000000..6c86373
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png
new file mode 100644
index 0000000..fbafd90
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png
new file mode 100644
index 0000000..1bbade8
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png
new file mode 100644
index 0000000..0f17309
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png
new file mode 100644
index 0000000..35a3db2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png
new file mode 100644
index 0000000..426b4b3
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png
new file mode 100644
index 0000000..c708e76
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png
@@ -0,0 +1,11 @@
+<!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/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png
new file mode 100644
index 0000000..21839e2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png
new file mode 100644
index 0000000..999078d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png
@@ -0,0 +1,11 @@
+<!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/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png
new file mode 100644
index 0000000..8ac546c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png
new file mode 100644
index 0000000..e6f1240
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png
new file mode 100644
index 0000000..b39bd87
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png
new file mode 100644
index 0000000..2a16694
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png
new file mode 100644
index 0000000..c7b3d38
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png
new file mode 100644
index 0000000..87b0492
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png
new file mode 100644
index 0000000..42faaa1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png
new file mode 100644
index 0000000..248782d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png
new file mode 100644
index 0000000..9f37410
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png
new file mode 100644
index 0000000..70da26b
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png
@@ -0,0 +1,11 @@
+<!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/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf
new file mode 100644
index 0000000..929a78f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png
new file mode 100644
index 0000000..ea9e5b8
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png
new file mode 100644
index 0000000..7727e8c
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png
new file mode 100644
index 0000000..f6b0382
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png
new file mode 100644
index 0000000..99979f0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png
new file mode 100644
index 0000000..1d2930b
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png
new file mode 100644
index 0000000..056ccf9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png
new file mode 100644
index 0000000..8d846cb
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png
new file mode 100644
index 0000000..0ecee6d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png
new file mode 100644
index 0000000..7bbb8ba
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png
new file mode 100644
index 0000000..7442d55
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png
new file mode 100644
index 0000000..afab54d
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png
new file mode 100644
index 0000000..bdd2471
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png
new file mode 100644
index 0000000..495f00f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png
new file mode 100644
index 0000000..049ef34
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png
new file mode 100644
index 0000000..7abd5c6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png
new file mode 100644
index 0000000..d283c5a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png
new file mode 100644
index 0000000..8eb2ac0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png
new file mode 100644
index 0000000..b867b7f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png
new file mode 100644
index 0000000..2de9041
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png
new file mode 100644
index 0000000..1fa0d1a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png
new file mode 100644
index 0000000..e73e0fc
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png
new file mode 100644
index 0000000..8e60577
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf
new file mode 100644
index 0000000..0e58508
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg
new file mode 100644
index 0000000..56b34fe
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements-expected.png b/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements-expected.png
new file mode 100644
index 0000000..0a80611
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements.html b/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements.html
new file mode 100644
index 0000000..bc583e3
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/cobalt/1000-nested-elements.html
@@ -0,0 +1,1020 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ body {
+ background-color: white;
+ font-family: Roboto;
+ font-size: 30px;
+ }
+ </style>
+</head>
+<body>
+
+ <!-- 1000 nested <span>s, closing tags are implied. -->
+ <!-- Cobalt should only attach 29 <span>s, since there're the document, <html>
+ and <body> in the stack, given that max depth is 32. -->
+
+ <span>1
+ <span>2
+ <span>3
+ <span>4
+ <span>5
+ <span>6
+ <span>7
+ <span>8
+ <span>9
+ <span>10
+ <span>11
+ <span>12
+ <span>13
+ <span>14
+ <span>15
+ <span>16
+ <span>17
+ <span>18
+ <span>19
+ <span>20
+ <span>21
+ <span>22
+ <span>23
+ <span>24
+ <span>25
+ <span>26
+ <span>27
+ <span>28
+ <span>29
+ <span>30
+ <span>31
+ <span>32
+ <span>33
+ <span>34
+ <span>35
+ <span>36
+ <span>37
+ <span>38
+ <span>39
+ <span>40
+ <span>41
+ <span>42
+ <span>43
+ <span>44
+ <span>45
+ <span>46
+ <span>47
+ <span>48
+ <span>49
+ <span>50
+ <span>51
+ <span>52
+ <span>53
+ <span>54
+ <span>55
+ <span>56
+ <span>57
+ <span>58
+ <span>59
+ <span>60
+ <span>61
+ <span>62
+ <span>63
+ <span>64
+ <span>65
+ <span>66
+ <span>67
+ <span>68
+ <span>69
+ <span>70
+ <span>71
+ <span>72
+ <span>73
+ <span>74
+ <span>75
+ <span>76
+ <span>77
+ <span>78
+ <span>79
+ <span>80
+ <span>81
+ <span>82
+ <span>83
+ <span>84
+ <span>85
+ <span>86
+ <span>87
+ <span>88
+ <span>89
+ <span>90
+ <span>91
+ <span>92
+ <span>93
+ <span>94
+ <span>95
+ <span>96
+ <span>97
+ <span>98
+ <span>99
+ <span>100
+ <span>101
+ <span>102
+ <span>103
+ <span>104
+ <span>105
+ <span>106
+ <span>107
+ <span>108
+ <span>109
+ <span>110
+ <span>111
+ <span>112
+ <span>113
+ <span>114
+ <span>115
+ <span>116
+ <span>117
+ <span>118
+ <span>119
+ <span>120
+ <span>121
+ <span>122
+ <span>123
+ <span>124
+ <span>125
+ <span>126
+ <span>127
+ <span>128
+ <span>129
+ <span>130
+ <span>131
+ <span>132
+ <span>133
+ <span>134
+ <span>135
+ <span>136
+ <span>137
+ <span>138
+ <span>139
+ <span>140
+ <span>141
+ <span>142
+ <span>143
+ <span>144
+ <span>145
+ <span>146
+ <span>147
+ <span>148
+ <span>149
+ <span>150
+ <span>151
+ <span>152
+ <span>153
+ <span>154
+ <span>155
+ <span>156
+ <span>157
+ <span>158
+ <span>159
+ <span>160
+ <span>161
+ <span>162
+ <span>163
+ <span>164
+ <span>165
+ <span>166
+ <span>167
+ <span>168
+ <span>169
+ <span>170
+ <span>171
+ <span>172
+ <span>173
+ <span>174
+ <span>175
+ <span>176
+ <span>177
+ <span>178
+ <span>179
+ <span>180
+ <span>181
+ <span>182
+ <span>183
+ <span>184
+ <span>185
+ <span>186
+ <span>187
+ <span>188
+ <span>189
+ <span>190
+ <span>191
+ <span>192
+ <span>193
+ <span>194
+ <span>195
+ <span>196
+ <span>197
+ <span>198
+ <span>199
+ <span>200
+ <span>201
+ <span>202
+ <span>203
+ <span>204
+ <span>205
+ <span>206
+ <span>207
+ <span>208
+ <span>209
+ <span>210
+ <span>211
+ <span>212
+ <span>213
+ <span>214
+ <span>215
+ <span>216
+ <span>217
+ <span>218
+ <span>219
+ <span>220
+ <span>221
+ <span>222
+ <span>223
+ <span>224
+ <span>225
+ <span>226
+ <span>227
+ <span>228
+ <span>229
+ <span>230
+ <span>231
+ <span>232
+ <span>233
+ <span>234
+ <span>235
+ <span>236
+ <span>237
+ <span>238
+ <span>239
+ <span>240
+ <span>241
+ <span>242
+ <span>243
+ <span>244
+ <span>245
+ <span>246
+ <span>247
+ <span>248
+ <span>249
+ <span>250
+ <span>251
+ <span>252
+ <span>253
+ <span>254
+ <span>255
+ <span>256
+ <span>257
+ <span>258
+ <span>259
+ <span>260
+ <span>261
+ <span>262
+ <span>263
+ <span>264
+ <span>265
+ <span>266
+ <span>267
+ <span>268
+ <span>269
+ <span>270
+ <span>271
+ <span>272
+ <span>273
+ <span>274
+ <span>275
+ <span>276
+ <span>277
+ <span>278
+ <span>279
+ <span>280
+ <span>281
+ <span>282
+ <span>283
+ <span>284
+ <span>285
+ <span>286
+ <span>287
+ <span>288
+ <span>289
+ <span>290
+ <span>291
+ <span>292
+ <span>293
+ <span>294
+ <span>295
+ <span>296
+ <span>297
+ <span>298
+ <span>299
+ <span>300
+ <span>301
+ <span>302
+ <span>303
+ <span>304
+ <span>305
+ <span>306
+ <span>307
+ <span>308
+ <span>309
+ <span>310
+ <span>311
+ <span>312
+ <span>313
+ <span>314
+ <span>315
+ <span>316
+ <span>317
+ <span>318
+ <span>319
+ <span>320
+ <span>321
+ <span>322
+ <span>323
+ <span>324
+ <span>325
+ <span>326
+ <span>327
+ <span>328
+ <span>329
+ <span>330
+ <span>331
+ <span>332
+ <span>333
+ <span>334
+ <span>335
+ <span>336
+ <span>337
+ <span>338
+ <span>339
+ <span>340
+ <span>341
+ <span>342
+ <span>343
+ <span>344
+ <span>345
+ <span>346
+ <span>347
+ <span>348
+ <span>349
+ <span>350
+ <span>351
+ <span>352
+ <span>353
+ <span>354
+ <span>355
+ <span>356
+ <span>357
+ <span>358
+ <span>359
+ <span>360
+ <span>361
+ <span>362
+ <span>363
+ <span>364
+ <span>365
+ <span>366
+ <span>367
+ <span>368
+ <span>369
+ <span>370
+ <span>371
+ <span>372
+ <span>373
+ <span>374
+ <span>375
+ <span>376
+ <span>377
+ <span>378
+ <span>379
+ <span>380
+ <span>381
+ <span>382
+ <span>383
+ <span>384
+ <span>385
+ <span>386
+ <span>387
+ <span>388
+ <span>389
+ <span>390
+ <span>391
+ <span>392
+ <span>393
+ <span>394
+ <span>395
+ <span>396
+ <span>397
+ <span>398
+ <span>399
+ <span>400
+ <span>401
+ <span>402
+ <span>403
+ <span>404
+ <span>405
+ <span>406
+ <span>407
+ <span>408
+ <span>409
+ <span>410
+ <span>411
+ <span>412
+ <span>413
+ <span>414
+ <span>415
+ <span>416
+ <span>417
+ <span>418
+ <span>419
+ <span>420
+ <span>421
+ <span>422
+ <span>423
+ <span>424
+ <span>425
+ <span>426
+ <span>427
+ <span>428
+ <span>429
+ <span>430
+ <span>431
+ <span>432
+ <span>433
+ <span>434
+ <span>435
+ <span>436
+ <span>437
+ <span>438
+ <span>439
+ <span>440
+ <span>441
+ <span>442
+ <span>443
+ <span>444
+ <span>445
+ <span>446
+ <span>447
+ <span>448
+ <span>449
+ <span>450
+ <span>451
+ <span>452
+ <span>453
+ <span>454
+ <span>455
+ <span>456
+ <span>457
+ <span>458
+ <span>459
+ <span>460
+ <span>461
+ <span>462
+ <span>463
+ <span>464
+ <span>465
+ <span>466
+ <span>467
+ <span>468
+ <span>469
+ <span>470
+ <span>471
+ <span>472
+ <span>473
+ <span>474
+ <span>475
+ <span>476
+ <span>477
+ <span>478
+ <span>479
+ <span>480
+ <span>481
+ <span>482
+ <span>483
+ <span>484
+ <span>485
+ <span>486
+ <span>487
+ <span>488
+ <span>489
+ <span>490
+ <span>491
+ <span>492
+ <span>493
+ <span>494
+ <span>495
+ <span>496
+ <span>497
+ <span>498
+ <span>499
+ <span>500
+ <span>501
+ <span>502
+ <span>503
+ <span>504
+ <span>505
+ <span>506
+ <span>507
+ <span>508
+ <span>509
+ <span>510
+ <span>511
+ <span>512
+ <span>513
+ <span>514
+ <span>515
+ <span>516
+ <span>517
+ <span>518
+ <span>519
+ <span>520
+ <span>521
+ <span>522
+ <span>523
+ <span>524
+ <span>525
+ <span>526
+ <span>527
+ <span>528
+ <span>529
+ <span>530
+ <span>531
+ <span>532
+ <span>533
+ <span>534
+ <span>535
+ <span>536
+ <span>537
+ <span>538
+ <span>539
+ <span>540
+ <span>541
+ <span>542
+ <span>543
+ <span>544
+ <span>545
+ <span>546
+ <span>547
+ <span>548
+ <span>549
+ <span>550
+ <span>551
+ <span>552
+ <span>553
+ <span>554
+ <span>555
+ <span>556
+ <span>557
+ <span>558
+ <span>559
+ <span>560
+ <span>561
+ <span>562
+ <span>563
+ <span>564
+ <span>565
+ <span>566
+ <span>567
+ <span>568
+ <span>569
+ <span>570
+ <span>571
+ <span>572
+ <span>573
+ <span>574
+ <span>575
+ <span>576
+ <span>577
+ <span>578
+ <span>579
+ <span>580
+ <span>581
+ <span>582
+ <span>583
+ <span>584
+ <span>585
+ <span>586
+ <span>587
+ <span>588
+ <span>589
+ <span>590
+ <span>591
+ <span>592
+ <span>593
+ <span>594
+ <span>595
+ <span>596
+ <span>597
+ <span>598
+ <span>599
+ <span>600
+ <span>601
+ <span>602
+ <span>603
+ <span>604
+ <span>605
+ <span>606
+ <span>607
+ <span>608
+ <span>609
+ <span>610
+ <span>611
+ <span>612
+ <span>613
+ <span>614
+ <span>615
+ <span>616
+ <span>617
+ <span>618
+ <span>619
+ <span>620
+ <span>621
+ <span>622
+ <span>623
+ <span>624
+ <span>625
+ <span>626
+ <span>627
+ <span>628
+ <span>629
+ <span>630
+ <span>631
+ <span>632
+ <span>633
+ <span>634
+ <span>635
+ <span>636
+ <span>637
+ <span>638
+ <span>639
+ <span>640
+ <span>641
+ <span>642
+ <span>643
+ <span>644
+ <span>645
+ <span>646
+ <span>647
+ <span>648
+ <span>649
+ <span>650
+ <span>651
+ <span>652
+ <span>653
+ <span>654
+ <span>655
+ <span>656
+ <span>657
+ <span>658
+ <span>659
+ <span>660
+ <span>661
+ <span>662
+ <span>663
+ <span>664
+ <span>665
+ <span>666
+ <span>667
+ <span>668
+ <span>669
+ <span>670
+ <span>671
+ <span>672
+ <span>673
+ <span>674
+ <span>675
+ <span>676
+ <span>677
+ <span>678
+ <span>679
+ <span>680
+ <span>681
+ <span>682
+ <span>683
+ <span>684
+ <span>685
+ <span>686
+ <span>687
+ <span>688
+ <span>689
+ <span>690
+ <span>691
+ <span>692
+ <span>693
+ <span>694
+ <span>695
+ <span>696
+ <span>697
+ <span>698
+ <span>699
+ <span>700
+ <span>701
+ <span>702
+ <span>703
+ <span>704
+ <span>705
+ <span>706
+ <span>707
+ <span>708
+ <span>709
+ <span>710
+ <span>711
+ <span>712
+ <span>713
+ <span>714
+ <span>715
+ <span>716
+ <span>717
+ <span>718
+ <span>719
+ <span>720
+ <span>721
+ <span>722
+ <span>723
+ <span>724
+ <span>725
+ <span>726
+ <span>727
+ <span>728
+ <span>729
+ <span>730
+ <span>731
+ <span>732
+ <span>733
+ <span>734
+ <span>735
+ <span>736
+ <span>737
+ <span>738
+ <span>739
+ <span>740
+ <span>741
+ <span>742
+ <span>743
+ <span>744
+ <span>745
+ <span>746
+ <span>747
+ <span>748
+ <span>749
+ <span>750
+ <span>751
+ <span>752
+ <span>753
+ <span>754
+ <span>755
+ <span>756
+ <span>757
+ <span>758
+ <span>759
+ <span>760
+ <span>761
+ <span>762
+ <span>763
+ <span>764
+ <span>765
+ <span>766
+ <span>767
+ <span>768
+ <span>769
+ <span>770
+ <span>771
+ <span>772
+ <span>773
+ <span>774
+ <span>775
+ <span>776
+ <span>777
+ <span>778
+ <span>779
+ <span>780
+ <span>781
+ <span>782
+ <span>783
+ <span>784
+ <span>785
+ <span>786
+ <span>787
+ <span>788
+ <span>789
+ <span>790
+ <span>791
+ <span>792
+ <span>793
+ <span>794
+ <span>795
+ <span>796
+ <span>797
+ <span>798
+ <span>799
+ <span>800
+ <span>801
+ <span>802
+ <span>803
+ <span>804
+ <span>805
+ <span>806
+ <span>807
+ <span>808
+ <span>809
+ <span>810
+ <span>811
+ <span>812
+ <span>813
+ <span>814
+ <span>815
+ <span>816
+ <span>817
+ <span>818
+ <span>819
+ <span>820
+ <span>821
+ <span>822
+ <span>823
+ <span>824
+ <span>825
+ <span>826
+ <span>827
+ <span>828
+ <span>829
+ <span>830
+ <span>831
+ <span>832
+ <span>833
+ <span>834
+ <span>835
+ <span>836
+ <span>837
+ <span>838
+ <span>839
+ <span>840
+ <span>841
+ <span>842
+ <span>843
+ <span>844
+ <span>845
+ <span>846
+ <span>847
+ <span>848
+ <span>849
+ <span>850
+ <span>851
+ <span>852
+ <span>853
+ <span>854
+ <span>855
+ <span>856
+ <span>857
+ <span>858
+ <span>859
+ <span>860
+ <span>861
+ <span>862
+ <span>863
+ <span>864
+ <span>865
+ <span>866
+ <span>867
+ <span>868
+ <span>869
+ <span>870
+ <span>871
+ <span>872
+ <span>873
+ <span>874
+ <span>875
+ <span>876
+ <span>877
+ <span>878
+ <span>879
+ <span>880
+ <span>881
+ <span>882
+ <span>883
+ <span>884
+ <span>885
+ <span>886
+ <span>887
+ <span>888
+ <span>889
+ <span>890
+ <span>891
+ <span>892
+ <span>893
+ <span>894
+ <span>895
+ <span>896
+ <span>897
+ <span>898
+ <span>899
+ <span>900
+ <span>901
+ <span>902
+ <span>903
+ <span>904
+ <span>905
+ <span>906
+ <span>907
+ <span>908
+ <span>909
+ <span>910
+ <span>911
+ <span>912
+ <span>913
+ <span>914
+ <span>915
+ <span>916
+ <span>917
+ <span>918
+ <span>919
+ <span>920
+ <span>921
+ <span>922
+ <span>923
+ <span>924
+ <span>925
+ <span>926
+ <span>927
+ <span>928
+ <span>929
+ <span>930
+ <span>931
+ <span>932
+ <span>933
+ <span>934
+ <span>935
+ <span>936
+ <span>937
+ <span>938
+ <span>939
+ <span>940
+ <span>941
+ <span>942
+ <span>943
+ <span>944
+ <span>945
+ <span>946
+ <span>947
+ <span>948
+ <span>949
+ <span>950
+ <span>951
+ <span>952
+ <span>953
+ <span>954
+ <span>955
+ <span>956
+ <span>957
+ <span>958
+ <span>959
+ <span>960
+ <span>961
+ <span>962
+ <span>963
+ <span>964
+ <span>965
+ <span>966
+ <span>967
+ <span>968
+ <span>969
+ <span>970
+ <span>971
+ <span>972
+ <span>973
+ <span>974
+ <span>975
+ <span>976
+ <span>977
+ <span>978
+ <span>979
+ <span>980
+ <span>981
+ <span>982
+ <span>983
+ <span>984
+ <span>985
+ <span>986
+ <span>987
+ <span>988
+ <span>989
+ <span>990
+ <span>991
+ <span>992
+ <span>993
+ <span>994
+ <span>995
+ <span>996
+ <span>997
+ <span>998
+ <span>999
+ <span>1000
+
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/cobalt/layout_tests.txt b/src/cobalt/layout_tests/testdata/cobalt/layout_tests.txt
index 7ada83e..93e5eda 100644
--- a/src/cobalt/layout_tests/testdata/cobalt/layout_tests.txt
+++ b/src/cobalt/layout_tests/testdata/cobalt/layout_tests.txt
@@ -1,3 +1,4 @@
+1000-nested-elements
block-and-inline-block-display
changing-css-text-triggers-layout
cobalt-oxide, file:///cobalt/browser/testdata/cobalt-oxide/cobalt-oxide.html
diff --git a/src/cobalt/media/can_play_type_handler.h b/src/cobalt/media/can_play_type_handler.h
new file mode 100644
index 0000000..7fdf060
--- /dev/null
+++ b/src/cobalt/media/can_play_type_handler.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2016 Google Inc. 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_MEDIA_CAN_PLAY_TYPE_HANDLER_H_
+#define COBALT_MEDIA_CAN_PLAY_TYPE_HANDLER_H_
+
+#include <string>
+
+namespace cobalt {
+namespace media {
+
+class CanPlayTypeHandler {
+ public:
+ virtual std::string CanPlayType(const std::string& mime_type,
+ const std::string& key_system) = 0;
+
+ protected:
+ CanPlayTypeHandler() {}
+ ~CanPlayTypeHandler() {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CanPlayTypeHandler);
+};
+
+} // namespace media
+} // namespace cobalt
+
+#endif // COBALT_MEDIA_CAN_PLAY_TYPE_HANDLER_H_
diff --git a/src/cobalt/media/media.gyp b/src/cobalt/media/media.gyp
index a61b8a8..0713216 100644
--- a/src/cobalt/media/media.gyp
+++ b/src/cobalt/media/media.gyp
@@ -21,6 +21,7 @@
'target_name': 'media',
'type': 'static_library',
'sources': [
+ 'can_play_type_handler.h',
'fetcher_buffered_data_source.cc',
'fetcher_buffered_data_source.h',
'media_module.h',
diff --git a/src/cobalt/media/media_module.h b/src/cobalt/media/media_module.h
index 933b214..c055bd6 100644
--- a/src/cobalt/media/media_module.h
+++ b/src/cobalt/media/media_module.h
@@ -26,6 +26,7 @@
#include "base/memory/scoped_ptr.h"
#include "cobalt/base/user_log.h"
#include "cobalt/math/size.h"
+#include "cobalt/media/can_play_type_handler.h"
#include "cobalt/media/web_media_player_factory.h"
#include "cobalt/render_tree/image.h"
#include "cobalt/render_tree/resource_provider.h"
@@ -38,17 +39,20 @@
namespace media {
// TODO: Collapse MediaModule into ShellMediaPlatform.
-class MediaModule : public WebMediaPlayerFactory,
+class MediaModule : public CanPlayTypeHandler,
+ public WebMediaPlayerFactory,
public ::media::WebMediaPlayerDelegate {
public:
struct Options {
Options()
: use_audio_decoder_stub(false),
use_null_audio_streamer(false),
- use_video_decoder_stub(false) {}
+ use_video_decoder_stub(false),
+ disable_webm_vp9(false) {}
bool use_audio_decoder_stub;
bool use_null_audio_streamer;
bool use_video_decoder_stub;
+ bool disable_webm_vp9;
};
typedef ::media::WebMediaPlayer WebMediaPlayer;
diff --git a/src/cobalt/media/media_module_starboard.cc b/src/cobalt/media/media_module_starboard.cc
index e8c2368..5e388a1 100644
--- a/src/cobalt/media/media_module_starboard.cc
+++ b/src/cobalt/media/media_module_starboard.cc
@@ -30,6 +30,7 @@
#include "media/filters/shell_raw_video_decoder_stub.h"
#include "media/filters/shell_video_decoder_impl.h"
#include "media/player/web_media_player_impl.h"
+#include "starboard/media.h"
namespace cobalt {
namespace media {
@@ -45,6 +46,21 @@
const Options& options)
: options_(options), media_platform_(resource_provider) {}
+ std::string CanPlayType(const std::string& mime_type,
+ const std::string& key_system) OVERRIDE {
+ SbMediaSupportType type =
+ SbMediaCanPlayMimeAndKeySystem(mime_type.c_str(), key_system.c_str());
+ switch (type) {
+ case kSbMediaSupportTypeNotSupported:
+ return "";
+ case kSbMediaSupportTypeMaybe:
+ return "maybe";
+ case kSbMediaSupportTypeProbably:
+ return "probably";
+ }
+ NOTREACHED();
+ return "";
+ }
scoped_ptr<WebMediaPlayer> CreateWebMediaPlayer(
::media::WebMediaPlayerClient* client) OVERRIDE {
scoped_ptr<MessageLoopFactory> message_loop_factory(new MessageLoopFactory);
diff --git a/src/cobalt/media/media_module_stub.cc b/src/cobalt/media/media_module_stub.cc
index e2ddcfd..90813e1 100644
--- a/src/cobalt/media/media_module_stub.cc
+++ b/src/cobalt/media/media_module_stub.cc
@@ -16,6 +16,8 @@
#include "cobalt/media/media_module_stub.h"
+#include <string>
+
#include "base/compiler_specific.h"
namespace cobalt {
@@ -95,6 +97,13 @@
using ::media::WebMediaPlayer;
+std::string MediaModuleStub::CanPlayType(const std::string& mime_type,
+ const std::string& key_system) {
+ UNREFERENCED_PARAMETER(mime_type);
+ UNREFERENCED_PARAMETER(key_system);
+ return ""; // Cannot play.
+}
+
scoped_ptr<WebMediaPlayer> MediaModuleStub::CreateWebMediaPlayer(
::media::WebMediaPlayerClient* client) {
UNREFERENCED_PARAMETER(client);
diff --git a/src/cobalt/media/media_module_stub.h b/src/cobalt/media/media_module_stub.h
index 7be421c..a9b1036 100644
--- a/src/cobalt/media/media_module_stub.h
+++ b/src/cobalt/media/media_module_stub.h
@@ -17,6 +17,8 @@
#ifndef COBALT_MEDIA_MEDIA_MODULE_STUB_H_
#define COBALT_MEDIA_MEDIA_MODULE_STUB_H_
+#include <string>
+
#include "cobalt/media/media_module.h"
namespace cobalt {
@@ -26,6 +28,8 @@
public:
MediaModuleStub() {}
+ std::string CanPlayType(const std::string& mime_type,
+ const std::string& key_system) OVERRIDE;
scoped_ptr<WebMediaPlayer> CreateWebMediaPlayer(
::media::WebMediaPlayerClient* client) OVERRIDE;
};
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
index ee59b76..04ca7c1 100644
--- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -28,7 +28,6 @@
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/core/SkTypeface.h"
-#include "third_party/skia/include/ports/SkFontMgr.h"
using cobalt::render_tree::ImageData;
diff --git a/src/cobalt/script/mozjs/conversion_helpers.h b/src/cobalt/script/mozjs/conversion_helpers.h
index cf0206e..5aa53ed 100644
--- a/src/cobalt/script/mozjs/conversion_helpers.h
+++ b/src/cobalt/script/mozjs/conversion_helpers.h
@@ -34,6 +34,7 @@
#include "cobalt/script/mozjs/union_type_conversion_forward.h"
#include "third_party/mozjs/js/src/jsapi.h"
#include "third_party/mozjs/js/src/jsproxy.h"
+#include "third_party/mozjs/js/src/jsstr.h"
namespace cobalt {
namespace script {
@@ -72,9 +73,21 @@
// std::string -> JSValue
inline void ToJSValue(JSContext* context, const std::string& in_string,
JS::MutableHandleValue out_value) {
+ size_t length = in_string.length();
+ jschar* inflated_buffer =
+ js::InflateUTF8String(context, in_string.c_str(), &length);
+ DCHECK(inflated_buffer);
+
+ if (!inflated_buffer) {
+ LOG(ERROR) << "Failed to inflate UTF8 string.";
+ out_value.setNull();
+ return;
+ }
+
JS::RootedString rooted_string(
- context,
- JS_NewStringCopyN(context, in_string.c_str(), in_string.length()));
+ context, JS_NewUCStringCopyN(context, inflated_buffer, length));
+ js_free(inflated_buffer);
+
out_value.set(JS::StringValue(rooted_string));
}
@@ -380,7 +393,7 @@
DCHECK_EQ(conversion_flags & ~kConversionFlagsObject, 0)
<< "Unexpected conversion flags found.";
JS::RootedObject js_object(context);
- if (value.isNull()) {
+ if (value.isNull() || value.isUndefined()) {
if (!(conversion_flags & kConversionFlagNullable)) {
exception_state->SetSimpleException(ExceptionState::kTypeError,
kNotNullableType);
diff --git a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc b/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
index c56be2c..d25e1b7 100644
--- a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
+++ b/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
@@ -208,9 +208,19 @@
last_error_message_ = &error_message;
JS::RootedObject global_object(
context_, js::GetProxyTargetObject(global_object_proxy_));
- bool success = JS_EvaluateScript(
- context_, global_object, script.c_str(), script.size(),
- location.file_path.c_str(), location.line_number, result_value.address());
+
+ size_t length = script.size();
+ jschar* inflated_buffer =
+ js::InflateUTF8String(context_, script.c_str(), &length);
+ DCHECK(inflated_buffer);
+ bool success = false;
+ if (inflated_buffer) {
+ success = JS_EvaluateUCScript(context_, global_object, inflated_buffer,
+ length, location.file_path.c_str(),
+ location.line_number, result_value.address());
+ js_free(inflated_buffer);
+ }
+
if (out_result_utf8) {
if (success) {
MozjsExceptionState exception_state(context_);
diff --git a/src/cobalt/script/mozjs/util/exception_helpers.cc b/src/cobalt/script/mozjs/util/exception_helpers.cc
index 1c4b8ad..030f45a 100644
--- a/src/cobalt/script/mozjs/util/exception_helpers.cc
+++ b/src/cobalt/script/mozjs/util/exception_helpers.cc
@@ -46,10 +46,15 @@
if (stack_trace[i].fun) {
JS::RootedString rooted_string(context,
JS_GetFunctionId(stack_trace[i].fun));
- JS::RootedValue rooted_value(context, STRING_TO_JSVAL(rooted_string));
- MozjsExceptionState exception_state(context);
- FromJSValue(context, rooted_value, kNoConversionFlags, &exception_state,
- &sf.function_name);
+ if (rooted_string) {
+ JS::RootedValue rooted_value(context, STRING_TO_JSVAL(rooted_string));
+ MozjsExceptionState exception_state(context);
+ FromJSValue(context, rooted_value, kNoConversionFlags, &exception_state,
+ &sf.function_name);
+ } else {
+ // anonymous function
+ sf.function_name = "(anonymous function)";
+ }
}
if (stack_trace[i].script) {
sf.source_url = stack_trace[i].script->filename();
diff --git a/src/cobalt/system_window/starboard/system_window.cc b/src/cobalt/system_window/starboard/system_window.cc
index 111cf8b..7cd1178 100644
--- a/src/cobalt/system_window/starboard/system_window.cc
+++ b/src/cobalt/system_window/starboard/system_window.cc
@@ -35,8 +35,19 @@
} // namespace
SystemWindowStarboard::SystemWindowStarboard(
+ base::EventDispatcher* event_dispatcher)
+ : SystemWindow(event_dispatcher),
+ window_(kSbWindowInvalid),
+ key_down_(false) {
+ window_ = SbWindowCreate(NULL);
+ DCHECK(SbWindowIsValid(window_));
+ DCHECK(!g_the_window) << "TODO: Support multiple SystemWindows.";
+ g_the_window = this;
+}
+
+SystemWindowStarboard::SystemWindowStarboard(
base::EventDispatcher* event_dispatcher, const math::Size& window_size)
- : SystemWindow(event_dispatcher, window_size),
+ : SystemWindow(event_dispatcher),
window_(kSbWindowInvalid),
key_down_(false) {
SbWindowOptions options;
@@ -57,6 +68,12 @@
SbWindowDestroy(window_);
}
+math::Size SystemWindowStarboard::GetWindowSize() const {
+ SbWindowSize window_size;
+ SbWindowGetSize(window_, &window_size);
+ return math::Size(window_size.width, window_size.height);
+}
+
SbWindow SystemWindowStarboard::GetSbWindow() { return window_; }
void* SystemWindowStarboard::GetWindowHandle() {
@@ -140,9 +157,15 @@
}
scoped_ptr<SystemWindow> CreateSystemWindow(
- base::EventDispatcher* event_dispatcher, const math::Size& window_size) {
- return scoped_ptr<SystemWindow>(
- new SystemWindowStarboard(event_dispatcher, window_size));
+ base::EventDispatcher* event_dispatcher,
+ const base::optional<math::Size>& window_size) {
+ if (window_size) {
+ return scoped_ptr<SystemWindow>(
+ new SystemWindowStarboard(event_dispatcher, *window_size));
+ } else {
+ return scoped_ptr<SystemWindow>(
+ new SystemWindowStarboard(event_dispatcher));
+ }
}
// Returns true if the event was handled.
diff --git a/src/cobalt/system_window/starboard/system_window.h b/src/cobalt/system_window/starboard/system_window.h
index efc6caa..7d6a76e 100644
--- a/src/cobalt/system_window/starboard/system_window.h
+++ b/src/cobalt/system_window/starboard/system_window.h
@@ -30,10 +30,13 @@
class SystemWindowStarboard : public SystemWindow {
public:
- explicit SystemWindowStarboard(base::EventDispatcher* event_dispatcher,
- const math::Size& window_size);
+ explicit SystemWindowStarboard(base::EventDispatcher* event_dispatcher);
+ SystemWindowStarboard(base::EventDispatcher* event_dispatcher,
+ const math::Size& window_size);
~SystemWindowStarboard() OVERRIDE;
+ math::Size GetWindowSize() const OVERRIDE;
+
// Returns a handle to the Starboard window object.
SbWindow GetSbWindow();
diff --git a/src/cobalt/system_window/system_window.h b/src/cobalt/system_window/system_window.h
index 4054bc0..4695652 100644
--- a/src/cobalt/system_window/system_window.h
+++ b/src/cobalt/system_window/system_window.h
@@ -21,6 +21,7 @@
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
+#include "base/optional.h"
#include "cobalt/base/event_dispatcher.h"
#include "cobalt/math/size.h"
@@ -63,29 +64,32 @@
DialogCallback callback;
};
- SystemWindow(base::EventDispatcher* event_dispatcher,
- const math::Size& window_size)
- : event_dispatcher_(event_dispatcher), window_size_(window_size) {}
+ explicit SystemWindow(base::EventDispatcher* event_dispatcher)
+ : event_dispatcher_(event_dispatcher) {}
virtual ~SystemWindow();
// Launches a system dialog.
virtual void ShowDialog(const DialogOptions& options);
- base::EventDispatcher* event_dispatcher() const { return event_dispatcher_; }
+ // Returns the dimensions of the window.
+ virtual math::Size GetWindowSize() const = 0;
- const math::Size& window_size() const { return window_size_; }
+ base::EventDispatcher* event_dispatcher() const { return event_dispatcher_; }
private:
base::EventDispatcher* event_dispatcher_;
- const math::Size window_size_;
};
// The implementation of this function should be platform specific, and will
// create and return a platform-specific system window object. The system
// window object routes callbacks for user input and provides the information
// necessary to create a display render target for a graphics system.
-scoped_ptr<SystemWindow> CreateSystemWindow(base::EventDispatcher*,
- const math::Size& window_size);
+// Explicitly setting a window size will result in the system attempting to
+// accommmodate the preferred size, but not all systems may be able to
+// fulfill the request. |window_size| can be left blank to let the system
+// choose a default window size.
+scoped_ptr<SystemWindow> CreateSystemWindow(
+ base::EventDispatcher*, const base::optional<math::Size>& window_size);
} // namespace system_window
} // namespace cobalt
diff --git a/src/cobalt/system_window/win/system_window.cc b/src/cobalt/system_window/win/system_window.cc
index 4fc1029..09e4217 100644
--- a/src/cobalt/system_window/win/system_window.cc
+++ b/src/cobalt/system_window/win/system_window.cc
@@ -68,12 +68,22 @@
}
} // namespace
-SystemWindowWin::SystemWindowWin(base::EventDispatcher* event_dispatcher,
- const math::Size& window_size)
- : SystemWindow(event_dispatcher, window_size),
+SystemWindowWin::SystemWindowWin(base::EventDispatcher* event_dispatcher)
+ : SystemWindow(event_dispatcher),
thread(kThreadName),
window_initialized(true, false),
- window_handle_(NULL) {
+ window_handle_(NULL),
+ window_size_(math::Size(1920, 1080)) {
+ StartWindow();
+}
+
+SystemWindowWin::SystemWindowWin(base::EventDispatcher* event_dispatcher,
+ const math::Size& window_size)
+ : SystemWindow(event_dispatcher),
+ thread(kThreadName),
+ window_initialized(true, false),
+ window_handle_(NULL),
+ window_size_(window_size) {
StartWindow();
}
@@ -160,8 +170,8 @@
window_handle_ = CreateWindowEx(
WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, kClassName, kWindowTitle,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, 0, 0,
- window_size().width(), window_size().height(), NULL, NULL,
- module_instance, NULL);
+ window_size_.width(), window_size_.height(), NULL, NULL, module_instance,
+ NULL);
CHECK(window_handle_);
ShowWindow(window_handle_, SW_SHOW);
@@ -181,9 +191,14 @@
}
scoped_ptr<SystemWindow> CreateSystemWindow(
- base::EventDispatcher* event_dispatcher, const math::Size& window_size) {
- return scoped_ptr<SystemWindow>(
- new SystemWindowWin(event_dispatcher, window_size));
+ base::EventDispatcher* event_dispatcher,
+ const base::optional<math::Size>& window_size) {
+ if (window_size) {
+ return scoped_ptr<SystemWindow>(
+ new SystemWindowWin(event_dispatcher, *window_size));
+ } else {
+ return scoped_ptr<SystemWindow>(new SystemWindowWin(event_dispatcher));
+ }
}
} // namespace system_window
diff --git a/src/cobalt/system_window/win/system_window.h b/src/cobalt/system_window/win/system_window.h
index 7025f00..69ac4e5 100644
--- a/src/cobalt/system_window/win/system_window.h
+++ b/src/cobalt/system_window/win/system_window.h
@@ -34,11 +34,14 @@
// received and processed.
class SystemWindowWin : public SystemWindow {
public:
- explicit SystemWindowWin(base::EventDispatcher* event_dispatcher,
- const math::Size& window_size);
+ explicit SystemWindowWin(base::EventDispatcher* event_dispatcher);
+ SystemWindowWin(base::EventDispatcher* event_dispatcher,
+ const math::Size& window_size);
~SystemWindowWin() OVERRIDE;
+ math::Size GetWindowSize() const OVERRIDE { return window_size_; }
+
HWND window_handle() const { return window_handle_; }
protected:
@@ -56,6 +59,7 @@
base::Thread thread;
base::WaitableEvent window_initialized;
HWND window_handle_;
+ math::Size window_size_;
};
} // namespace system_window
diff --git a/src/cobalt/web_animations/animation.cc b/src/cobalt/web_animations/animation.cc
index 258854d..0c8a578 100644
--- a/src/cobalt/web_animations/animation.cc
+++ b/src/cobalt/web_animations/animation.cc
@@ -26,7 +26,9 @@
: effect_(effect) {
const KeyframeEffectReadOnly* keyframe_effect =
base::polymorphic_downcast<const KeyframeEffectReadOnly*>(effect.get());
- keyframe_effect->target()->Register(this);
+ if (keyframe_effect) {
+ keyframe_effect->target()->Register(this);
+ }
set_timeline(timeline);
}
@@ -34,17 +36,22 @@
if (timeline_) {
timeline_->Deregister(this);
}
- timeline->Register(this);
+
+ if (timeline) {
+ timeline->Register(this);
+ }
+
timeline_ = timeline;
}
// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#playing-an-animation-section
void Animation::Play() {
// This is currently a simplified version of steps 8.2.
- DCHECK(timeline_);
- DCHECK(timeline_->current_time());
- if (!data_.start_time()) {
- set_start_time(timeline_->current_time());
+ if (timeline_) {
+ DCHECK(timeline_->current_time());
+ if (!data_.start_time()) {
+ set_start_time(timeline_->current_time());
+ }
}
UpdatePendingTasks();
@@ -103,7 +110,9 @@
if (timeline_) {
timeline_->Deregister(this);
}
- keyframe_effect->target()->Deregister(this);
+ if (keyframe_effect) {
+ keyframe_effect->target()->Deregister(this);
+ }
}
void Animation::UpdatePendingTasks() {
@@ -114,17 +123,24 @@
// the "after phase".
on_enter_after_phase_.reset();
} else {
+ if (!effect_) {
+ return;
+ }
+
base::TimeDelta local_time =
base::TimeDelta::FromMillisecondsD(*local_time_in_ms);
+
base::TimeDelta time_to_after_phase =
effect_->timing()->data().time_until_after_phase(local_time);
if (time_to_after_phase >= base::TimeDelta() &&
time_to_after_phase != base::TimeDelta::Max()) {
// Setup the "upon entering the after phase" event to fire at the
// specified timeline time.
- on_enter_after_phase_ = timeline_->QueueTask(
- *data_.start_time() + time_to_after_phase,
- base::Bind(&Animation::OnEnterAfterPhase, base::Unretained(this)));
+ if (timeline_) {
+ on_enter_after_phase_ = timeline_->QueueTask(
+ *data_.start_time() + time_to_after_phase,
+ base::Bind(&Animation::OnEnterAfterPhase, base::Unretained(this)));
+ }
} else {
// We are already in the after phase, so clear this task.
on_enter_after_phase_.reset();
diff --git a/src/cobalt/webdriver/get_element_text_test.cc b/src/cobalt/webdriver/get_element_text_test.cc
index 07f2ce3..fd9881b 100644
--- a/src/cobalt/webdriver/get_element_text_test.cc
+++ b/src/cobalt/webdriver/get_element_text_test.cc
@@ -43,7 +43,8 @@
: css_parser_(css_parser::Parser::Create()),
dom_stat_tracker_(new dom::DomStatTracker("GetElementTextTest")),
html_element_context_(NULL, css_parser_.get(), NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, dom_stat_tracker_.get(), "") {}
+ NULL, NULL, NULL, NULL, dom_stat_tracker_.get(),
+ "") {}
void SetUp() OVERRIDE {
dom::Document::Options options;
diff --git a/src/cobalt/webdriver/is_displayed_test.cc b/src/cobalt/webdriver/is_displayed_test.cc
index 1b613f3..8953ec5 100644
--- a/src/cobalt/webdriver/is_displayed_test.cc
+++ b/src/cobalt/webdriver/is_displayed_test.cc
@@ -58,6 +58,7 @@
dom_stat_tracker_(new dom::DomStatTracker("IsDisplayedTest")),
html_element_context_(
&fetcher_factory_, css_parser_.get(), dom_parser_.get(),
+ NULL /* can_play_type_handler */,
NULL /* web_media_player_factory */, &script_runner_,
NULL /* media_source_registry */, resource_provider_stub_.get(),
image_cache_.get(), NULL /* remote_font_cache */,
diff --git a/src/media/base/sbplayer_pipeline.cc b/src/media/base/sbplayer_pipeline.cc
index 7248c25..edc8565 100644
--- a/src/media/base/sbplayer_pipeline.cc
+++ b/src/media/base/sbplayer_pipeline.cc
@@ -582,8 +582,12 @@
DCHECK(message_loop_->BelongsToCurrentThread());
if (status == PIPELINE_OK) {
- DCHECK(!audio_read_in_progress_);
- DCHECK(!video_read_in_progress_);
+ if (audio_read_in_progress_ || video_read_in_progress_) {
+ message_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&SbPlayerPipeline::OnDemuxerSeeked, this, status));
+ return;
+ }
++ticket_;
SbPlayerSeek(player_, seek_time_, ticket_);
}
diff --git a/src/media/mp4/mp4_stream_parser.cc b/src/media/mp4/mp4_stream_parser.cc
index dbbc07b..a001872 100644
--- a/src/media/mp4/mp4_stream_parser.cc
+++ b/src/media/mp4/mp4_stream_parser.cc
@@ -502,10 +502,6 @@
StreamParserBuffer::CopyFrom(&frame_buf[0], frame_buf.size(),
runs_->is_keyframe());
#endif
- if (!stream_buf) {
- DLOG(WARNING) << "Failed to create StreamParserBuffer";
- return false;
- }
if (decrypt_config)
stream_buf->SetDecryptConfig(decrypt_config.Pass());
diff --git a/src/media/player/can_play_type.cc b/src/media/player/can_play_type.cc
index 5dc1883..d3880ae 100644
--- a/src/media/player/can_play_type.cc
+++ b/src/media/player/can_play_type.cc
@@ -24,32 +24,9 @@
#include "media/audio/shell_audio_streamer.h"
#include "media/player/crypto/key_systems.h"
#include "media/player/mime_util.h"
-#if defined(OS_STARBOARD)
-#include "starboard/media.h"
-#endif // defined(OS_STARBOARD)
namespace media {
-#if defined(OS_STARBOARD)
-
-std::string CanPlayType(const std::string& content_type,
- const std::string& key_system) {
- SbMediaSupportType type =
- SbMediaCanPlayMimeAndKeySystem(content_type.c_str(), key_system.c_str());
- switch (type) {
- case kSbMediaSupportTypeNotSupported:
- return "";
- case kSbMediaSupportTypeMaybe:
- return "maybe";
- case kSbMediaSupportTypeProbably:
- return "probably";
- }
- NOTREACHED();
- return "";
-}
-
-#else // defined(OS_STARBOARD)
-
namespace {
bool ContainsAAC51(const std::vector<std::string>& codecs) {
@@ -177,6 +154,4 @@
return kProbably;
}
-#endif // defined(OS_STARBOARD)
-
} // namespace media
diff --git a/src/media/webm/webm_cluster_parser.cc b/src/media/webm/webm_cluster_parser.cc
index 035963e..1bb9042 100644
--- a/src/media/webm/webm_cluster_parser.cc
+++ b/src/media/webm/webm_cluster_parser.cc
@@ -311,11 +311,6 @@
StreamParserBuffer::CopyFrom(data, size, is_keyframe);
#endif // defined(__LB_SHELL__) || defined(COBALT)
- if (!buffer) {
- DLOG(WARNING) << "Failed to create StreamParserBuffer";
- return false;
- }
-
// Every encrypted Block has a signal byte and IV prepended to it. Current
// encrypted WebM request for comments specification is here
// http://wiki.webmproject.org/encryption/webm-encryption-rfc
@@ -379,21 +374,24 @@
buffer = StreamParserBuffer::CopyFrom(data + data_offset,
size - data_offset, is_keyframe);
#endif // defined(__LB_SHELL__) || defined(COBALT)
- if (!buffer) {
- DLOG(WARNING) << "Failed to create StreamParserBuffer";
- return false;
- }
// TODO(fgalligan): Revisit if DecryptConfig needs to be set on unencrypted
// frames after the CDM API is finalized.
// Unencrypted frames of potentially encrypted streams currently set
// DecryptConfig.
- buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(
- new DecryptConfig(encryption_key_id, counter_block,
-#if !defined(__LB_SHELL__) && !defined(COBALT)
- data_offset,
-#endif // !defined(__LB_SHELL__) && !defined(COBALT)
- subsample_entries)));
+ if (buffer) {
+ buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(
+ new DecryptConfig(encryption_key_id, counter_block,
+ #if !defined(__LB_SHELL__) && !defined(COBALT)
+ data_offset,
+ #endif // !defined(__LB_SHELL__) && !defined(COBALT)
+ subsample_entries)));
+ }
+ }
+
+ if (!buffer) {
+ DLOG(WARNING) << "Failed to create StreamParserBuffer";
+ return false;
}
buffer->SetTimestamp(timestamp);
diff --git a/src/net/http/http_stream_factory.cc b/src/net/http/http_stream_factory.cc
index db13935..139083d 100644
--- a/src/net/http/http_stream_factory.cc
+++ b/src/net/http/http_stream_factory.cc
@@ -81,7 +81,7 @@
if (protocol == ALTERNATE_PROTOCOL_BROKEN) {
// This warning is not important for LbShell so we are going to disable it
// since it produces considerable console spam
-#if !defined(__LB_SHELL__)
+#if !defined(__LB_SHELL__) && !defined(COBALT)
// Currently, we only recognize the npn-spdy protocol.
DLOG(WARNING) << kAlternateProtocolHeader
<< " header has unrecognized protocol: "
diff --git a/src/starboard/client_porting/poem/string_poem.h b/src/starboard/client_porting/poem/string_poem.h
index 93cbcd2..1d9ee57 100644
--- a/src/starboard/client_porting/poem/string_poem.h
+++ b/src/starboard/client_porting/poem/string_poem.h
@@ -94,7 +94,7 @@
#if defined(POEM_FULL_EMULATION) && (POEM_FULL_EMULATION)
#define strlen(s) SbStringGetLength(s)
-#define strcpy(o, s) SbStringCopyUnsafe(dst, src)
+#define strcpy(o, s) SbStringCopyUnsafe(o, s)
#define strncpy(o, s, ds) SbStringCopy(o, s, ds)
#define strcat(o, s) PoemConcatUnsafe(o, s)
#define strncat(o, s, ds) PoemConcat(o, s, ds)
diff --git a/src/starboard/event.h b/src/starboard/event.h
index 5c1db49..c602259 100644
--- a/src/starboard/event.h
+++ b/src/starboard/event.h
@@ -68,8 +68,8 @@
// A navigational link has come from the system, and the application should
// consider handling it by navigating to the corresponding application
- // location. The contents of the link are application-specific.
- // SbEventLinkData is passed as the data argument.
+ // location. The data argument is an application-specific, null-terminated
+ // string.
kSbEventTypeLink,
// The beginning of a vertical sync has been detected. This event is very
@@ -114,16 +114,6 @@
// An ID that can be used to refer to a scheduled event.
typedef uint32_t SbEventId;
-// Event data for kSbEventTypeLink and kSbEventTypeStart events.
-typedef struct SbEventLinkData {
- // A buffer of data comprising the link information. The format of this data
- // will be platform-specific.
- const void* link_data;
-
- // The number of bytes of data provided in link_data.
- int link_data_size;
-} SbEventLinkData;
-
// Event data for kSbEventTypeStart events.
typedef struct SbEventStartData {
// The command-line argument values (argv).
@@ -132,8 +122,8 @@
// The command-line argument count (argc).
int argument_count;
- // The startup link data, if any.
- SbEventLinkData link_data;
+ // The startup link, if any.
+ const char* link;
} SbEventStartData;
#define kSbEventIdInvalid (SbEventId)0
diff --git a/src/starboard/linux/shared/system_has_capability.cc b/src/starboard/linux/shared/system_has_capability.cc
index 2cad7c4..8503ef4 100644
--- a/src/starboard/linux/shared/system_has_capability.cc
+++ b/src/starboard/linux/shared/system_has_capability.cc
@@ -20,6 +20,8 @@
switch (capability_id) {
case kSbSystemCapabilityReversedEnterAndBack:
return false;
+ case kSbSystemCapabilityCanQueryGPUMemoryStats:
+ return false;
}
SB_DLOG(WARNING) << "Unrecognized capability: " << capability_id;
diff --git a/src/starboard/linux/x64directfb/starboard_platform.gyp b/src/starboard/linux/x64directfb/starboard_platform.gyp
index bea20b6..9d95ec2 100644
--- a/src/starboard/linux/x64directfb/starboard_platform.gyp
+++ b/src/starboard/linux/x64directfb/starboard_platform.gyp
@@ -141,7 +141,8 @@
'<(DEPTH)/starboard/shared/linux/socket_get_local_interface_address.cc',
'<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
'<(DEPTH)/starboard/shared/linux/system_get_stack.cc',
- '<(DEPTH)/starboard/shared/linux/system_get_total_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
'<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
'<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
'<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
@@ -305,6 +306,8 @@
'<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
],
'include_dirs': [
'/usr/include/directfb',
diff --git a/src/starboard/linux/x64x11/starboard_platform.gyp b/src/starboard/linux/x64x11/starboard_platform.gyp
index 3200d13..932e00e 100644
--- a/src/starboard/linux/x64x11/starboard_platform.gyp
+++ b/src/starboard/linux/x64x11/starboard_platform.gyp
@@ -104,7 +104,8 @@
'<(DEPTH)/starboard/shared/linux/socket_get_local_interface_address.cc',
'<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
'<(DEPTH)/starboard/shared/linux/system_get_stack.cc',
- '<(DEPTH)/starboard/shared/linux/system_get_total_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
'<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
'<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
'<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
@@ -196,8 +197,8 @@
'<(DEPTH)/starboard/shared/pthread/thread_join.cc',
'<(DEPTH)/starboard/shared/pthread/thread_set_local_value.cc',
'<(DEPTH)/starboard/shared/pthread/thread_yield.cc',
- '<(DEPTH)/starboard/shared/signal/crash_signals_sigaction.cc',
'<(DEPTH)/starboard/shared/signal/crash_signals.h',
+ '<(DEPTH)/starboard/shared/signal/crash_signals_sigaction.cc',
'<(DEPTH)/starboard/shared/starboard/application.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
@@ -264,6 +265,8 @@
'<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
'<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
'<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
+ '<(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/x11/application_x11.cc',
diff --git a/src/starboard/nplb/memory_map_test.cc b/src/starboard/nplb/memory_map_test.cc
index 7d84c50..53ccd50 100644
--- a/src/starboard/nplb/memory_map_test.cc
+++ b/src/starboard/nplb/memory_map_test.cc
@@ -50,9 +50,9 @@
TEST(SbMemoryMapTest, DoesNotLeak) {
// Map 4x the amount of system memory (sequentially, not at once).
- int64_t bytes_mapped = SbSystemGetTotalMemory() / 4;
+ int64_t bytes_mapped = SbSystemGetTotalCPUMemory() / 4;
for (int64_t total_bytes_mapped = 0;
- total_bytes_mapped < SbSystemGetTotalMemory() * 4;
+ total_bytes_mapped < SbSystemGetTotalCPUMemory() * 4;
total_bytes_mapped += bytes_mapped) {
void* memory = SbMemoryMap(bytes_mapped, kSbMemoryMapProtectWrite, "test");
ASSERT_NE(kFailed, memory);
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index ff62b59..5b66821 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -24,12 +24,12 @@
'atomic_test.cc',
'audio_sink_create_test.cc',
'audio_sink_destroy_test.cc',
+ 'audio_sink_get_max_channels_test.cc',
+ 'audio_sink_get_nearest_supported_sample_frequency_test.cc',
'audio_sink_helpers.cc',
'audio_sink_helpers.h',
'audio_sink_is_audio_frame_storage_type_supported_test.cc',
'audio_sink_is_audio_sample_type_supported_test.cc',
- 'audio_sink_get_max_channels_test.cc',
- 'audio_sink_get_nearest_supported_sample_frequency_test.cc',
'audio_sink_test.cc',
'blitter_blit_rect_to_rect_test.cc',
'blitter_blit_rect_to_rect_tiled_test.cc',
@@ -189,7 +189,10 @@
'system_get_random_data_test.cc',
'system_get_random_uint64_test.cc',
'system_get_stack_test.cc',
- 'system_get_total_memory_test.cc',
+ 'system_get_total_cpu_memory_test.cc',
+ 'system_get_total_gpu_memory_test.cc',
+ 'system_get_used_cpu_memory_test.cc',
+ 'system_get_used_gpu_memory_test.cc',
'system_has_capability_test.cc',
'system_hide_splash_screen_test.cc',
'system_is_debugger_attached_test.cc',
diff --git a/src/starboard/nplb/string_parse_double_test.cc b/src/starboard/nplb/string_parse_double_test.cc
index 1197167..600931a 100644
--- a/src/starboard/nplb/string_parse_double_test.cc
+++ b/src/starboard/nplb/string_parse_double_test.cc
@@ -166,7 +166,9 @@
EXPECT_EQ(kDouble + 7, end);
}
-TEST(SbStringParseDoubleTest, Small) {
+// Some platforms do not support denormals
+// Denormal support is unnecessary for Cobalt as of Sep 7, 2016
+TEST(SbStringParseDoubleTest, DISABLED_Small) {
const char kDouble[] = "1e-310";
const double kExpected = DBL_MIN;
char* end = NULL;
@@ -176,7 +178,9 @@
EXPECT_EQ(kDouble + 6, end);
}
-TEST(SbStringParseDoubleTest, SmallNeg) {
+// Some platforms do not support denormals
+// Denormal support is unnecessary for Cobalt as of Sep 7, 2016
+TEST(SbStringParseDoubleTest, DISABLED_SmallNeg) {
const char kDouble[] = "-1e-310";
const double kExpected = -DBL_MIN;
char* end = NULL;
diff --git a/src/starboard/nplb/system_get_total_memory_test.cc b/src/starboard/nplb/system_get_total_cpu_memory_test.cc
similarity index 82%
rename from src/starboard/nplb/system_get_total_memory_test.cc
rename to src/starboard/nplb/system_get_total_cpu_memory_test.cc
index e9b1762..591fd6f 100644
--- a/src/starboard/nplb/system_get_total_memory_test.cc
+++ b/src/starboard/nplb/system_get_total_cpu_memory_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
+// Copyright 2016 Google Inc. 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.
@@ -19,9 +19,9 @@
namespace nplb {
namespace {
-TEST(SbSystemGetTotalMemoryTest, SunnyDay) {
+TEST(SbSystemGetTotalCPUMemoryTest, SunnyDay) {
// We are currently expecting this number to be over 80 megabytes.
- EXPECT_LE(SB_INT64_C(80) * 1024 * 1024, SbSystemGetTotalMemory());
+ EXPECT_LE(SB_INT64_C(80) * 1024 * 1024, SbSystemGetTotalCPUMemory());
}
} // namespace
diff --git a/src/starboard/nplb/system_get_total_memory_test.cc b/src/starboard/nplb/system_get_total_gpu_memory_test.cc
similarity index 69%
copy from src/starboard/nplb/system_get_total_memory_test.cc
copy to src/starboard/nplb/system_get_total_gpu_memory_test.cc
index e9b1762..0cd7d9b 100644
--- a/src/starboard/nplb/system_get_total_memory_test.cc
+++ b/src/starboard/nplb/system_get_total_gpu_memory_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
+// Copyright 2016 Google Inc. 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.
@@ -19,9 +19,12 @@
namespace nplb {
namespace {
-TEST(SbSystemGetTotalMemoryTest, SunnyDay) {
- // We are currently expecting this number to be over 80 megabytes.
- EXPECT_LE(SB_INT64_C(80) * 1024 * 1024, SbSystemGetTotalMemory());
+TEST(SbSystemGetTotalGPUMemoryTest, SunnyDay) {
+ if (SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats)) {
+ // If we claim to have GPU memory reporting capabilities, then this value
+ // should be larger than 0.
+ EXPECT_LT(0, SbSystemGetTotalCPUMemory());
+ }
}
} // namespace
diff --git a/src/starboard/nplb/system_get_total_memory_test.cc b/src/starboard/nplb/system_get_used_cpu_memory_test.cc
similarity index 75%
copy from src/starboard/nplb/system_get_total_memory_test.cc
copy to src/starboard/nplb/system_get_used_cpu_memory_test.cc
index e9b1762..35f0301 100644
--- a/src/starboard/nplb/system_get_total_memory_test.cc
+++ b/src/starboard/nplb/system_get_used_cpu_memory_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
+// Copyright 2016 Google Inc. 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.
@@ -19,9 +19,10 @@
namespace nplb {
namespace {
-TEST(SbSystemGetTotalMemoryTest, SunnyDay) {
- // We are currently expecting this number to be over 80 megabytes.
- EXPECT_LE(SB_INT64_C(80) * 1024 * 1024, SbSystemGetTotalMemory());
+TEST(SbSystemGetUsedCPUMemoryTest, SunnyDay) {
+ // We expect this number to be larger than 0, since at least this test is
+ // resident in process memory.
+ EXPECT_LT(0, SbSystemGetUsedCPUMemory());
}
} // namespace
diff --git a/src/starboard/nplb/system_get_total_memory_test.cc b/src/starboard/nplb/system_get_used_gpu_memory_test.cc
similarity index 76%
copy from src/starboard/nplb/system_get_total_memory_test.cc
copy to src/starboard/nplb/system_get_used_gpu_memory_test.cc
index e9b1762..45c5d3e 100644
--- a/src/starboard/nplb/system_get_total_memory_test.cc
+++ b/src/starboard/nplb/system_get_used_gpu_memory_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
+// Copyright 2016 Google Inc. 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.
@@ -19,9 +19,10 @@
namespace nplb {
namespace {
-TEST(SbSystemGetTotalMemoryTest, SunnyDay) {
- // We are currently expecting this number to be over 80 megabytes.
- EXPECT_LE(SB_INT64_C(80) * 1024 * 1024, SbSystemGetTotalMemory());
+TEST(SbSystemGetUsedGPUMemoryTest, SunnyDay) {
+ if (SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats)) {
+ EXPECT_LE(0, SbSystemGetUsedGPUMemory());
+ }
}
} // namespace
diff --git a/src/starboard/nplb/system_has_capability_test.cc b/src/starboard/nplb/system_has_capability_test.cc
index 64382a4..6711150 100644
--- a/src/starboard/nplb/system_has_capability_test.cc
+++ b/src/starboard/nplb/system_has_capability_test.cc
@@ -26,11 +26,18 @@
// Ensure that this doesn't crash, but we don't know if it should legitimately
// be true or false.
SbSystemHasCapability(kSbSystemCapabilityReversedEnterAndBack);
+ SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats);
}
TEST(SbSystemHasCapabilityTest, SunnyDayNoChange) {
- bool a = SbSystemHasCapability(kSbSystemCapabilityReversedEnterAndBack);
+ bool a;
+
+ a = SbSystemHasCapability(kSbSystemCapabilityReversedEnterAndBack);
EXPECT_EQ(a, SbSystemHasCapability(kSbSystemCapabilityReversedEnterAndBack));
+
+ a = SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats);
+ EXPECT_EQ(a,
+ SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats));
}
TEST(SbSystemHasCapabilityTest, RainyDayNoSuchCapability) {
diff --git a/src/starboard/raspi/1/starboard_platform.gyp b/src/starboard/raspi/1/starboard_platform.gyp
index e66dd31..d1b864c 100644
--- a/src/starboard/raspi/1/starboard_platform.gyp
+++ b/src/starboard/raspi/1/starboard_platform.gyp
@@ -111,7 +111,8 @@
'<(DEPTH)/starboard/shared/linux/socket_get_local_interface_address.cc',
'<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
'<(DEPTH)/starboard/shared/linux/system_get_stack.cc',
- '<(DEPTH)/starboard/shared/linux/system_get_total_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
+ '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
'<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
'<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
'<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
@@ -271,6 +272,8 @@
'<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
'<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
'<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
+ '<(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',
],
diff --git a/src/starboard/shared/linux/system_get_total_memory.cc b/src/starboard/shared/linux/system_get_total_cpu_memory.cc
similarity index 90%
rename from src/starboard/shared/linux/system_get_total_memory.cc
rename to src/starboard/shared/linux/system_get_total_cpu_memory.cc
index 5d2dfa9..53e4ab4 100644
--- a/src/starboard/shared/linux/system_get_total_memory.cc
+++ b/src/starboard/shared/linux/system_get_total_cpu_memory.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
+// Copyright 2016 Google Inc. 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.
@@ -18,7 +18,7 @@
#include "starboard/log.h"
-int64_t SbSystemGetTotalMemory() {
+int64_t SbSystemGetTotalCPUMemory() {
long pages = sysconf(_SC_PHYS_PAGES); // NOLINT[runtime/int]
long page_size = sysconf(_SC_PAGE_SIZE); // NOLINT[runtime/int]
if (pages == -1 || page_size == -1) {
diff --git a/src/starboard/shared/linux/system_get_used_cpu_memory.cc b/src/starboard/shared/linux/system_get_used_cpu_memory.cc
new file mode 100644
index 0000000..57c2b17
--- /dev/null
+++ b/src/starboard/shared/linux/system_get_used_cpu_memory.cc
@@ -0,0 +1,118 @@
+// Copyright 2016 Google Inc. 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"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/sysinfo.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "starboard/file.h"
+#include "starboard/log.h"
+#include "starboard/string.h"
+
+// We find the current amount of used memory on Linux by opening
+// '/proc/self/status' and scan the file for its "VmRSS" entry. Essentially,
+// we need to parse a buffer that has the following format:
+//
+// xxxxxx: 45327 kB
+// yyyyyy: 23 kB
+// VmRSS: 87432 kB
+// zzzzzz: 3213 kB
+// ...
+//
+// And here, we would want to return the value 87432 * 1024.
+// See http://man7.org/linux/man-pages/man5/proc.5.html for more details.
+
+// Searches for the value of VmRSS and returns it. Will modify |buffer| in
+// order to do so quickly and easily.
+int64_t SearchForVmRSSValue(char* buffer, size_t length) {
+ // Search for the string ""VmRSS:".
+ const char kSearchString[] = "\nVmRSS:";
+ enum State {
+ // We are currently searching for kSearchString
+ kSearchingForSearchString,
+ // We found the search string and are advancing through spaces/tabs until
+ // we see a number.
+ kAdvancingSpacesToNumber,
+ // We found the number and are now searching for the end of it.
+ kFindingEndOfNumber,
+ };
+ State state = kSearchingForSearchString;
+ const char* number_start = NULL;
+ for (size_t i = 0; i < length - sizeof(kSearchString); ++i) {
+ if (state == kSearchingForSearchString) {
+ if (SbStringCompare(&buffer[i], kSearchString,
+ sizeof(kSearchString) - 1) == 0) {
+ // Advance until we find a number.
+ state = kAdvancingSpacesToNumber;
+ i += sizeof(kSearchString) - 2;
+ }
+ } else if (state == kAdvancingSpacesToNumber) {
+ if (buffer[i] >= '0' && buffer[i] <= '9') {
+ // We found the start of the number, record where that is and then
+ // continue searching for the end of the number.
+ number_start = &buffer[i];
+ state = kFindingEndOfNumber;
+ }
+ } else {
+ SB_DCHECK(state == kFindingEndOfNumber);
+ if (buffer[i] < '0' || buffer[i] > '9') {
+ // Drop a null at the end of the number so that we can call atoi() on
+ // it and return.
+ buffer[i] = '\0';
+ return SbStringAToI(number_start);
+ }
+ }
+ }
+
+ SB_LOG(ERROR) << "Could not find 'VmRSS:' in /proc/self/status.";
+ return 0;
+}
+
+int64_t SbSystemGetUsedCPUMemory() {
+ // Read our process' current physical memory usage from /proc/self/status.
+ // This requires a bit of parsing through the output to find the value for
+ // the "VmRSS" field which indicates used physical memory.
+ starboard::ScopedFile status_file("/proc/self/status",
+ kSbFileOpenOnly | kSbFileRead);
+ if (!status_file.IsValid()) {
+ SB_LOG(ERROR)
+ << "Error opening /proc/self/status in order to query self memory "
+ "usage.";
+ return 0;
+ }
+
+ // Read the entire file into memory.
+ const int kBufferSize = 2048;
+ char buffer[kBufferSize];
+ int remaining = kBufferSize;
+ char* output_pointer = buffer;
+ do {
+ int result = status_file.Read(output_pointer, remaining);
+ if (result <= 0)
+ break;
+
+ remaining -= result;
+ output_pointer += result;
+ } while (remaining);
+
+ // Return the result, multiplied by 1024 because it is given in kilobytes.
+ return SearchForVmRSSValue(buffer,
+ static_cast<size_t>(output_pointer - buffer)) *
+ 1024;
+}
diff --git a/src/starboard/shared/posix/socket_receive_from.cc b/src/starboard/shared/posix/socket_receive_from.cc
index e5d4747..6acea4c 100644
--- a/src/starboard/shared/posix/socket_receive_from.cc
+++ b/src/starboard/shared/posix/socket_receive_from.cc
@@ -58,7 +58,8 @@
return static_cast<int>(bytes_read);
}
- if (errno != EAGAIN && errno != EWOULDBLOCK) {
+ if (errno != EAGAIN && errno != EWOULDBLOCK &&
+ socket->error != sbposix::TranslateSocketErrno(errno)) {
SB_DLOG(ERROR) << "recv failed, errno = " << errno;
}
socket->error = sbposix::TranslateSocketErrno(errno);
@@ -81,7 +82,8 @@
return static_cast<int>(bytes_read);
}
- if (errno != EAGAIN && errno != EWOULDBLOCK) {
+ if (errno != EAGAIN && errno != EWOULDBLOCK &&
+ socket->error != sbposix::TranslateSocketErrno(errno)) {
SB_DLOG(ERROR) << "recvfrom failed, errno = " << errno;
}
socket->error = sbposix::TranslateSocketErrno(errno);
diff --git a/src/starboard/shared/starboard/application.cc b/src/starboard/shared/starboard/application.cc
index 7904ece..1482b1a 100644
--- a/src/starboard/shared/starboard/application.cc
+++ b/src/starboard/shared/starboard/application.cc
@@ -43,8 +43,7 @@
SbEventStartData start_data;
start_data.argument_values = argv;
start_data.argument_count = argc;
- start_data.link_data.link_data = NULL;
- start_data.link_data.link_data_size = 0;
+ start_data.link = NULL;
Dispatch(kSbEventTypeStart, &start_data, NULL);
}
diff --git a/src/starboard/shared/stub/system_get_total_memory.cc b/src/starboard/shared/stub/system_get_total_cpu_memory.cc
similarity index 94%
rename from src/starboard/shared/stub/system_get_total_memory.cc
rename to src/starboard/shared/stub/system_get_total_cpu_memory.cc
index 8fb7b53..534b5c4 100644
--- a/src/starboard/shared/stub/system_get_total_memory.cc
+++ b/src/starboard/shared/stub/system_get_total_cpu_memory.cc
@@ -14,6 +14,6 @@
#include "starboard/system.h"
-int64_t SbSystemGetTotalMemory() {
+int64_t SbSystemGetTotalCPUMemory() {
return 0;
}
diff --git a/src/starboard/shared/stub/system_get_total_memory.cc b/src/starboard/shared/stub/system_get_total_gpu_memory.cc
similarity index 94%
copy from src/starboard/shared/stub/system_get_total_memory.cc
copy to src/starboard/shared/stub/system_get_total_gpu_memory.cc
index 8fb7b53..93d35a1 100644
--- a/src/starboard/shared/stub/system_get_total_memory.cc
+++ b/src/starboard/shared/stub/system_get_total_gpu_memory.cc
@@ -14,6 +14,6 @@
#include "starboard/system.h"
-int64_t SbSystemGetTotalMemory() {
+int64_t SbSystemGetTotalGPUMemory() {
return 0;
}
diff --git a/src/starboard/shared/stub/system_get_total_memory.cc b/src/starboard/shared/stub/system_get_used_cpu_memory.cc
similarity index 94%
copy from src/starboard/shared/stub/system_get_total_memory.cc
copy to src/starboard/shared/stub/system_get_used_cpu_memory.cc
index 8fb7b53..4849b4e 100644
--- a/src/starboard/shared/stub/system_get_total_memory.cc
+++ b/src/starboard/shared/stub/system_get_used_cpu_memory.cc
@@ -14,6 +14,6 @@
#include "starboard/system.h"
-int64_t SbSystemGetTotalMemory() {
+int64_t SbSystemGetUsedCPUMemory() {
return 0;
}
diff --git a/src/starboard/shared/stub/system_get_total_memory.cc b/src/starboard/shared/stub/system_get_used_gpu_memory.cc
similarity index 94%
copy from src/starboard/shared/stub/system_get_total_memory.cc
copy to src/starboard/shared/stub/system_get_used_gpu_memory.cc
index 8fb7b53..6e19b85 100644
--- a/src/starboard/shared/stub/system_get_total_memory.cc
+++ b/src/starboard/shared/stub/system_get_used_gpu_memory.cc
@@ -14,6 +14,6 @@
#include "starboard/system.h"
-int64_t SbSystemGetTotalMemory() {
+int64_t SbSystemGetUsedGPUMemory() {
return 0;
}
diff --git a/src/starboard/stub/starboard_platform.gyp b/src/starboard/stub/starboard_platform.gyp
index 21054dc..e07af31 100644
--- a/src/starboard/stub/starboard_platform.gyp
+++ b/src/starboard/stub/starboard_platform.gyp
@@ -184,7 +184,10 @@
'<(DEPTH)/starboard/shared/stub/system_get_random_data.cc',
'<(DEPTH)/starboard/shared/stub/system_get_random_uint64.cc',
'<(DEPTH)/starboard/shared/stub/system_get_stack.cc',
- '<(DEPTH)/starboard/shared/stub/system_get_total_memory.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_total_cpu_memory.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_used_cpu_memory.cc',
+ '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
'<(DEPTH)/starboard/shared/stub/system_has_capability.cc',
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_is_debugger_attached.cc',
diff --git a/src/starboard/system.h b/src/starboard/system.h
index 957719a..c52a4e1 100644
--- a/src/starboard/system.h
+++ b/src/starboard/system.h
@@ -142,6 +142,12 @@
typedef enum SbSystemCapabilityId {
// Whether this system has reversed Enter and Back keys.
kSbSystemCapabilityReversedEnterAndBack,
+
+ // Whether this system has the ability to report on GPU memory usage.
+ // If (and only if) a system has this capcability will
+ // SbSystemGetTotalGPUMemory() and SbSystemGetUsedGPUMemory() be valid to
+ // call.
+ kSbSystemCapabilityCanQueryGPUMemoryStats,
} SbSystemCapabilityId;
// Enumeration of possible values for the |type| parameter passed to the
@@ -241,10 +247,27 @@
// sandboxed limit.
SB_EXPORT int SbSystemGetNumberOfProcessors();
-// Gets the total memory potentially available to this application. If the
-// process is sandboxed to a maximum allowable limit, it will return the lesser
-// of the physical and sandbox limits.
-SB_EXPORT int64_t SbSystemGetTotalMemory();
+// Gets the total CPU memory (in bytes) potentially available to this
+// application. If the process is sandboxed to a maximum allowable limit, it
+// will return the lesser of the physical and sandbox limits.
+SB_EXPORT int64_t SbSystemGetTotalCPUMemory();
+
+// Returns the total physical CPU memory (in bytes) used by this application.
+// This value should always be less than (or in particularly exciting
+// situations, equal to) SbSystemGetTotalCPUMemory().
+SB_EXPORT int64_t SbSystemGetUsedCPUMemory();
+
+// Returns the total GPU memory available (in bytes) for use by this
+// application.
+// This function may only be called if true is the return value for calls to
+// SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats).
+SB_EXPORT int64_t SbSystemGetTotalGPUMemory();
+
+// Returns the current amount of GPU memory (in bytes) that is currently being
+// used by this application.
+// This function may only be called if true is the return value for calls to
+// SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats).
+SB_EXPORT int64_t SbSystemGetUsedGPUMemory();
// Returns the type of the device.
SB_EXPORT SbSystemDeviceType SbSystemGetDeviceType();
diff --git a/src/starboard/user.h b/src/starboard/user.h
index bf9a5d4..04443ee 100644
--- a/src/starboard/user.h
+++ b/src/starboard/user.h
@@ -108,55 +108,6 @@
SbUserPropertyId property_id,
char* out_value,
int value_size);
-
-#if SB_HAS(USER_APPLICATION_LINKING_SUPPORT)
-// Initiates a process to link |user| with a per-application authentication
-// token. On success, |out_token| is populated with the authentication token
-// and |out_expiry| is set to the number of seconds until the token expires. An
-// expiration of 0 indicates that the token never expires.
-// This call will block until the linking process is complete, which may involve
-// user input.
-// After this call completes successfully, subsequent calls to
-// SbUserRequestAuthenticationToken will return valid tokens.
-// Returns false if |user| is invalid, |token_results| is NULL,
-// |token_results.token_buffer| is NULL or if the token is larger than
-// |token_results.token_buffer_size|.
-// Returns true if process to link the token succeeded, and false if the process
-// failed for any reason including user cancellation.
-SB_EXPORT bool SbUserRequestApplicationLinking(
- SbUser user,
- SbUserApplicationTokenResults* token_results);
-
-// Remove the link between |user| and the per-application authentication token.
-// This call will block until the linking process is complete, which may involve
-// user input.
-// After this call completes successfully, subsequent calls to
-// SbUserRequestAuthenticationToken will fail.
-// Returns false if |user| is invalid.
-// Returns true if the process to unlink the token succeeded. Returns false if
-// the process failed for any reason including user cancellation.
-SB_EXPORT bool SbUserRequestApplicationUnlinking(SbUser user);
-
-// Requests a new per-application authentication token. On success, |out_token|
-// is populated with the authentication token and |out_expiry| is set to the
-// number of seconds until the token expires. An expiration of 0 indicates that
-// the token never expires.
-// This call will block until the token has been received.
-// Returns false if |user| is invalid, |out_token| or |out_expiration| are NULL,
-// or if the token is larger than |out_token_size|.
-// Returns false if the user account is not linked with an application. In this
-// case, SbUserRequestApplicationLinking should be called.
-// Returns true if process to link the token succeeded, and false if the process
-// failed for any reason including user cancellation.
-SB_EXPORT bool SbUserRequestAuthenticationToken(
- SbUser user,
- SbUserApplicationTokenResults* token_results);
-
-// Gets the maximum size of an authentication token as returned by
-// SbUserRequestApplicationLinking and SbUserRequestAuthenticationToken.
-SB_EXPORT size_t SbUserMaxAuthenticationTokenSizeInBytes();
-#endif // SB_HAS(USER_APPLICATION_LINKING_SUPPORT)
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/src/third_party/WebKit/Source/WTF/wtf/RAMSize.cpp b/src/third_party/WebKit/Source/WTF/wtf/RAMSize.cpp
index 5a4c3b8..97f3c55 100644
--- a/src/third_party/WebKit/Source/WTF/wtf/RAMSize.cpp
+++ b/src/third_party/WebKit/Source/WTF/wtf/RAMSize.cpp
@@ -98,7 +98,7 @@
return ramSizeGuess;
return mst.st_size;
#elif OS(STARBOARD)
- return SbSystemGetTotalMemory();
+ return SbSystemGetTotalCPUMemory();
#endif
}
diff --git a/src/third_party/mozjs/js/src/shell/js.cpp b/src/third_party/mozjs/js/src/shell/js.cpp
index cc11b09..7b1cf6b 100644
--- a/src/third_party/mozjs/js/src/shell/js.cpp
+++ b/src/third_party/mozjs/js/src/shell/js.cpp
@@ -80,6 +80,15 @@
#include "TraceLogging.h"
#endif
+#if defined(DEBUG) && defined(STARBOARD)
+// On Starboard platforms, DEBUG will get #undef'd when we #include zlib.h
+#define STARBOARD_DEBUG
+#endif
+
+#ifdef USE_ZLIB
+#include "zlib.h"
+#endif
+
using namespace js;
using namespace js::cli;
@@ -172,7 +181,7 @@
static bool compileOnly = false;
static bool fuzzingSafe = false;
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
static bool OOM_printAllocationCount = false;
#endif
@@ -1684,7 +1693,7 @@
return true;
}
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
static void
UpdateSwitchTableBounds(JSContext *cx, HandleScript script, unsigned offset,
@@ -3172,7 +3181,7 @@
ParseNode *pn = parser.parse(NULL);
if (!pn)
return false;
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
DumpParseTree(pn);
fputc('\n', stderr);
#endif
@@ -3510,7 +3519,7 @@
return false;
}
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
cx->stackIterAssertionEnabled = JSVAL_TO_BOOLEAN(JS_ARGV(cx, vp)[0]);
#endif
@@ -3649,7 +3658,7 @@
"throwError()",
" Throw an error from JS_ReportError."),
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
JS_FN_HELP("disassemble", DisassembleToString, 1, 0,
"disassemble([fun])",
" Return the disassembly for the given function."),
@@ -3751,7 +3760,7 @@
" Create object with resolve hook that copies properties\n"
" from src. If proto is omitted, use Object.prototype."),
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
JS_FN_HELP("arrayInfo", js_ArrayInfo, 1, 0,
"arrayInfo(a1, a2, ...)",
" Report statistics about arrays."),
@@ -4531,7 +4540,7 @@
static JSBool
dom_genericMethod(JSContext *cx, unsigned argc, JS::Value *vp);
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
static JSClass *GetDomClass();
#endif
@@ -4622,7 +4631,7 @@
JSCLASS_NO_INTERNAL_MEMBERS
};
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
static JSClass *GetDomClass() {
return &dom_class;
}
@@ -5245,7 +5254,7 @@
|| !op.addBoolOption('a', "always-mjit", "No-op (still used by fuzzers)")
|| !op.addBoolOption('D', "dump-bytecode", "Dump bytecode with exec count for all scripts")
|| !op.addBoolOption('b', "print-timing", "Print sub-ms runtime for each file that's run")
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
|| !op.addBoolOption('O', "print-alloc", "Print the number of allocations at exit")
#endif
|| !op.addOptionalStringArg("script", "A script to execute (after all options)")
@@ -5325,7 +5334,7 @@
if (op.getHelpOption())
return EXIT_SUCCESS;
-#ifdef DEBUG
+#if defined(DEBUG) || defined(STARBOARD_DEBUG)
/*
* Process OOM options as early as possible so that we can observe as many
* allocations as possible.
@@ -5376,7 +5385,7 @@
result = Shell(cx, &op, envp);
-#ifdef DEBUG
+#if defined(DEBUG) && !defined(JS_USE_CUSTOM_ALLOCATOR)
if (OOM_printAllocationCount)
printf("OOM max count: %u\n", OOM_counter);
#endif