diff --git a/DEPS b/DEPS index 41b948d..8541fba92 100644 --- a/DEPS +++ b/DEPS
@@ -100,7 +100,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '4ab1cadef13b0f085cddfae744ba9c99421ea2cc', + 'catapult_revision': 'f4ac632c50f310f3a863bd0342e70aca7420d669', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc index 959d2b4d..d5252bd2 100644 --- a/android_webview/browser/aw_browser_context.cc +++ b/android_webview/browser/aw_browser_context.cc
@@ -269,30 +269,6 @@ visitedlink_master_->AddURLs(urls); } -net::URLRequestContextGetter* AwBrowserContext::CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - // This function cannot actually create the request context because - // there is a reentrant dependency on GetResourceContext() via - // content::StoragePartitionImplMap::Create(). This is not fixable - // until http://crbug.com/159193. Until then, assert that the context - // has already been allocated and just handle setting the protocol_handlers. - DCHECK(url_request_context_getter_.get()); - url_request_context_getter_->SetHandlersAndInterceptors( - protocol_handlers, std::move(request_interceptors)); - return url_request_context_getter_.get(); -} - -net::URLRequestContextGetter* -AwBrowserContext::CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - NOTREACHED(); - return NULL; -} - AwQuotaManagerBridge* AwBrowserContext::GetQuotaManagerBridge() { if (!quota_manager_bridge_.get()) { quota_manager_bridge_ = native_factory_->CreateAwQuotaManagerBridge(this); @@ -439,6 +415,30 @@ return nullptr; } +net::URLRequestContextGetter* AwBrowserContext::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + // This function cannot actually create the request context because + // there is a reentrant dependency on GetResourceContext() via + // content::StoragePartitionImplMap::Create(). This is not fixable + // until http://crbug.com/159193. Until then, assert that the context + // has already been allocated and just handle setting the protocol_handlers. + DCHECK(url_request_context_getter_.get()); + url_request_context_getter_->SetHandlersAndInterceptors( + protocol_handlers, std::move(request_interceptors)); + return url_request_context_getter_.get(); +} + +net::URLRequestContextGetter* +AwBrowserContext::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + NOTREACHED(); + return NULL; +} + policy::URLBlacklistManager* AwBrowserContext::GetURLBlacklistManager() { // Should not be called until the end of PreMainMessageLoopRun, where // blacklist_manager_ is initialized.
diff --git a/android_webview/browser/aw_browser_context.h b/android_webview/browser/aw_browser_context.h index 2db1831..bd6418f1 100644 --- a/android_webview/browser/aw_browser_context.h +++ b/android_webview/browser/aw_browser_context.h
@@ -86,15 +86,6 @@ // These methods map to Add methods in visitedlink::VisitedLinkMaster. void AddVisitedURLs(const std::vector<GURL>& urls); - net::URLRequestContextGetter* CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors); - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors); - AwQuotaManagerBridge* GetQuotaManagerBridge(); AwFormDatabaseService* GetFormDatabaseService(); data_reduction_proxy::DataReductionProxySettings* @@ -126,6 +117,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; // visitedlink::VisitedLinkDelegate implementation. void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) override;
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index 5ce8414f6..c6954077 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc
@@ -232,30 +232,6 @@ host->AddFilter(new AwPrintingMessageFilter(host->GetID())); } -net::URLRequestContextGetter* AwContentBrowserClient::CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - DCHECK_EQ(browser_context_.get(), browser_context); - return browser_context_->CreateRequestContext( - protocol_handlers, std::move(request_interceptors)); -} - -net::URLRequestContextGetter* -AwContentBrowserClient::CreateRequestContextForStoragePartition( - content::BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - DCHECK_EQ(browser_context_.get(), browser_context); - // TODO(mkosiba,kinuko): request_interceptors should be hooked up in the - // downstream. (crbug.com/350286) - return browser_context_->CreateRequestContextForStoragePartition( - partition_path, in_memory, protocol_handlers, - std::move(request_interceptors)); -} - bool AwContentBrowserClient::IsHandledURL(const GURL& url) { if (!url.is_valid()) { // We handle error cases.
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h index 7be439e..414de96 100644 --- a/android_webview/browser/aw_content_browser_client.h +++ b/android_webview/browser/aw_content_browser_client.h
@@ -41,16 +41,6 @@ content::WebContentsViewDelegate* GetWebContentsViewDelegate( content::WebContents* web_contents) override; void RenderProcessWillLaunch(content::RenderProcessHost* host) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - content::BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; bool IsHandledURL(const GURL& url) override; std::string GetCanonicalEncodingNameByAliasName( const std::string& alias_name) override;
diff --git a/android_webview/browser/aw_render_thread_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc index e89b78a..6a28b82 100644 --- a/android_webview/browser/aw_render_thread_context_provider.cc +++ b/android_webview/browser/aw_render_thread_context_provider.cc
@@ -52,9 +52,9 @@ attributes.bind_generates_resource = false; context_.reset(gpu::GLInProcessContext::Create( service, surface, surface->IsOffscreen(), gfx::kNullAcceleratedWidget, - surface->GetSize(), nullptr /* share_context */, - false /* share_resources */, attributes, gfx::PreferDiscreteGpu, - gpu::GLInProcessContextSharedMemoryLimits(), nullptr, nullptr)); + surface->GetSize(), nullptr /* share_context */, attributes, + gfx::PreferDiscreteGpu, gpu::GLInProcessContextSharedMemoryLimits(), + nullptr, nullptr)); context_->SetContextLostCallback(base::Bind( &AwRenderThreadContextProvider::OnLostContext, base::Unretained(this))); @@ -116,11 +116,14 @@ } void AwRenderThreadContextProvider::SetupLock() { - context_->SetLock(&context_lock_); + // This context provider is not used on multiple threads. + NOTREACHED(); } base::Lock* AwRenderThreadContextProvider::GetLock() { - return &context_lock_; + // This context provider is not used on multiple threads. + NOTREACHED(); + return nullptr; } void AwRenderThreadContextProvider::DeleteCachedResources() {
diff --git a/android_webview/browser/aw_render_thread_context_provider.h b/android_webview/browser/aw_render_thread_context_provider.h index f9df881..dcf5ca4 100644 --- a/android_webview/browser/aw_render_thread_context_provider.h +++ b/android_webview/browser/aw_render_thread_context_provider.h
@@ -10,7 +10,6 @@ #include <memory> #include "base/macros.h" -#include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "cc/output/context_provider.h" #include "gpu/command_buffer/service/in_process_command_buffer.h" @@ -63,8 +62,6 @@ LostContextCallback lost_context_callback_; - base::Lock context_lock_; - DISALLOW_COPY_AND_ASSIGN(AwRenderThreadContextProvider); };
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc index 5c292e4..9f91213d 100644 --- a/android_webview/browser/browser_view_renderer.cc +++ b/android_webview/browser/browser_view_renderer.cc
@@ -25,6 +25,7 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkPictureRecorder.h" +#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/scroll_offset.h" #include "ui/gfx/geometry/vector2d_conversions.h" @@ -404,10 +405,11 @@ UpdateCompositorIsActive(); } -void BrowserViewRenderer::SynchronizeRendererScroll() { +void BrowserViewRenderer::ZoomBy(float delta) { if (!compositor_) return; - compositor_->SynchronizeWithRenderer(); + compositor_->SynchronouslyZoomBy( + delta, gfx::Point(size_.width() / 2, size_.height() / 2)); } void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) {
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h index baf76c2..fe6cad7 100644 --- a/android_webview/browser/browser_view_renderer.h +++ b/android_webview/browser/browser_view_renderer.h
@@ -82,7 +82,7 @@ void OnSizeChanged(int width, int height); void OnAttachedToWindow(int width, int height); void OnDetachedFromWindow(); - void SynchronizeRendererScroll(); + void ZoomBy(float delta); void OnComputeScroll(base::TimeTicks animation_time); // Sets the scale for logical<->physical pixel conversions.
diff --git a/android_webview/browser/net/aw_url_request_context_getter.h b/android_webview/browser/net/aw_url_request_context_getter.h index 64ac984..daa5147 100644 --- a/android_webview/browser/net/aw_url_request_context_getter.h +++ b/android_webview/browser/net/aw_url_request_context_getter.h
@@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "components/prefs/pref_member.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_job_factory.h"
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 657f1f81..0ea766ef 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -2104,8 +2104,7 @@ if (delta < 0.01f || delta > 100.0f) { throw new IllegalStateException("zoom delta value outside [0.01, 100] range."); } - mContentViewCore.pinchByDelta(delta); - nativeSynchronizeRendererScroll(mNativeAwContents); + nativeZoomBy(mNativeAwContents, delta); } /** @@ -3239,7 +3238,7 @@ long nativeAwContents, String path, ValueCallback<String> callback); private native void nativeAddVisitedLinks(long nativeAwContents, String[] visitedLinks); - private native void nativeSynchronizeRendererScroll(long nativeAwContents); + private native void nativeZoomBy(long nativeAwContents, float delta); private native void nativeOnComputeScroll( long nativeAwContents, long currentAnimationTimeMillis); private native boolean nativeOnDraw(long nativeAwContents, Canvas canvas,
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc index 35fca8b..1f41bb6 100644 --- a/android_webview/native/aw_contents.cc +++ b/android_webview/native/aw_contents.cc
@@ -1016,11 +1016,11 @@ render_view_host_ext_->SetBackgroundColor(color); } -void AwContents::SynchronizeRendererScroll( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj) { +void AwContents::ZoomBy(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jfloat delta) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - browser_view_renderer_.SynchronizeRendererScroll(); + browser_view_renderer_.ZoomBy(delta); } void AwContents::OnComputeScroll(JNIEnv* env,
diff --git a/android_webview/native/aw_contents.h b/android_webview/native/aw_contents.h index 75e07e7..bb3469fd 100644 --- a/android_webview/native/aw_contents.h +++ b/android_webview/native/aw_contents.h
@@ -164,9 +164,9 @@ void SetBackgroundColor(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jint color); - void SynchronizeRendererScroll( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); + void ZoomBy(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jfloat delta); void OnComputeScroll(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jlong animation_time_millis);
diff --git a/ash/ash.gyp b/ash/ash.gyp index fee27ca..af7a2426 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp
@@ -74,10 +74,6 @@ 'display/display_error_observer_chromeos.h', 'display/display_info.cc', 'display/display_info.h', - 'display/display_layout.cc', - 'display/display_layout.h', - 'display/display_layout_builder.cc', - 'display/display_layout_builder.h', 'display/display_layout_store.cc', 'display/display_layout_store.h', 'display/display_manager.cc', @@ -829,7 +825,6 @@ 'display/display_color_manager_chromeos_unittest.cc', 'display/display_error_observer_chromeos_unittest.cc', 'display/display_info_unittest.cc', - 'display/display_layout_builder_unittest.cc', 'display/display_manager_unittest.cc', 'display/display_util_unittest.cc', 'display/extended_mouse_warp_controller_unittest.cc', @@ -978,6 +973,7 @@ '../ui/base/ui_base.gyp:ui_base', '../ui/base/ui_base.gyp:ui_data_pack', '../ui/compositor/compositor.gyp:compositor', + '../ui/display/display.gyp:display', '../ui/events/devices/events_devices.gyp:events_devices', '../ui/events/events.gyp:events', '../ui/events/events.gyp:events_base', @@ -1038,7 +1034,6 @@ '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_resources', '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_strings', '../ui/chromeos/ui_chromeos.gyp:ui_chromeos', - '../ui/display/display.gyp:display', '../ui/display/display.gyp:display_util', ], }, { # else: chromeos!=1 @@ -1176,6 +1171,7 @@ '../ui/base/ui_base.gyp:ui_base_test_support', '../ui/compositor/compositor.gyp:compositor', '../ui/compositor/compositor.gyp:compositor_test_support', + '../ui/display/display.gyp:display', '../ui/events/devices/events_devices.gyp:events_devices', '../ui/events/events.gyp:events', '../ui/events/events.gyp:events_test_support', @@ -1237,7 +1233,6 @@ '../chromeos/chromeos.gyp:power_manager_proto', '../components/components.gyp:quirks', '../device/bluetooth/bluetooth.gyp:device_bluetooth', - '../ui/display/display.gyp:display', '../ui/display/display.gyp:display_test_support', '../ui/display/display.gyp:display_test_util', '../ui/display/display.gyp:display_types',
diff --git a/ash/display/display_change_observer_chromeos.cc b/ash/display/display_change_observer_chromeos.cc index 23f3665..8e92ff0 100644 --- a/ash/display/display_change_observer_chromeos.cc +++ b/ash/display/display_change_observer_chromeos.cc
@@ -24,6 +24,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/user_activity/user_activity_detector.h" #include "ui/compositor/dip_util.h" +#include "ui/display/manager/display_layout.h" #include "ui/display/types/display_mode.h" #include "ui/display/types/display_snapshot.h" #include "ui/display/util/display_util.h" @@ -156,16 +157,16 @@ UpdateInternalDisplayId(display_states); if (display_states.size() == 1) return ui::MULTIPLE_DISPLAY_STATE_SINGLE; - DisplayIdList list = + display::DisplayIdList list = GenerateDisplayIdList(display_states.begin(), display_states.end(), [](const ui::DisplaySnapshot* display_state) { return display_state->display_id(); }); - const DisplayLayout& layout = Shell::GetInstance() - ->display_manager() - ->layout_store() - ->GetRegisteredDisplayLayout(list); + const display::DisplayLayout& layout = Shell::GetInstance() + ->display_manager() + ->layout_store() + ->GetRegisteredDisplayLayout(list); return layout.mirrored ? ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED; }
diff --git a/ash/display/display_configuration_controller.cc b/ash/display/display_configuration_controller.cc index 9fdf8bea..3110858b 100644 --- a/ash/display/display_configuration_controller.cc +++ b/ash/display/display_configuration_controller.cc
@@ -5,11 +5,11 @@ #include "ash/display/display_configuration_controller.h" #include "ash/display/display_animator.h" -#include "ash/display/display_layout.h" #include "ash/display/display_manager.h" #include "ash/rotator/screen_rotation_animator.h" #include "ash/screen_util.h" #include "base/time/time.h" +#include "ui/display/manager/display_layout.h" #if defined(OS_CHROMEOS) #include "ash/display/display_animator_chromeos.h" @@ -68,7 +68,7 @@ } void DisplayConfigurationController::SetDisplayLayout( - scoped_ptr<DisplayLayout> layout, + scoped_ptr<display::DisplayLayout> layout, bool user_action) { if (user_action && display_animator_) { display_animator_->StartFadeOutAnimation( @@ -147,7 +147,7 @@ } void DisplayConfigurationController::SetDisplayLayoutImpl( - scoped_ptr<DisplayLayout> layout) { + scoped_ptr<display::DisplayLayout> layout) { // TODO(oshima/stevenjb): Add support for 3+ displays. display_manager_->SetLayoutForCurrentDisplays(std::move(layout)); if (display_animator_)
diff --git a/ash/display/display_configuration_controller.h b/ash/display/display_configuration_controller.h index 2c3f5b1..2256b6db 100644 --- a/ash/display/display_configuration_controller.h +++ b/ash/display/display_configuration_controller.h
@@ -17,6 +17,10 @@ #include "base/memory/weak_ptr.h" #include "ui/gfx/display.h" +namespace display { +class DisplayLayout; +} + namespace ash { namespace test { @@ -25,7 +29,6 @@ class DisplayAnimator; class DisplayManager; -class DisplayLayout; class ASH_EXPORT DisplayConfigurationController : public WindowTreeHostManager::Observer { @@ -38,7 +41,8 @@ // Sets the layout for the current displays with a fade in/out // animation. Currently |display_id| is assumed to be the secondary // display. TODO(oshima/stevenjb): Support 3+ displays. - void SetDisplayLayout(scoped_ptr<DisplayLayout> layout, bool user_action); + void SetDisplayLayout(scoped_ptr<display::DisplayLayout> layout, + bool user_action); // Sets the mirror mode with a fade-in/fade-out animation. Affects all // displays. @@ -69,7 +73,7 @@ // *before* starting any animations. void SetThrottleTimeout(int64_t throttle_ms); bool IsLimited(); - void SetDisplayLayoutImpl(scoped_ptr<DisplayLayout> layout); + void SetDisplayLayoutImpl(scoped_ptr<display::DisplayLayout> layout); void SetMirrorModeImpl(bool mirror); void SetPrimaryDisplayIdImpl(int64_t display_id);
diff --git a/ash/display/display_layout_store.cc b/ash/display/display_layout_store.cc index 5ede80b..7b074e00 100644 --- a/ash/display/display_layout_store.cc +++ b/ash/display/display_layout_store.cc
@@ -16,7 +16,7 @@ namespace ash { DisplayLayoutStore::DisplayLayoutStore() - : default_display_placement_(DisplayPlacement::RIGHT, 0) { + : default_display_placement_(display::DisplayPlacement::RIGHT, 0) { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) { std::string value = command_line->GetSwitchValueASCII( @@ -25,13 +25,13 @@ int offset = 0; if (sscanf(value.c_str(), "%c,%d", &layout, &offset) == 2) { if (layout == 't') - default_display_placement_.position = DisplayPlacement::TOP; + default_display_placement_.position = display::DisplayPlacement::TOP; else if (layout == 'b') - default_display_placement_.position = DisplayPlacement::BOTTOM; + default_display_placement_.position = display::DisplayPlacement::BOTTOM; else if (layout == 'r') - default_display_placement_.position = DisplayPlacement::RIGHT; + default_display_placement_.position = display::DisplayPlacement::RIGHT; else if (layout == 'l') - default_display_placement_.position = DisplayPlacement::LEFT; + default_display_placement_.position = display::DisplayPlacement::LEFT; default_display_placement_.offset = offset; } } @@ -41,15 +41,15 @@ } void DisplayLayoutStore::SetDefaultDisplayPlacement( - const DisplayPlacement& placement) { + const display::DisplayPlacement& placement) { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) default_display_placement_ = placement; } void DisplayLayoutStore::RegisterLayoutForDisplayIdList( - const DisplayIdList& list, - scoped_ptr<DisplayLayout> layout) { + const display::DisplayIdList& list, + scoped_ptr<display::DisplayLayout> layout) { // m50/51 dev/beta channel may have bad layout data saved in local state. // TODO(oshima): Consider removing this after m53. if (list.size() == 2 && layout->placement_list.size() > 1) @@ -71,27 +71,28 @@ layout->placement_list[0].parent_display_id = list[0]; } } - DCHECK(DisplayLayout::Validate(list, *layout.get())) + DCHECK(display::DisplayLayout::Validate(list, *layout.get())) << "ids=" << DisplayIdListToString(list) << ", layout=" << layout->ToString(); layouts_[list] = std::move(layout); } -const DisplayLayout& DisplayLayoutStore::GetRegisteredDisplayLayout( - const DisplayIdList& list) { +const display::DisplayLayout& DisplayLayoutStore::GetRegisteredDisplayLayout( + const display::DisplayIdList& list) { DCHECK_NE(1u, list.size()); const auto iter = layouts_.find(list); - const DisplayLayout* layout = iter != layouts_.end() - ? iter->second.get() - : CreateDefaultDisplayLayout(list); - DCHECK(DisplayLayout::Validate(list, *layout)) << layout->ToString(); + const display::DisplayLayout* layout = iter != layouts_.end() + ? iter->second.get() + : CreateDefaultDisplayLayout(list); + DCHECK(display::DisplayLayout::Validate(list, *layout)) << layout->ToString(); DCHECK_NE(layout->primary_id, gfx::Display::kInvalidDisplayID); return *layout; } -void DisplayLayoutStore::UpdateMultiDisplayState(const DisplayIdList& list, - bool mirrored, - bool default_unified) { +void DisplayLayoutStore::UpdateMultiDisplayState( + const display::DisplayIdList& list, + bool mirrored, + bool default_unified) { DCHECK(layouts_.find(list) != layouts_.end()); if (layouts_.find(list) == layouts_.end()) CreateDefaultDisplayLayout(list); @@ -100,14 +101,14 @@ layouts_[list]->default_unified = default_unified; } -DisplayLayout* DisplayLayoutStore::CreateDefaultDisplayLayout( - const DisplayIdList& list) { - scoped_ptr<DisplayLayout> layout(new DisplayLayout); +display::DisplayLayout* DisplayLayoutStore::CreateDefaultDisplayLayout( + const display::DisplayIdList& list) { + scoped_ptr<display::DisplayLayout> layout(new display::DisplayLayout); // The first display is the primary by default. layout->primary_id = list[0]; layout->placement_list.clear(); for (size_t i = 0; i < list.size() - 1; i++) { - DisplayPlacement placement(default_display_placement_); + display::DisplayPlacement placement(default_display_placement_); placement.display_id = list[i + 1]; placement.parent_display_id = list[i]; layout->placement_list.push_back(placement);
diff --git a/ash/display/display_layout_store.h b/ash/display/display_layout_store.h index 6dd7b8a..ab93ca1b 100644 --- a/ash/display/display_layout_store.h +++ b/ash/display/display_layout_store.h
@@ -10,9 +10,9 @@ #include <map> #include "ash/ash_export.h" -#include "ash/display/display_layout.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "ui/display/manager/display_layout.h" namespace ash { @@ -21,32 +21,35 @@ DisplayLayoutStore(); ~DisplayLayoutStore(); - void SetDefaultDisplayPlacement(const DisplayPlacement& placement); + void SetDefaultDisplayPlacement(const display::DisplayPlacement& placement); // Registeres the display layout info for the specified display(s). - void RegisterLayoutForDisplayIdList(const DisplayIdList& list, - scoped_ptr<DisplayLayout> layout); + void RegisterLayoutForDisplayIdList( + const display::DisplayIdList& list, + scoped_ptr<display::DisplayLayout> layout); // If no layout is registered, it creatas new layout using // |default_display_layout_|. - const DisplayLayout& GetRegisteredDisplayLayout(const DisplayIdList& list); + const display::DisplayLayout& GetRegisteredDisplayLayout( + const display::DisplayIdList& list); // Update the multi display state in the display layout for // |display_list|. This creates new display layout if no layout is // registered for |display_list|. - void UpdateMultiDisplayState(const DisplayIdList& display_list, + void UpdateMultiDisplayState(const display::DisplayIdList& display_list, bool mirrored, bool default_unified); private: // Creates new layout for display list from |default_display_layout_|. - DisplayLayout* CreateDefaultDisplayLayout(const DisplayIdList& display_list); + display::DisplayLayout* CreateDefaultDisplayLayout( + const display::DisplayIdList& display_list); // The default display placement. - DisplayPlacement default_display_placement_; + display::DisplayPlacement default_display_placement_; // Display layout per list of devices. - std::map<DisplayIdList, scoped_ptr<DisplayLayout>> layouts_; + std::map<display::DisplayIdList, scoped_ptr<display::DisplayLayout>> layouts_; DISALLOW_COPY_AND_ASSIGN(DisplayLayoutStore); };
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc index 1b79b9de..6ec4e4f 100644 --- a/ash/display/display_manager.cc +++ b/ash/display/display_manager.cc
@@ -52,7 +52,6 @@ #endif namespace ash { -typedef std::vector<gfx::Display> DisplayList; typedef std::vector<DisplayInfo> DisplayInfoList; namespace { @@ -118,7 +117,7 @@ return size; } -gfx::Display* FindDisplayById(DisplayList* display_list, int64_t id) { +gfx::Display* FindDisplayById(display::DisplayList* display_list, int64_t id) { auto iter = std::find_if( display_list->begin(), display_list->end(), [id](const gfx::Display& display) { return display.id() == id; }); @@ -211,20 +210,20 @@ #endif // OS_CHROMEOS } -const DisplayLayout& DisplayManager::GetCurrentDisplayLayout() const { +const display::DisplayLayout& DisplayManager::GetCurrentDisplayLayout() const { DCHECK_LE(2U, num_connected_displays()); if (num_connected_displays() > 1) { - DisplayIdList list = GetCurrentDisplayIdList(); + display::DisplayIdList list = GetCurrentDisplayIdList(); return layout_store_->GetRegisteredDisplayLayout(list); } LOG(ERROR) << "DisplayLayout is requested for single display"; // On release build, just fallback to default instead of blowing up. - static DisplayLayout layout; + static display::DisplayLayout layout; layout.primary_id = active_display_list_[0].id(); return layout; } -DisplayIdList DisplayManager::GetCurrentDisplayIdList() const { +display::DisplayIdList DisplayManager::GetCurrentDisplayIdList() const { if (IsInUnifiedMode()) { return CreateDisplayIdList(software_mirroring_display_list_); } else if (IsInMirrorMode()) { @@ -243,14 +242,14 @@ } void DisplayManager::SetLayoutForCurrentDisplays( - scoped_ptr<DisplayLayout> layout) { + scoped_ptr<display::DisplayLayout> layout) { if (GetNumDisplays() == 1) return; - const DisplayIdList list = GetCurrentDisplayIdList(); + const display::DisplayIdList list = GetCurrentDisplayIdList(); - DCHECK(DisplayLayout::Validate(list, *layout)); + DCHECK(display::DisplayLayout::Validate(list, *layout)); - const DisplayLayout& current_layout = + const display::DisplayLayout& current_layout = layout_store_->GetRegisteredDisplayLayout(list); if (layout->HasSamePlacementList(current_layout)) @@ -614,11 +613,11 @@ #if defined(OS_CHROMEOS) if (!base::SysInfo::IsRunningOnChromeOS() && new_display_info_list.size() > 1) { - DisplayIdList list = GenerateDisplayIdList( + display::DisplayIdList list = GenerateDisplayIdList( new_display_info_list.begin(), new_display_info_list.end(), [](const DisplayInfo& info) { return info.id(); }); - const DisplayLayout& layout = + const display::DisplayLayout& layout = layout_store_->GetRegisteredDisplayLayout(list); // Mirror mode is set by DisplayConfigurator on the device. // Emulate it when running on linux desktop. @@ -654,10 +653,10 @@ DisplayInfoSortFunctor()); if (new_display_info_list.size() > 1) { - DisplayIdList list = GenerateDisplayIdList( + display::DisplayIdList list = GenerateDisplayIdList( new_display_info_list.begin(), new_display_info_list.end(), [](const DisplayInfo& info) { return info.id(); }); - const DisplayLayout& layout = + const display::DisplayLayout& layout = layout_store_->GetRegisteredDisplayLayout(list); current_default_multi_display_mode_ = (layout.default_unified && unified_desktop_enabled_) ? UNIFIED @@ -674,12 +673,12 @@ if (delegate_) delegate_->CloseMirroringDisplayIfNotNecessary(); - DisplayList new_displays; - DisplayList removed_displays; + display::DisplayList new_displays; + display::DisplayList removed_displays; std::map<size_t, uint32_t> display_changes; std::vector<size_t> added_display_indices; - DisplayList::iterator curr_iter = active_display_list_.begin(); + display::DisplayList::iterator curr_iter = active_display_list_.begin(); DisplayInfoList::const_iterator new_info_iter = new_display_info_list.begin(); while (curr_iter != active_display_list_.end() || @@ -854,7 +853,7 @@ const gfx::Display& DisplayManager::GetPrimaryDisplayCandidate() const { if (GetNumDisplays() != 2) return active_display_list_[0]; - const DisplayLayout& layout = + const display::DisplayLayout& layout = layout_store_->GetRegisteredDisplayLayout(GetCurrentDisplayIdList()); return GetDisplayForId(layout.primary_id); } @@ -971,7 +970,7 @@ void DisplayManager::ToggleDisplayScaleFactor() { DCHECK(!active_display_list_.empty()); std::vector<DisplayInfo> new_display_info_list; - for (DisplayList::const_iterator iter = active_display_list_.begin(); + for (display::DisplayList::const_iterator iter = active_display_list_.begin(); iter != active_display_list_.end(); ++iter) { DisplayInfo display_info = GetDisplayInfo(iter->id()); display_info.set_device_scale_factor( @@ -996,7 +995,7 @@ void DisplayManager::SetDefaultMultiDisplayModeForCurrentDisplays( MultiDisplayMode mode) { DCHECK_NE(MIRRORING, mode); - DisplayIdList list = GetCurrentDisplayIdList(); + display::DisplayIdList list = GetCurrentDisplayIdList(); layout_store_->UpdateMultiDisplayState(list, IsInMirrorMode(), mode == UNIFIED); ReconfigureDisplays(); @@ -1221,8 +1220,10 @@ void DisplayManager::AddMirrorDisplayInfoIfAny( std::vector<DisplayInfo>* display_info_list) { - if (software_mirroring_enabled() && IsInMirrorMode()) + if (software_mirroring_enabled() && IsInMirrorMode()) { display_info_list->push_back(GetDisplayInfo(mirroring_display_id_)); + software_mirroring_display_list_.clear(); + } } void DisplayManager::InsertAndUpdateDisplayInfo(const DisplayInfo& new_info) { @@ -1282,13 +1283,14 @@ } void DisplayManager::UpdateNonPrimaryDisplayBoundsForLayout( - DisplayList* display_list, + display::DisplayList* display_list, std::vector<size_t>* updated_indices) { if (display_list->size() == 1u) return; - const DisplayLayout& layout = layout_store_->GetRegisteredDisplayLayout( - CreateDisplayIdList(*display_list)); + const display::DisplayLayout& layout = + layout_store_->GetRegisteredDisplayLayout( + CreateDisplayIdList(*display_list)); // Ignore if a user has a old format (should be extremely rare) // and this will be replaced with DCHECK. @@ -1317,8 +1319,8 @@ delegate_->CreateOrUpdateMirroringDisplay(list); } -void DisplayManager::ApplyDisplayLayout(const DisplayLayout& layout, - DisplayList* display_list, +void DisplayManager::ApplyDisplayLayout(const display::DisplayLayout& layout, + display::DisplayList* display_list, std::vector<int64_t>* updated_ids) { // Layout from primary, then dependent displays. std::set<int64_t> parents; @@ -1326,7 +1328,7 @@ while (parents.size()) { int64_t parent_id = *parents.begin(); parents.erase(parent_id); - for (const DisplayPlacement& placement : layout.placement_list) { + for (const display::DisplayPlacement& placement : layout.placement_list) { if (placement.parent_display_id == parent_id) { if (ApplyDisplayPlacement(placement, display_list) && updated_ids) updated_ids->push_back(placement.display_id); @@ -1336,8 +1338,9 @@ } } -bool DisplayManager::ApplyDisplayPlacement(const DisplayPlacement& placement, - DisplayList* display_list) { +bool DisplayManager::ApplyDisplayPlacement( + const display::DisplayPlacement& placement, + display::DisplayList* display_list) { const gfx::Display& parent_display = *FindDisplayById(display_list, placement.parent_display_id); DCHECK(parent_display.is_valid()); @@ -1349,13 +1352,13 @@ const gfx::Rect& target_bounds = target_display->bounds(); gfx::Point new_target_origin = parent_bounds.origin(); - DisplayPlacement::Position position = placement.position; + display::DisplayPlacement::Position position = placement.position; // Ignore the offset in case the target display doesn't share edges with // the parent display. int offset = placement.offset; - if (position == DisplayPlacement::TOP || - position == DisplayPlacement::BOTTOM) { + if (position == display::DisplayPlacement::TOP || + position == display::DisplayPlacement::BOTTOM) { offset = std::min( offset, parent_bounds.width() - kMinimumOverlapForInvalidOffset); offset = std::max( @@ -1367,16 +1370,16 @@ offset, -target_bounds.height() + kMinimumOverlapForInvalidOffset); } switch (position) { - case DisplayPlacement::TOP: + case display::DisplayPlacement::TOP: new_target_origin.Offset(offset, -target_bounds.height()); break; - case DisplayPlacement::RIGHT: + case display::DisplayPlacement::RIGHT: new_target_origin.Offset(parent_bounds.width(), offset); break; - case DisplayPlacement::BOTTOM: + case display::DisplayPlacement::BOTTOM: new_target_origin.Offset(offset, parent_bounds.height()); break; - case DisplayPlacement::LEFT: + case display::DisplayPlacement::LEFT: new_target_origin.Offset(-target_bounds.width(), offset); break; }
diff --git a/ash/display/display_manager.h b/ash/display/display_manager.h index 6a437bc2..1ef1ea4 100644 --- a/ash/display/display_manager.h +++ b/ash/display/display_manager.h
@@ -13,12 +13,12 @@ #include "ash/ash_export.h" #include "ash/display/display_info.h" -#include "ash/display/display_layout.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/display.h" #if defined(OS_CHROMEOS) @@ -131,14 +131,14 @@ void RefreshFontParams(); // Returns the display layout used for current displays. - const DisplayLayout& GetCurrentDisplayLayout() const; + const display::DisplayLayout& GetCurrentDisplayLayout() const; // Returns the current display list. - DisplayIdList GetCurrentDisplayIdList() const; + display::DisplayIdList GetCurrentDisplayIdList() const; // Sets the layout for the current display pair. The |layout| specifies // the locaion of the displays relative to their parents. - void SetLayoutForCurrentDisplays(scoped_ptr<DisplayLayout> layout); + void SetLayoutForCurrentDisplays(scoped_ptr<display::DisplayLayout> layout); // Returns display for given |id|; const gfx::Display& GetDisplayForId(int64_t id) const; @@ -237,7 +237,7 @@ // when displays are mirrored. size_t GetNumDisplays() const; - const DisplayList& active_display_list() const { + const display::DisplayList& active_display_list() const { return active_display_list_; } @@ -252,7 +252,7 @@ // Returns the mirroring status. bool IsInMirrorMode() const; int64_t mirroring_display_id() const { return mirroring_display_id_; } - const DisplayList& software_mirroring_display_list() const { + const display::DisplayList& software_mirroring_display_list() const { return software_mirroring_display_list_; } @@ -389,7 +389,7 @@ // the layout registered for the display pair. For more than 2 displays, // the bounds are updated using horizontal layout. void UpdateNonPrimaryDisplayBoundsForLayout( - DisplayList* display_list, + display::DisplayList* display_list, std::vector<size_t>* updated_indices); void CreateMirrorWindowIfAny(); @@ -398,14 +398,14 @@ // Applies the |layout| and updates the bounds of displays in |display_list|. // |updated_ids| contains the ids for displays whose bounds have changed. - void ApplyDisplayLayout(const DisplayLayout& layout, - DisplayList* display_list, + void ApplyDisplayLayout(const display::DisplayLayout& layout, + display::DisplayList* display_list, std::vector<int64_t>* updated_ids); // Apply the display placement to the display layout. // Returns true if the display bounds has been updated. - bool ApplyDisplayPlacement(const DisplayPlacement& placement, - DisplayList* display_list); + bool ApplyDisplayPlacement(const display::DisplayPlacement& placement, + display::DisplayList* display_list); Delegate* delegate_; // not owned. @@ -416,7 +416,7 @@ int64_t first_display_id_; // List of current active displays. - DisplayList active_display_list_; + display::DisplayList active_display_list_; int num_connected_displays_; @@ -439,7 +439,7 @@ MultiDisplayMode current_default_multi_display_mode_; int64_t mirroring_display_id_; - DisplayList software_mirroring_display_list_; + display::DisplayList software_mirroring_display_list_; // User preference for rotation lock of the internal display. bool registered_internal_display_rotation_lock_;
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 88cb314..e2762428ce3 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -7,7 +7,6 @@ #include "ash/accelerators/accelerator_commands.h" #include "ash/ash_switches.h" #include "ash/display/display_info.h" -#include "ash/display/display_layout_builder.h" #include "ash/display/display_layout_store.h" #include "ash/display/display_util.h" #include "ash/display/mirror_window_controller.h" @@ -26,6 +25,7 @@ #include "ui/aura/env.h" #include "ui/aura/window_observer.h" #include "ui/aura/window_tree_host.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" #include "ui/gfx/display_observer.h" @@ -314,7 +314,8 @@ EXPECT_EQ("960,0 400x300", display_manager()->GetDisplayAt(2).bounds().ToString()); - DisplayPlacement default_placement(DisplayPlacement::BOTTOM, 10); + display::DisplayPlacement default_placement(display::DisplayPlacement::BOTTOM, + 10); display_manager()->layout_store()->SetDefaultDisplayPlacement( default_placement); @@ -335,15 +336,16 @@ return; int64_t primary_id = gfx::Screen::GetScreen()->GetPrimaryDisplay().id(); - DisplayIdList list = ash::test::CreateDisplayIdListN( + display::DisplayIdList list = ash::test::CreateDisplayIdListN( 3, primary_id, primary_id + 1, primary_id + 2); { // Layout: [2] // [1][P] - DisplayLayoutBuilder builder(primary_id); - builder.AddDisplayPlacement(list[1], primary_id, DisplayPlacement::LEFT, - 10); - builder.AddDisplayPlacement(list[2], list[1], DisplayPlacement::TOP, 10); + display::DisplayLayoutBuilder builder(primary_id); + builder.AddDisplayPlacement(list[1], primary_id, + display::DisplayPlacement::LEFT, 10); + builder.AddDisplayPlacement(list[2], list[1], + display::DisplayPlacement::TOP, 10); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( list, builder.Build()); @@ -361,10 +363,11 @@ { // Layout: [1] // [P][2] - DisplayLayoutBuilder builder(primary_id); - builder.AddDisplayPlacement(list[1], primary_id, DisplayPlacement::TOP, 10); - builder.AddDisplayPlacement(list[2], primary_id, DisplayPlacement::RIGHT, - 10); + display::DisplayLayoutBuilder builder(primary_id); + builder.AddDisplayPlacement(list[1], primary_id, + display::DisplayPlacement::TOP, 10); + builder.AddDisplayPlacement(list[2], primary_id, + display::DisplayPlacement::RIGHT, 10); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( list, builder.Build()); @@ -383,10 +386,11 @@ // Layout: [P] // [2] // [1] - DisplayLayoutBuilder builder(primary_id); - builder.AddDisplayPlacement(list[1], list[2], DisplayPlacement::BOTTOM, 10); - builder.AddDisplayPlacement(list[2], primary_id, DisplayPlacement::BOTTOM, - 10); + display::DisplayLayoutBuilder builder(primary_id); + builder.AddDisplayPlacement(list[1], list[2], + display::DisplayPlacement::BOTTOM, 10); + builder.AddDisplayPlacement(list[2], primary_id, + display::DisplayPlacement::BOTTOM, 10); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( list, builder.Build()); @@ -409,13 +413,15 @@ // Layout: [P][2] // [3][4] // [1] - DisplayLayoutBuilder builder(primary_id); - builder.AddDisplayPlacement(list[2], primary_id, DisplayPlacement::RIGHT, - 10); - builder.AddDisplayPlacement(list[1], list[3], DisplayPlacement::BOTTOM, 10); - builder.AddDisplayPlacement(list[3], list[4], DisplayPlacement::LEFT, 10); - builder.AddDisplayPlacement(list[4], primary_id, DisplayPlacement::BOTTOM, - 10); + display::DisplayLayoutBuilder builder(primary_id); + builder.AddDisplayPlacement(list[2], primary_id, + display::DisplayPlacement::RIGHT, 10); + builder.AddDisplayPlacement(list[1], list[3], + display::DisplayPlacement::BOTTOM, 10); + builder.AddDisplayPlacement(list[3], list[4], + display::DisplayPlacement::LEFT, 10); + builder.AddDisplayPlacement(list[4], primary_id, + display::DisplayPlacement::BOTTOM, 10); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( list, builder.Build()); @@ -1484,6 +1490,21 @@ gfx::Screen::GetScreen()->RemoveObserver(&display_observer); } +TEST_F(DisplayManagerTest, RotateInSoftwareMirroring) { + if (!SupportsMultipleDisplays()) + return; + + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + UpdateDisplay("600x400,500x300"); + display_manager->SetMirrorMode(true); + + EXPECT_EQ(1U, display_manager->GetNumDisplays()); + int64_t primary_id = gfx::Screen::GetScreen()->GetPrimaryDisplay().id(); + display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_180, + gfx::Display::ROTATION_SOURCE_ACTIVE); + display_manager->SetMirrorMode(false); +} + TEST_F(DisplayManagerTest, SingleDisplayToSoftwareMirroring) { if (!SupportsMultipleDisplays()) return; @@ -1570,32 +1591,56 @@ TEST_F(DisplayManagerTest, InvertLayout) { EXPECT_EQ("left, 0", - DisplayPlacement(DisplayPlacement::RIGHT, 0).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::RIGHT, 0) + .Swap() + .ToString()); EXPECT_EQ("left, -100", - DisplayPlacement(DisplayPlacement::RIGHT, 100).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::RIGHT, 100) + .Swap() + .ToString()); EXPECT_EQ("left, 50", - DisplayPlacement(DisplayPlacement::RIGHT, -50).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::RIGHT, -50) + .Swap() + .ToString()); EXPECT_EQ("right, 0", - DisplayPlacement(DisplayPlacement::LEFT, 0).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::LEFT, 0) + .Swap() + .ToString()); EXPECT_EQ("right, -90", - DisplayPlacement(DisplayPlacement::LEFT, 90).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::LEFT, 90) + .Swap() + .ToString()); EXPECT_EQ("right, 60", - DisplayPlacement(DisplayPlacement::LEFT, -60).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::LEFT, -60) + .Swap() + .ToString()); EXPECT_EQ("bottom, 0", - DisplayPlacement(DisplayPlacement::TOP, 0).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::TOP, 0) + .Swap() + .ToString()); EXPECT_EQ("bottom, -80", - DisplayPlacement(DisplayPlacement::TOP, 80).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::TOP, 80) + .Swap() + .ToString()); EXPECT_EQ("bottom, 70", - DisplayPlacement(DisplayPlacement::TOP, -70).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::TOP, -70) + .Swap() + .ToString()); EXPECT_EQ("top, 0", - DisplayPlacement(DisplayPlacement::BOTTOM, 0).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::BOTTOM, 0) + .Swap() + .ToString()); EXPECT_EQ("top, -70", - DisplayPlacement(DisplayPlacement::BOTTOM, 70).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::BOTTOM, 70) + .Swap() + .ToString()); EXPECT_EQ("top, 80", - DisplayPlacement(DisplayPlacement::BOTTOM, -80).Swap().ToString()); + display::DisplayPlacement(display::DisplayPlacement::BOTTOM, -80) + .Swap() + .ToString()); } TEST_F(DisplayManagerTest, NotifyPrimaryChange) { @@ -1766,8 +1811,8 @@ // if the displays are configured to use mirroring when running on desktop. // This is a workdaround to force the display manager to forget // the mirroing layout. - DisplayIdList list = test::CreateDisplayIdList2(1, 2); - DisplayLayoutBuilder builder( + display::DisplayIdList list = test::CreateDisplayIdList2(1, 2); + display::DisplayLayoutBuilder builder( display_manager()->layout_store()->GetRegisteredDisplayLayout(list)); builder.SetMirrored(false); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( @@ -1790,8 +1835,8 @@ Shell::GetPrimaryRootWindow()->RemoveObserver(this); UpdateDisplay("400x500,300x200"); - DisplayIdList list = display_manager()->GetCurrentDisplayIdList(); - DisplayLayoutBuilder builder( + display::DisplayIdList list = display_manager()->GetCurrentDisplayIdList(); + display::DisplayLayoutBuilder builder( display_manager()->layout_store()->GetRegisteredDisplayLayout(list)); builder.SetDefaultUnified(false); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( @@ -2011,10 +2056,10 @@ TEST_F(DisplayManagerTest, DontRegisterBadConfig) { if (!SupportsMultipleDisplays()) return; - DisplayIdList list = ash::test::CreateDisplayIdList2(1, 2); - DisplayLayoutBuilder builder(1); - builder.AddDisplayPlacement(2, 1, ash::DisplayPlacement::LEFT, 0); - builder.AddDisplayPlacement(3, 1, ash::DisplayPlacement::BOTTOM, 0); + display::DisplayIdList list = ash::test::CreateDisplayIdList2(1, 2); + display::DisplayLayoutBuilder builder(1); + builder.AddDisplayPlacement(2, 1, display::DisplayPlacement::LEFT, 0); + builder.AddDisplayPlacement(3, 1, display::DisplayPlacement::BOTTOM, 0); display_manager()->layout_store()->RegisterLayoutForDisplayIdList( list, builder.Build()); @@ -2199,17 +2244,17 @@ int64_t id1 = 10001; int64_t id2 = 10002; ASSERT_TRUE(CompareDisplayIds(id1, id2)); - DisplayLayoutBuilder good_builder(id1); - good_builder.SetSecondaryPlacement(id2, DisplayPlacement::LEFT, 0); - scoped_ptr<DisplayLayout> good(good_builder.Build()); + display::DisplayLayoutBuilder good_builder(id1); + good_builder.SetSecondaryPlacement(id2, display::DisplayPlacement::LEFT, 0); + scoped_ptr<display::DisplayLayout> good(good_builder.Build()); - DisplayIdList good_list = test::CreateDisplayIdList2(id1, id2); + display::DisplayIdList good_list = test::CreateDisplayIdList2(id1, id2); layout_store->RegisterLayoutForDisplayIdList(good_list, good->Copy()); - DisplayLayoutBuilder bad(id1); - bad.SetSecondaryPlacement(id2, DisplayPlacement::BOTTOM, 0); + display::DisplayLayoutBuilder bad(id1); + bad.SetSecondaryPlacement(id2, display::DisplayPlacement::BOTTOM, 0); - DisplayIdList bad_list(2); + display::DisplayIdList bad_list(2); bad_list[0] = id2; bad_list[1] = id1; layout_store->RegisterLayoutForDisplayIdList(bad_list, bad.Build()); @@ -2222,14 +2267,15 @@ int64_t id1 = 10001; int64_t id2 = 10002; - scoped_ptr<DisplayLayout> old_layout(new DisplayLayout); - old_layout->placement_list.emplace_back(DisplayPlacement::BOTTOM, 0); + scoped_ptr<display::DisplayLayout> old_layout(new display::DisplayLayout); + old_layout->placement_list.emplace_back(display::DisplayPlacement::BOTTOM, 0); old_layout->primary_id = id1; DisplayLayoutStore* layout_store = display_manager()->layout_store(); - DisplayIdList list = test::CreateDisplayIdList2(id1, id2); + display::DisplayIdList list = test::CreateDisplayIdList2(id1, id2); layout_store->RegisterLayoutForDisplayIdList(list, std::move(old_layout)); - const DisplayLayout& stored = layout_store->GetRegisteredDisplayLayout(list); + const display::DisplayLayout& stored = + layout_store->GetRegisteredDisplayLayout(list); EXPECT_EQ(id1, stored.placement_list[0].parent_display_id); EXPECT_EQ(id2, stored.placement_list[0].display_id);
diff --git a/ash/display/display_util.cc b/ash/display/display_util.cc index 02fa6c9..0fa95e6 100644 --- a/ash/display/display_util.cc +++ b/ash/display/display_util.cc
@@ -235,22 +235,22 @@ int rr = std::min(a_bounds.right(), b_bounds.right()); int rb = std::min(a_bounds.bottom(), b_bounds.bottom()); - DisplayPlacement::Position position; + display::DisplayPlacement::Position position; if ((rb - ry) == 0) { // top bottom if (a_bounds.bottom() == b_bounds.y()) { - position = DisplayPlacement::BOTTOM; + position = display::DisplayPlacement::BOTTOM; } else if (a_bounds.y() == b_bounds.bottom()) { - position = DisplayPlacement::TOP; + position = display::DisplayPlacement::TOP; } else { return false; } } else { // left right if (a_bounds.right() == b_bounds.x()) { - position = DisplayPlacement::RIGHT; + position = display::DisplayPlacement::RIGHT; } else if (a_bounds.x() == b_bounds.right()) { - position = DisplayPlacement::LEFT; + position = display::DisplayPlacement::LEFT; } else { DCHECK_NE(rr, rx); return false; @@ -258,11 +258,11 @@ } switch (position) { - case DisplayPlacement::TOP: - case DisplayPlacement::BOTTOM: { + case display::DisplayPlacement::TOP: + case display::DisplayPlacement::BOTTOM: { int left = std::max(a_bounds.x(), b_bounds.x()); int right = std::min(a_bounds.right(), b_bounds.right()); - if (position == DisplayPlacement::TOP) { + if (position == display::DisplayPlacement::TOP) { a_edge_in_screen->SetRect(left, a_bounds.y(), right - left, 1); b_edge_in_screen->SetRect(left, b_bounds.bottom() - 1, right - left, 1); } else { @@ -271,11 +271,11 @@ } break; } - case DisplayPlacement::LEFT: - case DisplayPlacement::RIGHT: { + case display::DisplayPlacement::LEFT: + case display::DisplayPlacement::RIGHT: { int top = std::max(a_bounds.y(), b_bounds.y()); int bottom = std::min(a_bounds.bottom(), b_bounds.bottom()); - if (position == DisplayPlacement::LEFT) { + if (position == display::DisplayPlacement::LEFT) { a_edge_in_screen->SetRect(a_bounds.x(), top, 1, bottom - top); b_edge_in_screen->SetRect(b_bounds.right() - 1, top, 1, bottom - top); } else { @@ -374,18 +374,18 @@ return iter == displays.end() ? -1 : (iter - displays.begin()); } -DisplayIdList CreateDisplayIdList(const DisplayList& list) { +display::DisplayIdList CreateDisplayIdList(const display::DisplayList& list) { return GenerateDisplayIdList( list.begin(), list.end(), [](const gfx::Display& display) { return display.id(); }); } -void SortDisplayIdList(DisplayIdList* ids) { +void SortDisplayIdList(display::DisplayIdList* ids) { std::sort(ids->begin(), ids->end(), [](int64_t a, int64_t b) { return CompareDisplayIds(a, b); }); } -std::string DisplayIdListToString(const ash::DisplayIdList& list) { +std::string DisplayIdListToString(const display::DisplayIdList& list) { std::stringstream s; const char* sep = ""; for (int64_t id : list) {
diff --git a/ash/display/display_util.h b/ash/display/display_util.h index fc331cb..7c1a5b7 100644 --- a/ash/display/display_util.h +++ b/ash/display/display_util.h
@@ -12,7 +12,7 @@ #include <vector> #include "ash/ash_export.h" -#include "ash/display/display_layout.h" +#include "ui/display/manager/display_layout.h" namespace gfx { class Display; @@ -89,7 +89,7 @@ const gfx::Point& point_in_screen); // Sorts id list using |CompareDisplayIds| below. -ASH_EXPORT void SortDisplayIdList(DisplayIdList* list); +ASH_EXPORT void SortDisplayIdList(display::DisplayIdList* list); // Default id generator. class DefaultDisplayIdGenerator { @@ -97,12 +97,13 @@ int64_t operator()(int64_t id) { return id; } }; -// Generate sorted DisplayIdList from iterators. +// Generate sorted display::DisplayIdList from iterators. template <class ForwardIterator, class Generator = DefaultDisplayIdGenerator> -DisplayIdList GenerateDisplayIdList(ForwardIterator first, - ForwardIterator last, - Generator generator = Generator()) { - DisplayIdList list; +display::DisplayIdList GenerateDisplayIdList( + ForwardIterator first, + ForwardIterator last, + Generator generator = Generator()) { + display::DisplayIdList list; while (first != last) { list.push_back(generator(*first)); ++first; @@ -111,10 +112,12 @@ return list; } -// Creates sorted DisplayIdList. -ASH_EXPORT DisplayIdList CreateDisplayIdList(const DisplayList& list); +// Creates sorted display::DisplayIdList. +ASH_EXPORT display::DisplayIdList CreateDisplayIdList( + const display::DisplayList& list); -ASH_EXPORT std::string DisplayIdListToString(const DisplayIdList& list); +ASH_EXPORT std::string DisplayIdListToString( + const display::DisplayIdList& list); // Returns true if one of following conditinos is met. // 1) id1 is internal.
diff --git a/ash/display/display_util_unittest.cc b/ash/display/display_util_unittest.cc index 10866ba..2e70a1b4 100644 --- a/ash/display/display_util_unittest.cc +++ b/ash/display/display_util_unittest.cc
@@ -92,7 +92,7 @@ } TEST_F(DisplayUtilTest, GenerateDisplayIdList) { - DisplayIdList list; + display::DisplayIdList list; { int64_t ids[] = {10, 1}; list = GenerateDisplayIdList(std::begin(ids), std::end(ids)); @@ -162,13 +162,15 @@ TEST_F(DisplayUtilTest, DisplayIdListToString) { { int64_t ids[] = {10, 1, 16}; - DisplayIdList list = GenerateDisplayIdList(std::begin(ids), std::end(ids)); + display::DisplayIdList list = + GenerateDisplayIdList(std::begin(ids), std::end(ids)); EXPECT_EQ("1,10,16", DisplayIdListToString(list)); } { test::ScopedSetInternalDisplayId set_internal(16); int64_t ids[] = {10, 1, 16}; - DisplayIdList list = GenerateDisplayIdList(std::begin(ids), std::end(ids)); + display::DisplayIdList list = + GenerateDisplayIdList(std::begin(ids), std::end(ids)); EXPECT_EQ("16,1,10", DisplayIdListToString(list)); } }
diff --git a/ash/display/extended_mouse_warp_controller.cc b/ash/display/extended_mouse_warp_controller.cc index 6e5273f3..78e80951 100644 --- a/ash/display/extended_mouse_warp_controller.cc +++ b/ash/display/extended_mouse_warp_controller.cc
@@ -14,6 +14,7 @@ #include "ash/screen_util.h" #include "ash/shell.h" #include "ui/aura/window.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_utils.h" #include "ui/gfx/screen.h" #include "ui/wm/core/coordinate_conversion.h" @@ -103,7 +104,7 @@ Shell::GetInstance()->display_manager(); int64_t drag_source_id = drag_source ? GetDisplayIdFromWindow(drag_source) : gfx::Display::kInvalidDisplayID; - DisplayList display_list = display_manager->active_display_list(); + display::DisplayList display_list = display_manager->active_display_list(); // Try to create a Warp region for all possible two displays combination. // The following code does it by poping the last element in the list // and then pairing with remaining displays in the list, until the list
diff --git a/ash/display/extended_mouse_warp_controller.h b/ash/display/extended_mouse_warp_controller.h index 05a6988..540b4d2 100644 --- a/ash/display/extended_mouse_warp_controller.h +++ b/ash/display/extended_mouse_warp_controller.h
@@ -9,7 +9,6 @@ #include <vector> -#include "ash/display/display_layout.h" #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h"
diff --git a/ash/display/extended_mouse_warp_controller_unittest.cc b/ash/display/extended_mouse_warp_controller_unittest.cc index 85988cc..20aef5b 100644 --- a/ash/display/extended_mouse_warp_controller_unittest.cc +++ b/ash/display/extended_mouse_warp_controller_unittest.cc
@@ -4,13 +4,14 @@ #include "ash/display/extended_mouse_warp_controller.h" -#include "ash/display/display_layout_builder.h" #include "ash/display/display_layout_store.h" #include "ash/display/display_manager.h" #include "ash/display/mouse_cursor_event_filter.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/test/display_manager_test_api.h" +#include "ui/display/manager/display_layout.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" #include "ui/gfx/screen.h" @@ -61,8 +62,8 @@ gfx::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[1]).id(); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - scoped_ptr<DisplayLayout> layout( - test::CreateDisplayLayout(DisplayPlacement::RIGHT, 0)); + scoped_ptr<display::DisplayLayout> layout( + test::CreateDisplayLayout(display::DisplayPlacement::RIGHT, 0)); display_manager->SetLayoutForCurrentDisplays(layout->Copy()); event_filter()->ShowSharedEdgeIndicator(root_windows[0] /* primary */); @@ -133,8 +134,8 @@ gfx::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[1]).id(); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - scoped_ptr<DisplayLayout> layout( - test::CreateDisplayLayout(DisplayPlacement::LEFT, 0)); + scoped_ptr<display::DisplayLayout> layout( + test::CreateDisplayLayout(display::DisplayPlacement::LEFT, 0)); display_manager->SetLayoutForCurrentDisplays(layout->Copy()); event_filter()->ShowSharedEdgeIndicator(root_windows[0] /* primary */); @@ -174,8 +175,8 @@ gfx::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[1]).id(); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - scoped_ptr<DisplayLayout> layout( - test::CreateDisplayLayout(DisplayPlacement::TOP, 0)); + scoped_ptr<display::DisplayLayout> layout( + test::CreateDisplayLayout(display::DisplayPlacement::TOP, 0)); display_manager->SetLayoutForCurrentDisplays(layout->Copy()); event_filter()->ShowSharedEdgeIndicator(root_windows[0] /* primary */); ASSERT_EQ(1U, GetWarpRegionsCount()); @@ -199,7 +200,7 @@ EXPECT_EQ(gfx::Rect(250, 0, 110, 1), GetIndicatorBounds(display_0_id)); EXPECT_EQ(gfx::Rect(250, -1, 110, 1), GetIndicatorBounds(display_1_id)); - layout->placement_list[0].position = DisplayPlacement::BOTTOM; + layout->placement_list[0].position = display::DisplayPlacement::BOTTOM; layout->placement_list[0].offset = 0; display_manager->SetLayoutForCurrentDisplays(layout->Copy()); event_filter()->ShowSharedEdgeIndicator(root_windows[0] /* primary */); @@ -289,11 +290,11 @@ // +-+---+--++ // | 2 | // +------+ - ash::DisplayLayoutBuilder builder(display_0_id); + display::DisplayLayoutBuilder builder(display_0_id); builder.AddDisplayPlacement(display_1_id, display_0_id, - ash::DisplayPlacement::RIGHT, 0); + display::DisplayPlacement::RIGHT, 0); builder.AddDisplayPlacement(display_2_id, display_0_id, - ash::DisplayPlacement::BOTTOM, 100); + display::DisplayPlacement::BOTTOM, 100); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); display_manager->SetLayoutForCurrentDisplays(builder.Build()); @@ -340,11 +341,11 @@ // +-+---+-+++ // | 2 | // +------+ - ash::DisplayLayoutBuilder builder(display_0_id); + display::DisplayLayoutBuilder builder(display_0_id); builder.AddDisplayPlacement(display_2_id, display_0_id, - ash::DisplayPlacement::BOTTOM, 100); + display::DisplayPlacement::BOTTOM, 100); builder.AddDisplayPlacement(display_1_id, display_2_id, - ash::DisplayPlacement::TOP, 800); + display::DisplayPlacement::TOP, 800); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); display_manager->SetLayoutForCurrentDisplays(builder.Build());
diff --git a/ash/display/json_converter.cc b/ash/display/json_converter.cc index 63a7efe76..352a2ff 100644 --- a/ash/display/json_converter.cc +++ b/ash/display/json_converter.cc
@@ -6,11 +6,11 @@ #include <string> -#include "ash/display/display_layout.h" #include "ash/display/display_pref_util.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" +#include "ui/display/manager/display_layout.h" namespace ash { @@ -28,17 +28,18 @@ const char kDisplayPlacementDisplayIdKey[] = "display_id"; const char kDisplayPlacementParentDisplayIdKey[] = "parent_display_id"; -bool AddLegacyValuesFromValue(const base::Value& value, DisplayLayout* layout) { +bool AddLegacyValuesFromValue(const base::Value& value, + display::DisplayLayout* layout) { const base::DictionaryValue* dict_value = nullptr; if (!value.GetAsDictionary(&dict_value)) return false; int offset; if (dict_value->GetInteger(kOffsetKey, &offset)) { - DisplayPlacement::Position position; + display::DisplayPlacement::Position position; std::string position_str; if (!dict_value->GetString(kPositionKey, &position_str)) return false; - DisplayPlacement::StringToPosition(position_str, &position); + display::DisplayPlacement::StringToPosition(position_str, &position); layout->placement_list.emplace_back(position, offset); } return true; @@ -86,14 +87,14 @@ template <> bool UpdateFromDict(const base::DictionaryValue* dict_value, const std::string& field_name, - DisplayPlacement::Position* output) { + display::DisplayPlacement::Position* output) { bool (base::Value::*getter)(std::string*) const = &base::Value::GetAsString; std::string value; if (!UpdateFromDict(dict_value, field_name, getter, &value)) return false; - return value.empty() ? true - : DisplayPlacement::StringToPosition(value, output); + return value.empty() ? true : display::DisplayPlacement::StringToPosition( + value, output); } template <> @@ -111,7 +112,7 @@ template <> bool UpdateFromDict(const base::DictionaryValue* dict_value, const std::string& field_name, - std::vector<DisplayPlacement>* output) { + std::vector<display::DisplayPlacement>* output) { bool (base::Value::*getter)(const base::ListValue**) const = &base::Value::GetAsList; const base::ListValue* list = nullptr; @@ -127,7 +128,7 @@ if (!list_item->GetAsDictionary(&item_values)) return false; - DisplayPlacement item; + display::DisplayPlacement item; if (!UpdateFromDict(item_values, kOffsetKey, &item.offset) || !UpdateFromDict(item_values, kPositionKey, &item.position) || !UpdateFromDict(item_values, kDisplayPlacementDisplayIdKey, @@ -144,7 +145,8 @@ } // namespace -bool JsonToDisplayLayout(const base::Value& value, DisplayLayout* layout) { +bool JsonToDisplayLayout(const base::Value& value, + display::DisplayLayout* layout) { layout->placement_list.clear(); const base::DictionaryValue* dict_value = nullptr; if (!value.GetAsDictionary(&dict_value)) @@ -166,7 +168,8 @@ return AddLegacyValuesFromValue(value, layout); } -bool DisplayLayoutToJson(const DisplayLayout& layout, base::Value* value) { +bool DisplayLayoutToJson(const display::DisplayLayout& layout, + base::Value* value) { base::DictionaryValue* dict_value = nullptr; if (!value->GetAsDictionary(&dict_value)) return false; @@ -180,7 +183,8 @@ scoped_ptr<base::DictionaryValue> placement_value( new base::DictionaryValue); placement_value->SetString( - kPositionKey, DisplayPlacement::PositionToString(placement.position)); + kPositionKey, + display::DisplayPlacement::PositionToString(placement.position)); placement_value->SetInteger(kOffsetKey, placement.offset); placement_value->SetString(kDisplayPlacementDisplayIdKey, base::Int64ToString(placement.display_id));
diff --git a/ash/display/json_converter.h b/ash/display/json_converter.h index 4c88eb0..0125f23 100644 --- a/ash/display/json_converter.h +++ b/ash/display/json_converter.h
@@ -11,14 +11,16 @@ class Value; } +namespace display { +class DisplayLayout; +} + namespace ash { -class DisplayLayout; - ASH_EXPORT bool JsonToDisplayLayout(const base::Value& value, - DisplayLayout* layout); + display::DisplayLayout* layout); -ASH_EXPORT bool DisplayLayoutToJson(const DisplayLayout& layout, +ASH_EXPORT bool DisplayLayoutToJson(const display::DisplayLayout& layout, base::Value* value); } // namespace ash
diff --git a/ash/display/json_converter_unittest.cc b/ash/display/json_converter_unittest.cc index 0ac13d8..1d14ef1 100644 --- a/ash/display/json_converter_unittest.cc +++ b/ash/display/json_converter_unittest.cc
@@ -4,27 +4,27 @@ #include "ash/display/json_converter.h" -#include "ash/display/display_layout.h" #include "base/json/json_reader.h" #include "base/values.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/display/manager/display_layout.h" namespace ash { TEST(JsonConverterTest, JsonFromToDisplayLayout) { - DisplayLayout layout; + display::DisplayLayout layout; layout.primary_id = 1; layout.mirrored = true; layout.default_unified = false; - layout.placement_list.push_back(DisplayPlacement()); - layout.placement_list.push_back(DisplayPlacement()); + layout.placement_list.push_back(display::DisplayPlacement()); + layout.placement_list.push_back(display::DisplayPlacement()); layout.placement_list[0].display_id = 2; layout.placement_list[0].parent_display_id = 1; - layout.placement_list[0].position = DisplayPlacement::BOTTOM; + layout.placement_list[0].position = display::DisplayPlacement::BOTTOM; layout.placement_list[1].display_id = 3; layout.placement_list[1].parent_display_id = 2; - layout.placement_list[1].position = DisplayPlacement::LEFT; + layout.placement_list[1].position = display::DisplayPlacement::LEFT; layout.placement_list[1].offset = 30; base::DictionaryValue value; @@ -55,7 +55,7 @@ << error_column; EXPECT_TRUE(value.Equals(read_value.get())); - DisplayLayout read_layout; + display::DisplayLayout read_layout; EXPECT_TRUE(JsonToDisplayLayout(*read_value, &read_layout)); EXPECT_EQ(read_layout.mirrored, layout.mirrored); EXPECT_EQ(read_layout.primary_id, layout.primary_id); @@ -79,13 +79,14 @@ ASSERT_EQ(0, error_code) << error_msg << " at " << error_line << ":" << error_column; - DisplayLayout read_layout; + display::DisplayLayout read_layout; EXPECT_TRUE(JsonToDisplayLayout(*read_value, &read_layout)); EXPECT_EQ(true, read_layout.mirrored); EXPECT_EQ(1, read_layout.primary_id); EXPECT_EQ(false, read_layout.default_unified); ASSERT_EQ(1u, read_layout.placement_list.size()); - EXPECT_EQ(DisplayPlacement::BOTTOM, read_layout.placement_list[0].position); + EXPECT_EQ(display::DisplayPlacement::BOTTOM, + read_layout.placement_list[0].position); EXPECT_EQ(20, read_layout.placement_list[0].offset); }
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc index ce7fba1..b042c85 100644 --- a/ash/display/mirror_window_controller.cc +++ b/ash/display/mirror_window_controller.cc
@@ -34,6 +34,7 @@ #include "ui/aura/window_tree_host.h" #include "ui/base/layout.h" #include "ui/compositor/reflector.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/canvas.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/screen.h" @@ -332,9 +333,10 @@ if (pair.second->ash_host->AsWindowTreeHost()->window() == root) { // Sanity check to catch an error early. int64_t id = pair.first; - const DisplayList& list = Shell::GetInstance() - ->display_manager() - ->software_mirroring_display_list(); + const display::DisplayList& list = + Shell::GetInstance() + ->display_manager() + ->software_mirroring_display_list(); auto iter = std::find_if( list.begin(), list.end(), [id](const gfx::Display& display) { return display.id() == id; });
diff --git a/ash/display/mouse_cursor_event_filter_unittest.cc b/ash/display/mouse_cursor_event_filter_unittest.cc index 0842c694..401cf14 100644 --- a/ash/display/mouse_cursor_event_filter_unittest.cc +++ b/ash/display/mouse_cursor_event_filter_unittest.cc
@@ -11,6 +11,7 @@ #include "ash/test/cursor_manager_test_api.h" #include "ash/test/display_manager_test_api.h" #include "ui/aura/env.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/test/event_generator.h" namespace ash { @@ -42,11 +43,11 @@ UpdateDisplay("500x500,500x500"); - ASSERT_EQ(DisplayPlacement::RIGHT, Shell::GetInstance() - ->display_manager() - ->GetCurrentDisplayLayout() - .placement_list[0] - .position); + ASSERT_EQ(display::DisplayPlacement::RIGHT, Shell::GetInstance() + ->display_manager() + ->GetCurrentDisplayLayout() + .placement_list[0] + .position); EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(11, 11))); @@ -82,11 +83,11 @@ UpdateDisplay("500x500,600x600"); // the second one is larger. - ASSERT_EQ(DisplayPlacement::RIGHT, Shell::GetInstance() - ->display_manager() - ->GetCurrentDisplayLayout() - .placement_list[0] - .position); + ASSERT_EQ(display::DisplayPlacement::RIGHT, Shell::GetInstance() + ->display_manager() + ->GetCurrentDisplayLayout() + .placement_list[0] + .position); // Touch the left edge of the secondary root window. Pointer should NOT warp // because 1px left of (0, 500) is outside the primary root window. @@ -110,11 +111,11 @@ UpdateDisplay("500x500,600x600*2"); - ASSERT_EQ(DisplayPlacement::RIGHT, Shell::GetInstance() - ->display_manager() - ->GetCurrentDisplayLayout() - .placement_list[0] - .position); + ASSERT_EQ(display::DisplayPlacement::RIGHT, Shell::GetInstance() + ->display_manager() + ->GetCurrentDisplayLayout() + .placement_list[0] + .position); aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(900, 123)); @@ -159,7 +160,7 @@ UpdateDisplay("400x400,800x800*2"); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::RIGHT, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::RIGHT, 0)); test::CursorManagerTestApi cursor_test_api( Shell::GetInstance()->cursor_manager());
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc index 9223a54..01dab0ee 100644 --- a/ash/display/root_window_transformers_unittest.cc +++ b/ash/display/root_window_transformers_unittest.cc
@@ -21,6 +21,7 @@ #include "ui/aura/env.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tracker.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_handler.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" @@ -193,7 +194,7 @@ magnifier->SetEnabled(false); display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::BOTTOM, 50)); + test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 50)); EXPECT_EQ("50,120 150x200", ScreenUtil::GetSecondaryDisplay().bounds().ToString());
diff --git a/ash/display/screen_position_controller_unittest.cc b/ash/display/screen_position_controller_unittest.cc index 333379c..a4eeca65 100644 --- a/ash/display/screen_position_controller_unittest.cc +++ b/ash/display/screen_position_controller_unittest.cc
@@ -15,6 +15,7 @@ #include "ui/aura/window_tracker.h" #include "ui/aura/window_tree_host.h" #include "ui/base/layout.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/screen.h" @@ -41,11 +42,11 @@ namespace { -void SetSecondaryDisplayLayout(DisplayPlacement::Position position) { - scoped_ptr<DisplayLayout> layout(Shell::GetInstance() - ->display_manager() - ->GetCurrentDisplayLayout() - .Copy()); +void SetSecondaryDisplayLayout(display::DisplayPlacement::Position position) { + scoped_ptr<display::DisplayLayout> layout(Shell::GetInstance() + ->display_manager() + ->GetCurrentDisplayLayout() + .Copy()); layout->placement_list[0].position = position; Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( std::move(layout)); @@ -117,7 +118,7 @@ window_->SetBoundsInScreen( gfx::Rect(window_pos, gfx::Size(100, 100)), gfx::Screen::GetScreen()->GetDisplayNearestPoint(window_pos)); - SetSecondaryDisplayLayout(DisplayPlacement::RIGHT); + SetSecondaryDisplayLayout(display::DisplayPlacement::RIGHT); // The point is on the primary root window. EXPECT_EQ("50,50", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -125,7 +126,7 @@ // The point is on the secondary display. EXPECT_EQ("250,0", ConvertHostPointToScreen(50, 400)); - SetSecondaryDisplayLayout(DisplayPlacement::BOTTOM); + SetSecondaryDisplayLayout(display::DisplayPlacement::BOTTOM); // The point is on the primary root window. EXPECT_EQ("50,50", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -133,7 +134,7 @@ // The point is on the secondary display. EXPECT_EQ("50,200", ConvertHostPointToScreen(50, 400)); - SetSecondaryDisplayLayout(DisplayPlacement::LEFT); + SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); // The point is on the primary root window. EXPECT_EQ("50,50", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -141,7 +142,7 @@ // The point is on the secondary display. EXPECT_EQ("-150,0", ConvertHostPointToScreen(50, 400)); - SetSecondaryDisplayLayout(DisplayPlacement::TOP); + SetSecondaryDisplayLayout(display::DisplayPlacement::TOP); // The point is on the primary root window. EXPECT_EQ("50,50", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -149,7 +150,7 @@ // The point is on the secondary display. EXPECT_EQ("50,-200", ConvertHostPointToScreen(50, 400)); - SetSecondaryDisplayLayout(DisplayPlacement::RIGHT); + SetSecondaryDisplayLayout(display::DisplayPlacement::RIGHT); const gfx::Point window_pos2(300, 100); window_->SetBoundsInScreen( gfx::Rect(window_pos2, gfx::Size(100, 100)), @@ -161,7 +162,7 @@ // The point is on the primary root window. EXPECT_EQ("50,0", ConvertHostPointToScreen(50, -400)); - SetSecondaryDisplayLayout(DisplayPlacement::BOTTOM); + SetSecondaryDisplayLayout(display::DisplayPlacement::BOTTOM); // The point is on the secondary display. EXPECT_EQ("50,250", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -169,7 +170,7 @@ // The point is on the primary root window. EXPECT_EQ("50,0", ConvertHostPointToScreen(50, -400)); - SetSecondaryDisplayLayout(DisplayPlacement::LEFT); + SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); // The point is on the secondary display. EXPECT_EQ("-150,50", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. @@ -177,7 +178,7 @@ // The point is on the primary root window. EXPECT_EQ("50,0", ConvertHostPointToScreen(50, -400)); - SetSecondaryDisplayLayout(DisplayPlacement::TOP); + SetSecondaryDisplayLayout(display::DisplayPlacement::TOP); // The point is on the secondary display. EXPECT_EQ("50,-150", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows.
diff --git a/ash/display/unified_mouse_warp_controller.cc b/ash/display/unified_mouse_warp_controller.cc index fec9b60..702b53a 100644 --- a/ash/display/unified_mouse_warp_controller.cc +++ b/ash/display/unified_mouse_warp_controller.cc
@@ -16,6 +16,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/base/layout.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_utils.h" #include "ui/gfx/screen.h" #include "ui/wm/core/coordinate_conversion.h" @@ -37,9 +38,10 @@ // the |point_in_screen|. Returns nullptr if such WTH does not exist. aura::WindowTreeHost* FindMirroringWindowTreeHostFromScreenPoint( const gfx::Point& point_in_screen) { - DisplayList mirroring_display_list = Shell::GetInstance() - ->display_manager() - ->software_mirroring_display_list(); + display::DisplayList mirroring_display_list = + Shell::GetInstance() + ->display_manager() + ->software_mirroring_display_list(); int index = FindDisplayIndexContainingPoint(mirroring_display_list, point_in_screen); if (index < 0) @@ -75,7 +77,7 @@ aura::client::CursorClient* cursor_client = aura::client::GetCursorClient(target->GetRootWindow()); if (cursor_client) { - DisplayList mirroring_display_list = + display::DisplayList mirroring_display_list = Shell::GetInstance() ->display_manager() ->software_mirroring_display_list(); @@ -119,9 +121,9 @@ } void UnifiedMouseWarpController::ComputeBounds() { - DisplayList display_list = Shell::GetInstance() - ->display_manager() - ->software_mirroring_display_list(); + display::DisplayList display_list = Shell::GetInstance() + ->display_manager() + ->software_mirroring_display_list(); if (display_list.size() < 2) { LOG(ERROR) << "Mirroring Display lost during re-configuration"; @@ -152,9 +154,9 @@ bool in_second_edge = second_edge_bounds_in_native_.Contains(point_in_native); if (!in_first_edge && !in_second_edge) return false; - DisplayList display_list = Shell::GetInstance() - ->display_manager() - ->software_mirroring_display_list(); + display::DisplayList display_list = Shell::GetInstance() + ->display_manager() + ->software_mirroring_display_list(); // Wait updating the cursor until the cursor moves to the new display // to avoid showing the wrong sized cursor at the source display. current_cursor_display_id_ =
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index e919e9b..9336dfc 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -44,6 +44,7 @@ #include "ui/aura/window_tree_host.h" #include "ui/base/ime/input_method_factory.h" #include "ui/compositor/compositor.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/display.h" #include "ui/gfx/screen.h" #include "ui/wm/core/coordinate_conversion.h" @@ -439,15 +440,16 @@ GetRootWindowSettings(GetWindow(non_primary_host))->display_id = old_primary_display.id(); - const DisplayLayout& layout = GetDisplayManager()->GetCurrentDisplayLayout(); + const display::DisplayLayout& layout = + GetDisplayManager()->GetCurrentDisplayLayout(); // The requested primary id can be same as one in the stored layout // when the primary id is set after new displays are connected. // Only update the layout if it is requested to swap primary display. if (layout.primary_id != new_primary_display.id()) { - scoped_ptr<DisplayLayout> swapped_layout(layout.Copy()); + scoped_ptr<display::DisplayLayout> swapped_layout(layout.Copy()); swapped_layout->placement_list[0].Swap(); swapped_layout->primary_id = new_primary_display.id(); - DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); GetDisplayManager()->layout_store()->RegisterLayoutForDisplayIdList( list, std::move(swapped_layout)); } @@ -764,8 +766,8 @@ DisplayManager* display_manager = GetDisplayManager(); DisplayLayoutStore* layout_store = display_manager->layout_store(); if (display_manager->num_connected_displays() > 1) { - DisplayIdList list = display_manager->GetCurrentDisplayIdList(); - const DisplayLayout& layout = + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + const display::DisplayLayout& layout = layout_store->GetRegisteredDisplayLayout(list); layout_store->UpdateMultiDisplayState( list, display_manager->IsInMirrorMode(), layout.default_unified);
diff --git a/ash/display/window_tree_host_manager_unittest.cc b/ash/display/window_tree_host_manager_unittest.cc index 0fdcb58..faa8f4d 100644 --- a/ash/display/window_tree_host_manager_unittest.cc +++ b/ash/display/window_tree_host_manager_unittest.cc
@@ -27,6 +27,7 @@ #include "ui/aura/window_observer.h" #include "ui/aura/window_tracker.h" #include "ui/aura/window_tree_host.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_handler.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" @@ -183,20 +184,22 @@ Shell::GetAllRootWindows()[1]); } -void SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::Position position, - int offset) { - scoped_ptr<DisplayLayout> layout(test::CreateDisplayLayout(position, offset)); +void SetSecondaryDisplayLayoutAndOffset( + display::DisplayPlacement::Position position, + int offset) { + scoped_ptr<display::DisplayLayout> layout( + test::CreateDisplayLayout(position, offset)); ASSERT_GT(gfx::Screen::GetScreen()->GetNumDisplays(), 1); Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( std::move(layout)); } -void SetSecondaryDisplayLayout(DisplayPlacement::Position position) { +void SetSecondaryDisplayLayout(display::DisplayPlacement::Position position) { SetSecondaryDisplayLayoutAndOffset(position, 0); } -void SetDefaultDisplayLayout(DisplayPlacement::Position position) { - DisplayPlacement default_placement(position, 0); +void SetDefaultDisplayLayout(display::DisplayPlacement::Position position) { + display::DisplayPlacement default_placement(position, 0); Shell::GetInstance() ->display_manager() @@ -416,7 +419,7 @@ EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); // Layout the secondary display to the bottom of the primary. - SetSecondaryDisplayLayout(DisplayPlacement::BOTTOM); + SetSecondaryDisplayLayout(display::DisplayPlacement::BOTTOM); EXPECT_EQ(1, observer.CountAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -428,7 +431,7 @@ EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString()); // Layout the secondary display to the left of the primary. - SetSecondaryDisplayLayout(DisplayPlacement::LEFT); + SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); EXPECT_EQ(1, observer.CountAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -440,7 +443,7 @@ EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString()); // Layout the secondary display to the top of the primary. - SetSecondaryDisplayLayout(DisplayPlacement::TOP); + SetSecondaryDisplayLayout(display::DisplayPlacement::TOP); EXPECT_EQ(1, observer.CountAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -452,7 +455,7 @@ EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString()); // Layout to the right with an offset. - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::RIGHT, 300); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::RIGHT, 300); EXPECT_EQ(1, observer.CountAndReset()); // resize and add EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -463,7 +466,7 @@ EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString()); // Keep the minimum 100. - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::RIGHT, 490); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::RIGHT, 490); EXPECT_EQ(1, observer.CountAndReset()); // resize and add EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -473,7 +476,7 @@ EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString()); - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::RIGHT, -400); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::RIGHT, -400); EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -484,7 +487,7 @@ EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString()); // Layout to the bottom with an offset. - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::BOTTOM, -200); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::BOTTOM, -200); EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -495,7 +498,7 @@ EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString()); // Keep the minimum 100. - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::BOTTOM, 490); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::BOTTOM, 490); EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -505,7 +508,7 @@ EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString()); - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::BOTTOM, -400); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::BOTTOM, -400); EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(1, observer.GetWorkareaChangedCountAndReset()); @@ -516,7 +519,7 @@ EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); // Setting the same layout shouldn't invoke observers. - SetSecondaryDisplayLayoutAndOffset(DisplayPlacement::BOTTOM, -400); + SetSecondaryDisplayLayoutAndOffset(display::DisplayPlacement::BOTTOM, -400); EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset()); EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset()); EXPECT_EQ(0, observer.GetWorkareaChangedCountAndReset()); @@ -609,7 +612,7 @@ w1->Focus(); TestObserver observer; - SetDefaultDisplayLayout(DisplayPlacement::BOTTOM); + SetDefaultDisplayLayout(display::DisplayPlacement::BOTTOM); UpdateDisplay("200x200,300x300"); // layout, resize and add. EXPECT_EQ(1, observer.CountAndReset()); EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); @@ -717,7 +720,7 @@ UpdateDisplay("200x200,300x300"); display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::RIGHT, 50)); + test::CreateDisplayLayout(display::DisplayPlacement::RIGHT, 50)); gfx::Display primary_display = gfx::Screen::GetScreen()->GetPrimaryDisplay(); gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay(); @@ -781,7 +784,7 @@ gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay(); display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::RIGHT, 50)); + test::CreateDisplayLayout(display::DisplayPlacement::RIGHT, 50)); EXPECT_NE(primary_display.id(), secondary_display.id()); aura::Window* primary_root = @@ -824,7 +827,7 @@ EXPECT_TRUE(primary_root->Contains(shelf_window)); EXPECT_FALSE(secondary_root->Contains(shelf_window)); - const DisplayLayout& inverted_layout = + const display::DisplayLayout& inverted_layout = display_manager->GetCurrentDisplayLayout(); EXPECT_EQ("id=2200000000, parent=2200000001, left, -50", @@ -1005,7 +1008,7 @@ EXPECT_EQ(1, observer.GetRotationChangedCountAndReset()); display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::BOTTOM, 50)); + test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 50)); EXPECT_EQ("50,120 150x200", ScreenUtil::GetSecondaryDisplay().bounds().ToString()); @@ -1364,7 +1367,7 @@ // Set the 2nd display on the left. DisplayLayoutStore* layout_store = Shell::GetInstance()->display_manager()->layout_store(); - DisplayPlacement new_default(DisplayPlacement::LEFT, 0); + display::DisplayPlacement new_default(display::DisplayPlacement::LEFT, 0); layout_store->SetDefaultDisplayPlacement(new_default); UpdateDisplay("200x200,300x300");
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc index 035e925d..b42f2d44 100644 --- a/ash/extended_desktop_unittest.cc +++ b/ash/extended_desktop_unittest.cc
@@ -21,6 +21,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/cursor/cursor.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_handler.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" @@ -33,8 +34,8 @@ namespace ash { namespace { -void SetSecondaryDisplayLayout(DisplayPlacement::Position position) { - scoped_ptr<DisplayLayout> layout = +void SetSecondaryDisplayLayout(display::DisplayPlacement::Position position) { + scoped_ptr<display::DisplayLayout> layout = Shell::GetInstance()->display_manager()->GetCurrentDisplayLayout().Copy(); layout->placement_list[0].position = position; Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( @@ -310,7 +311,7 @@ return; UpdateDisplay("700x500,500x500"); - SetSecondaryDisplayLayout(DisplayPlacement::LEFT); + SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); EXPECT_EQ(root_windows[1], wm::GetRootWindowAt(gfx::Point(-400, 100))); @@ -331,7 +332,7 @@ return; UpdateDisplay("700x500,500x500"); - SetSecondaryDisplayLayout(DisplayPlacement::LEFT); + SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); @@ -732,7 +733,7 @@ EXPECT_EQ("-1010,-10", p.ToString()); // Move the 2nd display to the bottom and test again. - SetSecondaryDisplayLayout(DisplayPlacement::BOTTOM); + SetSecondaryDisplayLayout(display::DisplayPlacement::BOTTOM); display_2 = screen->GetDisplayNearestWindow(root_windows[1]); EXPECT_EQ("0,600", display_2.bounds().origin().ToString());
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc index d2f1d0b..1c73328 100644 --- a/ash/root_window_controller_unittest.cc +++ b/ash/root_window_controller_unittest.cc
@@ -666,17 +666,12 @@ TEST_F(NoSessionRootWindowControllerTest, Event) { aura::Window* root = Shell::GetPrimaryRootWindow(); const gfx::Size size = root->bounds().size(); - aura::Window* event_target = root->GetEventHandlerForPoint(gfx::Point(0, 0)); - EXPECT_TRUE(event_target); - EXPECT_EQ(event_target, - root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); - EXPECT_EQ(event_target, - root->GetEventHandlerForPoint(gfx::Point(size.width() - 1, 0))); - EXPECT_EQ(event_target, - root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); - EXPECT_EQ(event_target, - root->GetEventHandlerForPoint( - gfx::Point(size.width() - 1, size.height() - 1))); + EXPECT_TRUE(root->GetEventHandlerForPoint(gfx::Point(0, 0))); + EXPECT_TRUE(root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); + EXPECT_TRUE(root->GetEventHandlerForPoint(gfx::Point(size.width() - 1, 0))); + EXPECT_TRUE(root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); + EXPECT_TRUE(root->GetEventHandlerForPoint( + gfx::Point(size.width() - 1, size.height() - 1))); } class VirtualKeyboardRootWindowControllerTest
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index 5dc36f4..f0330e7 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -245,15 +245,13 @@ } void ShelfLayoutManager::LayoutShelf() { - if (shelf_->shelf()) { - TargetBounds target_bounds; - CalculateTargetBounds(state_, &target_bounds); - UpdateBoundsAndOpacity(target_bounds, false, NULL); + TargetBounds target_bounds; + CalculateTargetBounds(state_, &target_bounds); + UpdateBoundsAndOpacity(target_bounds, false, NULL); - // Update insets in ShelfWindowTargeter when shelf bounds change. - FOR_EACH_OBSERVER(ShelfLayoutManagerObserver, observers_, - WillChangeVisibilityState(visibility_state())); - } + // Update insets in ShelfWindowTargeter when shelf bounds change. + FOR_EACH_OBSERVER(ShelfLayoutManagerObserver, observers_, + WillChangeVisibilityState(visibility_state())); } ShelfVisibilityState ShelfLayoutManager::CalculateShelfVisibility() {
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index 8703963..6969695 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -35,6 +35,7 @@ #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/gesture_detection/gesture_configuration.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" @@ -947,7 +948,7 @@ UpdateDisplay("800x600,800x600"); Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::RIGHT, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::RIGHT, 0)); // Put the primary monitor's shelf on the display boundary. ShelfLayoutManager* shelf = GetShelfLayoutManager(); shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
diff --git a/ash/shell/content/client/shell_content_browser_client.cc b/ash/shell/content/client/shell_content_browser_client.cc index 1329a65..60da706 100644 --- a/ash/shell/content/client/shell_content_browser_client.cc +++ b/ash/shell/content/client/shell_content_browser_client.cc
@@ -8,7 +8,6 @@ #include "ash/shell/content/client/shell_browser_main_parts.h" #include "base/command_line.h" -#include "content/shell/browser/shell_browser_context.h" #include "third_party/skia/include/core/SkBitmap.h" namespace ash { @@ -25,19 +24,5 @@ return shell_browser_main_parts_; } -net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext( - content::BrowserContext* content_browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - content::ShellBrowserContext* shell_context = - static_cast<content::ShellBrowserContext*>(content_browser_context); - return shell_context->CreateRequestContext(protocol_handlers, - std::move(request_interceptors)); -} - -content::ShellBrowserContext* ShellContentBrowserClient::browser_context() { - return shell_browser_main_parts_->browser_context(); -} - } // namespace examples } // namespace views
diff --git a/ash/shell/content/client/shell_content_browser_client.h b/ash/shell/content/client/shell_content_browser_client.h index bef621a6..116c4b6 100644 --- a/ash/shell/content/client/shell_content_browser_client.h +++ b/ash/shell/content/client/shell_content_browser_client.h
@@ -30,12 +30,6 @@ // Overridden from content::ContentBrowserClient: content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams& parameters) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - - content::ShellBrowserContext* browser_context(); private: ShellBrowserMainParts* shell_browser_main_parts_;
diff --git a/ash/sticky_keys/sticky_keys_overlay_unittest.cc b/ash/sticky_keys/sticky_keys_overlay_unittest.cc index 8fb0d1f7..ac67d4f 100644 --- a/ash/sticky_keys/sticky_keys_overlay_unittest.cc +++ b/ash/sticky_keys/sticky_keys_overlay_unittest.cc
@@ -10,6 +10,7 @@ #include "ash/sticky_keys/sticky_keys_controller.h" #include "ash/test/ash_test_base.h" #include "ash/test/display_manager_test_api.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event.h" #include "ui/views/widget/widget.h" @@ -47,11 +48,12 @@ // Add a secondary display to the left of the primary one. UpdateDisplay("1280x1024,1980x1080"); DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - DisplayIdList display_ids = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList display_ids = + display_manager->GetCurrentDisplayIdList(); int64_t primary_display_id = display_ids[0]; int64_t secondary_display_id = display_ids[1]; display_manager->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::LEFT, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::LEFT, 0)); // The overlay should belong to the secondary root window. StickyKeysOverlay overlay;
diff --git a/ash/test/display_manager_test_api.cc b/ash/test/display_manager_test_api.cc index 0e49e6d0..10ef37f7 100644 --- a/ash/test/display_manager_test_api.cc +++ b/ash/test/display_manager_test_api.cc
@@ -9,7 +9,6 @@ #include "ash/ash_switches.h" #include "ash/display/display_info.h" -#include "ash/display/display_layout_builder.h" #include "ash/display/display_layout_store.h" #include "ash/display/display_manager.h" #include "ash/display/display_util.h" @@ -22,15 +21,12 @@ #include "base/strings/string_split.h" #include "ui/aura/env.h" #include "ui/aura/window_event_dispatcher.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/display.h" namespace ash { namespace test { -typedef std::vector<gfx::Display> DisplayList; -typedef DisplayInfo DisplayInfo; -typedef std::vector<DisplayInfo> DisplayInfoList; - namespace { std::vector<DisplayInfo> CreateDisplayInfoListFromString( @@ -41,9 +37,10 @@ specs, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); size_t index = 0; - DisplayList list = display_manager->IsInUnifiedMode() - ? display_manager->software_mirroring_display_list() - : display_manager->active_display_list(); + display::DisplayList list = + display_manager->IsInUnifiedMode() + ? display_manager->software_mirroring_display_list() + : display_manager->active_display_list(); for (std::vector<std::string>::const_iterator iter = parts.begin(); iter != parts.end(); ++iter, ++index) { @@ -174,29 +171,29 @@ ScreenUtil::GetSecondaryDisplay().id()); } -scoped_ptr<DisplayLayout> CreateDisplayLayout( - DisplayPlacement::Position position, +scoped_ptr<display::DisplayLayout> CreateDisplayLayout( + display::DisplayPlacement::Position position, int offset) { DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); - DisplayLayoutBuilder builder( + display::DisplayLayoutBuilder builder( gfx::Screen::GetScreen()->GetPrimaryDisplay().id()); builder.SetSecondaryPlacement(ScreenUtil::GetSecondaryDisplay().id(), position, offset); return builder.Build(); } -DisplayIdList CreateDisplayIdList2(int64_t id1, int64_t id2) { - DisplayIdList list; +display::DisplayIdList CreateDisplayIdList2(int64_t id1, int64_t id2) { + display::DisplayIdList list; list.push_back(id1); list.push_back(id2); SortDisplayIdList(&list); return list; } -DisplayIdList CreateDisplayIdListN(size_t count, ...) { - DisplayIdList list; +display::DisplayIdList CreateDisplayIdListN(size_t count, ...) { + display::DisplayIdList list; va_list args; va_start(args, count); for (size_t i = 0; i < count; i++) {
diff --git a/ash/test/display_manager_test_api.h b/ash/test/display_manager_test_api.h index 573f212..b72818c9 100644 --- a/ash/test/display_manager_test_api.h +++ b/ash/test/display_manager_test_api.h
@@ -10,8 +10,8 @@ #include <string> #include <vector> -#include "ash/display/display_layout.h" #include "base/macros.h" +#include "ui/display/manager/display_layout.h" #include "ui/display/types/display_constants.h" namespace gfx { @@ -98,13 +98,13 @@ // independent of current displays, use DisplayLayoutBuilder or simply // create a new DisplayLayout and set display id fields (primary, ids // in placement) manually. -scoped_ptr<DisplayLayout> CreateDisplayLayout( - DisplayPlacement::Position position, +scoped_ptr<display::DisplayLayout> CreateDisplayLayout( + display::DisplayPlacement::Position position, int offset); // Creates the DisplayIdList from ints. -DisplayIdList CreateDisplayIdList2(int64_t id1, int64_t id2); -DisplayIdList CreateDisplayIdListN(size_t count, ...); +display::DisplayIdList CreateDisplayIdList2(int64_t id1, int64_t id2); +display::DisplayIdList CreateDisplayIdListN(size_t count, ...); } // namespace test } // namespace ash
diff --git a/ash/touch/touch_transformer_controller.cc b/ash/touch/touch_transformer_controller.cc index 8bea2bf5..2fac6625 100644 --- a/ash/touch/touch_transformer_controller.cc +++ b/ash/touch/touch_transformer_controller.cc
@@ -11,6 +11,7 @@ #include "ash/shell.h" #include "ui/aura/window_tree_host.h" #include "ui/display/chromeos/display_configurator.h" +#include "ui/display/manager/display_layout.h" #include "ui/display/types/display_snapshot.h" #include "ui/events/devices/device_data_manager.h" @@ -174,7 +175,7 @@ single_display = display_manager->GetDisplayInfo(single_display_id); UpdateTouchRadius(single_display); } else { - DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); display1_id = list[0]; display2_id = list[1]; DCHECK(display1_id != gfx::Display::kInvalidDisplayID &&
diff --git a/ash/wm/dock/docked_window_layout_manager_unittest.cc b/ash/wm/dock/docked_window_layout_manager_unittest.cc index 5ff61a1..9755749 100644 --- a/ash/wm/dock/docked_window_layout_manager_unittest.cc +++ b/ash/wm/dock/docked_window_layout_manager_unittest.cc
@@ -31,6 +31,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/hit_test.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/screen.h" #include "ui/views/widget/widget.h" #include "ui/wm/core/coordinate_conversion.h" @@ -544,7 +545,7 @@ // Layout the secondary display to the bottom of the primary. ASSERT_GT(gfx::Screen::GetScreen()->GetNumDisplays(), 1); Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::BOTTOM, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 0)); scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(0, 1000, 201, 310))); DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w1.get(), 1000 + 20);
diff --git a/ash/wm/drag_window_resizer_unittest.cc b/ash/wm/drag_window_resizer_unittest.cc index 9705c75d..24da2889 100644 --- a/ash/wm/drag_window_resizer_unittest.cc +++ b/ash/wm/drag_window_resizer_unittest.cc
@@ -4,7 +4,6 @@ #include "ash/wm/drag_window_resizer.h" -#include "ash/display/display_layout_builder.h" #include "ash/display/display_manager.h" #include "ash/display/mouse_cursor_event_filter.h" #include "ash/root_window_controller.h" @@ -24,6 +23,8 @@ #include "ui/base/hit_test.h" #include "ui/base/ui_base_types.h" #include "ui/compositor/layer_tree_owner.h" +#include "ui/display/manager/display_layout.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/gfx/geometry/insets.h" #include "ui/views/widget/widget.h" #include "ui/wm/core/window_util.h" @@ -425,12 +426,14 @@ // Layout so that all three displays touch each other. DisplayManager* display_manager = Shell::GetInstance()->display_manager(); - DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); ASSERT_EQ(3u, list.size()); ASSERT_EQ(gfx::Screen::GetScreen()->GetPrimaryDisplay().id(), list[0]); - DisplayLayoutBuilder builder(list[0]); - builder.AddDisplayPlacement(list[1], list[0], DisplayPlacement::RIGHT, 0); - builder.AddDisplayPlacement(list[2], list[0], DisplayPlacement::BOTTOM, 0); + display::DisplayLayoutBuilder builder(list[0]); + builder.AddDisplayPlacement(list[1], list[0], + display::DisplayPlacement::RIGHT, 0); + builder.AddDisplayPlacement(list[2], list[0], + display::DisplayPlacement::BOTTOM, 0); display_manager->SetLayoutForCurrentDisplays(builder.Build()); // Sanity check. ASSERT_EQ(gfx::Rect(0, 000, 400, 600),
diff --git a/ash/wm/immersive_fullscreen_controller_unittest.cc b/ash/wm/immersive_fullscreen_controller_unittest.cc index 381b7b0b..7e1f1fb 100644 --- a/ash/wm/immersive_fullscreen_controller_unittest.cc +++ b/ash/wm/immersive_fullscreen_controller_unittest.cc
@@ -19,6 +19,7 @@ #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_utils.h" #include "ui/events/test/event_generator.h" #include "ui/events/test/test_event_handler.h" @@ -504,7 +505,7 @@ // Set up initial state. UpdateDisplay("800x600,800x600"); ash::Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(ash::DisplayPlacement::TOP, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::TOP, 0)); SetEnabled(true); ASSERT_TRUE(controller()->IsEnabled());
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc index e45fb7b0..ff5d1be6 100644 --- a/ash/wm/overview/window_selector_unittest.cc +++ b/ash/wm/overview/window_selector_unittest.cc
@@ -7,7 +7,6 @@ #include "ash/accessibility_delegate.h" #include "ash/ash_switches.h" -#include "ash/display/display_layout.h" #include "ash/drag_drop/drag_drop_controller.h" #include "ash/root_window_controller.h" #include "ash/screen_util.h" @@ -47,6 +46,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/event_utils.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/geometry/point_conversions.h" @@ -1383,7 +1383,7 @@ UpdateDisplay("400x400,400x400"); Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::LEFT, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::LEFT, 0)); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); gfx::Rect bounds1(-350, 0, 100, 100); gfx::Rect bounds2(0, 0, 100, 100);
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc index 918b2fd0..0f0e82e 100644 --- a/ash/wm/workspace/workspace_layout_manager_unittest.cc +++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/display/display_layout.h" #include "ash/display/display_manager.h" #include "ash/root_window_controller.h" #include "ash/screen_util.h" @@ -30,6 +29,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/ui_base_types.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/screen.h" #include "ui/views/widget/widget.h" @@ -145,7 +145,7 @@ aura::Window::Windows root_windows = Shell::GetAllRootWindows(); Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(DisplayPlacement::TOP, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::TOP, 0)); EXPECT_EQ("0,-500 400x500", root_windows[1]->GetBoundsInScreen().ToString()); scoped_ptr<aura::Window> window1(
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc index 91973fe1..c6e844ed 100644 --- a/ash/wm/workspace/workspace_window_resizer_unittest.cc +++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -24,6 +24,7 @@ #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/hit_test.h" +#include "ui/display/manager/display_layout.h" #include "ui/events/gesture_detection/gesture_configuration.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/geometry/insets.h" @@ -822,7 +823,7 @@ // Positions the secondary display at the bottom the primary display. Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - test::CreateDisplayLayout(ash::DisplayPlacement::BOTTOM, 0)); + test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 0)); { window_->SetBounds(gfx::Rect(100, 200, 300, 20));
diff --git a/base/debug/dump_without_crashing.cc b/base/debug/dump_without_crashing.cc index 4b338ca29..47fd873c 100644 --- a/base/debug/dump_without_crashing.cc +++ b/base/debug/dump_without_crashing.cc
@@ -18,12 +18,9 @@ namespace debug { -bool DumpWithoutCrashing() { - if (dump_without_crashing_function_) { +void DumpWithoutCrashing() { + if (dump_without_crashing_function_) (*dump_without_crashing_function_)(); - return true; - } - return false; } void SetDumpWithoutCrashingFunction(void (CDECL *function)()) {
diff --git a/base/debug/dump_without_crashing.h b/base/debug/dump_without_crashing.h index a5c85d5e..b8ed174 100644 --- a/base/debug/dump_without_crashing.h +++ b/base/debug/dump_without_crashing.h
@@ -17,8 +17,7 @@ // Before calling this function, call SetDumpWithoutCrashingFunction to pass a // function pointer, typically chrome!DumpProcessWithoutCrash. See example code // in chrome_main.cc that does this for chrome.dll. -// Returns false if called before SetDumpWithoutCrashingFunction. -BASE_EXPORT bool DumpWithoutCrashing(); +BASE_EXPORT void DumpWithoutCrashing(); // Sets a function that'll be invoked to dump the current process when // DumpWithoutCrashing() is called.
diff --git a/base/logging.cc b/base/logging.cc index 4790ca8..a5f9e11 100644 --- a/base/logging.cc +++ b/base/logging.cc
@@ -59,7 +59,6 @@ #include "base/command_line.h" #include "base/debug/alias.h" #include "base/debug/debugger.h" -#include "base/debug/dump_without_crashing.h" #include "base/debug/stack_trace.h" #include "base/posix/eintr_wrapper.h" #include "base/strings/string_piece.h" @@ -334,19 +333,6 @@ } // namespace -#if defined(DCHECK_IS_DUMP_WITHOUT_CRASH) -// Used to implement dump-on-DCHECK. See crbug.com/596231. -void DCheckDumpWithoutCrashing() { - // To ensure we don't risk spamming Crash with dump-on-DCHECK reports we log - // only the first[*] DCHECK to fail once DumpWithoutCrashing() is working. - // [*] This is racey, but in the pathological case still only results in one - // dump per-racing-thread, rather than our aim of one per-process. - static bool dump_on_dcheck = true; - if (dump_on_dcheck) - dump_on_dcheck = !base::debug::DumpWithoutCrashing(); -} -#endif - LoggingSettings::LoggingSettings() : logging_dest(LOG_DEFAULT), log_file(nullptr),
diff --git a/base/logging.h b/base/logging.h index 84d6cc33..07674698 100644 --- a/base/logging.h +++ b/base/logging.h
@@ -637,17 +637,11 @@ #if DCHECK_IS_ON() -// If DCHECK is configured to dump-without-crashing then omit these, so that -// anything using them directly will break the build. See crbug.com/596231. -#if !defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ COMPACT_GOOGLE_LOG_EX_FATAL(ClassName , ##__VA_ARGS__) #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_FATAL const LogSeverity LOG_DCHECK = LOG_FATAL; -#endif // !defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - #else // DCHECK_IS_ON() // These are just dummy values. @@ -666,10 +660,6 @@ #if defined(_PREFAST_) && defined(OS_WIN) // See comments on the previous use of __analysis_assume. -#if defined(DCHECK_IS_DUMP_WITHOUT_CRASH) -#error "Only one of _PREFAST_ and DCHECK_IS_DUMP_WITHOUT_CRASH may be set" -#endif // defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - #define DCHECK(condition) \ __analysis_assume(!!(condition)), \ LAZY_STREAM(LOG_STREAM(DCHECK), false) \ @@ -680,20 +670,7 @@ LAZY_STREAM(PLOG_STREAM(DCHECK), false) \ << "Check failed: " #condition ". " -#elif DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) -// DCHECK is configured to dump-without-crashing, rather than logging. -// See crbug.com/596231. - -BASE_EXPORT void DCheckDumpWithoutCrashing(); - -#define DCHECK(condition) \ - (condition) ? (void)0 : logging::DCheckDumpWithoutCrashing(), \ - EAT_STREAM_PARAMETERS - -// Since we're uploading a crash dump, not logging, DPCHECK behaves identically. -#define DPCHECK(condition) DCHECK(condition) - -#else // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) +#else // _PREFAST_ #define DCHECK(condition) \ LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \ @@ -703,21 +680,10 @@ LAZY_STREAM(PLOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \ << "Check failed: " #condition ". " -#endif // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) +#endif // _PREFAST_ // Helper macro for binary operators. // Don't use this macro directly in your code, use DCHECK_EQ et al below. - -#if DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) -// DCHECK is configured to dump-without-crashing, rather than logging. -// See crbug.com/596231. - -// Use logging::Check*Impl() to ensure that operator<<()s don't go unused. -#define DCHECK_OP(name, op, val1, val2) \ - DCHECK(logging::Check##name##Impl((val1), (val2), #val1 " " #op " " #val2)) - -#else // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - // The 'switch' is used to prevent the 'else' from being ambiguous when the // macro is used in an 'if' clause such as: // if (a == 1) @@ -733,8 +699,6 @@ logging::LogMessage(__FILE__, __LINE__, ::logging::LOG_DCHECK, \ true_if_passed.message()).stream() -#endif // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - // Equality/Inequality checks - compare two values, and log a // LOG_DCHECK message including the two values when the result is not // as expected. The values must have operator<<(ostream, ...)
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc index e8756f1..22fb855 100644 --- a/base/logging_unittest.cc +++ b/base/logging_unittest.cc
@@ -234,19 +234,13 @@ EXPECT_TRUE(DLOG_IS_ON(DCHECK)); #endif -#if defined(DCHECK_IS_DUMP_WITHOUT_CRASH) - const bool kDCheckLogsOutput = false; -#else - const bool kDCheckLogsOutput = DCHECK_IS_ON(); -#endif - EXPECT_EQ(0, log_sink_call_count); DCHECK(false); - EXPECT_EQ(kDCheckLogsOutput ? 1 : 0, log_sink_call_count); + EXPECT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count); DPCHECK(false); - EXPECT_EQ(kDCheckLogsOutput ? 2 : 0, log_sink_call_count); + EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count); DCHECK_EQ(0, 1); - EXPECT_EQ(kDCheckLogsOutput ? 3 : 0, log_sink_call_count); + EXPECT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count); } TEST_F(LoggingTest, DcheckReleaseBehavior) {
diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc index 460c75e..b19a897a 100644 --- a/base/metrics/statistics_recorder.cc +++ b/base/metrics/statistics_recorder.cc
@@ -113,11 +113,11 @@ histogram_to_return = histogram; } else { const std::string& name = histogram->histogram_name(); - const uint64_t name_hash = histogram->name_hash(); - DCHECK_NE(0U, name_hash); - HistogramMap::iterator it = histograms_->find(name_hash); + HistogramMap::iterator it = histograms_->find(name); if (histograms_->end() == it) { - (*histograms_)[name_hash] = histogram; + // The StringKey references the name within |histogram| rather than + // making a copy. + (*histograms_)[name] = histogram; ANNOTATE_LEAKING_OBJECT_PTR(histogram); // see crbug.com/79322 // If there are callbacks for this histogram, we set the kCallbackExists // flag. @@ -261,7 +261,6 @@ return; for (const auto& entry : *histograms_) { - DCHECK_EQ(entry.first, entry.second->name_hash()); output->push_back(entry.second); } } @@ -298,10 +297,9 @@ if (allocator) allocator->ImportHistogramsToStatisticsRecorder(); - HistogramMap::iterator it = histograms_->find(HashMetricName(name)); + HistogramMap::iterator it = histograms_->find(name); if (histograms_->end() == it) return NULL; - DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; return it->second; } @@ -346,11 +344,9 @@ return false; callbacks_->insert(std::make_pair(name, cb)); - auto it = histograms_->find(HashMetricName(name)); - if (it != histograms_->end()) { - DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; + auto it = histograms_->find(name); + if (it != histograms_->end()) it->second->SetFlags(HistogramBase::kCallbackExists); - } return true; } @@ -366,11 +362,9 @@ callbacks_->erase(name); // We also clear the flag from the histogram (if it exists). - auto it = histograms_->find(HashMetricName(name)); - if (it != histograms_->end()) { - DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; + auto it = histograms_->find(name); + if (it != histograms_->end()) it->second->ClearFlags(HistogramBase::kCallbackExists); - } } // static @@ -407,7 +401,7 @@ // static void StatisticsRecorder::ForgetHistogramForTesting(base::StringPiece name) { if (histograms_) - histograms_->erase(HashMetricName(name.as_string())); + histograms_->erase(name); } // This singleton instance should be started during the single threaded portion
diff --git a/base/metrics/statistics_recorder.h b/base/metrics/statistics_recorder.h index 6eaf079..12543b8 100644 --- a/base/metrics/statistics_recorder.h +++ b/base/metrics/statistics_recorder.h
@@ -32,7 +32,36 @@ class BASE_EXPORT StatisticsRecorder { public: - typedef std::map<uint64_t, HistogramBase*> HistogramMap; // Key is name-hash. + // A class used as a key for the histogram map below. It always references + // a string owned outside of this class, likely in the value of the map. + class StringKey : public StringPiece { + public: + // Constructs the StringKey using various sources. The source must live + // at least as long as the created object. + StringKey(const std::string& str) : StringPiece(str) {} + StringKey(StringPiece str) : StringPiece(str) {} + + // Though StringPiece is better passed by value than by reference, in + // this case it's being passed many times and likely already been stored + // in memory (not just registers) so the benefit of pass-by-value is + // negated. + bool operator<(const StringKey& rhs) const { + // Since order is unimportant in the map and string comparisons can be + // slow, use the length as the primary sort value. + if (length() < rhs.length()) + return true; + if (length() > rhs.length()) + return false; + + // Fall back to an actual string comparison. The lengths are the same + // so a simple memory-compare is sufficient. This is slightly more + // efficient than calling operator<() for StringPiece which would + // again have to check lengths before calling wordmemcmp(). + return wordmemcmp(data(), rhs.data(), length()) < 0; + } + }; + + typedef std::map<StringKey, HistogramBase*> HistogramMap; typedef std::vector<HistogramBase*> Histograms; // A class for iterating over the histograms held within this global resource.
diff --git a/base/task_scheduler/scheduler_worker_thread.cc b/base/task_scheduler/scheduler_worker_thread.cc index e03726a..49dde51d 100644 --- a/base/task_scheduler/scheduler_worker_thread.cc +++ b/base/task_scheduler/scheduler_worker_thread.cc
@@ -17,14 +17,10 @@ std::unique_ptr<SchedulerWorkerThread> SchedulerWorkerThread::CreateSchedulerWorkerThread( ThreadPriority thread_priority, - const Closure& main_entry_callback, - const GetWorkCallback& get_work_callback, - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback, + Delegate* delegate, TaskTracker* task_tracker) { std::unique_ptr<SchedulerWorkerThread> worker_thread( - new SchedulerWorkerThread(thread_priority, main_entry_callback, - get_work_callback, - ran_task_from_sequence_callback, task_tracker)); + new SchedulerWorkerThread(thread_priority, delegate, task_tracker)); if (worker_thread->thread_handle_.is_null()) return nullptr; @@ -48,36 +44,29 @@ PlatformThread::Join(thread_handle_); } -SchedulerWorkerThread::SchedulerWorkerThread( - ThreadPriority thread_priority, - const Closure& main_entry_callback, - const GetWorkCallback& get_work_callback, - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback, - TaskTracker* task_tracker) +SchedulerWorkerThread::SchedulerWorkerThread(ThreadPriority thread_priority, + Delegate* delegate, + TaskTracker* task_tracker) : wake_up_event_(false, false), - main_entry_callback_(main_entry_callback), - get_work_callback_(get_work_callback), - ran_task_from_sequence_callback_(ran_task_from_sequence_callback), + delegate_(delegate), task_tracker_(task_tracker) { - DCHECK(!main_entry_callback_.is_null()); - DCHECK(!get_work_callback_.is_null()); - DCHECK(!ran_task_from_sequence_callback_.is_null()); + DCHECK(delegate_); DCHECK(task_tracker_); - static const size_t kDefaultStackSize = 0; + const size_t kDefaultStackSize = 0; PlatformThread::CreateWithPriority(kDefaultStackSize, this, &thread_handle_, thread_priority); } void SchedulerWorkerThread::ThreadMain() { - main_entry_callback_.Run(); + delegate_->OnMainEntry(); // A SchedulerWorkerThread starts out sleeping. wake_up_event_.Wait(); while (!task_tracker_->shutdown_completed() && !ShouldExitForTesting()) { // Get the sequence containing the next task to execute. - scoped_refptr<Sequence> sequence = get_work_callback_.Run(this); + scoped_refptr<Sequence> sequence = delegate_->GetWork(this); if (!sequence) { wake_up_event_.Wait(); @@ -85,15 +74,17 @@ } task_tracker_->RunTask(sequence->PeekTask()); - ran_task_from_sequence_callback_.Run(this, std::move(sequence)); + delegate_->RanTaskFromSequence(std::move(sequence)); // Calling WakeUp() guarantees that this SchedulerWorkerThread will run - // Tasks from Sequences returned by |get_work_callback_| until the callback - // returns nullptr. Resetting |wake_up_event_| here doesn't break this - // invariant and avoids a useless loop iteration before going to sleep if - // WakeUp() is called while this SchedulerWorkerThread is awake. + // Tasks from Sequences returned by the GetWork() method of |delegate_| + // until it returns nullptr. Resetting |wake_up_event_| here doesn't break + // this invariant and avoids a useless loop iteration before going to sleep + // if WakeUp() is called while this SchedulerWorkerThread is awake. wake_up_event_.Reset(); } + + delegate_->OnMainExit(); } bool SchedulerWorkerThread::ShouldExitForTesting() const {
diff --git a/base/task_scheduler/scheduler_worker_thread.h b/base/task_scheduler/scheduler_worker_thread.h index 8b129a3..cc3b1b5 100644 --- a/base/task_scheduler/scheduler_worker_thread.h +++ b/base/task_scheduler/scheduler_worker_thread.h
@@ -8,7 +8,6 @@ #include <memory> #include "base/base_export.h" -#include "base/callback.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/synchronization/waitable_event.h" @@ -21,40 +20,46 @@ class TaskTracker; -// A thread that runs Tasks from Sequences returned by a callback. +// A thread that runs Tasks from Sequences returned by a delegate. // -// A SchedulerWorkerThread is woken up when its WakeUp() method is called. After -// a wake- up, a SchedulerWorkerThread runs Tasks from Sequences returned by its -// "get work" callback as long as it doesn't return nullptr. It also -// periodically checks with its TaskTracker whether shutdown has completed and -// exits when it has. +// A SchedulerWorkerThread starts out sleeping. It is woken up by a call to +// WakeUp(). After a wake-up, a SchedulerWorkerThread runs Tasks from Sequences +// returned by the GetWork() method of its delegate as long as it doesn't return +// nullptr. It also periodically checks with its TaskTracker whether shutdown +// has completed and exits when it has. // // This class is thread-safe. class BASE_EXPORT SchedulerWorkerThread : public PlatformThread::Delegate { public: - // Callback invoked to get a Sequence from which to run a Task on - // |worker_thread|. - using GetWorkCallback = - Callback<scoped_refptr<Sequence>(SchedulerWorkerThread* worker_thread)>; + // Delegate interface for SchedulerWorkerThread. The methods are always called + // from the thread managed by the SchedulerWorkerThread instance. + class Delegate { + public: + virtual ~Delegate() = default; - // Callback invoked after |worker_thread| has tried to run a Task from - // |sequence| (a TaskTracker might have prevented the Task from running). - using RanTaskFromSequenceCallback = - Callback<void(const SchedulerWorkerThread* worker_thread, - scoped_refptr<Sequence> sequence)>; + // Called when the main function of the SchedulerWorkerThread enters. + virtual void OnMainEntry() = 0; + + // Called when the main function of the SchedulerWorkerThread exits. + virtual void OnMainExit() = 0; + + // Called by |worker_thread| to get a Sequence from which to run a Task. + virtual scoped_refptr<Sequence> GetWork( + SchedulerWorkerThread* worker_thread) = 0; + + // Called after the SchedulerWorkerThread has tried to run a Task from + // |sequence| (a TaskTracker might have prevented the Task from running). + // The Task is still in |sequence| when this is called. + virtual void RanTaskFromSequence(scoped_refptr<Sequence> sequence) = 0; + }; // Creates a SchedulerWorkerThread with priority |thread_priority| that runs - // Tasks from Sequences returned by |get_work_callback|. |main_entry_callback| - // is invoked when the main function of the SchedulerWorkerThread is entered. - // |ran_task_from_sequence_callback| is invoked after the - // SchedulerWorkerThread has tried to run a Task from a Sequence returned by - // |get_work_callback|. |task_tracker| is used to handle shutdown behavior of - // Tasks. Returns nullptr if creating the underlying platform thread fails. + // Tasks from Sequences returned by |delegate|. |task_tracker| is used to + // handle shutdown behavior of Tasks. Returns nullptr if creating the + // underlying platform thread fails. static std::unique_ptr<SchedulerWorkerThread> CreateSchedulerWorkerThread( ThreadPriority thread_priority, - const Closure& main_entry_callback, - const GetWorkCallback& get_work_callback, - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback, + Delegate* delegate, TaskTracker* task_tracker); // Destroying a SchedulerWorkerThread in production is not allowed; it is @@ -62,9 +67,9 @@ // has returned. ~SchedulerWorkerThread() override; - // Wakes up this SchedulerWorkerThread. After this is called, this - // SchedulerWorkerThread will run Tasks from Sequences returned by - // |get_work_callback_| until it returns nullptr. + // Wakes up this SchedulerWorkerThread if it wasn't already awake. After this + // is called, this SchedulerWorkerThread will run Tasks from Sequences + // returned by the GetWork() method of its delegate until it returns nullptr. void WakeUp(); // Joins this SchedulerWorkerThread. If a Task is already running, it will be @@ -72,12 +77,9 @@ void JoinForTesting(); private: - SchedulerWorkerThread( - ThreadPriority thread_priority, - const Closure& main_entry_callback, - const GetWorkCallback& get_work_callback, - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback, - TaskTracker* task_tracker); + SchedulerWorkerThread(ThreadPriority thread_priority, + Delegate* delegate, + TaskTracker* task_tracker); // PlatformThread::Delegate: void ThreadMain() override; @@ -90,9 +92,7 @@ // Event signaled to wake up this SchedulerWorkerThread. WaitableEvent wake_up_event_; - const Closure main_entry_callback_; - const GetWorkCallback get_work_callback_; - const RanTaskFromSequenceCallback ran_task_from_sequence_callback_; + Delegate* const delegate_; TaskTracker* const task_tracker_; // Synchronizes access to |should_exit_for_testing_|.
diff --git a/base/task_scheduler/scheduler_worker_thread_unittest.cc b/base/task_scheduler/scheduler_worker_thread_unittest.cc index fcccda1..2796388 100644 --- a/base/task_scheduler/scheduler_worker_thread_unittest.cc +++ b/base/task_scheduler/scheduler_worker_thread_unittest.cc
@@ -26,51 +26,42 @@ const size_t kNumSequencesPerTest = 150; -class TaskSchedulerWorkerThreadTest : public testing::Test { +class TaskSchedulerWorkerThreadTest : public testing::Test, + public SchedulerWorkerThread::Delegate { protected: TaskSchedulerWorkerThreadTest() - : num_main_entry_callback_cv_(lock_.CreateConditionVariable()), - num_get_work_callback_cv_(lock_.CreateConditionVariable()), + : main_entry_called_(true, false), + num_get_work_cv_(lock_.CreateConditionVariable()), run_sequences_cv_(lock_.CreateConditionVariable()) {} void SetUp() override { worker_thread_ = SchedulerWorkerThread::CreateSchedulerWorkerThread( - ThreadPriority::NORMAL, - Bind(&TaskSchedulerWorkerThreadTest::MainEntryCallback, - Unretained(this)), - Bind(&TaskSchedulerWorkerThreadTest::GetWorkCallback, Unretained(this)), - Bind(&TaskSchedulerWorkerThreadTest::RanTaskFromSequenceCallback, - Unretained(this)), - &task_tracker_); + ThreadPriority::NORMAL, this, &task_tracker_); ASSERT_TRUE(worker_thread_); - WaitForNumMainEntryCallback(1); + main_entry_called_.Wait(); } void TearDown() override { + { + AutoSchedulerLock auto_lock(lock_); + EXPECT_FALSE(main_exit_called_); + } + worker_thread_->JoinForTesting(); AutoSchedulerLock auto_lock(lock_); - EXPECT_EQ(1U, num_main_entry_callback_); + EXPECT_TRUE(main_exit_called_); } - // Wait until MainEntryCallback() has been called |num_main_entry_callback| - // times. - void WaitForNumMainEntryCallback(size_t num_main_entry_callback) { + // Wait until GetWork() has been called |num_get_work| times. + void WaitForNumGetWork(size_t num_get_work) { AutoSchedulerLock auto_lock(lock_); - while (num_main_entry_callback_ < num_main_entry_callback) - num_main_entry_callback_cv_->Wait(); + while (num_get_work_ < num_get_work) + num_get_work_cv_->Wait(); } - // Wait until GetWorkCallback() has been called |num_get_work_callback| times. - void WaitForNumGetWorkCallback(size_t num_get_work_callback) { - AutoSchedulerLock auto_lock(lock_); - while (num_get_work_callback_ < num_get_work_callback) - num_get_work_callback_cv_->Wait(); - } - - // Wait until there is no more Sequences to create and - // RanTaskFromSequenceCallback() has been invoked once for each Sequence - // returned by GetWorkCallback(). + // Wait until there are no more Sequences to create and RanTaskFromSequence() + // has been invoked once for each Sequence returned by GetWork(). void WaitForAllSequencesToRun() { AutoSchedulerLock auto_lock(lock_); @@ -79,12 +70,12 @@ run_sequences_cv_->Wait(); } - // Verify that RanTaskFromSequenceCallback() has been invoked with the - // same Sequences that were returned by GetWorkCallback(). + // Verify that RanTaskFromSequence() has been invoked with the same + // Sequences that were returned by GetWork(). EXPECT_EQ(created_sequences_, run_sequences_); // Verify that RunTaskCallback() has been invoked once for each Sequence - // returned by GetWorkCallback(). + // returned by GetWork(). EXPECT_EQ(created_sequences_.size(), num_run_tasks_); } @@ -94,32 +85,42 @@ num_sequences_to_create_ = num_sequences_to_create; } - size_t NumGetWorkCallback() const { + void SetMaxGetWork(size_t max_get_work) { AutoSchedulerLock auto_lock(lock_); - return num_get_work_callback_; + max_get_work_ = max_get_work; } std::unique_ptr<SchedulerWorkerThread> worker_thread_; private: - void MainEntryCallback() { + // SchedulerWorkerThread::Delegate: + void OnMainEntry() override { + // Without this |auto_lock|, OnMainEntry() could be called twice without + // generating an error. AutoSchedulerLock auto_lock(lock_); - ++num_main_entry_callback_; - num_main_entry_callback_cv_->Signal(); + EXPECT_FALSE(main_entry_called_.IsSignaled()); + main_entry_called_.Signal(); } - // Returns a Sequence that contains 1 Task if |num_sequences_to_create_| is - // greater than 0. - scoped_refptr<Sequence> GetWorkCallback( - SchedulerWorkerThread* worker_thread) { + void OnMainExit() override { + AutoSchedulerLock auto_lock(lock_); + EXPECT_FALSE(main_exit_called_); + main_exit_called_ = true; + } + + scoped_refptr<Sequence> GetWork( + SchedulerWorkerThread* worker_thread) override { EXPECT_EQ(worker_thread_.get(), worker_thread); { AutoSchedulerLock auto_lock(lock_); - // Increment the number of times that this callback has been invoked. - ++num_get_work_callback_; - num_get_work_callback_cv_->Signal(); + // Increment the number of times that this method has been called. + ++num_get_work_; + num_get_work_cv_->Signal(); + + // Verify that this method isn't called more times than expected. + EXPECT_LE(num_get_work_, max_get_work_); // Check if a Sequence should be returned. if (num_sequences_to_create_ == 0) @@ -127,7 +128,7 @@ --num_sequences_to_create_; } - // Create a Sequence that contains 1 Task. + // Create a Sequence that contains one Task. scoped_refptr<Sequence> sequence(new Sequence); task_tracker_.PostTask( Bind(IgnoreResult(&Sequence::PushTask), Unretained(sequence.get())), @@ -145,18 +146,17 @@ return sequence; } - void RanTaskFromSequenceCallback(const SchedulerWorkerThread* worker_thread, - scoped_refptr<Sequence> sequence) { - EXPECT_EQ(worker_thread_.get(), worker_thread); - + void RanTaskFromSequence(scoped_refptr<Sequence> sequence) override { AutoSchedulerLock auto_lock(lock_); run_sequences_.push_back(std::move(sequence)); + EXPECT_LE(run_sequences_.size(), created_sequences_.size()); run_sequences_cv_->Signal(); } void RunTaskCallback() { AutoSchedulerLock auto_lock(lock_); ++num_run_tasks_; + EXPECT_LE(num_run_tasks_, created_sequences_.size()); } TaskTracker task_tracker_; @@ -164,26 +164,29 @@ // Synchronizes access to all members below. mutable SchedulerLock lock_; - // Number of times that MainEntryCallback() has been called. - size_t num_main_entry_callback_ = 0; + // Signaled once OnMainEntry() has been called. + WaitableEvent main_entry_called_; - // Condition variable signaled when |num_main_entry_callback_| is incremented. - std::unique_ptr<ConditionVariable> num_main_entry_callback_cv_; + // True once OnMainExit() has been called. + bool main_exit_called_ = false; - // Number of Sequences that should be created by GetWorkCallback(). When this - // is 0, GetWorkCallback() returns nullptr. + // Number of Sequences that should be created by GetWork(). When this + // is 0, GetWork() returns nullptr. size_t num_sequences_to_create_ = 0; - // Number of times that GetWorkCallback() has been called. - size_t num_get_work_callback_ = 0; + // Number of times that GetWork() has been called. + size_t num_get_work_ = 0; - // Condition variable signaled when |num_get_work_callback_| is incremented. - std::unique_ptr<ConditionVariable> num_get_work_callback_cv_; + // Maximum number of times that GetWork() can be called. + size_t max_get_work_ = 0; - // Sequences created by GetWorkCallback(). + // Condition variable signaled when |num_get_work_| is incremented. + std::unique_ptr<ConditionVariable> num_get_work_cv_; + + // Sequences created by GetWork(). std::vector<scoped_refptr<Sequence>> created_sequences_; - // Sequences passed to RanTaskFromSequenceCallback(). + // Sequences passed to RanTaskFromSequence(). std::vector<scoped_refptr<Sequence>> run_sequences_; // Condition variable signaled when a Sequence is added to |run_sequences_|. @@ -195,45 +198,44 @@ DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerThreadTest); }; -// Verify that when GetWorkCallback() continuously returns Sequences, all Tasks -// in these Sequences run successfully. The SchedulerWorkerThread is woken up -// once. -TEST_F(TaskSchedulerWorkerThreadTest, ContinousWork) { - // Set GetWorkCallback() to return |kNumSequencesPerTest| Sequences before - // starting to return nullptr. +// Verify that when GetWork() continuously returns Sequences, all Tasks in these +// Sequences run successfully. The test wakes up the SchedulerWorkerThread once. +TEST_F(TaskSchedulerWorkerThreadTest, ContinuousWork) { + // Set GetWork() to return |kNumSequencesPerTest| Sequences before starting to + // return nullptr. SetNumSequencesToCreate(kNumSequencesPerTest); + // Expect |kNumSequencesPerTest| calls to GetWork() in which it returns a + // Sequence and one call in which its returns nullptr. + const size_t kExpectedNumGetWork = kNumSequencesPerTest + 1; + SetMaxGetWork(kExpectedNumGetWork); + // Wake up |worker_thread_| and wait until it has run all the Tasks returned - // by GetWorkCallback(). + // by GetWork(). worker_thread_->WakeUp(); WaitForAllSequencesToRun(); - - // Expect |kNumSequencesPerTest| calls to GetWorkCallback() in which it - // returned a Sequence and 1 call in which it returned nullptr. - const size_t expected_num_get_work_callback = kNumSequencesPerTest + 1; - WaitForNumGetWorkCallback(expected_num_get_work_callback); - EXPECT_EQ(expected_num_get_work_callback, NumGetWorkCallback()); + WaitForNumGetWork(kExpectedNumGetWork); } -// Verify that when GetWorkCallback() alternates between returning a Sequence -// and returning nullptr, all Tasks in the returned Sequences run successfully. -// The SchedulerWorkerThread is woken up once for each Sequence. +// Verify that when GetWork() alternates between returning a Sequence and +// returning nullptr, all Tasks in the returned Sequences run successfully. The +// test wakes up the SchedulerWorkerThread once for each Sequence. TEST_F(TaskSchedulerWorkerThreadTest, IntermittentWork) { for (size_t i = 0; i < kNumSequencesPerTest; ++i) { - // Set GetWorkCallback() to return 1 Sequence before starting to return + // Set GetWork() to return 1 Sequence before starting to return // nullptr. SetNumSequencesToCreate(1); - // Wake up |worker_thread_| and wait until it has run all the Tasks returned - // by GetWorkCallback(). + // Expect |i + 1| calls to GetWork() in which it returns a Sequence and + // |i + 1| calls in which it returns nullptr. + const size_t expected_num_get_work = 2 * (i + 1); + SetMaxGetWork(expected_num_get_work); + + // Wake up |worker_thread_| and wait until it has run the Task returned by + // GetWork(). worker_thread_->WakeUp(); WaitForAllSequencesToRun(); - - // Expect |i| calls to GetWorkCallback() in which it returned a Sequence and - // |i| calls in which it returned nullptr. - const size_t expected_num_get_work_callback = 2 * (i + 1); - WaitForNumGetWorkCallback(expected_num_get_work_callback); - EXPECT_EQ(expected_num_get_work_callback, NumGetWorkCallback()); + WaitForNumGetWork(expected_num_get_work); } }
diff --git a/base/trace_event/trace_event_impl.cc b/base/trace_event/trace_event_impl.cc index 4ab0d35..e2e250ed5 100644 --- a/base/trace_event/trace_event_impl.cc +++ b/base/trace_event/trace_event_impl.cc
@@ -293,10 +293,10 @@ // Category group checked at category creation time. DCHECK(!strchr(name_, '"')); StringAppendF(out, "{\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 - "," - "\"ph\":\"%c\",\"cat\":\"%s\",\"name\":\"%s\",\"args\":", - process_id, thread_id, time_int64, phase_, category_group_name, - name_); + ",\"ph\":\"%c\",\"cat\":\"%s\",\"name\":", + process_id, thread_id, time_int64, phase_, category_group_name); + EscapeJSONString(name_, true, out); + *out += ",\"args\":"; // Output argument names and values, stop at first NULL argument name. // TODO(oysteine): The dual predicates here is a bit ugly; if the filtering
diff --git a/base/trace_event/trace_event_unittest.cc b/base/trace_event/trace_event_unittest.cc index 91155ea..6a1d8a4 100644 --- a/base/trace_event/trace_event_unittest.cc +++ b/base/trace_event/trace_event_unittest.cc
@@ -2330,6 +2330,16 @@ EXPECT_EQ(1, int_value); } +TEST_F(TraceEventTestFixture, NameIsEscaped) { + TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""), + TraceLog::RECORDING_MODE); + TRACE_EVENT0("category", "name\\with\\backspaces"); + EndTraceAndFlush(); + + EXPECT_TRUE(FindMatchingValue("cat", "category")); + EXPECT_TRUE(FindMatchingValue("name", "name\\with\\backspaces")); +} + namespace { bool IsArgNameWhitelisted(const char* arg_name) {
diff --git a/base/win/win_util.cc b/base/win/win_util.cc index b10d5554..4e18d406 100644 --- a/base/win/win_util.cc +++ b/base/win/win_util.cc
@@ -22,6 +22,8 @@ #include <signal.h> #include <stddef.h> #include <stdlib.h> +#include <tchar.h> // Must be before tpcshrd.h or for any use of _T macro +#include <tpcshrd.h> #include <uiviewsettingsinterop.h> #include <windows.ui.viewmanagement.h> #include <winstring.h> @@ -115,12 +117,14 @@ return PowerDeterminePlatformRoleEx(POWER_PLATFORM_ROLE_V2); } +} // namespace + // Uses the Windows 10 WRL API's to query the current system state. The API's // we are using in the function below are supported in Win32 apps as per msdn. // It looks like the API implementation is buggy at least on Surface 4 causing // it to always return UserInteractionMode_Touch which as per documentation // indicates tablet mode. -bool IsWindows10TabletDevice() { +bool IsWindows10TabletMode(HWND hwnd) { if (GetVersion() < VERSION_WIN10) return false; @@ -179,7 +183,7 @@ // Avoid using GetForegroundWindow here and pass in the HWND of the window // intiating the request to display the keyboard. hr = view_settings_interop->GetForWindow( - ::GetForegroundWindow(), + hwnd, __uuidof(ABI::Windows::UI::ViewManagement::IUIViewSettings), view_settings.ReceiveVoid()); if (FAILED(hr)) @@ -191,8 +195,6 @@ return mode == ABI::Windows::UI::ViewManagement::UserInteractionMode_Touch; } -} // namespace - // Returns true if a physical keyboard is detected on Windows 8 and up. // Uses the Setup APIs to enumerate the attached keyboards and returns true // if the keyboard count is 1 or more.. While this will work in most cases @@ -476,7 +478,7 @@ return false; } - if (IsWindows10TabletDevice()) + if (IsWindows10TabletMode(::GetForegroundWindow())) return true; if (GetSystemMetrics(SM_MAXIMUMTOUCHES) == 0) { @@ -695,5 +697,15 @@ return false; } +void EnableFlicks(HWND hwnd) { + ::RemoveProp(hwnd, MICROSOFT_TABLETPENSERVICE_PROPERTY); +} + +void DisableFlicks(HWND hwnd) { + ::SetProp(hwnd, MICROSOFT_TABLETPENSERVICE_PROPERTY, + reinterpret_cast<HANDLE>(TABLET_DISABLE_FLICKS | + TABLET_DISABLE_FLICKFALLBACKKEYS)); +} + } // namespace win } // namespace base
diff --git a/base/win/win_util.h b/base/win/win_util.h index b261ce7..08e0112 100644 --- a/base/win/win_util.h +++ b/base/win/win_util.h
@@ -123,6 +123,10 @@ // process is aborted. BASE_EXPORT void SetAbortBehaviorForCrashReporting(); +// Checks whether the supplied |hwnd| is in Windows 10 tablet mode. Will return +// false on versions below 10. +BASE_EXPORT bool IsWindows10TabletMode(HWND hwnd); + // A tablet is a device that is touch enabled and also is being used // "like a tablet". This is used by the following:- // 1. Metrics:- To gain insight into how users use Chrome. @@ -174,6 +178,12 @@ BASE_EXPORT bool GetLoadedModulesSnapshot(HANDLE process, std::vector<HMODULE>* snapshot); +// Adds or removes the MICROSOFT_TABLETPENSERVICE_PROPERTY property with the +// TABLET_DISABLE_FLICKS & TABLET_DISABLE_FLICKFALLBACKKEYS flags in order to +// disable pen flick gestures for the given HWND. +BASE_EXPORT void EnableFlicks(HWND hwnd); +BASE_EXPORT void DisableFlicks(HWND hwnd); + } // namespace win } // namespace base
diff --git a/blimp/client/feature/compositor/blimp_context_provider.cc b/blimp/client/feature/compositor/blimp_context_provider.cc index f4a963e8..43bdd77 100644 --- a/blimp/client/feature/compositor/blimp_context_provider.cc +++ b/blimp/client/feature/compositor/blimp_context_provider.cc
@@ -42,9 +42,8 @@ context_.reset(gpu::GLInProcessContext::Create( nullptr /* service */, nullptr /* surface */, false /* is_offscreen */, - widget, gfx::Size(1, 1), nullptr /* share_context */, - false /* share_resources */, attribs_for_gles2, gfx::PreferDiscreteGpu, - gpu::GLInProcessContextSharedMemoryLimits(), + widget, gfx::Size(1, 1), nullptr /* share_context */, attribs_for_gles2, + gfx::PreferDiscreteGpu, gpu::GLInProcessContextSharedMemoryLimits(), gpu_memory_buffer_manager, nullptr /* memory_limits */)); context_->SetContextLostCallback( base::Bind(&BlimpContextProvider::OnLostContext, base::Unretained(this)));
diff --git a/blimp/engine/app/blimp_content_browser_client.cc b/blimp/engine/app/blimp_content_browser_client.cc index 55fcb17..8e88f5d 100644 --- a/blimp/engine/app/blimp_content_browser_client.cc +++ b/blimp/engine/app/blimp_content_browser_client.cc
@@ -5,7 +5,6 @@ #include "blimp/engine/app/blimp_content_browser_client.h" #include "blimp/engine/app/blimp_browser_main_parts.h" #include "blimp/engine/app/settings_manager.h" -#include "blimp/engine/common/blimp_browser_context.h" #include "blimp/engine/mojo/blob_channel_service.h" #include "content/public/common/service_registry.h" @@ -23,17 +22,6 @@ return blimp_browser_main_parts_; } -net::URLRequestContextGetter* BlimpContentBrowserClient::CreateRequestContext( - content::BrowserContext* content_browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - BlimpBrowserContext* blimp_context = - static_cast<BlimpBrowserContext*>(content_browser_context); - return blimp_context->CreateRequestContext(protocol_handlers, - std::move(request_interceptors)) - .get(); -} - void BlimpContentBrowserClient::OverrideWebkitPrefs( content::RenderViewHost* render_view_host, content::WebPreferences* prefs) {
diff --git a/blimp/engine/app/blimp_content_browser_client.h b/blimp/engine/app/blimp_content_browser_client.h index f743258..87d174c 100644 --- a/blimp/engine/app/blimp_content_browser_client.h +++ b/blimp/engine/app/blimp_content_browser_client.h
@@ -22,10 +22,6 @@ // content::ContentBrowserClient implementation. content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams& parameters) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; void OverrideWebkitPrefs(content::RenderViewHost* render_view_host, content::WebPreferences* prefs) override; void RegisterRenderProcessMojoServices(
diff --git a/blimp/engine/app/blimp_url_request_context_getter.h b/blimp/engine/app/blimp_url_request_context_getter.h index 087e70a..43d5395 100644 --- a/blimp/engine/app/blimp_url_request_context_getter.h +++ b/blimp/engine/app/blimp_url_request_context_getter.h
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/macros.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "net/url_request/url_request_context_getter.h"
diff --git a/blimp/engine/common/blimp_browser_context.cc b/blimp/engine/common/blimp_browser_context.cc index f91426a..98a1201f 100644 --- a/blimp/engine/common/blimp_browser_context.cc +++ b/blimp/engine/common/blimp_browser_context.cc
@@ -101,23 +101,6 @@ return GetDefaultStoragePartition(this)->GetURLRequestContext(); } -const scoped_refptr<BlimpURLRequestContextGetter>& -BlimpBrowserContext::CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - DCHECK(!resource_context_->url_request_context_getter()); - // net_log_ is owned by BrowserMainParts. - resource_context_->set_url_request_context_getter( - new BlimpURLRequestContextGetter( - ignore_certificate_errors_, GetPath(), - content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::IO), - content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::FILE), - protocol_handlers, std::move(request_interceptors), net_log_)); - return resource_context_->url_request_context_getter(); -} - net::URLRequestContextGetter* BlimpBrowserContext::GetMediaRequestContext() { return GetRequestContext(); } @@ -166,5 +149,30 @@ return nullptr; } +net::URLRequestContextGetter* BlimpBrowserContext::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + DCHECK(!resource_context_->url_request_context_getter()); + // net_log_ is owned by BrowserMainParts. + resource_context_->set_url_request_context_getter( + new BlimpURLRequestContextGetter( + ignore_certificate_errors_, GetPath(), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::IO), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::FILE), + protocol_handlers, std::move(request_interceptors), net_log_)); + return resource_context_->url_request_context_getter().get(); +} + +net::URLRequestContextGetter* +BlimpBrowserContext::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + } // namespace engine } // namespace blimp
diff --git a/blimp/engine/common/blimp_browser_context.h b/blimp/engine/common/blimp_browser_context.h index e859a3c..e6caa4e 100644 --- a/blimp/engine/common/blimp_browser_context.h +++ b/blimp/engine/common/blimp_browser_context.h
@@ -51,12 +51,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; - - // The content of |protocol_handlers| is swapped into the returned instance. - // Caller should take a reference to the returned instance via scoped_refptr. - const scoped_refptr<BlimpURLRequestContextGetter>& CreateRequestContext( + net::URLRequestContextGetter* CreateRequestContext( content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors); + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; private: // Performs initialization of the BlimpBrowserContext while IO is still
diff --git a/build/android/buildbot/bb_host_steps.py b/build/android/buildbot/bb_host_steps.py index 11f5032..04a0e38 100755 --- a/build/android/buildbot/bb_host_steps.py +++ b/build/android/buildbot/bb_host_steps.py
@@ -50,8 +50,25 @@ RunCmd(['gclient', 'runhooks'], halt_on_failure=True) +def GenerateBuildFiles(options): + cmd = [SrcPath('tools', 'mb', 'mb.py'), + 'gen', + '-m', options.build_properties['mastername'], + '-b', options.build_properties['buildername'], + '--goma-dir', bb_utils.GOMA_DIR, + '//out/%s' % options.target] + bb_annotations.PrintNamedStep('generate_build_files') + RunCmd(cmd, halt_on_failure=True) + + def Compile(options): - RunHooks(options.target) + if options.run_mb: + os.environ['GYP_CHROMIUM_NO_ACTION'] = '1' + RunHooks(options.target) + GenerateBuildFiles(options) + else: + RunHooks(options.target) + cmd = [os.path.join(SLAVE_SCRIPTS_DIR, 'compile.py'), '--build-tool=ninja', '--compiler=goma', @@ -111,6 +128,8 @@ parser.add_option('--extra_src', default='', help='Path to extra source file. If this is supplied, ' 'bisect script will use it to override default behavior.') + parser.add_option('--run-mb', action='store_true', + help='Use mb to generate build files.') return parser
diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py index 5f57c9bb..4cdb572 100755 --- a/build/android/buildbot/bb_run_bot.py +++ b/build/android/buildbot/bb_run_bot.py
@@ -129,6 +129,7 @@ flakiness_server = ( '--flakiness-server=%s' % constants.UPSTREAM_FLAKINESS_SERVER) experimental = ['--experimental'] + run_mb = ['--run-mb'] bisect_chrome_output_dir = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir, 'bisect', 'src', 'out')) @@ -180,7 +181,7 @@ H(compile_step, extra_gyp='component=shared_library'), T(std_tests, ['--experimental', flakiness_server])), B('gpu-builder-tests-dbg', - H(compile_step), + H(compile_step, extra_args=run_mb), T(['gpu'], ['--install=ContentShell'])), # Pass empty T([]) so that logcat monitor and device status check are run. B('perf-bisect-builder-tests-dbg',
diff --git a/build/args/blimp_engine.gn b/build/args/blimp_engine.gn index ef990cd60..b2abe14 100644 --- a/build/args/blimp_engine.gn +++ b/build/args/blimp_engine.gn
@@ -10,6 +10,7 @@ use_aura = true use_ozone = true metrics_use_blimp = true +use_low_quality_image_interpolation = true # Not available within docker container. use_alsa = false
diff --git a/build/common.gypi b/build/common.gypi index 0e88c8b..aefad50 100644 --- a/build/common.gypi +++ b/build/common.gypi
@@ -722,15 +722,6 @@ 'optimize_jni_generation%': 1, 'conditions': [ - # In Windows official builds, enable DCHECK as dump-without-crashing. - ['OS=="win" and buildtype=="Official"', { - 'dcheck_always_on%': 1, - 'dcheck_is_dump_without_crash': 1, - }, { - 'dcheck_always_on%': 0, - 'dcheck_is_dump_without_crash': 0, - }], - # A flag for POSIX platforms ['OS=="win"', { 'os_posix%': 0, @@ -1202,7 +1193,6 @@ 'fastbuild%': '<(fastbuild)', 'win_z7%': '<(win_z7)', 'dcheck_always_on%': '<(dcheck_always_on)', - 'dcheck_is_dump_without_crash%': '<(dcheck_is_dump_without_crash)', 'tracing_like_official_build%': '<(tracing_like_official_build)', 'fieldtrial_testing_like_official_build%': '<(fieldtrial_testing_like_official_build)', 'arm_version%': '<(arm_version)', @@ -2846,9 +2836,6 @@ ['dcheck_always_on!=0', { 'defines': ['DCHECK_ALWAYS_ON=1'], }], # dcheck_always_on!=0 - ['dcheck_is_dump_without_crash!=0', { - 'defines': ['DCHECK_IS_DUMP_WITHOUT_CRASH=1'], - }], # dcheck_is_dump_without_crash!=0 ['tracing_like_official_build!=0', { 'defines': ['TRACING_IS_OFFICIAL_BUILD=1'], }], # tracing_like_official_build!=0
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn index 58893181..b6d0b71f 100644 --- a/build/config/BUILD.gn +++ b/build/config/BUILD.gn
@@ -92,14 +92,6 @@ if (use_browser_spellchecker) { defines += [ "USE_BROWSER_SPELLCHECKER=1" ] } - - # In Windows official builds, this will cause DCHECKs to - # dump-without-crashing. See crbug.com/596231. - if (is_official_build && is_win) { - dcheck_always_on = true - defines += [ "DCHECK_IS_DUMP_WITHOUT_CRASH=1" ] - } - if (dcheck_always_on) { defines += [ "DCHECK_ALWAYS_ON=1" ] }
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 073f00725..b94134c 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -2180,6 +2180,10 @@ depfile, generated_script, ] + data = [ + generated_script, + ] + args = [ "--depfile", rebase_path(depfile, root_build_dir),
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni index 32f3d99..7055e1e 100644 --- a/build/config/mac/rules.gni +++ b/build/config/mac/rules.gni
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/toolchain/toolchain.gni") + mac_app_script = "//build/config/mac/mac_app.py" template("code_sign_mac") { @@ -210,3 +212,145 @@ ] } } + +# Template to package a shared library into a Mac framework bundle. +# +# Arguments +# +# info_plist: +# string, path to the Info.plist file that will be used for the bundle. +# +# output_name: +# (optional) string, name of the generated framework without the +# .framework suffix. If omitted, defaults to target_name. +# +# framework_version: +# (optional) string, version of the framework. Typically this is a +# single letter, like "A". If omitted, the Versions/ subdirectory +# structure will not be created, and build output will go directly +# into the framework subdirectory. +template("mac_framework") { + assert(defined(invoker.deps), + "Dependencies must be specified for $target_name") + assert(defined(invoker.info_plist), + "The Info.plist file must be specified for $target_name") + + _target_name = target_name + _output_name = target_name + if (defined(invoker.output_name)) { + _output_name = invoker.output_name + } + _framework_name = _output_name + ".framework" + _framework_version = "" + if (defined(invoker.framework_version)) { + _framework_version = invoker.framework_version + } + _framework_target = _output_name + "_framework" + + _shared_library_target = target_name + "_shared_library" + _shared_library_bundle_data = _shared_library_target + "_bundle_data" + + shared_library(_shared_library_target) { + visibility = [ ":$_shared_library_bundle_data" ] + forward_variables_from(invoker, + "*", + [ + "assert_no_deps", + "data_deps", + "info_plist", + "output_name", + "visibility", + ]) + } + + bundle_data(_shared_library_bundle_data) { + visibility = [ ":$_framework_target" ] + forward_variables_from(invoker, [ "testonly" ]) + sources = [ + "$root_out_dir/${shlib_prefix}${_shared_library_target}${shlib_extension}", + ] + outputs = [ + "{{bundle_executable_dir}}/$_output_name", + ] + public_deps = [ + ":$_shared_library_target", + ] + } + + _info_plist_target = target_name + "_info_plist" + + # TODO(rsesek): Process Info.plist variables. + + _info_plist_bundle_data = _info_plist_target + "_bundle_data" + + bundle_data(_info_plist_bundle_data) { + visibility = [ ":$_framework_target" ] + forward_variables_from(invoker, [ "testonly" ]) + sources = [ + invoker.info_plist, + ] + outputs = [ + "{{bundle_root_dir}}/Info.plist", + ] + } + + create_bundle(_framework_target) { + visibility = [ ":$_target_name" ] + forward_variables_from(invoker, + [ + "data_deps", + "deps", + "public_deps", + "testonly", + "visibility", + ]) + + if (!defined(deps)) { + deps = [] + } + deps += [ + ":$_info_plist_bundle_data", + ":$_shared_library_bundle_data", + ] + + bundle_root_dir = "$root_out_dir/$_framework_name" + if (_framework_version != "") { + bundle_root_dir += "/Versions/$_framework_version" + } + bundle_resources_dir = "$bundle_root_dir/Resources" + bundle_executable_dir = "$bundle_root_dir" + } + + if (_framework_version != "") { + action(_target_name) { + forward_variables_from(invoker, + [ + "visibility", + "testonly", + ]) + script = "$root_out_dir/gyp-mac-tool" + outputs = [ + "$root_out_dir/$_framework_name/Versions/Current", + ] + args = [ + "package-framework", + "$_framework_name", + "$_framework_version", + ] + deps = [ + ":$_framework_target", + ] + } + } else { + group(_target_name) { + forward_variables_from(invoker, + [ + "visibility", + "testonly", + ]) + deps = [ + ":$_framework_target", + ] + } + } +}
diff --git a/build/gn_migration.gypi b/build/gn_migration.gypi index 00fc23f..16fa4cf 100644 --- a/build/gn_migration.gypi +++ b/build/gn_migration.gypi
@@ -696,7 +696,6 @@ ['OS=="linux" or OS=="win"', { 'dependencies': [ # TODO(GYP): Figure out which of these run on android/mac/win/ios/etc. - '../net/net.gyp:net_docs', '../remoting/remoting.gyp:ar_sample_test_driver', # TODO(GYP): in progress - see tfarina. @@ -724,7 +723,6 @@ '../content/content_shell_and_tests.gyp:content_shell_crash_service', '../gpu/gpu.gyp:angle_end2end_tests', '../gpu/gpu.gyp:angle_perftests', - '../net/net.gyp:net_docs', '../ppapi/ppapi_internal.gyp:ppapi_perftests', '../remoting/remoting.gyp:ar_sample_test_driver', '../remoting/remoting.gyp:remoting_breakpad_tester',
diff --git a/build/win/copy_cdb_to_output.py b/build/win/copy_cdb_to_output.py new file mode 100755 index 0000000..d41dd40a --- /dev/null +++ b/build/win/copy_cdb_to_output.py
@@ -0,0 +1,84 @@ +#!/usr/bin/env python +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import hashlib +import os +import shutil +import sys + +script_dir = os.path.dirname(os.path.realpath(__file__)) +src_build_dir = os.path.abspath(os.path.join(script_dir, os.pardir)) +sys.path.insert(0, src_build_dir) + +import vs_toolchain + + +def _HexDigest(file_name): + hasher = hashlib.sha256() + afile = open(file_name, 'rb') + blocksize = 65536 + buf = afile.read(blocksize) + while len(buf) > 0: + hasher.update(buf) + buf = afile.read(blocksize) + afile.close() + return hasher.hexdigest() + + +def _CopyImpl(file_name, target_dir, source_dir, verbose=True): + """Copy |source| to |target| if it doesn't already exist or if it + needs to be updated. + """ + target = os.path.join(target_dir, file_name) + source = os.path.join(source_dir, file_name) + if (os.path.isdir(os.path.dirname(target)) and + ((not os.path.isfile(target)) or + _HexDigest(source) != _HexDigest(target))): + if verbose: + print 'Copying %s to %s...' % (source, target) + if os.path.exists(target): + os.unlink(target) + shutil.copy(source, target) + + +def _CopyCDBToOutput(output_dir, target_arch): + """Copies the Windows debugging executable cdb.exe to the output + directory, which is created if it does not exist. The output + directory, and target architecture that should be copied, are + passed. Supported values for the target architecture are the GYP + values "ia32" and "x64". + """ + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs() + win_sdk_dir = os.path.normpath(os.environ['WINDOWSSDKDIR']) + if target_arch == 'ia32': + src_arch = 'x86' + elif target_arch == 'x64': + src_arch = 'x64' + else: + print 'copy_cdb_to_output.py: unknown target_arch %s' % target_arch + sys.exit(1) + # We need to copy multiple files, so cache the computed source directory. + src_dir = os.path.join(win_sdk_dir, 'Debuggers', src_arch) + # Note that the outputs from the "copy_cdb_to_output" target need to + # be kept in sync with this list. + _CopyImpl('cdb.exe', output_dir, src_dir) + _CopyImpl('dbgeng.dll', output_dir, src_dir) + _CopyImpl('dbghelp.dll', output_dir, src_dir) + _CopyImpl('dbgmodel.dll', output_dir, src_dir) + return 0 + + +def main(): + if len(sys.argv) < 2: + print >>sys.stderr, 'Usage: copy_cdb_to_output.py <output_dir> ' + \ + '<target_arch>' + return 1 + return _CopyCDBToOutput(sys.argv[1], sys.argv[2]) + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/cc/debug/picture_debug_util.cc b/cc/debug/picture_debug_util.cc index 50ae60b..dda4dce 100644 --- a/cc/debug/picture_debug_util.cc +++ b/cc/debug/picture_debug_util.cc
@@ -73,8 +73,8 @@ size_t serialized_size = stream.bytesWritten(); scoped_ptr<char[]> serialized_picture(new char[serialized_size]); stream.copyTo(serialized_picture.get()); - base::Base64Encode(std::string(serialized_picture.get(), serialized_size), - output); + base::Base64Encode( + base::StringPiece(serialized_picture.get(), serialized_size), output); } } // namespace cc
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc index 82045a4..db86e75 100644 --- a/cc/test/layer_tree_pixel_test.cc +++ b/cc/test/layer_tree_pixel_test.cc
@@ -54,9 +54,12 @@ } case PIXEL_TEST_GL: { bool flipped_output_surface = false; + scoped_refptr<TestInProcessContextProvider> compositor( + new TestInProcessContextProvider(nullptr)); + scoped_refptr<TestInProcessContextProvider> worker( + new TestInProcessContextProvider(compositor.get())); output_surface = make_scoped_ptr(new PixelTestOutputSurface( - new TestInProcessContextProvider, new TestInProcessContextProvider, - flipped_output_surface)); + std::move(compositor), std::move(worker), flipped_output_surface)); break; } }
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc index 58e5564..f33a6bf 100644 --- a/cc/test/pixel_test.cc +++ b/cc/test/pixel_test.cc
@@ -124,9 +124,12 @@ bool flipped_output_surface) { enable_pixel_output_.reset(new gfx::DisableNullDrawGLBindings); + scoped_refptr<TestInProcessContextProvider> compositor( + new TestInProcessContextProvider(nullptr)); + scoped_refptr<TestInProcessContextProvider> worker( + new TestInProcessContextProvider(compositor.get())); output_surface_.reset(new PixelTestOutputSurface( - new TestInProcessContextProvider, new TestInProcessContextProvider, - flipped_output_surface)); + std::move(compositor), std::move(worker), flipped_output_surface)); output_surface_->BindToClient(output_surface_client_.get()); shared_bitmap_manager_.reset(new TestSharedBitmapManager);
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc index dd05be3..ab9c2ab 100644 --- a/cc/test/test_in_process_context_provider.cc +++ b/cc/test/test_in_process_context_provider.cc
@@ -26,9 +26,9 @@ // static scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext( TestGpuMemoryBufferManager* gpu_memory_buffer_manager, - TestImageFactory* image_factory) { + TestImageFactory* image_factory, + gpu::GLInProcessContext* shared_context) { const bool is_offscreen = true; - const bool share_resources = true; gpu::gles2::ContextCreationAttribHelper attribs; attribs.alpha_size = 8; attribs.blue_size = 8; @@ -44,31 +44,25 @@ scoped_ptr<gpu::GLInProcessContext> context = make_scoped_ptr(gpu::GLInProcessContext::Create( - NULL, - NULL, - is_offscreen, - gfx::kNullAcceleratedWidget, - gfx::Size(1, 1), - NULL, - share_resources, - attribs, - gpu_preference, + nullptr, nullptr, is_offscreen, gfx::kNullAcceleratedWidget, + gfx::Size(1, 1), shared_context, attribs, gpu_preference, gpu::GLInProcessContextSharedMemoryLimits(), - gpu_memory_buffer_manager, - image_factory)); + gpu_memory_buffer_manager, image_factory)); DCHECK(context); return context; } scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext() { - return CreateTestInProcessContext(nullptr, nullptr); + return CreateTestInProcessContext(nullptr, nullptr, nullptr); } -TestInProcessContextProvider::TestInProcessContextProvider() - : context_(CreateTestInProcessContext(&gpu_memory_buffer_manager_, - &image_factory_)) { -} +TestInProcessContextProvider::TestInProcessContextProvider( + TestInProcessContextProvider* shared_context) + : context_(CreateTestInProcessContext( + &gpu_memory_buffer_manager_, + &image_factory_, + (shared_context ? shared_context->context_.get() : nullptr))) {} TestInProcessContextProvider::~TestInProcessContextProvider() { if (gr_context_)
diff --git a/cc/test/test_in_process_context_provider.h b/cc/test/test_in_process_context_provider.h index b8e1bf8..3303420 100644 --- a/cc/test/test_in_process_context_provider.h +++ b/cc/test/test_in_process_context_provider.h
@@ -24,11 +24,13 @@ scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext(); scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext( TestGpuMemoryBufferManager* gpu_memory_buffer_manager, - TestImageFactory* image_factory); + TestImageFactory* image_factory, + gpu::GLInProcessContext* shared_context); class TestInProcessContextProvider : public ContextProvider { public: - TestInProcessContextProvider(); + explicit TestInProcessContextProvider( + TestInProcessContextProvider* shared_context); bool BindToCurrentThread() override; gpu::gles2::GLES2Interface* ContextGL() override;
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index 5104bab..64769853 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc
@@ -541,29 +541,28 @@ draw_property_utils::LayerShouldBeSkipped( layer, layer_is_drawn, property_trees->transform_tree)) { layer->draw_properties().render_target = nullptr; - return; - } - - bool render_to_separate_surface = - IsRootLayer(layer) || - (can_render_to_separate_surface && layer->render_surface()); - - if (render_to_separate_surface) { - DCHECK(layer->render_surface()) << IsRootLayer(layer) - << can_render_to_separate_surface - << layer->has_render_surface(); - layer->draw_properties().render_target = layer; - - if (layer->mask_layer()) - layer->mask_layer()->draw_properties().render_target = layer; - - if (layer->replica_layer() && layer->replica_layer()->mask_layer()) - layer->replica_layer()->mask_layer()->draw_properties().render_target = - layer; - } else { - DCHECK(!IsRootLayer(layer)); - layer->draw_properties().render_target = layer->parent()->render_target(); + bool render_to_separate_surface = + IsRootLayer(layer) || + (can_render_to_separate_surface && layer->render_surface()); + + if (render_to_separate_surface) { + DCHECK(layer->render_surface()) << IsRootLayer(layer) + << can_render_to_separate_surface + << layer->has_render_surface(); + layer->draw_properties().render_target = layer; + + if (layer->mask_layer()) + layer->mask_layer()->draw_properties().render_target = layer; + + if (layer->replica_layer() && layer->replica_layer()->mask_layer()) + layer->replica_layer()->mask_layer()->draw_properties().render_target = + layer; + + } else { + DCHECK(!IsRootLayer(layer)); + layer->draw_properties().render_target = layer->parent()->render_target(); + } } for (size_t i = 0; i < layer->children().size(); ++i) { CalculateRenderTarget( @@ -609,6 +608,13 @@ if (layer->render_surface()) layer->ClearRenderSurfaceLayerList(); layer->draw_properties().render_target = nullptr; + for (auto* child_layer : layer->children()) { + CalculateRenderSurfaceLayerList( + child_layer, property_trees, render_surface_layer_list, descendants, + nearest_occlusion_immune_ancestor, layer_is_drawn, + can_render_to_separate_surface, current_render_surface_layer_list_id, + max_texture_size); + } return; } @@ -655,11 +661,10 @@ descendants = &(layer->render_surface()->layer_list()); } - size_t descendants_size = descendants->size(); - bool layer_should_be_skipped = !draw_property_utils::LayerNeedsUpdate( layer, layer_is_drawn, property_trees->transform_tree); if (!layer_should_be_skipped) { + DCHECK(layer->draw_properties().render_target); MarkLayerWithRenderSurfaceLayerListId(layer, current_render_surface_layer_list_id); descendants->push_back(layer); @@ -738,7 +743,7 @@ layer->render_surface()->SetContentRect(surface_content_rect); } const LayerImpl* parent_target = layer->parent()->render_target(); - if (!IsRootLayer(parent_target)) { + if (parent_target && !IsRootLayer(parent_target)) { gfx::Rect surface_content_rect = parent_target->render_surface()->accumulated_content_rect(); if (render_to_separate_surface) { @@ -766,13 +771,6 @@ if (render_to_separate_surface && !IsRootLayer(layer) && layer->render_surface()->DrawableContentRect().IsEmpty()) { RemoveSurfaceForEarlyExit(layer, render_surface_layer_list); - return; - } - - // If neither this layer nor any of its children were added, early out. - if (descendants_size == descendants->size()) { - DCHECK(!render_to_separate_surface || IsRootLayer(layer)); - return; } } @@ -873,8 +871,6 @@ DCHECK(inputs->can_render_to_separate_surface == inputs->property_trees->non_root_surfaces_enabled); const bool subtree_visible_from_ancestor = true; - for (auto* layer : *inputs->root_layer->layer_tree_impl()) - layer->draw_properties().render_target = nullptr; CalculateRenderTarget(inputs->root_layer, inputs->property_trees, subtree_visible_from_ancestor, inputs->can_render_to_separate_surface);
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 39b6c33..bdacfa1 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -266,6 +266,7 @@ "junit/src/org/chromium/chrome/browser/crash/LogcatExtractionCallableTest.java", "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkModelUnitTest.java", "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java", + "junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java", "junit/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtilsTest.java", "junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java", "junit/src/org/chromium/chrome/browser/gcore/GoogleApiClientHelperTest.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 661a4db32..a7e90b29 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -79,7 +79,6 @@ import org.chromium.chrome.browser.signin.SigninPromoScreen; import org.chromium.chrome.browser.snackbar.undo.UndoBarController; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -88,7 +87,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; import org.chromium.chrome.browser.tabmodel.TabModelUtils; -import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.chrome.browser.tabmodel.TabWindowManager; import org.chromium.chrome.browser.toolbar.ToolbarControlContainer; import org.chromium.chrome.browser.util.FeatureUtilities; @@ -241,6 +239,11 @@ closeIfNoTabsAndHomepageEnabled(); } + @Override + public void tabRemoved(Tab tab) { + closeIfNoTabsAndHomepageEnabled(); + } + private void closeIfNoTabsAndHomepageEnabled() { // If the last tab is closed, and homepage is enabled, then exit Chrome. if (HomepageManager.isHomepageEnabled(getApplicationContext()) @@ -471,9 +474,8 @@ mTabModelSelectorImpl.getCurrentTab().setFullscreenManager(getFullscreenManager()); } - mFindToolbarManager = new FindToolbarManager(this, getTabModelSelector(), - getToolbarManager() - .getActionModeController().getActionModeCallback()); + mFindToolbarManager = new FindToolbarManager(this, + getToolbarManager().getActionModeController().getActionModeCallback()); if (getContextualSearchManager() != null) { getContextualSearchManager().setFindToolbarManager(mFindToolbarManager); } @@ -1089,24 +1091,15 @@ } private void moveTabToOtherWindow(Tab tab) { - getCurrentTabModel().removeTab(tab); - tab.getContentViewCore().updateWindowAndroid(null); - tab.attachTabContentManager(null); - Class<? extends Activity> targetActivity = MultiWindowUtils.getInstance().getOpenInOtherWindowActivity(this); if (targetActivity == null) return; - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tab.getUrl())); + Intent intent = new Intent(this, targetActivity); intent.setClass(this, targetActivity); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | MultiWindowUtils.FLAG_ACTIVITY_LAUNCH_ADJACENT); - intent.putExtra(IntentHandler.EXTRA_TAB_ID, tab.getId()); + intent.setFlags(MultiWindowUtils.FLAG_ACTIVITY_LAUNCH_ADJACENT); - AsyncTabParamsManager.add(tab.getId(), - new TabReparentingParams(tab, intent, null)); - - startActivity(intent); + tab.detachAndStartReparenting(intent, null, null); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java index 072a6a7d..4989b9c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -10,6 +10,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.ChromeVersionInfo; import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; @@ -111,7 +112,7 @@ UpdateMenuItemHelper.getInstance().shouldShowMenuItem(mActivity)); // TODO(newt): change this to a flag when command line flags work on Android N. - boolean enableMoveToOtherWindow = false; + boolean enableMoveToOtherWindow = ChromeVersionInfo.isLocalBuild(); menu.findItem(R.id.move_to_other_window_menu_id).setVisible(enableMoveToOtherWindow && MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(mActivity));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java index e8ae88b82..b84119b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java
@@ -34,6 +34,8 @@ import org.chromium.content_public.browser.WebContents; import org.chromium.net.NetworkChangeNotifier; +import java.util.List; + /** * The activity that enables the user to modify the title, url and parent folder of a bookmark. */ @@ -52,6 +54,7 @@ } private BookmarkModel mModel; + private OfflinePageBridge mOfflinePageBridge; private BookmarkId mBookmarkId; private EmptyAlertEditText mTitleEditText; private EmptyAlertEditText mUrlEditText; @@ -86,6 +89,7 @@ setTitle(title); BookmarkUtils.setTaskDescriptionInDocumentMode(this, getString(title)); mModel = new BookmarkModel(); + mOfflinePageBridge = mModel.getOfflinePageBridge(); mBookmarkId = BookmarkId.getBookmarkIdFromString( getIntent().getStringExtra(INTENT_BOOKMARK_ID)); mModel.addObserver(mBookmarkModelObserver); @@ -108,7 +112,7 @@ } }); - if (OfflinePageBridge.isEnabled() && OfflinePageBridge.canSavePage( + if (mOfflinePageBridge != null && OfflinePageBridge.canSavePage( mModel.getBookmarkById(mBookmarkId).getUrl())) { mConnectionObserver = new NetworkChangeNotifier.ConnectionTypeObserver() { public void onConnectionTypeChanged(int connectionType) { @@ -128,7 +132,7 @@ } }; - mModel.getOfflinePageBridge().addObserver(mOfflinePageModelObserver); + mOfflinePageBridge.addObserver(mOfflinePageModelObserver); // Make offline page section visible and find controls. findViewById(R.id.offline_page_group).setVisibility(View.VISIBLE); getIntent().setExtrasClassLoader(WebContents.class.getClassLoader()); @@ -202,10 +206,21 @@ String fixedUrl = UrlUtilities.fixupUrl(url); if (fixedUrl != null && !fixedUrl.equals(originalUrl)) { ClientId clientId = ClientId.createClientIdForBookmarkId(mBookmarkId); - boolean hasOfflinePage = OfflinePageBridge.isEnabled() - && mModel.getOfflinePageBridge().getPageByClientId(clientId) != null; - RecordHistogram.recordBooleanHistogram( - "OfflinePages.Edit.BookmarkUrlChangedForOfflinePage", hasOfflinePage); + if (mOfflinePageBridge != null) { + mOfflinePageBridge.getPagesByClientId( + clientId, new OfflinePageBridge.MultipleOfflinePageItemCallback() { + @Override + public void onResult(List<OfflinePageItem> items) { + // Bookmarks ensures only one item will be present per + // client ID. + assert items.size() <= 1; + + recordUrlChangeHistogram(!items.isEmpty()); + } + }); + } else { + recordUrlChangeHistogram(false); + } mModel.setBookmarkUrl(mBookmarkId, fixedUrl); } } @@ -214,12 +229,17 @@ super.onStop(); } + private void recordUrlChangeHistogram(boolean hasOfflinePage) { + RecordHistogram.recordBooleanHistogram( + "OfflinePages.Edit.BookmarkUrlChangedForOfflinePage", hasOfflinePage); + } + @Override protected void onDestroy() { recordOfflineButtonAction(false); - if (OfflinePageBridge.isEnabled()) { - mModel.getOfflinePageBridge().removeObserver( - mOfflinePageModelObserver); + if (mOfflinePageBridge != null) { + mOfflinePageBridge.removeObserver(mOfflinePageModelObserver); + mOfflinePageBridge = null; } if (mConnectionObserver != null) { @@ -233,20 +253,36 @@ } private void updateOfflineSection() { - assert OfflinePageBridge.isEnabled(); + assert mOfflinePageBridge != null; // It is possible that callback arrives after the activity was dismissed. // See http://crbug.com/566939 if (mModel == null) return; - OfflinePageBridge offlinePageBridge = mModel.getOfflinePageBridge(); - offlinePageBridge.checkOfflinePageMetadata(); + mOfflinePageBridge.checkOfflinePageMetadata(); + + ClientId clientId = ClientId.createClientIdForBookmarkId(mBookmarkId); + mOfflinePageBridge.getPagesByClientId( + clientId, new OfflinePageBridge.MultipleOfflinePageItemCallback() { + @Override + public void onResult(List<OfflinePageItem> items) { + offlineItemsRetrieved(items); + } + }); + } + + private void offlineItemsRetrieved(List<OfflinePageItem> items) { + // It is possible that callback arrives after the activity was dismissed. + // See http://crbug.com/566939 + if (mModel == null || mOfflinePageBridge == null) return; Button saveRemoveVisitButton = (Button) findViewById(R.id.offline_page_save_remove_button); TextView offlinePageInfoTextView = (TextView) findViewById(R.id.offline_page_info_text); - ClientId clientId = ClientId.createClientIdForBookmarkId(mBookmarkId); - OfflinePageItem offlinePage = offlinePageBridge.getPageByClientId(clientId); + // Bookmarks should enforce that only one item exists per client ID. + OfflinePageItem offlinePage = null; + if (items.size() > 0) offlinePage = items.get(0); + if (offlinePage != null) { // Offline page exists. Show information and button to remove. offlinePageInfoTextView.setText( @@ -255,8 +291,8 @@ Formatter.formatFileSize(this, offlinePage.getFileSize()))); updateButtonToDeleteOfflinePage(saveRemoveVisitButton); saveRemoveVisitButton.setVisibility(View.VISIBLE); - } else if (mWebContents != null && !mWebContents.isDestroyed() - && offlinePageBridge.canSavePage(mWebContents.getLastCommittedUrl())) { + } else if (mWebContents != null && !mWebContents.isDestroyed() && mOfflinePageBridge != null + && mOfflinePageBridge.canSavePage(mWebContents.getLastCommittedUrl())) { // Offline page is not saved, but a bookmarked page is opened. Show save button. offlinePageInfoTextView.setText( getString(OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none))); @@ -286,7 +322,7 @@ recordOfflineButtonAction(true); button.setEnabled(false); ClientId clientId = ClientId.createClientIdForBookmarkId(mBookmarkId); - mModel.getOfflinePageBridge().deletePage(clientId, new DeletePageCallback() { + mOfflinePageBridge.deletePage(clientId, new DeletePageCallback() { @Override public void onDeletePageDone(int deletePageResult) { // TODO(fgorski): Add snackbar upon failure. @@ -307,16 +343,14 @@ recordOfflineButtonAction(true); ClientId clientId = ClientId.createClientIdForBookmarkId(mBookmarkId); button.setEnabled(false); - mModel.getOfflinePageBridge().savePage( - mWebContents, clientId, new SavePageCallback() { - @Override - public void onSavePageDone( - int savePageResult, String url, long offlineId) { - // TODO(fgorski): Add snackbar upon failure. - // Always update UI, as buttons might be disabled. - updateOfflineSection(); - } - }); + mOfflinePageBridge.savePage(mWebContents, clientId, new SavePageCallback() { + @Override + public void onSavePageDone(int savePageResult, String url, long offlineId) { + // TODO(fgorski): Add snackbar upon failure. + // Always update UI, as buttons might be disabled. + updateOfflineSection(); + } + }); } }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java index 34a93ab7..a837258 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java
@@ -15,6 +15,7 @@ import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.Callback; import org.chromium.chrome.R; import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; @@ -24,6 +25,8 @@ import org.chromium.chrome.browser.widget.RoundedIconGenerator; import org.chromium.components.bookmarks.BookmarkId; +import java.util.List; + /** * A row view that shows bookmark info in the bookmarks UI. */ @@ -83,34 +86,67 @@ mIconImageView.setImageDrawable(null); mTitleView.setText(item.getTitle()); mDelegate.getLargeIconBridge().getLargeIconForUrl(mUrl, mMinIconSize, this); - updateOfflinePageSize(bookmarkId); + + updateOfflineSectionForBookmark(bookmarkId); + return item; } - private void updateOfflinePageSize(BookmarkId bookmarkId) { - OfflinePageItem offlinePage = null; - OfflinePageBridge bridge = mDelegate.getModel().getOfflinePageBridge(); - if (mDelegate.getCurrentState() == BookmarkUIState.STATE_FILTER && bridge != null) { - offlinePage = - bridge.getPageByClientId(ClientId.createClientIdForBookmarkId(bookmarkId)); + private void updateOfflineSectionForBookmark(BookmarkId bookmarkId) { + boolean hasOfflineSection = mDelegate.getCurrentState() == BookmarkUIState.STATE_FILTER; + updateOfflinePageSizeTextVisibility(hasOfflineSection); + if (hasOfflineSection) { + getOfflinePageItemForBookmark(bookmarkId, new Callback<OfflinePageItem>() { + @Override + public void onResult(OfflinePageItem offlinePage) { + if (offlinePage == null) { + updateOfflinePageSizeTextVisibility(false); + return; + } + updateOfflinePageSizeText(offlinePage.getFileSize()); + } + }); } + } + + private void getOfflinePageItemForBookmark( + BookmarkId bookmarkId, final Callback<OfflinePageItem> callback) { + OfflinePageBridge bridge = mDelegate.getModel().getOfflinePageBridge(); + if (bridge == null) return; + + bridge.getPagesByClientId(ClientId.createClientIdForBookmarkId(bookmarkId), + new OfflinePageBridge.MultipleOfflinePageItemCallback() { + @Override + public void onResult(List<OfflinePageItem> items) { + // Offline pages generated by bookmarking a page will have a one-to-one + // mapping from Client ID to Bookmark ID. + assert items.size() <= 1; + + callback.onResult(items.isEmpty() ? null : items.get(0)); + } + }); + } + + private void updateOfflinePageSizeTextVisibility(boolean visible) { TextView textView = (TextView) findViewById(R.id.offline_page_size); + textView.setVisibility(visible ? View.VISIBLE : View.GONE); View bookmarkRowView = findViewById(R.id.bookmark_row); - if (offlinePage != null) { + if (visible) { int verticalPadding = textView.getResources().getDimensionPixelSize( R.dimen.offline_page_item_vertical_spacing); - textView.setText(Formatter.formatFileSize(getContext(), offlinePage.getFileSize())); // Get the embedded bookmark_row layout, and add padding. This is because the entries // in filter view are larger (contain more items) than normal bookmark view. bookmarkRowView.setPadding(0, verticalPadding / 2, 0, verticalPadding / 2); - textView.setVisibility(View.VISIBLE); } else { - textView.setVisibility(View.GONE); - // Remove padding when we leave filter view. bookmarkRowView.setPadding(0, 0, 0, 0); } } + private void updateOfflinePageSizeText(long size) { + TextView textView = (TextView) findViewById(R.id.offline_page_size); + textView.setText(Formatter.formatFileSize(getContext(), size)); + } + // LargeIconCallback implementation. @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java index 328fd4f..326e3403 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
@@ -275,9 +275,7 @@ String url = getBookmarkById(bookmarkId).getUrl(); if (mOfflinePageBridge == null) return url; - ClientId clientId = ClientId.createClientIdForBookmarkId(bookmarkId); - return mOfflinePageBridge.getLaunchUrlAndMarkAccessed( - mOfflinePageBridge.getPageByClientId(clientId), url); + return mOfflinePageBridge.getLaunchUrlFromOnlineUrl(url); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 9c346bf..5606864c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -306,6 +306,8 @@ * Perform any initialization necessary for showing a reparented tab. */ public void prepareForTabReparenting() { + if (mHasDrawnOnce) return; + // Set the background to white while we wait for the first swap of buffers. This gets // corrected inside the view. mCompositorView.setBackgroundColor(Color.WHITE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java index fa24c6b..026a87e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -533,6 +533,13 @@ mPanelMetrics.setDidSearchInvolvePromo(); } + /** + * @param wasPartOfUrl Whether the selected text was part of a URL. + */ + public void setWasSelectionPartOfUrl(boolean wasPartOfUrl) { + mPanelMetrics.setWasSelectionPartOfUrl(wasPartOfUrl); + } + // ============================================================================================ // Panel Rendering // ============================================================================================ @@ -705,6 +712,13 @@ private ContextualSearchPromoHost mPromoHost; /** + * @return Whether the Promo reached a state in which it could be interacted. + */ + public boolean wasPromoInteractive() { + return getPromoControl().wasInteractive(); + } + + /** * @return Height of the promo in pixels. */ private float getPromoHeightPx() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java index 9fc6851..050662a9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java
@@ -28,6 +28,7 @@ private boolean mIsSearchPanelFullyPreloaded; private boolean mWasIconSpriteAnimated; private boolean mWasPanelOpenedBeyondPeek; + private boolean mWasSelectionPartOfUrl; // Time when the panel peeks into view (not reset by a chained search). // Used to log total time the panel is showing (not closed). private long mFirstPeekTimeNs; @@ -84,6 +85,11 @@ ContextualSearchUma.logResultsSeen(mWasSearchContentViewSeen, mWasActivatedByTap); } + if (mWasSelectionPartOfUrl) { + ContextualSearchUma.logResultsSeenSelectionIsUrl(mWasSearchContentViewSeen, + mWasActivatedByTap); + } + ContextualSearchUma.logIconSpriteAnimated(mWasIconSpriteAnimated, mWasSearchContentViewSeen, mWasActivatedByTap); } @@ -157,6 +163,7 @@ mHasExitedExpanded = false; mHasExitedMaximized = false; mIsSerpNavigation = false; + mWasSelectionPartOfUrl = false; } // TODO(manzagop): When the user opts in, we should replay his actions for the current @@ -194,6 +201,13 @@ } /** + * @param wasPartOfUrl Whether the selected text was part of a URL. + */ + public void setWasSelectionPartOfUrl(boolean wasPartOfUrl) { + mWasSelectionPartOfUrl = wasPartOfUrl; + } + + /** * Called to record the time when a search request started, for resolve and prefetch timing. */ public void onSearchRequestStarted() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java index 16ae169..87cb2cb4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
@@ -80,6 +80,11 @@ private float mPromoViewY; /** + * Whether the Promo was in a state that could be interacted. + */ + private boolean mWasInteractive; + + /** * Whether the user's choice has been handled. */ private boolean mHasHandledChoice; @@ -146,6 +151,8 @@ mIsVisible = true; mIsMandatory = isMandatory; + mWasInteractive = false; + mHeightPx = mContentHeightPx; } @@ -201,6 +208,13 @@ } /** + * @return Whether the Promo reached a state in which it could be interacted. + */ + public boolean wasInteractive() { + return mWasInteractive; + } + + /** * @return The Promo height in pixels. */ public float getHeightPx() { @@ -425,7 +439,8 @@ View view = getView(); if (view == null || !mIsVisible - || (mIsShowingView && mPromoViewY == y)) return; + || (mIsShowingView && mPromoViewY == y) + || mHeightPx == 0.f) return; float offsetX = mOverlayPanel.getOffsetX() * mDpToPx; if (LocalizationUtils.isLayoutRtl()) { @@ -442,6 +457,9 @@ mIsShowingView = true; mPromoViewY = y; + + // The Promo can only be interacted when the View is being displayed. + mWasInteractive = true; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagementDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagementDelegate.java index a5a39d8a..1809d59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagementDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagementDelegate.java
@@ -20,11 +20,6 @@ ChromeActivity getChromeActivity(); /** - * Called when the promo Panel gets closed, to log the outcome. - */ - void logPromoOutcome(); - - /** * Promotes the current Content View Core in the Contextual Search Panel to its own Tab. */ void promoteToTab();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 7b86b523..767b4aa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -120,6 +120,7 @@ private boolean mIsShowingPeekPromo; private boolean mWouldShowPeekPromo; private boolean mIsShowingPromo; + private boolean mIsMandatoryPromo; private boolean mDidLogPromoOutcome; /** @@ -343,9 +344,9 @@ mPolicy.logPeekPromoMetrics(mIsShowingPeekPromo, mWouldShowPeekPromo); } - if (mIsShowingPromo && !mDidLogPromoOutcome) { - // TODO(pedrosimonetti): add separate metric for the mandatory promo. - logPromoOutcome(); + if (mIsShowingPromo && !mDidLogPromoOutcome && mSearchPanel.wasPromoInteractive()) { + ContextualSearchUma.logPromoOutcome(mWasActivatedByTap, mIsMandatoryPromo); + mDidLogPromoOutcome = true; } mIsShowingPromo = false; @@ -459,8 +460,9 @@ // Note: now that the contextual search has properly started, set the promo involvement. if (mPolicy.isPromoAvailable()) { mIsShowingPromo = true; + mIsMandatoryPromo = mPolicy.isMandatoryPromoAvailable(); mDidLogPromoOutcome = false; - mSearchPanel.setIsPromoActive(true, mPolicy.isMandatoryPromoAvailable()); + mSearchPanel.setIsPromoActive(true, mIsMandatoryPromo); mSearchPanel.setDidSearchInvolvePromo(); } @@ -602,6 +604,9 @@ final String encoding, final String surroundingText, int startOffset, int endOffset) { GSAContextDisplaySelection selection = new GSAContextDisplaySelection(encoding, surroundingText, startOffset, endOffset); + mSearchPanel.setWasSelectionPartOfUrl( + ContextualSearchSelectionController.isSelectionPartOfUrl( + surroundingText, startOffset, endOffset)); notifyShowContextualSearch(selection); } @@ -1009,12 +1014,6 @@ } } - @Override - public void logPromoOutcome() { - ContextualSearchUma.logPromoOutcome(mWasActivatedByTap); - mDidLogPromoOutcome = true; - } - /** * @return Whether the given HTTP result code represents a failure or not. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java index 5e665f7b..c79c532 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -14,6 +14,7 @@ import org.chromium.content_public.browser.GestureStateListener; import org.chromium.ui.touch_selection.SelectionEventType; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -42,6 +43,14 @@ private static final String CONTAINS_WORD_PATTERN = "(\\w|\\p{L}|\\p{N})+"; private static final String SINGLE_DIGIT_PATTERN = "^\\d$"; + // A URL is: + // 0-1: schema:// + // 1+: any word char, _ or - + // 1+: . followed by 1+ of any word char, _ or - + // 0-1: 0+ of any word char or .,@?^=%&:/~#- followed by any word char or @?^-%&/~+#- + // TODO(twellington): expand accepted schemas? Require a schema? + private static final Pattern URL_PATTERN = Pattern.compile("((http|https|file)://)?" + + "([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"); // Max selection length must be limited or the entire request URL can go past the 2K limit. private static final int MAX_SELECTION_LENGTH = 100; @@ -468,6 +477,30 @@ } /** + * @param selectionContext The String including the surrounding text and the selection. + * @param startOffset The offset to the start of the selection (inclusive). + * @param endOffset The offset to the end of the selection (non-inclusive). + * @return Whether the selection is part of URL. A valid URL is: + * 0-1: schema:// + * 1+: any word char, _ or - + * 1+: . followed by 1+ of any word char, _ or - + * 0-1: 0+ of any word char or .,@?^=%&:/~#- followed by any word char or @?^-%&/~+#- + */ + public static boolean isSelectionPartOfUrl(String selectionContext, int startOffset, + int endOffset) { + Matcher matcher = URL_PATTERN.matcher(selectionContext); + + // Starts are inclusive and ends are non-inclusive for both GSAContext & matcher. + while (matcher.find()) { + if (startOffset >= matcher.start() && endOffset <= matcher.end()) { + return true; + } + } + + return false; + } + + /** * @param word A given word. * @return Whether the given word is blacklisted. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java index bbe4c01..1bb7186 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
@@ -649,17 +649,26 @@ } /** - * Logs the outcome of the promo (first run flow). + * Logs the outcome of the Promo. * Logs multiple histograms; with and without the originating gesture. * @param wasTap Whether the gesture that originally caused the panel to show was a Tap. + * @param wasMandatory Whether the Promo was mandatory. */ - public static void logPromoOutcome(boolean wasTap) { + public static void logPromoOutcome(boolean wasTap, boolean wasMandatory) { int preferenceCode = getPreferenceValue(); RecordHistogram.recordEnumeratedHistogram("Search.ContextualSearchFirstRunFlowOutcome", preferenceCode, PREFERENCE_HISTOGRAM_BOUNDARY); + int preferenceByGestureCode = getPromoByGestureStateCode(preferenceCode, wasTap); - RecordHistogram.recordEnumeratedHistogram("Search.ContextualSearchPromoOutcomeByGesture", - preferenceByGestureCode, PROMO_BY_GESTURE_BOUNDARY); + if (wasMandatory) { + RecordHistogram.recordEnumeratedHistogram( + "Search.ContextualSearchMandatoryPromoOutcomeByGesture", + preferenceByGestureCode, PROMO_BY_GESTURE_BOUNDARY); + } else { + RecordHistogram.recordEnumeratedHistogram( + "Search.ContextualSearchPromoOutcomeByGesture", + preferenceByGestureCode, PROMO_BY_GESTURE_BOUNDARY); + } } /** @@ -761,6 +770,20 @@ } /** + * Logs whether search results were seen when the selection was part of a URL. + * Unlike ContextualSearchResultsSeen, this histogram is logged for both decided and undecided + * users. + * @param wasPanelSeen Whether the panel was seen. + * @param wasTap Whether the gesture that originally caused the panel to show was a Tap. + */ + public static void logResultsSeenSelectionIsUrl(boolean wasPanelSeen, boolean wasTap) { + int result = wasPanelSeen ? (wasTap ? RESULTS_SEEN_FROM_TAP : RESULTS_SEEN_FROM_LONG_PRESS) + : (wasTap ? RESULTS_NOT_SEEN_FROM_TAP : RESULTS_NOT_SEEN_FROM_LONG_PRESS); + RecordHistogram.recordEnumeratedHistogram( + "Search.ContextualSearchResultsSeenSelectionWasUrl", result, RESULTS_SEEN_BOUNDARY); + } + + /** * Logs whether search results were seen, whether the search provider icon sprite was animated * when the panel first appeared, and the triggering gesture. * @param wasIconSpriteAnimated Whether the search provider icon sprite was animated when the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 788662b..0f59feee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -8,6 +8,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Bundle; import android.os.IBinder; import android.os.StrictMode; import android.support.customtabs.CustomTabsCallback; @@ -23,7 +24,6 @@ import android.widget.RemoteViews; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.FieldTrialList; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; @@ -33,7 +33,6 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.browser.ChromeVersionInfo; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler.ExternalAppId; import org.chromium.chrome.browser.KeyboardShortcuts; @@ -49,12 +48,10 @@ import org.chromium.chrome.browser.rappor.RapporServiceBridge; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabIdManager; -import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; -import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.chrome.browser.toolbar.ToolbarControlContainer; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.FeatureUtilities; @@ -268,7 +265,7 @@ LayoutManagerDocument layoutDriver = new CustomTabLayoutManager(getCompositorViewHolder()); initializeCompositorContent(layoutDriver, findViewById(R.id.url_bar), (ViewGroup) findViewById(android.R.id.content), controlContainer); - mFindToolbarManager = new FindToolbarManager(this, getTabModelSelector(), + mFindToolbarManager = new FindToolbarManager(this, getToolbarManager().getActionModeController().getActionModeCallback()); if (getContextualSearchManager() != null) { getContextualSearchManager().setFindToolbarManager(mFindToolbarManager); @@ -703,9 +700,10 @@ * @return Whether or not the tab was sent over successfully. */ boolean openCurrentUrlInBrowser(boolean forceReparenting) { - if (getActivityTab() == null) return false; + Tab tab = getActivityTab(); + if (tab == null) return false; - String url = getActivityTab().getUrl(); + String url = tab.getUrl(); if (DomDistillerUrlUtils.isDistilledPage(url)) { url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); } @@ -723,45 +721,28 @@ StrictMode.setThreadPolicy(oldPolicy); } + Bundle startActivityOptions = ActivityOptionsCompat.makeCustomAnimation( + this, R.anim.abc_fade_in, R.anim.abc_fade_out).toBundle(); if (willChromeHandleIntent || forceReparenting) { - intent.setPackage(getPackageName()); + Runnable finalizeCallback = new Runnable() { + @Override + public void run() { + finishAndClose(); + } + }; - boolean enableTabReparenting = ChromeVersionInfo.isLocalBuild() - || ChromeVersionInfo.isCanaryBuild() || ChromeVersionInfo.isDevBuild() - || FieldTrialList.findFullName("TabReparenting").startsWith("Enabled") - || forceReparenting; - if (enableTabReparenting) { - // Take the activity tab and set it aside for reparenting. - final Tab tab = getActivityTab(); - // TODO(yusufo): The removal should happen as a part of the callback or as a part of - // onDestroy when finish() gets called. Find a way to do this properly without - // confusing the TabModel and without hiding the tab. crbug.com/590278 - getCurrentTabModel().removeTab(getActivityTab()); - mMainTab = null; - tab.getContentViewCore().updateWindowAndroid(null); - tab.attachTabContentManager(null); - - Runnable finalizeCallback = new Runnable() { - @Override - public void run() { - finishAndClose(); - } - }; - AsyncTabParamsManager.add( - tab.getId(), new TabReparentingParams(tab, intent, finalizeCallback)); - intent.putExtra(IntentHandler.EXTRA_TAB_ID, tab.getId()); + mMainTab = null; + tab.detachAndStartReparenting(intent, startActivityOptions, finalizeCallback); + } else { + // Temporarily allowing disk access while fixing. TODO: http://crbug.com/581860 + StrictMode.allowThreadDiskReads(); + StrictMode.allowThreadDiskWrites(); + try { + startActivity(intent, startActivityOptions); + } finally { + StrictMode.setThreadPolicy(oldPolicy); } } - - // Temporarily allowing disk access while fixing. TODO: http://crbug.com/581860 - StrictMode.allowThreadDiskReads(); - StrictMode.allowThreadDiskWrites(); - try { - startActivity(intent, ActivityOptionsCompat.makeCustomAnimation( - this, R.anim.abc_fade_in, R.anim.abc_fade_out).toBundle()); - } finally { - StrictMode.setThreadPolicy(oldPolicy); - } return true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java index dad262aa..e38fb571d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
@@ -54,6 +54,7 @@ import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; +import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate; import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams; import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel; @@ -611,7 +612,8 @@ if (params != null && params.getTabToReparent() != null) { mTab = params.getTabToReparent(); - mTab.reparentToActivity(this, new DocumentTabDelegateFactory()); + mTab.attachAndFinishReparenting(this, new DocumentTabDelegateFactory(), + (TabReparentingParams) params); } else { mTab = createActivityTab(asyncParams); } @@ -718,9 +720,8 @@ initializeCompositorContent(layoutDriver, findViewById(R.id.url_bar), (ViewGroup) findViewById(android.R.id.content), controlContainer); - mFindToolbarManager = new FindToolbarManager(this, getTabModelSelector(), - getToolbarManager().getActionModeController() - .getActionModeCallback()); + mFindToolbarManager = new FindToolbarManager(this, + getToolbarManager().getActionModeController().getActionModeCallback()); if (getContextualSearchManager() != null) { getContextualSearchManager().setFindToolbarManager(mFindToolbarManager);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java index a76da29..2591170e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
@@ -58,7 +58,7 @@ public ExternalNavigationDelegateImpl(Tab tab) { mTab = tab; - mApplicationContext = tab.getContentViewCore().getContext().getApplicationContext(); + mApplicationContext = tab.getWindowAndroid().getApplicationContext(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java index dc02b4f1..5a8fbb2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -284,43 +284,22 @@ /** * Gets the offline pages associated with a provided client ID. - * TODO(http://crbug.com/589526): Rename to just OfflinePageBridge#getPagesByClientId and - * remove the synchronous method OfflinePageBridge#getPageByClientId. * * @param clientId Client's ID associated with an offline page. * @return A {@link OfflinePageItem} matching the bookmark Id or <code>null</code> if none * exist. */ - @VisibleForTesting - public void getPagesByClientIdAsync( + public void getPagesByClientId( final ClientId clientId, final MultipleOfflinePageItemCallback callback) { runWhenLoaded(new Runnable() { @Override public void run() { - callback.onResult(getPagesByClientId(clientId)); + callback.onResult(getPagesByClientIdInternal(clientId)); } }); } - /** - * Gets an offline page associated with a provided client ID. - * This method is deprecated. Use OfflinePageBridge#getPagesByClientIdAsync. - * - * @param clientId Client's ID associated with an offline page. - * @return A {@link OfflinePageItem} matching the bookmark Id or <code>null</code> if none - * exist. - */ - public OfflinePageItem getPageByClientId(ClientId clientId) { - List<OfflinePageItem> result = getPagesByClientId(clientId); - if (result.isEmpty()) { - return null; - } - - // TODO: a better job of choosing which page (e.g. timestamp?) - return result.get(0); - } - - private List<OfflinePageItem> getPagesByClientId(ClientId clientId) { + private List<OfflinePageItem> getPagesByClientIdInternal(ClientId clientId) { Set<Long> ids = getOfflineIdsForClientId(clientId); List<OfflinePageItem> result = new ArrayList<>(); for (long offlineId : ids) { @@ -362,17 +341,6 @@ } /** - * Gets an offline page associated with a provided online URL. - * This method is deprecated. Use OfflinePageBridge#getPagesByOnlineUrl. - * - * @param onlineURL URL of the page. - * @return An {@link OfflinePageItem} matching the URL or <code>null</code> if none exist. - */ - public OfflinePageItem getPageByOnlineUrl(String onlineUrl) { - return nativeGetPageByOnlineURL(mNativeOfflinePageBridge, onlineUrl); - } - - /** * Gets the offline pages associated with the provided offline URL. * * @param string URL pointing to the offline copy of the web page. @@ -559,7 +527,8 @@ * @param onlineUrl Online URL to launch if offline is not available. * @return The launch URL. */ - public String getLaunchUrlAndMarkAccessed(OfflinePageItem page, String onlineUrl) { + @VisibleForTesting + String getLaunchUrlAndMarkAccessed(OfflinePageItem page, String onlineUrl) { if (page == null) return onlineUrl; boolean isOnline = OfflinePageUtils.isConnected(); @@ -585,7 +554,7 @@ */ public String getOfflineUrlForOnlineUrl(String onlineUrl) { assert mIsNativeOfflinePageModelLoaded; - OfflinePageItem item = getPageByOnlineUrl(onlineUrl); + OfflinePageItem item = nativeGetPageByOnlineURL(mNativeOfflinePageBridge, onlineUrl); if (item == null) return null; return item.getOfflineUrl();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java index 78318e3..867f56f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebUma.java
@@ -26,6 +26,7 @@ @ThreadSafe public class PhysicalWebUma { private static final String TAG = "PhysicalWeb"; + private static final String HAS_DEFERRED_METRICS_KEY = "PhysicalWeb.HasDeferredMetrics"; private static final String OPT_IN_DECLINE_BUTTON_PRESS_COUNT = "PhysicalWeb.OptIn.DeclineButtonPressed"; private static final String OPT_IN_ENABLE_BUTTON_PRESS_COUNT = @@ -205,65 +206,19 @@ sUploadAllowed = true; // Read the metrics. - UmaUploader uploader = new UmaUploader(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - uploader.urlSelectedCount = prefs.getInt(URL_SELECTED_COUNT, 0); - uploader.optInDeclineButtonTapCount = prefs.getInt(OPT_IN_DECLINE_BUTTON_PRESS_COUNT, 0); - uploader.optInEnableButtonTapCount = prefs.getInt(OPT_IN_ENABLE_BUTTON_PRESS_COUNT, 0); - uploader.optInHighPriorityNotificationCount = - prefs.getInt(OPT_IN_HIGH_PRIORITY_NOTIFICATION_COUNT, 0); - uploader.optInMinPriorityNotificationCount = - prefs.getInt(OPT_IN_MIN_PRIORITY_NOTIFICATION_COUNT, 0); - uploader.optInNotificationPressCount = prefs.getInt(OPT_IN_NOTIFICATION_PRESS_COUNT, 0); - uploader.prefsFeatureDisabledCount = prefs.getInt(PREFS_FEATURE_DISABLED_COUNT, 0); - uploader.prefsFeatureEnabledCount = prefs.getInt(PREFS_FEATURE_ENABLED_COUNT, 0); - uploader.prefsLocationDeniedCount = prefs.getInt(PREFS_LOCATION_DENIED_COUNT, 0); - uploader.prefsLocationGrantedCount = prefs.getInt(PREFS_LOCATION_GRANTED_COUNT, 0); - uploader.pwsBackgroundResolveTimes = prefs.getString(PWS_BACKGROUND_RESOLVE_TIMES, "[]"); - uploader.pwsForegroundResolveTimes = prefs.getString(PWS_FOREGROUND_RESOLVE_TIMES, "[]"); - uploader.standardNotificationPressDelays = - prefs.getString(STANDARD_NOTIFICATION_PRESS_DELAYS, "[]"); - uploader.optInNotificationPressDelays = - prefs.getString(OPT_IN_NOTIFICATION_PRESS_DELAYS, "[]"); - uploader.totalUrlsInitialCounts = prefs.getString(TOTAL_URLS_INITIAL_COUNTS, "[]"); - uploader.totalUrlsRefreshCounts = prefs.getString(TOTAL_URLS_REFRESH_COUNTS, "[]"); - uploader.activityReferrals = prefs.getString(ACTIVITY_REFERRALS, "[]"); - - // If the metrics are empty, we are done. - if (uploader.isEmpty()) { - return; + if (prefs.getBoolean(HAS_DEFERRED_METRICS_KEY, false)) { + AsyncTask.THREAD_POOL_EXECUTOR.execute(new UmaUploader(prefs)); } - - // Clear out the stored deferred metrics that we are about to upload. - prefs.edit() - .remove(URL_SELECTED_COUNT) - .remove(OPT_IN_DECLINE_BUTTON_PRESS_COUNT) - .remove(OPT_IN_ENABLE_BUTTON_PRESS_COUNT) - .remove(OPT_IN_HIGH_PRIORITY_NOTIFICATION_COUNT) - .remove(OPT_IN_MIN_PRIORITY_NOTIFICATION_COUNT) - .remove(OPT_IN_NOTIFICATION_PRESS_COUNT) - .remove(PREFS_FEATURE_DISABLED_COUNT) - .remove(PREFS_FEATURE_ENABLED_COUNT) - .remove(PREFS_LOCATION_DENIED_COUNT) - .remove(PREFS_LOCATION_GRANTED_COUNT) - .remove(PWS_BACKGROUND_RESOLVE_TIMES) - .remove(PWS_FOREGROUND_RESOLVE_TIMES) - .remove(STANDARD_NOTIFICATION_PRESS_DELAYS) - .remove(OPT_IN_NOTIFICATION_PRESS_DELAYS) - .remove(TOTAL_URLS_INITIAL_COUNTS) - .remove(TOTAL_URLS_REFRESH_COUNTS) - .remove(ACTIVITY_REFERRALS) - .apply(); - - // Finally, upload the metrics. - AsyncTask.THREAD_POOL_EXECUTOR.execute(uploader); } private static void storeAction(Context context, String key) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - SharedPreferences.Editor prefsEditor = prefs.edit(); int count = prefs.getInt(key, 0); - prefsEditor.putInt(key, count + 1).apply(); + prefs.edit() + .putBoolean(HAS_DEFERRED_METRICS_KEY, true) + .putInt(key, count + 1) + .apply(); } private static void storeValue(Context context, String key, Object value) { @@ -273,6 +228,10 @@ try { values = new JSONArray(prefs.getString(key, "[]")); values.put(value); + prefsEditor + .putBoolean(HAS_DEFERRED_METRICS_KEY, true) + .putString(key, values.toString()) + .apply(); } catch (JSONException e) { Log.e(TAG, "JSONException when storing " + key + " stats", e); prefsEditor.remove(key).apply(); @@ -298,78 +257,38 @@ } private static class UmaUploader implements Runnable { - public int urlSelectedCount; - public int optInDeclineButtonTapCount; - public int optInEnableButtonTapCount; - public int optInHighPriorityNotificationCount; - public int optInMinPriorityNotificationCount; - public int optInNotificationPressCount; - public int prefsFeatureDisabledCount; - public int prefsFeatureEnabledCount; - public int prefsLocationDeniedCount; - public int prefsLocationGrantedCount; - public String pwsBackgroundResolveTimes; - public String pwsForegroundResolveTimes; - public String standardNotificationPressDelays; - public String optInNotificationPressDelays; - public String totalUrlsInitialCounts; - public String totalUrlsRefreshCounts; - public String activityReferrals; + SharedPreferences mPrefs; - public boolean isEmpty() { - return urlSelectedCount == 0 - && optInDeclineButtonTapCount == 0 - && optInEnableButtonTapCount == 0 - && optInHighPriorityNotificationCount == 0 - && optInMinPriorityNotificationCount == 0 - && optInNotificationPressCount == 0 - && prefsFeatureDisabledCount == 0 - && prefsFeatureEnabledCount == 0 - && prefsLocationDeniedCount == 0 - && prefsLocationGrantedCount == 0 - && pwsBackgroundResolveTimes.equals("[]") - && pwsForegroundResolveTimes.equals("[]") - && standardNotificationPressDelays.equals("[]") - && optInNotificationPressDelays.equals("[]") - && totalUrlsInitialCounts.equals("[]") - && totalUrlsRefreshCounts.equals("[]") - && activityReferrals.equals("[]"); - } - - UmaUploader() { + UmaUploader(SharedPreferences prefs) { + mPrefs = prefs; } @Override public void run() { - uploadActions(urlSelectedCount, URL_SELECTED_COUNT); - uploadActions(optInDeclineButtonTapCount, OPT_IN_DECLINE_BUTTON_PRESS_COUNT); - uploadActions(optInEnableButtonTapCount, OPT_IN_ENABLE_BUTTON_PRESS_COUNT); - uploadActions(optInHighPriorityNotificationCount, - OPT_IN_HIGH_PRIORITY_NOTIFICATION_COUNT); - uploadActions(optInMinPriorityNotificationCount, - OPT_IN_MIN_PRIORITY_NOTIFICATION_COUNT); - uploadActions(optInNotificationPressCount, OPT_IN_NOTIFICATION_PRESS_COUNT); - uploadActions(prefsFeatureDisabledCount, PREFS_FEATURE_DISABLED_COUNT); - uploadActions(prefsFeatureEnabledCount, PREFS_FEATURE_ENABLED_COUNT); - uploadActions(prefsLocationDeniedCount, PREFS_LOCATION_DENIED_COUNT); - uploadActions(prefsLocationGrantedCount, PREFS_LOCATION_GRANTED_COUNT); - uploadTimes(pwsBackgroundResolveTimes, PWS_BACKGROUND_RESOLVE_TIMES, - TimeUnit.MILLISECONDS); - uploadTimes(pwsForegroundResolveTimes, PWS_FOREGROUND_RESOLVE_TIMES, - TimeUnit.MILLISECONDS); - uploadTimes(standardNotificationPressDelays, STANDARD_NOTIFICATION_PRESS_DELAYS, - TimeUnit.MILLISECONDS); - uploadTimes(optInNotificationPressDelays, OPT_IN_NOTIFICATION_PRESS_DELAYS, - TimeUnit.MILLISECONDS); - uploadCounts(totalUrlsInitialCounts, TOTAL_URLS_INITIAL_COUNTS); - uploadCounts(totalUrlsRefreshCounts, TOTAL_URLS_REFRESH_COUNTS); - uploadEnums(activityReferrals, ACTIVITY_REFERRALS, ListUrlsActivity.REFERER_BOUNDARY); + uploadActions(URL_SELECTED_COUNT); + uploadActions(OPT_IN_DECLINE_BUTTON_PRESS_COUNT); + uploadActions(OPT_IN_ENABLE_BUTTON_PRESS_COUNT); + uploadActions(OPT_IN_HIGH_PRIORITY_NOTIFICATION_COUNT); + uploadActions(OPT_IN_MIN_PRIORITY_NOTIFICATION_COUNT); + uploadActions(OPT_IN_NOTIFICATION_PRESS_COUNT); + uploadActions(PREFS_FEATURE_DISABLED_COUNT); + uploadActions(PREFS_FEATURE_ENABLED_COUNT); + uploadActions(PREFS_LOCATION_DENIED_COUNT); + uploadActions(PREFS_LOCATION_GRANTED_COUNT); + uploadTimes(PWS_BACKGROUND_RESOLVE_TIMES, TimeUnit.MILLISECONDS); + uploadTimes(PWS_FOREGROUND_RESOLVE_TIMES, TimeUnit.MILLISECONDS); + uploadTimes(STANDARD_NOTIFICATION_PRESS_DELAYS, TimeUnit.MILLISECONDS); + uploadTimes(OPT_IN_NOTIFICATION_PRESS_DELAYS, TimeUnit.MILLISECONDS); + uploadCounts(TOTAL_URLS_INITIAL_COUNTS); + uploadCounts(TOTAL_URLS_REFRESH_COUNTS); + uploadEnums(ACTIVITY_REFERRALS, ListUrlsActivity.REFERER_BOUNDARY); + removePref(HAS_DEFERRED_METRICS_KEY); } - private static void uploadActions(int count, String key) { - for (int i = 0; i < count; i++) { - RecordUserAction.record(key); - } + private void removePref(String key) { + mPrefs.edit() + .remove(key) + .apply(); } private static Number[] parseJsonNumberArray(String jsonArrayStr) { @@ -413,7 +332,17 @@ return array; } - private static void uploadTimes(String jsonTimesStr, final String key, final TimeUnit tu) { + private void uploadActions(String key) { + int count = mPrefs.getInt(key, 0); + removePref(key); + for (int i = 0; i < count; i++) { + RecordUserAction.record(key); + } + } + + private void uploadTimes(final String key, final TimeUnit tu) { + String jsonTimesStr = mPrefs.getString(key, "[]"); + removePref(key); Long[] times = parseJsonLongArray(jsonTimesStr); if (times == null) { Log.e(TAG, "Error reporting " + key + " with values: " + jsonTimesStr); @@ -424,7 +353,9 @@ } } - private static void uploadCounts(String jsonCountsStr, final String key) { + private void uploadCounts(final String key) { + String jsonCountsStr = mPrefs.getString(key, "[]"); + removePref(key); Integer[] counts = parseJsonIntegerArray(jsonCountsStr); if (counts == null) { Log.e(TAG, "Error reporting " + key + " with values: " + jsonCountsStr); @@ -435,7 +366,9 @@ } } - private static void uploadEnums(String jsonEnumsStr, final String key, int boundary) { + private void uploadEnums(final String key, int boundary) { + String jsonEnumsStr = mPrefs.getString(key, "[]"); + removePref(key); Integer[] values = parseJsonIntegerArray(jsonEnumsStr); if (values == null) { Log.e(TAG, "Error reporting " + key + " with values: " + jsonEnumsStr);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 14136d35..f0d54629 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -10,7 +10,9 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; +import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Browser; @@ -37,6 +39,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.FrozenNativePage; +import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler.TabOpenType; import org.chromium.chrome.browser.NativePage; import org.chromium.chrome.browser.SwipeRefreshHandler; @@ -69,12 +72,14 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.ssl.SecurityStateModel; import org.chromium.chrome.browser.tab.TabUma.TabCreationState; +import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabModelImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.security_state.ConnectionSecurityLevel; @@ -1395,13 +1400,54 @@ } /** - * Detaches tab and related objects from an existing activity and attaches to a new one. This - * updates many delegates inside the tab and {@link ContentViewCore} both on java and native - * sides. + * Begins the tab reparenting process. Detaches the tab from its current activity and fires + * an Intent to reparent the tab into its new host activity. + * + * @param intent An optional intent with the desired component, flags, or extras to use when + * launching the new host activity. This intent's URI and action will be + * overriden. This may be null if no intent customization is needed. + * @param startActivityOptions Options to pass to {@link Activity#startActivity(Intent, Bundle)} + * @param finalizeCallback A callback that will be called after the tab is attached to the new + * host activity in {@link #attachAndFinishReparenting}. + * @return Whether reparenting succeeded. If false, the tab was not removed and the intent was + * not fired. + */ + public boolean detachAndStartReparenting(Intent intent, Bundle startActivityOptions, + Runnable finalizeCallback) { + ChromeActivity activity = getActivity(); + if (activity == null) return false; + TabModelSelector tabModelSelector = getTabModelSelector(); + if (tabModelSelector == null) return false; + tabModelSelector.getModel(mIncognito).removeTab(this); + + if (mContentViewCore != null) mContentViewCore.updateWindowAndroid(null); + attachTabContentManager(null); + + if (intent == null) intent = new Intent(); + intent.setPackage(activity.getPackageName()); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(getUrl())); + intent.putExtra(IntentHandler.EXTRA_TAB_ID, mId); + IntentHandler.addTrustedIntentExtras(intent, activity); + + AsyncTabParamsManager.add(mId, + new TabReparentingParams(this, intent, finalizeCallback)); + + activity.startActivity(intent, startActivityOptions); + return true; + } + + /** + * Finishes the tab reparenting process. Attaches the tab to the new activity, and updates the + * tab and related objects to reference the new activity. This updates many delegates inside the + * tab and {@link ContentViewCore} both on java and native sides. + * * @param activity The new activity this tab should be associated with. * @param tabDelegateFactory The new delegate factory this tab should be using. + * @Param reparentingParams The TabReparentingParams associated with this reparenting process. */ - public void reparentToActivity(ChromeActivity activity, TabDelegateFactory tabDelegateFactory) { + public void attachAndFinishReparenting(ChromeActivity activity, + TabDelegateFactory tabDelegateFactory, TabReparentingParams reparentingParams) { // TODO(yusufo): Share these calls with the construction related calls. // crbug.com/590281 @@ -1422,6 +1468,8 @@ mTopControlsVisibilityDelegate = mDelegateFactory.createTopControlsVisibilityDelegate(this); setInterceptNavigationDelegate(mDelegateFactory.createInterceptNavigationDelegate(this)); mAppBannerManager = mDelegateFactory.createAppBannerManager(this); + + reparentingParams.finalizeTabReparenting(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index d476c3c4..8f825f6b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -121,8 +121,7 @@ TabReparentingParams params = (TabReparentingParams) asyncParams; tab = params.getTabToReparent(); - tab.reparentToActivity(mActivity, new TabDelegateFactory()); - params.finalizeTabReparenting(); + tab.attachAndFinishReparenting(mActivity, new TabDelegateFactory(), params); } else if (asyncParams != null && asyncParams.getWebContents() != null) { openInForeground = true; WebContents webContents = asyncParams.getWebContents();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index ba7bc66..d795155 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -85,9 +85,9 @@ @Override public void removeTab(Tab tab) { - for (TabModelObserver obs : mObservers) obs.tabRemoved(tab); - removeTabAndSelectNext(tab, TabSelectionType.FROM_USER, true, true); + + for (TabModelObserver obs : mObservers) obs.tabRemoved(tab); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java index b75f132..63d44f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java
@@ -102,7 +102,7 @@ void allTabsClosureCommitted(); /** - * Called when a tab is removed. + * Called after a tab has been removed. At this point, the tab is no longer in the tab model. * * @param tab The tab that has been removed. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index edc07ba..f744e33 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -287,6 +287,12 @@ updateTabCount(); refreshSelectedTab(); } + + @Override + public void tabRemoved(Tab tab) { + updateTabCount(); + refreshSelectedTab(); + } }; mTabObserver = new EmptyTabObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/upgrade/UpgradeIntentService.java b/chrome/android/java/src/org/chromium/chrome/browser/upgrade/UpgradeIntentService.java index a661eb6..87842a4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/upgrade/UpgradeIntentService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/upgrade/UpgradeIntentService.java
@@ -23,7 +23,7 @@ public class UpgradeIntentService extends IntentService { private static final String TAG = "UpgradeIntentService"; - private static final long TIMEOUT_MS = 15000; + private static final long TIMEOUT_MS = 10000; public static void startMigrationIfNecessary(Context context) { if (!DocumentModeAssassin.getInstance().isMigrationNecessary()) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java index 549d127d..c3cd962 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java
@@ -82,6 +82,11 @@ public void allTabsPendingClosure(List<Integer> tabIds) { updateEmptyContainerState(); } + + @Override + public void tabRemoved(Tab tab) { + updateEmptyContainerState(); + } }; mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java index 932f598..ccc4919c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.widget.findinpage; +import android.animation.Animator; import android.annotation.SuppressLint; import android.content.ClipData; import android.content.ClipboardManager; @@ -45,6 +46,7 @@ import org.chromium.chrome.browser.widget.TintedImageButton; import org.chromium.chrome.browser.widget.VerticallyFixedEditText; import org.chromium.ui.UiUtils; +import org.chromium.ui.base.WindowAndroid; /** A toolbar providing find in page functionality. */ public class FindToolbar extends LinearLayout @@ -61,11 +63,12 @@ private FindResultBar mResultBar = null; - protected TabModelSelector mTabModelSelector; + private TabModelSelector mTabModelSelector; private final TabModelSelectorObserver mTabModelSelectorObserver; private final TabModelObserver mTabModelObserver; private Tab mCurrentTab; private final TabObserver mTabObserver; + private WindowAndroid mWindowAndroid; private FindInPageBridge mFindInPageBridge; private FindToolbarObserver mObserver; @@ -489,6 +492,13 @@ } /** + * Sets the WindowAndroid in which the find toolbar will be shown. Needed for animations. + */ + public void setWindowAndroid(WindowAndroid windowAndroid) { + mWindowAndroid = windowAndroid; + } + + /** * Handles updating any visual elements of the find toolbar based on changes to the tab model. * @param isIncognito Whether the current tab model is incognito or not. */ @@ -588,6 +598,7 @@ mFindInPageBridge.destroy(); mFindInPageBridge = null; + mCurrentTab = null; mActive = false; } @@ -605,6 +616,13 @@ setResultsBarVisibility(false); } + /** + * @see WindowAndroid#startAnimationOverContent(Animator) + */ + protected void startAnimationOverContent(Animator animation) { + mWindowAndroid.startAnimationOverContent(animation); + } + @VisibleForTesting public FindResultBar getFindResultBar() { return mResultBar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java index 946c4468..1d3152b9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarManager.java
@@ -4,14 +4,13 @@ package org.chromium.chrome.browser.widget.findinpage; -import android.app.Activity; import android.view.ActionMode; import android.view.View; import android.view.ViewStub; import org.chromium.base.ObserverList; import org.chromium.chrome.R; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.ChromeActivity; import org.chromium.ui.base.DeviceFormFactor; /** @@ -19,22 +18,18 @@ */ public class FindToolbarManager { private FindToolbar mFindToolbar; - private final Activity mActivity; - private final TabModelSelector mTabModelSelector; + private final ChromeActivity mActivity; private final ActionMode.Callback mCallback; private final ObserverList<FindToolbarObserver> mObservers; /** * Creates an instance of a {@link FindToolbarManager}. - * @param activity An Activity that represents a parent of the {@link android.view.ViewStub}. - * @param selector The {@link TabModelSelector} that will interact with the {@link FindToolbar}. + * @param activity The ChromeActivity that contains the {@link FindToolbar}. * @param callback The ActionMode.Callback that will be used when selection occurs on the * {@link FindToolbar}. */ - public FindToolbarManager( - Activity activity, TabModelSelector selector, ActionMode.Callback callback) { + public FindToolbarManager(ChromeActivity activity, ActionMode.Callback callback) { mActivity = activity; - mTabModelSelector = selector; mCallback = callback; mObservers = new ObserverList<FindToolbarObserver>(); } @@ -73,7 +68,8 @@ stubId = R.id.find_toolbar_tablet_stub; } mFindToolbar = (FindToolbar) ((ViewStub) mActivity.findViewById(stubId)).inflate(); - mFindToolbar.setTabModelSelector(mTabModelSelector); + mFindToolbar.setTabModelSelector(mActivity.getTabModelSelector()); + mFindToolbar.setWindowAndroid(mActivity.getWindowAndroid()); mFindToolbar.setActionModeCallbackForTextEdit(mCallback); mFindToolbar.setObserver(new FindToolbarObserver() { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java index 4880104..8085737 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java
@@ -150,9 +150,7 @@ mCurrentAnimation = null; } }); - mTabModelSelector.getCurrentTab() - .getWindowAndroid() - .startAnimationOverContent(mCurrentAnimation); + startAnimationOverContent(mCurrentAnimation); } } @@ -172,9 +170,7 @@ if (nextAnimator != null) { mCurrentAnimation = nextAnimator; - mTabModelSelector.getCurrentTab() - .getWindowAndroid() - .startAnimationOverContent(nextAnimator); + startAnimationOverContent(nextAnimator); postInvalidateOnAnimation(); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OWNERS new file mode 100644 index 0000000..5abf5a1 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OWNERS
@@ -0,0 +1 @@ +qinmin@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java index 5d4117cc0..0c62cca 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
@@ -353,7 +353,7 @@ ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - mOfflinePageBridge.getPagesByClientIdAsync( + mOfflinePageBridge.getPagesByClientId( clientId, new OfflinePageBridge.MultipleOfflinePageItemCallback() { @Override public void onResult(List<OfflinePageItem> items) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java new file mode 100644 index 0000000..c061452 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java
@@ -0,0 +1,148 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.contextualsearch; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.chromium.base.test.util.Feature; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; + +/** + * Tests the ContextualSearchSelectionController#isSelectionPartOfUrl() method. + */ +@RunWith(BlockJUnit4ClassRunner.class) +public class ContextualSearchSelectionControllerTest { + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testBasicUrlExtraction() { + String testSentence = "A sentence containing a http://www.example.com valid url"; + + // Select "com". + assertEquals("com", testSentence.subSequence(43, 46)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 43, 46)); + + // Select "http". + assertEquals("http", testSentence.subSequence(24, 28)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 24, 28)); + + // Select "www". + assertEquals("www", testSentence.subSequence(31, 34)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 31, 34)); + + // Select "example". + assertEquals("example", testSentence.subSequence(35, 42)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 35, 42)); + + // Select "containing". + assertEquals("containing", testSentence.subSequence(11, 21)); + assertFalse(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 11, 21)); + + // Select "url". + assertEquals("url", testSentence.subSequence(53, 56)); + assertFalse(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 53, 56)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlWithAnchorAndNoSchema() { + String testSentence = "This is a sentence about example.com/foo#bar."; + + // Select "foo". + assertEquals("foo", testSentence.subSequence(37, 40)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 37, 40)); + + // Select "bar". + assertEquals("bar", testSentence.subSequence(41, 44)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 41, 44)); + + // Select "This". + assertEquals("This", testSentence.subSequence(0, 4)); + assertFalse(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 0, 4)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlSurroundedByParens() { + String testSentence = "This is another sentence (example.com)."; + + // Select "com". + assertEquals("com", testSentence.subSequence(34, 37)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 34, 37)); + + // Select "(". + assertEquals("(", testSentence.subSequence(25, 26)); + assertFalse(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 25, 26)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlWithHttpsSchema() { + String testSentence = "https://supersecure.net."; + + // Select "supersecure". + assertEquals("supersecure", testSentence.subSequence(8, 19)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 8, 19)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlWithFileSchema() { + String testSentence = "file://some_text_file.txt"; + + // Select "text". + assertEquals("text", testSentence.subSequence(12, 16)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 12, 16)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlWithPortAndQuery() { + String testSentence = "website.com:8080/html?query"; + + // Select "8080". + assertEquals("8080", testSentence.subSequence(12, 16)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 12, 16)); + + // Select "query". + assertEquals("query", testSentence.subSequence(22, 27)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 22, 27)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testIpAddress() { + String testSentence = "127.0.0.1"; + + // Select "0". + assertEquals("0", testSentence.subSequence(4, 5)); + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 4, 5)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testEmailAddress() { + String testSentence = "Please email me at username@domain.com or call..."; + + // Select "username". + assertEquals("username", testSentence.subSequence(19, 27)); + assertFalse(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 19, 27)); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUrlLikeSyntax() { + String testSentence = "Example sentence with no URLs, but.weird.syntax"; + + // Select "syntax". + assertEquals("weird", testSentence.subSequence(35, 40)); + // The selection looks like a URL, even though it's not. + assertTrue(ContextualSearchSelectionController.isSelectionPartOfUrl(testSentence, 35, 40)); + } +}
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 9ffef993..1a88d73 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//mojo/public/mojo_application_manifest.gni") import("//tools/grit/grit_rule.gni") if (is_android) { @@ -363,3 +364,26 @@ ] } } + +mojo_application_manifest("chrome_manifest") { + type = "exe" + application_name = "chrome" + source = "mojo/chrome_manifest.json" + base_manifest = "${root_out_dir}/content_browser_manifest.json" + base_deps = [ "//content/public/app:browser_manifest" ] +} + +mojo_application_manifest("chrome_renderer_manifest") { + type = "exe" + application_name = "chrome_renderer" + source = "mojo/chrome_renderer_manifest.json" + base_manifest = "${root_out_dir}/content_renderer_manifest.json" + base_deps = [ "//content/public/app:renderer_manifest" ] +} + +group("mojo_manifests") { + deps = [ + ":chrome_manifest", + ":chrome_renderer_manifest", + ] +}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 9ea86ae..ca66949 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5546,7 +5546,7 @@ WebRTC H.264 software video encoder/decoder </message> <message name="IDS_FLAGS_WEBRTC_H264_WITH_OPENH264_FFMPEG_DESCRIPTION" desc="Description of chrome:flags option to enable WebRTC H.264 sw encoder/decoder"> - When enabled, an H.264 software video encoder/decoder pair is included. (If a hardware decoder is also available it may be used instead of this decoder). + When enabled, an H.264 software video encoder/decoder pair is included. If a hardware encoder/decoder is also available it may be used instead of this encoder/decoder. </message> </if> <message name="IDS_FLAGS_WEBVR_NAME" desc="Name of the 'Enable WebVR' flag.">
diff --git a/chrome/app/mojo/chrome_manifest.json b/chrome/app/mojo/chrome_manifest.json new file mode 100644 index 0000000..2b4611e --- /dev/null +++ b/chrome/app/mojo/chrome_manifest.json
@@ -0,0 +1,6 @@ +{ + "manifest_version": 1, + "name": "exe:chrome", + "display_name": "Chrome", + "capabilities": {} +}
diff --git a/chrome/app/mojo/chrome_renderer_manifest.json b/chrome/app/mojo/chrome_renderer_manifest.json new file mode 100644 index 0000000..f4fd7d70 --- /dev/null +++ b/chrome/app/mojo/chrome_renderer_manifest.json
@@ -0,0 +1,5 @@ +{ + "name": "exe:chrome_renderer", + "display_name": "Chrome Renderer", + "capabilities": {} +}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 69b054e..dfa4818 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1646,7 +1646,7 @@ {"enable-autofill-credit-card-upload", IDS_FLAGS_AUTOFILL_CREDIT_CARD_UPLOAD_NAME, IDS_FLAGS_AUTOFILL_CREDIT_CARD_UPLOAD_DESCRIPTION, - kOsCrOS | kOsWin | kOsLinux | kOsAndroid, + kOsCrOS | kOsWin | kOsLinux | kOsAndroid | kOsMac, ENABLE_DISABLE_VALUE_TYPE( autofill::switches::kEnableOfferUploadCreditCards, autofill::switches::kDisableOfferUploadCreditCards)},
diff --git a/chrome/browser/android/accessibility/font_size_prefs_android.h b/chrome/browser/android/accessibility/font_size_prefs_android.h index 5c8e77f..3af85f1 100644 --- a/chrome/browser/android/accessibility/font_size_prefs_android.h +++ b/chrome/browser/android/accessibility/font_size_prefs_android.h
@@ -7,9 +7,10 @@ #include <jni.h> +#include <memory> + #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/observer_list.h" class PrefChangeRegistrar; @@ -56,7 +57,7 @@ // Callback for ForceEnableZoom changes from pref change registrar. void OnForceEnableZoomPrefsChanged(); - scoped_ptr<PrefChangeRegistrar> pref_change_registrar_; + std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; PrefService* const pref_service_; base::ObserverList<Observer> observers_; base::android::ScopedJavaGlobalRef<jobject> java_ref_;
diff --git a/chrome/browser/android/banners/app_banner_data_fetcher_android.cc b/chrome/browser/android/banners/app_banner_data_fetcher_android.cc index 0ae0671a..46be568 100644 --- a/chrome/browser/android/banners/app_banner_data_fetcher_android.cc +++ b/chrome/browser/android/banners/app_banner_data_fetcher_android.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/memory/ptr_util.h" #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.h" #include "chrome/browser/android/shortcut_helper.h" #include "chrome/browser/banners/app_banner_metrics.h" @@ -81,10 +82,10 @@ infobars::InfoBar* infobar = nullptr; if (native_app_data_.is_null()) { - scoped_ptr<AppBannerInfoBarDelegateAndroid> delegate( - new AppBannerInfoBarDelegateAndroid( - event_request_id(), this, title, new SkBitmap(*icon), - web_app_data())); + std::unique_ptr<AppBannerInfoBarDelegateAndroid> delegate( + new AppBannerInfoBarDelegateAndroid(event_request_id(), this, title, + new SkBitmap(*icon), + web_app_data())); infobar = new AppBannerInfoBarAndroid(std::move(delegate), web_app_data().start_url); @@ -93,7 +94,7 @@ TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_CREATED); } } else { - scoped_ptr<AppBannerInfoBarDelegateAndroid> delegate( + std::unique_ptr<AppBannerInfoBarDelegateAndroid> delegate( new AppBannerInfoBarDelegateAndroid( event_request_id(), title, new SkBitmap(*icon), native_app_data_, native_app_package_, referrer)); @@ -105,7 +106,7 @@ } } InfoBarService::FromWebContents(web_contents) - ->AddInfoBar(make_scoped_ptr(infobar)); + ->AddInfoBar(base::WrapUnique(infobar)); } } // namespace banners
diff --git a/chrome/browser/android/banners/app_banner_infobar_delegate_android.h b/chrome/browser/android/banners/app_banner_infobar_delegate_android.h index 049f0de..026f4b8 100644 --- a/chrome/browser/android/banners/app_banner_infobar_delegate_android.h +++ b/chrome/browser/android/banners/app_banner_infobar_delegate_android.h
@@ -83,7 +83,7 @@ scoped_refptr<AppBannerDataFetcherAndroid> data_fetcher_; base::string16 app_title_; - scoped_ptr<SkBitmap> app_icon_; + std::unique_ptr<SkBitmap> app_icon_; int event_request_id_; content::Manifest web_app_data_;
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc index 6b8be69..47b3563 100644 --- a/chrome/browser/android/bookmarks/bookmark_bridge.cc +++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -81,9 +81,9 @@ const icu::Collator* collator_; }; -scoped_ptr<icu::Collator> GetICUCollator() { +std::unique_ptr<icu::Collator> GetICUCollator() { UErrorCode error = U_ZERO_ERROR; - scoped_ptr<icu::Collator> collator_; + std::unique_ptr<icu::Collator> collator_; collator_.reset(icu::Collator::createInstance(error)); if (U_FAILURE(error)) collator_.reset(NULL); @@ -274,7 +274,7 @@ } } - scoped_ptr<icu::Collator> collator = GetICUCollator(); + std::unique_ptr<icu::Collator> collator = GetICUCollator(); std::stable_sort(top_level_folders.begin() + special_count, top_level_folders.end(), BookmarkTitleComparer(this, collator.get())); @@ -296,7 +296,7 @@ const JavaParamRef<jobject>& j_depths_obj) { DCHECK(IsLoaded()); - scoped_ptr<icu::Collator> collator = GetICUCollator(); + std::unique_ptr<icu::Collator> collator = GetICUCollator(); // Vector to temporarily contain all child bookmarks at same level for sorting std::vector<const BookmarkNode*> bookmarkList;
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.h b/chrome/browser/android/bookmarks/bookmark_bridge.h index ad165f6..b4dd53332 100644 --- a/chrome/browser/android/bookmarks/bookmark_bridge.h +++ b/chrome/browser/android/bookmarks/bookmark_bridge.h
@@ -263,7 +263,8 @@ JavaObjectWeakGlobalRef weak_java_ref_; bookmarks::BookmarkModel* bookmark_model_; // weak bookmarks::ManagedBookmarkService* managed_bookmark_service_; // weak - scoped_ptr<bookmarks::ScopedGroupBookmarkActions> grouped_bookmark_actions_; + std::unique_ptr<bookmarks::ScopedGroupBookmarkActions> + grouped_bookmark_actions_; PrefChangeRegistrar pref_change_registrar_; // Information about the Partner bookmarks (must check for IsLoaded()).
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_reader.h b/chrome/browser/android/bookmarks/partner_bookmarks_reader.h index a89a74b..ec65524e 100644 --- a/chrome/browser/android/bookmarks/partner_bookmarks_reader.h +++ b/chrome/browser/android/bookmarks/partner_bookmarks_reader.h
@@ -7,9 +7,10 @@ #include <stdint.h> +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/bookmarks/browser/bookmark_model.h" class PartnerBookmarksShim; @@ -47,7 +48,7 @@ Profile* profile_; // JNI - scoped_ptr<bookmarks::BookmarkNode> wip_partner_bookmarks_root_; + std::unique_ptr<bookmarks::BookmarkNode> wip_partner_bookmarks_root_; int64_t wip_next_available_id_; DISALLOW_COPY_AND_ASSIGN(PartnerBookmarksReader);
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc b/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc index ab7852f..e421d8a 100644 --- a/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc +++ b/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc
@@ -28,7 +28,7 @@ // PartnerBookmarksShim is responsible to applying and storing the user changes // (deletions/renames) in the user profile, thus keeping the hierarchy intact. struct PartnerModelKeeper { - scoped_ptr<BookmarkNode> partner_bookmarks_root; + std::unique_ptr<BookmarkNode> partner_bookmarks_root; bool loaded; PartnerModelKeeper()
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_shim.h b/chrome/browser/android/bookmarks/partner_bookmarks_shim.h index b5cd93e..7454d80 100644 --- a/chrome/browser/android/bookmarks/partner_bookmarks_shim.h +++ b/chrome/browser/android/bookmarks/partner_bookmarks_shim.h
@@ -7,9 +7,10 @@ #include <stdint.h> +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "base/supports_user_data.h" #include "components/bookmarks/browser/bookmark_model.h" @@ -133,7 +134,7 @@ void ReloadNodeMapping(); void SaveNodeMapping(); - scoped_ptr<bookmarks::BookmarkNode> partner_bookmarks_root_; + std::unique_ptr<bookmarks::BookmarkNode> partner_bookmarks_root_; PrefService* prefs_; NodeRenamingMap node_rename_remove_map_;
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_shim_unittest.cc b/chrome/browser/android/bookmarks/partner_bookmarks_shim_unittest.cc index a5d286f..d98d65a 100644 --- a/chrome/browser/android/bookmarks/partner_bookmarks_shim_unittest.cc +++ b/chrome/browser/android/bookmarks/partner_bookmarks_shim_unittest.cc
@@ -76,7 +76,7 @@ profile_.reset(NULL); } - scoped_ptr<TestingProfile> profile_; + std::unique_ptr<TestingProfile> profile_; content::TestBrowserThreadBundle thread_bundle_;
diff --git a/chrome/browser/android/bottombar/overlay_panel_content.cc b/chrome/browser/android/bottombar/overlay_panel_content.cc index 2603a001..3112412 100644 --- a/chrome/browser/android/bottombar/overlay_panel_content.cc +++ b/chrome/browser/android/bottombar/overlay_panel_content.cc
@@ -8,6 +8,7 @@ #include "base/android/jni_string.h" #include "base/callback.h" +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "chrome/browser/android/tab_android.h" @@ -130,7 +131,7 @@ DCHECK(web_contents); navigation_interception::InterceptNavigationDelegate::Associate( web_contents, - make_scoped_ptr(new navigation_interception::InterceptNavigationDelegate( + base::WrapUnique(new navigation_interception::InterceptNavigationDelegate( env, delegate))); }
diff --git a/chrome/browser/android/bottombar/overlay_panel_content.h b/chrome/browser/android/bottombar/overlay_panel_content.h index 03457a8..1dfe30a8 100644 --- a/chrome/browser/android/bottombar/overlay_panel_content.h +++ b/chrome/browser/android/bottombar/overlay_panel_content.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_ANDROID_BOTTOMBAR_OVERLAY_PANEL_CONTENT_H_ #define CHROME_BROWSER_ANDROID_BOTTOMBAR_OVERLAY_PANEL_CONTENT_H_ +#include <memory> + #include "base/android/jni_android.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "chrome/browser/android/contextualsearch/contextual_search_context.h" @@ -66,8 +67,8 @@ base::CancelableTaskTracker history_task_tracker_; // The WebContents that holds the panel content. - scoped_ptr<content::WebContents> web_contents_; - scoped_ptr<web_contents_delegate_android::WebContentsDelegateAndroid> + std::unique_ptr<content::WebContents> web_contents_; + std::unique_ptr<web_contents_delegate_android::WebContentsDelegateAndroid> web_contents_delegate_; DISALLOW_COPY_AND_ASSIGN(OverlayPanelContent);
diff --git a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc index dfb368b..0cbb30b 100644 --- a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc +++ b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc
@@ -48,7 +48,7 @@ } void BrowsingDataCounterBridge::onCounterFinished( - scoped_ptr<BrowsingDataCounter::Result> result) { + std::unique_ptr<BrowsingDataCounter::Result> result) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jstring> result_string = base::android::ConvertUTF16ToJavaString(
diff --git a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h index 46b21ba..b9d99d9 100644 --- a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h +++ b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h
@@ -30,11 +30,10 @@ static bool Register(JNIEnv* env); private: - void onCounterFinished( - scoped_ptr<BrowsingDataCounter::Result> result); + void onCounterFinished(std::unique_ptr<BrowsingDataCounter::Result> result); base::android::ScopedJavaGlobalRef<jobject> jobject_; - scoped_ptr<BrowsingDataCounter> counter_; + std::unique_ptr<BrowsingDataCounter> counter_; DISALLOW_COPY_AND_ASSIGN(BrowsingDataCounterBridge); };
diff --git a/chrome/browser/android/compositor/compositor_view.cc b/chrome/browser/android/compositor/compositor_view.cc index ff253cf7..0f69c0e 100644 --- a/chrome/browser/android/compositor/compositor_view.cc +++ b/chrome/browser/android/compositor/compositor_view.cc
@@ -4,17 +4,17 @@ #include "chrome/browser/android/compositor/compositor_view.h" -#include <vector> - #include <android/bitmap.h> #include <android/native_window_jni.h> +#include <memory> +#include <vector> + #include "base/android/build_info.h" #include "base/android/jni_android.h" #include "base/bind.h" #include "base/command_line.h" #include "base/id_map.h" -#include "base/memory/scoped_ptr.h" #include "base/rand_util.h" #include "base/trace_event/trace_event.h" #include "cc/layers/layer.h"
diff --git a/chrome/browser/android/compositor/compositor_view.h b/chrome/browser/android/compositor/compositor_view.h index 3b06e2b..ab0a2f7 100644 --- a/chrome/browser/android/compositor/compositor_view.h +++ b/chrome/browser/android/compositor/compositor_view.h
@@ -140,7 +140,7 @@ void SetBackground(bool visible, SkColor color); base::android::ScopedJavaGlobalRef<jobject> obj_; - scoped_ptr<content::Compositor> compositor_; + std::unique_ptr<content::Compositor> compositor_; LayerTitleCache* layer_title_cache_; TabContentManager* tab_content_manager_;
diff --git a/chrome/browser/android/compositor/decoration_title.h b/chrome/browser/android/compositor/decoration_title.h index 15955f1..71fe6e8 100644 --- a/chrome/browser/android/compositor/decoration_title.h +++ b/chrome/browser/android/compositor/decoration_title.h
@@ -7,9 +7,10 @@ #include <jni.h> +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "cc/resources/ui_resource_client.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/geometry/size.h" @@ -84,7 +85,7 @@ bool is_incognito_; bool is_rtl_; bool is_loading_; - scoped_ptr<gfx::Transform> transform_; + std::unique_ptr<gfx::Transform> transform_; ui::ResourceManager* resource_manager_;
diff --git a/chrome/browser/android/compositor/layer/content_layer.h b/chrome/browser/android/compositor/layer/content_layer.h index eb2d70a..c82cff2 100644 --- a/chrome/browser/android/compositor/layer/content_layer.h +++ b/chrome/browser/android/compositor/layer/content_layer.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_CONTENT_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_CONTENT_LAYER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "cc/output/filter_operations.h" #include "chrome/browser/android/compositor/layer/layer.h" #include "ui/gfx/geometry/rect.h"
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.h b/chrome/browser/android/compositor/layer/contextual_search_layer.h index 010443e..d1d5747 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.h +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.h
@@ -5,7 +5,8 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_CONTEXTUAL_SEARCH_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_CONTEXTUAL_SEARCH_LAYER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "chrome/browser/android/compositor/layer/overlay_panel_layer.h" namespace cc {
diff --git a/chrome/browser/android/compositor/layer/layer.h b/chrome/browser/android/compositor/layer/layer.h index f225191..4add7f0 100644 --- a/chrome/browser/android/compositor/layer/layer.h +++ b/chrome/browser/android/compositor/layer/layer.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_LAYER_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "cc/layers/layer.h" #include "cc/output/filter_operations.h" #include "ui/gfx/geometry/size.h"
diff --git a/chrome/browser/android/compositor/layer/overlay_panel_layer.h b/chrome/browser/android/compositor/layer/overlay_panel_layer.h index 725c9e8..43667d7 100644 --- a/chrome/browser/android/compositor/layer/overlay_panel_layer.h +++ b/chrome/browser/android/compositor/layer/overlay_panel_layer.h
@@ -5,7 +5,8 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_OVERLAY_PANEL_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_OVERLAY_PANEL_LAYER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "chrome/browser/android/compositor/layer/layer.h" namespace cc {
diff --git a/chrome/browser/android/compositor/layer/reader_mode_layer.h b/chrome/browser/android/compositor/layer/reader_mode_layer.h index bc13144..5549510 100644 --- a/chrome/browser/android/compositor/layer/reader_mode_layer.h +++ b/chrome/browser/android/compositor/layer/reader_mode_layer.h
@@ -5,7 +5,8 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_READER_MODE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_READER_MODE_LAYER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "chrome/browser/android/compositor/layer/overlay_panel_layer.h" namespace content {
diff --git a/chrome/browser/android/compositor/layer/tab_handle_layer.h b/chrome/browser/android/compositor/layer/tab_handle_layer.h index f7ed055..02048d4 100644 --- a/chrome/browser/android/compositor/layer/tab_handle_layer.h +++ b/chrome/browser/android/compositor/layer/tab_handle_layer.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TAB_HANDLE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TAB_HANDLE_LAYER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "cc/layers/nine_patch_layer.h" #include "cc/layers/solid_color_layer.h" #include "cc/layers/ui_resource_layer.h"
diff --git a/chrome/browser/android/compositor/layer/tab_layer.h b/chrome/browser/android/compositor/layer/tab_layer.h index 48ea9bf76..43741d08 100644 --- a/chrome/browser/android/compositor/layer/tab_layer.h +++ b/chrome/browser/android/compositor/layer/tab_layer.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TAB_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TAB_LAYER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/compositor/layer/layer.h" namespace cc {
diff --git a/chrome/browser/android/compositor/layer/toolbar_layer.h b/chrome/browser/android/compositor/layer/toolbar_layer.h index 95abfe6f..2c2be007 100644 --- a/chrome/browser/android/compositor/layer/toolbar_layer.h +++ b/chrome/browser/android/compositor/layer/toolbar_layer.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TOOLBAR_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_TOOLBAR_LAYER_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "cc/layers/nine_patch_layer.h" #include "chrome/browser/android/compositor/layer/layer.h" #include "ui/android/resources/resource_manager.h"
diff --git a/chrome/browser/android/compositor/layer_title_cache.cc b/chrome/browser/android/compositor/layer_title_cache.cc index 9339850a..a86a3fbf 100644 --- a/chrome/browser/android/compositor/layer_title_cache.cc +++ b/chrome/browser/android/compositor/layer_title_cache.cc
@@ -6,7 +6,8 @@ #include <android/bitmap.h> -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "cc/layers/layer.h" #include "cc/layers/ui_resource_layer.h" #include "chrome/browser/android/compositor/decoration_title.h"
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h index a5b243a..a618121 100644 --- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
@@ -5,13 +5,13 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_CONTEXTUAL_SEARCH_SCENE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_CONTEXTUAL_SEARCH_SCENE_LAYER_H_ +#include <memory> #include <vector> #include "base/android/jni_android.h" #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h" namespace chrome {
diff --git a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h index c48cc3b..13caf6d 100644 --- a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h
@@ -5,13 +5,13 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_READER_MODE_SCENE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_READER_MODE_SCENE_LAYER_H_ +#include <memory> #include <vector> #include "base/android/jni_android.h" #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h" #include "ui/android/resources/resource_manager_impl.h"
diff --git a/chrome/browser/android/compositor/scene_layer/static_tab_scene_layer.h b/chrome/browser/android/compositor/scene_layer/static_tab_scene_layer.h index c81efe0..ad00105 100644 --- a/chrome/browser/android/compositor/scene_layer/static_tab_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/static_tab_scene_layer.h
@@ -7,11 +7,12 @@ #include <jni.h> +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point_f.h"
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h index aba69e4..3c0575e 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
@@ -5,13 +5,13 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_TAB_LIST_SCENE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_TAB_LIST_SCENE_LAYER_H_ +#include <memory> #include <vector> #include "base/android/jni_android.h" #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "cc/layers/layer.h" #include "chrome/browser/android/compositor/layer/layer.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h index ce99e394..b67d290 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h
@@ -5,13 +5,13 @@ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_TAB_STRIP_SCENE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_TAB_STRIP_SCENE_LAYER_H_ +#include <memory> #include <vector> #include "base/android/jni_android.h" #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "cc/layers/layer.h" #include "cc/layers/ui_resource_layer.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
diff --git a/chrome/browser/android/compositor/tab_content_manager.cc b/chrome/browser/android/compositor/tab_content_manager.cc index 08b1933..556f8c25 100644 --- a/chrome/browser/android/compositor/tab_content_manager.cc +++ b/chrome/browser/android/compositor/tab_content_manager.cc
@@ -6,6 +6,7 @@ #include <android/bitmap.h> #include <stddef.h> + #include <utility> #include "base/android/jni_android.h" @@ -14,6 +15,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "cc/layers/layer.h" #include "chrome/browser/android/compositor/layer/thumbnail_layer.h" #include "chrome/browser/android/tab_android.h" @@ -144,7 +146,7 @@ jint write_queue_max_size, jboolean use_approximation_thumbnail) : weak_java_tab_content_manager_(env, obj), weak_factory_(this) { - thumbnail_cache_ = make_scoped_ptr(new ThumbnailCache( + thumbnail_cache_ = base::WrapUnique(new ThumbnailCache( (size_t)default_cache_size, (size_t)approximation_cache_size, (size_t)compression_queue_max_size, (size_t)write_queue_max_size, use_approximation_thumbnail)); @@ -271,8 +273,8 @@ TabReadbackCallback readback_done_callback = base::Bind(&TabContentManager::PutThumbnailIntoCache, weak_factory_.GetWeakPtr(), tab_id); - scoped_ptr<TabReadbackRequest> readback_request = - make_scoped_ptr(new TabReadbackRequest( + std::unique_ptr<TabReadbackRequest> readback_request = + base::WrapUnique(new TabReadbackRequest( content_view_core, thumbnail_scale, readback_done_callback)); pending_tab_readbacks_.set(tab_id, std::move(readback_request)); pending_tab_readbacks_.get(tab_id)->Run();
diff --git a/chrome/browser/android/compositor/tab_content_manager.h b/chrome/browser/android/compositor/tab_content_manager.h index 89a52fd..cfe17bc0a 100644 --- a/chrome/browser/android/compositor/tab_content_manager.h +++ b/chrome/browser/android/compositor/tab_content_manager.h
@@ -106,14 +106,14 @@ class TabReadbackRequest; typedef base::hash_map<int, scoped_refptr<cc::Layer>> LayerMap; typedef base::hash_map<int, scoped_refptr<ThumbnailLayer>> ThumbnailLayerMap; - typedef base::ScopedPtrHashMap<int, scoped_ptr<TabReadbackRequest>> + typedef base::ScopedPtrHashMap<int, std::unique_ptr<TabReadbackRequest>> TabReadbackRequestMap; void PutThumbnailIntoCache(int tab_id, float thumbnail_scale, const SkBitmap& bitmap); - scoped_ptr<ThumbnailCache> thumbnail_cache_; + std::unique_ptr<ThumbnailCache> thumbnail_cache_; ThumbnailLayerMap static_layer_cache_; LayerMap live_layer_list_; TabReadbackRequestMap pending_tab_readbacks_;
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index b7385c0..c4048e6 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -133,7 +133,7 @@ DCHECK(source == search_term_fetcher_.get()); int response_code = source->GetResponseCode(); - scoped_ptr<ResolvedSearchTerm> resolved_search_term( + std::unique_ptr<ResolvedSearchTerm> resolved_search_term( new ResolvedSearchTerm(response_code)); if (source->GetStatus().is_success() && response_code == net::HTTP_OK) { std::string response; @@ -150,7 +150,7 @@ context_.reset(); } -scoped_ptr<ResolvedSearchTerm> +std::unique_ptr<ResolvedSearchTerm> ContextualSearchDelegate::GetResolvedSearchTermFromJson( int response_code, const std::string& json_string) { @@ -184,7 +184,7 @@ } } bool is_invalid = response_code == net::URLFetcher::RESPONSE_CODE_INVALID; - return scoped_ptr<ResolvedSearchTerm>(new ResolvedSearchTerm( + return std::unique_ptr<ResolvedSearchTerm>(new ResolvedSearchTerm( is_invalid, response_code, search_term, display_text, alternate_term, prevent_preload == kDoPreventPreloadValue, start_adjust, end_adjust, context_language)); @@ -431,7 +431,7 @@ const std::string& proper_json = contains_xssi_escape ? response.substr(strlen(kXssiEscape)) : response; JSONStringValueDeserializer deserializer(proper_json); - scoped_ptr<base::Value> root = deserializer.Deserialize(NULL, NULL); + std::unique_ptr<base::Value> root = deserializer.Deserialize(NULL, NULL); if (root.get() != NULL && root->IsType(base::Value::TYPE_DICTIONARY)) { base::DictionaryValue* dict =
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.h b/chrome/browser/android/contextualsearch/contextual_search_delegate.h index 08dc52bc..d70bd89 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.h +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.h
@@ -7,10 +7,11 @@ #include <stddef.h> +#include <memory> + #include "base/callback.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "chrome/browser/android/contextualsearch/contextual_search_context.h" @@ -174,7 +175,7 @@ TemplateURLService* template_url_service); // Builds a Resolved Search Term by decoding the given JSON string. - scoped_ptr<ResolvedSearchTerm> GetResolvedSearchTermFromJson( + std::unique_ptr<ResolvedSearchTerm> GetResolvedSearchTermFromJson( int response_code, const std::string& json_string); @@ -212,7 +213,7 @@ size_t* end); // The current request in progress, or NULL. - scoped_ptr<net::URLFetcher> search_term_fetcher_; + std::unique_ptr<net::URLFetcher> search_term_fetcher_; // Holds the URL request context. Not owned. net::URLRequestContextGetter* url_request_context_; @@ -221,7 +222,7 @@ TemplateURLService* template_url_service_; // The field trial helper instance, always set up by the constructor. - scoped_ptr<ContextualSearchFieldTrial> field_trial_; + std::unique_ptr<ContextualSearchFieldTrial> field_trial_; // The callback for notifications of completed URL fetches. SearchTermResolutionCallback search_term_callback_; @@ -233,7 +234,7 @@ IcingCallback icing_callback_; // Used to hold the context until an upcoming search term request is started. - scoped_ptr<ContextualSearchContext> context_; + std::unique_ptr<ContextualSearchContext> context_; DISALLOW_COPY_AND_ASSIGN(ContextualSearchDelegate); };
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate_unittest.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate_unittest.cc index 9bf81d23..8b174bb 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate_unittest.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate_unittest.cc
@@ -6,9 +6,10 @@ #include <stddef.h> +#include <memory> + #include "base/base64.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" @@ -176,7 +177,7 @@ std::string context_language() { return context_language_; } // The delegate under test. - scoped_ptr<ContextualSearchDelegate> delegate_; + std::unique_ptr<ContextualSearchDelegate> delegate_; private: void recordSearchTermResolutionResponse( @@ -217,7 +218,7 @@ base::MessageLoopForIO io_message_loop_; net::TestURLFetcherFactory test_factory_; net::TestURLFetcher* fetcher_; - scoped_ptr<TemplateURLService> template_url_service_; + std::unique_ptr<TemplateURLService> template_url_service_; scoped_refptr<net::TestURLRequestContextGetter> request_context_; // Will be owned by the delegate.
diff --git a/chrome/browser/android/contextualsearch/contextual_search_field_trial_unittest.cc b/chrome/browser/android/contextualsearch/contextual_search_field_trial_unittest.cc index 6dc7795..01fc8ab 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_field_trial_unittest.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_field_trial_unittest.cc
@@ -4,8 +4,9 @@ #include "chrome/browser/android/contextualsearch/contextual_search_field_trial.h" +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "testing/gtest/include/gtest/gtest.h" // Tests ContextualSearchFieldTrail class. @@ -34,7 +35,7 @@ }; // The class under test. - scoped_ptr<ContextualSearchFieldTrailStubbed> field_trial_; + std::unique_ptr<ContextualSearchFieldTrailStubbed> field_trial_; protected: void SetUp() override {
diff --git a/chrome/browser/android/contextualsearch/contextual_search_manager.h b/chrome/browser/android/contextualsearch/contextual_search_manager.h index 4e9e323..4602efb2 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_manager.h +++ b/chrome/browser/android/contextualsearch/contextual_search_manager.h
@@ -88,7 +88,7 @@ base::android::ScopedJavaGlobalRef<jobject> java_manager_; // The delegate we're using the do the real work. - scoped_ptr<ContextualSearchDelegate> delegate_; + std::unique_ptr<ContextualSearchDelegate> delegate_; DISALLOW_COPY_AND_ASSIGN(ContextualSearchManager); };
diff --git a/chrome/browser/android/contextualsearch/contextual_search_tab_helper.h b/chrome/browser/android/contextualsearch/contextual_search_tab_helper.h index 8140f69..bafbb70 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_tab_helper.h +++ b/chrome/browser/android/contextualsearch/contextual_search_tab_helper.h
@@ -7,10 +7,11 @@ #include <jni.h> +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "components/prefs/pref_change_registrar.h" @@ -26,7 +27,7 @@ void OnContextualSearchPrefChanged(); JavaObjectWeakGlobalRef weak_java_ref_; - scoped_ptr<PrefChangeRegistrar> pref_change_registrar_; + std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; base::WeakPtrFactory<ContextualSearchTabHelper> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ContextualSearchTabHelper); };
diff --git a/chrome/browser/android/data_usage/data_use_matcher.cc b/chrome/browser/android/data_usage/data_use_matcher.cc index 1be71a5..c201597 100644 --- a/chrome/browser/android/data_usage/data_use_matcher.cc +++ b/chrome/browser/android/data_usage/data_use_matcher.cc
@@ -9,6 +9,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" @@ -66,7 +67,7 @@ invalid_rules++; continue; } - scoped_ptr<re2::RE2> pattern(new re2::RE2(url_regex, options)); + std::unique_ptr<re2::RE2> pattern(new re2::RE2(url_regex, options)); if (!pattern->ok()) { invalid_rules++; continue; @@ -75,7 +76,7 @@ if (expiration <= now_ticks) continue; // skip expired matching rules. DCHECK(!labels.at(i).empty()); - matching_rules_.push_back(make_scoped_ptr(new MatchingRule( + matching_rules_.push_back(base::WrapUnique(new MatchingRule( app_package_name, std::move(pattern), labels.at(i), expiration))); removed_matching_rule_labels.erase(labels.at(i)); @@ -169,7 +170,7 @@ } DataUseMatcher::MatchingRule::MatchingRule(const std::string& app_package_name, - scoped_ptr<re2::RE2> pattern, + std::unique_ptr<re2::RE2> pattern, const std::string& label, const base::TimeTicks& expiration) : app_package_name_(app_package_name),
diff --git a/chrome/browser/android/data_usage/data_use_matcher.h b/chrome/browser/android/data_usage/data_use_matcher.h index f905ab09..f10127ff 100644 --- a/chrome/browser/android/data_usage/data_use_matcher.h +++ b/chrome/browser/android/data_usage/data_use_matcher.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_MATCHER_H_ #define CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_MATCHER_H_ +#include <memory> #include <string> #include <vector> @@ -12,7 +13,6 @@ #include "base/containers/hash_tables.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "chrome/browser/android/data_usage/data_use_tab_model.h" @@ -84,7 +84,7 @@ class MatchingRule { public: MatchingRule(const std::string& app_package_name, - scoped_ptr<re2::RE2> pattern, + std::unique_ptr<re2::RE2> pattern, const std::string& label, const base::TimeTicks& expiration); ~MatchingRule(); @@ -99,7 +99,7 @@ const std::string app_package_name_; // RE2 pattern to match against URLs. - scoped_ptr<re2::RE2> pattern_; + std::unique_ptr<re2::RE2> pattern_; // Opaque label that uniquely identifies this matching rule. const std::string label_; @@ -123,7 +123,7 @@ base::ThreadChecker thread_checker_; - std::vector<scoped_ptr<MatchingRule>> matching_rules_; + std::vector<std::unique_ptr<MatchingRule>> matching_rules_; // |data_use_tab_model_| is notified if a label is removed from the set of // matching labels. @@ -134,7 +134,7 @@ const base::TimeDelta default_matching_rule_expiration_duration_; // TickClock used for obtaining the current time. - scoped_ptr<base::TickClock> tick_clock_; + std::unique_ptr<base::TickClock> tick_clock_; // Pointer to the ExternalDataUseObserverBridge owned by // ExternalDataUseObserver. DataUseTabModel (owner of |this|) and
diff --git a/chrome/browser/android/data_usage/data_use_matcher_unittest.cc b/chrome/browser/android/data_usage/data_use_matcher_unittest.cc index df2631b..aac2594 100644 --- a/chrome/browser/android/data_usage/data_use_matcher_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_matcher_unittest.cc
@@ -101,7 +101,8 @@ private: content::TestBrowserThreadBundle thread_bundle_; - scoped_ptr<ExternalDataUseObserverBridge> external_data_use_observer_bridge_; + std::unique_ptr<ExternalDataUseObserverBridge> + external_data_use_observer_bridge_; DataUseMatcher data_use_matcher_; DISALLOW_COPY_AND_ASSIGN(DataUseMatcherTest); };
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.h b/chrome/browser/android/data_usage/data_use_tab_model.h index bed0ff8..0ba6af5 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model.h +++ b/chrome/browser/android/data_usage/data_use_tab_model.h
@@ -7,13 +7,13 @@ #include <stddef.h> +#include <memory> #include <string> #include <vector> #include "base/containers/hash_tables.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" @@ -281,10 +281,10 @@ const base::TimeDelta open_tab_expiration_duration_; // TickClock used for obtaining the current time. - scoped_ptr<base::TickClock> tick_clock_; + std::unique_ptr<base::TickClock> tick_clock_; // Stores the matching patterns. - scoped_ptr<DataUseMatcher> data_use_matcher_; + std::unique_ptr<DataUseMatcher> data_use_matcher_; // True if the external control app is installed. bool is_control_app_installed_; @@ -296,7 +296,8 @@ // the UI navigation events need to be buffered. If the scoped_ptr contains a // vector all navigation events will be added to it. Otherwise all navigation // events will be processed immediately. - scoped_ptr<std::vector<DataUseUINavigationEvent>> data_use_ui_navigations_; + std::unique_ptr<std::vector<DataUseUINavigationEvent>> + data_use_ui_navigations_; base::ThreadChecker thread_checker_;
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc index fbda821..cb43c2a6 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
@@ -6,10 +6,10 @@ #include <stdint.h> +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" @@ -192,11 +192,12 @@ // Pointer to the tick clock owned by |data_use_tab_model_|. base::SimpleTestTickClock* tick_clock_; - scoped_ptr<DataUseTabModel> data_use_tab_model_; + std::unique_ptr<DataUseTabModel> data_use_tab_model_; private: content::TestBrowserThreadBundle thread_bundle_; - scoped_ptr<ExternalDataUseObserverBridge> external_data_use_observer_bridge_; + std::unique_ptr<ExternalDataUseObserverBridge> + external_data_use_observer_bridge_; DISALLOW_COPY_AND_ASSIGN(DataUseTabModelTest); };
diff --git a/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc index da290284..fd15406 100644 --- a/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc
@@ -89,9 +89,9 @@ DataUseUITabModel data_use_ui_tab_model_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; - scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; - scoped_ptr<ExternalDataUseObserver> external_data_use_observer_; - scoped_ptr<TestDataUseTabModel> data_use_tab_model_; + std::unique_ptr<data_usage::DataUseAggregator> data_use_aggregator_; + std::unique_ptr<ExternalDataUseObserver> external_data_use_observer_; + std::unique_ptr<TestDataUseTabModel> data_use_tab_model_; }; // Tests that DataUseTabModel is notified of tab closure and navigation events,
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc index 210b5db..b88d416e 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
@@ -238,7 +238,7 @@ FetchMatchingRules(); } - scoped_ptr<std::string> label(new std::string()); + std::unique_ptr<std::string> label(new std::string()); content::BrowserThread::PostTaskAndReplyWithResult( content::BrowserThread::UI, FROM_HERE,
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_observer.h index 89310dd..1a20d967 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.h +++ b/chrome/browser/android/data_usage/external_data_use_observer.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include <stdint.h> +#include <memory> #include <string> #include <vector> @@ -15,7 +16,6 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" @@ -275,7 +275,7 @@ #if defined(OS_ANDROID) // Listens to when Chromium gets backgrounded and submits buffered data use // reports. - scoped_ptr<base::android::ApplicationStatusListener> app_state_listener_; + std::unique_ptr<base::android::ApplicationStatusListener> app_state_listener_; #endif // True if |this| is currently registered as a data use observer.
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc b/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc index 9ef7a35a..04e6807 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc
@@ -4,11 +4,11 @@ #include "chrome/browser/android/data_usage/external_data_use_observer_bridge.h" +#include <memory> #include <vector> #include "base/android/context_utils.h" #include "base/android/jni_string.h" -#include "base/memory/scoped_ptr.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h"
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc index e280e730..7ba7b208 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
@@ -8,10 +8,10 @@ #include <stdint.h> #include <map> +#include <memory> #include <string> #include <vector> -#include "base/memory/scoped_ptr.h" #include "base/metrics/field_trial.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" @@ -147,9 +147,9 @@ } private: - scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; - scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; - scoped_ptr<ExternalDataUseObserver> external_data_use_observer_; + std::unique_ptr<content::TestBrowserThreadBundle> thread_bundle_; + std::unique_ptr<data_usage::DataUseAggregator> data_use_aggregator_; + std::unique_ptr<ExternalDataUseObserver> external_data_use_observer_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc index e824db4..b81f726f 100644 --- a/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc +++ b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc
@@ -7,10 +7,10 @@ #include <stddef.h> #include <stdint.h> +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/stringprintf.h" #include "base/test/histogram_tester.h" #include "base/time/tick_clock.h" @@ -146,8 +146,8 @@ // Pointer to the clock used for spoofing time, owned by |tab_model_|. SimpleOffsetTestTickClock* tick_clock_; - scoped_ptr<DataUseTabModel> tab_model_; - scoped_ptr<TabDataUseEntry> tab_entry_; + std::unique_ptr<DataUseTabModel> tab_model_; + std::unique_ptr<TabDataUseEntry> tab_entry_; DISALLOW_COPY_AND_ASSIGN(TabDataUseEntryTest); };
diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.cc b/chrome/browser/android/dev_tools_discovery_provider_android.cc index 73a3c57..113748bf3 100644 --- a/chrome/browser/android/dev_tools_discovery_provider_android.cc +++ b/chrome/browser/android/dev_tools_discovery_provider_android.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/android/tab_android.h" @@ -173,25 +174,25 @@ DISALLOW_COPY_AND_ASSIGN(TabDescriptor); }; -scoped_ptr<devtools_discovery::DevToolsTargetDescriptor> +std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor> CreateNewAndroidTab(const GURL& url) { if (TabModelList::empty()) - return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); TabModel* tab_model = TabModelList::get(0); if (!tab_model) - return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); WebContents* web_contents = tab_model->CreateNewTabForDevTools(url); if (!web_contents) - return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); TabAndroid* tab = TabAndroid::FromWebContents(web_contents); if (!tab) - return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); - return make_scoped_ptr(TabDescriptor::CreateForWebContents( - tab->GetAndroidId(), web_contents)); + return base::WrapUnique( + TabDescriptor::CreateForWebContents(tab->GetAndroidId(), web_contents)); } } // namespace @@ -247,6 +248,6 @@ devtools_discovery::DevToolsDiscoveryManager* discovery_manager = devtools_discovery::DevToolsDiscoveryManager::GetInstance(); discovery_manager->AddProvider( - make_scoped_ptr(new DevToolsDiscoveryProviderAndroid())); + base::WrapUnique(new DevToolsDiscoveryProviderAndroid())); discovery_manager->SetCreateCallback(base::Bind(&CreateNewAndroidTab)); }
diff --git a/chrome/browser/android/dev_tools_server.cc b/chrome/browser/android/dev_tools_server.cc index fcd5dd67..a7513b60 100644 --- a/chrome/browser/android/dev_tools_server.cc +++ b/chrome/browser/android/dev_tools_server.cc
@@ -150,8 +150,8 @@ } private: - scoped_ptr<net::ServerSocket> CreateForHttpServer() override { - scoped_ptr<net::UnixDomainServerSocket> socket( + std::unique_ptr<net::ServerSocket> CreateForHttpServer() override { + std::unique_ptr<net::UnixDomainServerSocket> socket( new net::UnixDomainServerSocket(auth_callback_, true /* use_abstract_namespace */)); @@ -164,16 +164,17 @@ if (socket->BindAndListen(fallback_address, kBackLog) == net::OK) return std::move(socket); - return scoped_ptr<net::ServerSocket>(); + return std::unique_ptr<net::ServerSocket>(); } - scoped_ptr<net::ServerSocket> CreateForTethering(std::string* name) override { + std::unique_ptr<net::ServerSocket> CreateForTethering( + std::string* name) override { *name = base::StringPrintf( kTetheringSocketName, getpid(), ++last_tethering_socket_); - scoped_ptr<net::UnixDomainServerSocket> socket( + std::unique_ptr<net::UnixDomainServerSocket> socket( new net::UnixDomainServerSocket(auth_callback_, true)); if (socket->BindAndListen(*name, kBackLog) != net::OK) - return scoped_ptr<net::ServerSocket>(); + return std::unique_ptr<net::ServerSocket>(); return std::move(socket); } @@ -211,7 +212,7 @@ allow_debug_permission ? base::Bind(&AuthorizeSocketAccessWithDebugPermission) : base::Bind(&content::CanUserConnectToDevTools); - scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( + std::unique_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new UnixDomainServerSocketFactory(socket_name_, auth_callback)); devtools_http_handler_.reset(new DevToolsHttpHandler( std::move(factory),
diff --git a/chrome/browser/android/dev_tools_server.h b/chrome/browser/android/dev_tools_server.h index c7f3e96..5f2e515 100644 --- a/chrome/browser/android/dev_tools_server.h +++ b/chrome/browser/android/dev_tools_server.h
@@ -6,9 +6,11 @@ #define CHROME_BROWSER_ANDROID_DEV_TOOLS_SERVER_H_ #include <jni.h> + +#include <memory> #include <string> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace devtools_http_handler { class DevToolsHttpHandler; @@ -30,7 +32,8 @@ private: std::string socket_name_; - scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; + std::unique_ptr<devtools_http_handler::DevToolsHttpHandler> + devtools_http_handler_; DISALLOW_COPY_AND_ASSIGN(DevToolsServer); };
diff --git a/chrome/browser/android/download/android_download_manager_overwrite_infobar_delegate.cc b/chrome/browser/android/download/android_download_manager_overwrite_infobar_delegate.cc index 090306cc..7eae0f4d 100644 --- a/chrome/browser/android/download/android_download_manager_overwrite_infobar_delegate.cc +++ b/chrome/browser/android/download/android_download_manager_overwrite_infobar_delegate.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/android/download/android_download_manager_overwrite_infobar_delegate.h" +#include <memory> + #include "base/android/jni_string.h" #include "base/files/file_util.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/android/download/chrome_download_delegate.h" #include "chrome/browser/infobars/infobar_service.h" @@ -33,7 +35,7 @@ jobject chrome_download_delegate, jobject download_info) { infobar_service->AddInfoBar(DownloadOverwriteInfoBar::CreateInfoBar( - make_scoped_ptr(new AndroidDownloadManagerOverwriteInfoBarDelegate( + base::WrapUnique(new AndroidDownloadManagerOverwriteInfoBarDelegate( file_name, dir_name, dir_full_path, chrome_download_delegate, download_info)))); }
diff --git a/chrome/browser/android/download/chrome_download_delegate.cc b/chrome/browser/android/download/chrome_download_delegate.cc index 8ce3facc..4fd1213 100644 --- a/chrome/browser/android/download/chrome_download_delegate.cc +++ b/chrome/browser/android/download/chrome_download_delegate.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/android/download/chrome_download_delegate.h" #include <jni.h> + #include <string> +#include <type_traits> #include "base/android/jni_android.h" #include "base/android/jni_string.h" @@ -108,10 +110,13 @@ base::android::ConvertJavaStringToUTF8(env, jpermission); // Convert java long long int to c++ pointer, take ownership. - scoped_ptr<DownloadControllerAndroid::AcquireFileAccessPermissionCallback> cb( - reinterpret_cast< - DownloadControllerAndroid::AcquireFileAccessPermissionCallback*>( - callback_id)); + static_assert( + std::is_same< + DownloadControllerAndroid::AcquireFileAccessPermissionCallback, + base::Callback<void(bool)>>::value, + "Callback types don't match!"); + std::unique_ptr<base::Callback<void(bool)>> cb( + reinterpret_cast<base::Callback<void(bool)>*>(callback_id)); std::vector<std::string> permissions; permissions.push_back(permission);
diff --git a/chrome/browser/android/download/chrome_download_manager_overwrite_infobar_delegate.cc b/chrome/browser/android/download/chrome_download_manager_overwrite_infobar_delegate.cc index 2d291d3..823222b 100644 --- a/chrome/browser/android/download/chrome_download_manager_overwrite_infobar_delegate.cc +++ b/chrome/browser/android/download/chrome_download_manager_overwrite_infobar_delegate.cc
@@ -4,10 +4,12 @@ #include "chrome/browser/android/download/chrome_download_manager_overwrite_infobar_delegate.h" +#include <memory> + #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/files/file_util.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/ui/android/infobars/download_overwrite_infobar.h" @@ -28,7 +30,7 @@ const base::FilePath& suggested_path, const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback) { infobar_service->AddInfoBar(DownloadOverwriteInfoBar::CreateInfoBar( - make_scoped_ptr(new ChromeDownloadManagerOverwriteInfoBarDelegate( + base::WrapUnique(new ChromeDownloadManagerOverwriteInfoBarDelegate( suggested_path, callback)))); }
diff --git a/chrome/browser/android/download/download_manager_service_unittest.cc b/chrome/browser/android/download/download_manager_service_unittest.cc index 2d49fb5..15325af 100644 --- a/chrome/browser/android/download/download_manager_service_unittest.cc +++ b/chrome/browser/android/download/download_manager_service_unittest.cc
@@ -74,7 +74,7 @@ } base::MessageLoop message_loop_; - scoped_ptr<content::MockDownloadItem> download_; + std::unique_ptr<content::MockDownloadItem> download_; content::MockDownloadManager manager_; DownloadManagerService* service_; bool finished_;
diff --git a/chrome/browser/android/favicon_helper.h b/chrome/browser/android/favicon_helper.h index 4c4da282..a463dff7 100644 --- a/chrome/browser/android/favicon_helper.h +++ b/chrome/browser/android/favicon_helper.h
@@ -7,9 +7,10 @@ #include <jni.h> +#include <memory> + #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" class FaviconHelper { @@ -41,7 +42,7 @@ static bool RegisterFaviconHelper(JNIEnv* env); private: - scoped_ptr<base::CancelableTaskTracker> cancelable_task_tracker_; + std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_; virtual ~FaviconHelper();
diff --git a/chrome/browser/android/feedback/connectivity_checker.cc b/chrome/browser/android/feedback/connectivity_checker.cc index e915e2b..51036206 100644 --- a/chrome/browser/android/feedback/connectivity_checker.cc +++ b/chrome/browser/android/feedback/connectivity_checker.cc
@@ -94,13 +94,13 @@ base::android::ScopedJavaGlobalRef<jobject> java_callback_; // The URLFetcher that executes the connectivity check. - scoped_ptr<net::URLFetcher> url_fetcher_; + std::unique_ptr<net::URLFetcher> url_fetcher_; // Whether |this| is already being destroyed, at which point the callback // has already happened, and no further action should be taken. bool is_being_destroyed_; - scoped_ptr<base::OneShotTimer> expiration_timer_; + std::unique_ptr<base::OneShotTimer> expiration_timer_; }; void ConnectivityChecker::OnURLFetchComplete(const net::URLFetcher* source) {
diff --git a/chrome/browser/android/foreign_session_helper.cc b/chrome/browser/android/foreign_session_helper.cc index 0a6d0d1..0cfeba0 100644 --- a/chrome/browser/android/foreign_session_helper.cc +++ b/chrome/browser/android/foreign_session_helper.cc
@@ -230,7 +230,7 @@ DictionaryPrefUpdate pref_update(profile_->GetPrefs(), prefs::kNtpCollapsedForeignSessions); base::DictionaryValue* pref_collapsed_sessions = pref_update.Get(); - scoped_ptr<base::DictionaryValue> collapsed_sessions( + std::unique_ptr<base::DictionaryValue> collapsed_sessions( pref_collapsed_sessions->DeepCopy()); pref_collapsed_sessions->Clear();
diff --git a/chrome/browser/android/fullscreen/fullscreen_infobar_delegate.cc b/chrome/browser/android/fullscreen/fullscreen_infobar_delegate.cc index 074333e..bf31c3a3 100644 --- a/chrome/browser/android/fullscreen/fullscreen_infobar_delegate.cc +++ b/chrome/browser/android/fullscreen/fullscreen_infobar_delegate.cc
@@ -4,8 +4,10 @@ #include "chrome/browser/android/fullscreen/fullscreen_infobar_delegate.h" +#include <memory> + #include "base/android/jni_string.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "chrome/browser/android/android_theme_resources.h" #include "chrome/browser/android/tab_android.h" #include "chrome/browser/infobars/infobar_service.h" @@ -28,7 +30,7 @@ InfoBarService* infobar_service = InfoBarService::FromWebContents(tab_android->web_contents()); infobar_service->AddInfoBar( - infobar_service->CreateConfirmInfoBar(make_scoped_ptr(delegate))); + infobar_service->CreateConfirmInfoBar(base::WrapUnique(delegate))); return reinterpret_cast<intptr_t>(delegate); }
diff --git a/chrome/browser/android/history_report/data_provider.cc b/chrome/browser/android/history_report/data_provider.cc index 73c84354..7cada3a8 100644 --- a/chrome/browser/android/history_report/data_provider.cc +++ b/chrome/browser/android/history_report/data_provider.cc
@@ -87,7 +87,7 @@ base::WaitableEvent* finished, base::CancelableTaskTracker* task_tracker) { history_service->ScheduleDBTask( - scoped_ptr<history::HistoryDBTask>( + std::unique_ptr<history::HistoryDBTask>( new history_report::HistoricVisitsMigrationTask(finished, buffer_service)), task_tracker); @@ -108,13 +108,13 @@ DataProvider::~DataProvider() {} -scoped_ptr<std::vector<DeltaFileEntryWithData>> DataProvider::Query( +std::unique_ptr<std::vector<DeltaFileEntryWithData>> DataProvider::Query( int64_t last_seq_no, int32_t limit) { if (last_seq_no == 0) RecreateLog(); - scoped_ptr<std::vector<DeltaFileEntryWithData> > entries; - scoped_ptr<std::vector<DeltaFileEntryWithData> > valid_entries; + std::unique_ptr<std::vector<DeltaFileEntryWithData>> entries; + std::unique_ptr<std::vector<DeltaFileEntryWithData>> valid_entries; do { entries = delta_file_service_->Query(last_seq_no, limit); if (!entries->empty()) { @@ -174,9 +174,9 @@ { base::WaitableEvent finished(false, false); - scoped_ptr<history::HistoryDBTask> task = - scoped_ptr<history::HistoryDBTask>(new GetAllUrlsFromHistoryTask( - &finished, &urls)); + std::unique_ptr<history::HistoryDBTask> task = + std::unique_ptr<history::HistoryDBTask>( + new GetAllUrlsFromHistoryTask(&finished, &urls)); content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, base::Bind(base::IgnoreResult(&history::HistoryService::ScheduleDBTask),
diff --git a/chrome/browser/android/history_report/data_provider.h b/chrome/browser/android/history_report/data_provider.h index 5e8f558..814b962 100644 --- a/chrome/browser/android/history_report/data_provider.h +++ b/chrome/browser/android/history_report/data_provider.h
@@ -7,10 +7,10 @@ #include <stdint.h> +#include <memory> #include <vector> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" class Profile; @@ -38,8 +38,9 @@ ~DataProvider(); // Provides up to limit delta file entries with sequence number > last_seq_no. - scoped_ptr<std::vector<DeltaFileEntryWithData>> Query(int64_t last_seq_no, - int32_t limit); + std::unique_ptr<std::vector<DeltaFileEntryWithData>> Query( + int64_t last_seq_no, + int32_t limit); void StartVisitMigrationToUsageBuffer( UsageReportsBufferService* buffer_service);
diff --git a/chrome/browser/android/history_report/delta_file_backend_leveldb.cc b/chrome/browser/android/history_report/delta_file_backend_leveldb.cc index d7b8b46..b9f04e3 100644 --- a/chrome/browser/android/history_report/delta_file_backend_leveldb.cc +++ b/chrome/browser/android/history_report/delta_file_backend_leveldb.cc
@@ -5,8 +5,10 @@ #include "chrome/browser/android/history_report/delta_file_backend_leveldb.h" #include <inttypes.h> + #include "base/files/file_util.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "chrome/browser/android/history_report/delta_file_commons.h" @@ -25,7 +27,7 @@ int64_t GetLastSeqNo(leveldb::DB* db) { leveldb::ReadOptions options; - scoped_ptr<leveldb::Iterator> db_iter(db->NewIterator(options)); + std::unique_ptr<leveldb::Iterator> db_iter(db->NewIterator(options)); db_iter->SeekToLast(); int64_t seq_no = 0; if (db_iter->Valid()) { @@ -128,7 +130,7 @@ int64_t DeltaFileBackend::Trim(int64_t lower_bound) { if (!EnsureInitialized()) return -1; leveldb::ReadOptions read_options; - scoped_ptr<leveldb::Iterator> db_iter(db_->NewIterator(read_options)); + std::unique_ptr<leveldb::Iterator> db_iter(db_->NewIterator(read_options)); db_iter->SeekToFirst(); if (!db_iter->Valid()) return -1; @@ -190,16 +192,16 @@ return false; } -scoped_ptr<std::vector<DeltaFileEntryWithData>> DeltaFileBackend::Query( +std::unique_ptr<std::vector<DeltaFileEntryWithData>> DeltaFileBackend::Query( int64_t last_seq_no, int32_t limit) { if (!EnsureInitialized()) - return make_scoped_ptr(new std::vector<DeltaFileEntryWithData>()); + return base::WrapUnique(new std::vector<DeltaFileEntryWithData>()); std::string start; base::SStringPrintf(&start, "%" PRId64, last_seq_no + 1); leveldb::ReadOptions options; - scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result( + std::unique_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result( new std::vector<DeltaFileEntryWithData>()); int32_t count = 0; for (db_it->Seek(start); db_it->Valid() && count < limit; db_it->Next()) { @@ -228,7 +230,7 @@ } dump.append("num pending entries="); leveldb::ReadOptions options; - scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); + std::unique_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); int num_entries = 0; for (db_it->SeekToFirst(); db_it->Valid(); db_it->Next()) num_entries++; dump.append(base::IntToString(num_entries));
diff --git a/chrome/browser/android/history_report/delta_file_backend_leveldb.h b/chrome/browser/android/history_report/delta_file_backend_leveldb.h index d4295d9..bb0def0 100644 --- a/chrome/browser/android/history_report/delta_file_backend_leveldb.h +++ b/chrome/browser/android/history_report/delta_file_backend_leveldb.h
@@ -7,11 +7,11 @@ #include <stdint.h> +#include <memory> #include <vector> #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" class GURL; @@ -41,8 +41,9 @@ bool Recreate(const std::vector<std::string>& urls); // Provides up to |limit| delta file entries with // sequence number > |last_seq_no|. - scoped_ptr<std::vector<DeltaFileEntryWithData>> Query(int64_t last_seq_no, - int32_t limit); + std::unique_ptr<std::vector<DeltaFileEntryWithData>> Query( + int64_t last_seq_no, + int32_t limit); // Removes all entries from delta file void Clear(); @@ -58,8 +59,8 @@ class DigitsComparator; base::FilePath path_; - scoped_ptr<leveldb::DB> db_; - scoped_ptr<DigitsComparator> leveldb_cmp_; + std::unique_ptr<leveldb::DB> db_; + std::unique_ptr<DigitsComparator> leveldb_cmp_; DISALLOW_COPY_AND_ASSIGN(DeltaFileBackend); };
diff --git a/chrome/browser/android/history_report/delta_file_backend_leveldb_unittest.cc b/chrome/browser/android/history_report/delta_file_backend_leveldb_unittest.cc index f01d556e..d98b1a18 100644 --- a/chrome/browser/android/history_report/delta_file_backend_leveldb_unittest.cc +++ b/chrome/browser/android/history_report/delta_file_backend_leveldb_unittest.cc
@@ -6,12 +6,12 @@ #include <stdint.h> +#include <memory> #include <vector> #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/history_report/delta_file_commons.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -29,7 +29,7 @@ backend_.reset(new DeltaFileBackend(temp_dir_.path())); } - scoped_ptr<DeltaFileBackend> backend_; + std::unique_ptr<DeltaFileBackend> backend_; private: base::ScopedTempDir temp_dir_; @@ -40,7 +40,7 @@ TEST_F(DeltaFileBackendTest, AddPage) { GURL test_url("test.org"); backend_->PageAdded(test_url); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(1u, result->size()); @@ -53,7 +53,7 @@ TEST_F(DeltaFileBackendTest, DelPage) { GURL test_url("test.org"); backend_->PageDeleted(test_url); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(1u, result->size()); @@ -76,7 +76,7 @@ urls.push_back("test.org"); urls.push_back("test2.org"); EXPECT_TRUE(backend_->Recreate(urls)); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(2u, result->size()); @@ -100,7 +100,7 @@ backend_->PageDeleted(test_url); backend_->Clear(); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(0u, result->size()); @@ -116,7 +116,7 @@ backend_->PageDeleted(test_url); // Skip first entry (start with sequence number == 2). - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(1, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(4u, result->size()); @@ -137,7 +137,7 @@ backend_->PageDeleted(test_url); // Query for up to 3 results. - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 3); EXPECT_TRUE(result.get() != NULL); // Check that we got exactly 3 results @@ -160,7 +160,7 @@ // Trim all entries with sequence number <= 3. int64_t max_seq_no = backend_->Trim(3); EXPECT_EQ(5, max_seq_no); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(2u, result->size()); @@ -184,7 +184,7 @@ // in delta file. int64_t max_seq_no = backend_->Trim(5); EXPECT_EQ(5, max_seq_no); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(1u, result->size()); @@ -207,7 +207,7 @@ // in delta file. int64_t max_seq_no = backend_->Trim(6); EXPECT_EQ(5, max_seq_no); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(1u, result->size()); @@ -226,7 +226,7 @@ // in delta file. int64_t max_seq_no = backend_->Trim(1); EXPECT_EQ(1, max_seq_no); - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(0, 10); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(1u, result->size()); @@ -245,7 +245,7 @@ } // Skip first entry (start with sequence number == 2). - scoped_ptr<std::vector<DeltaFileEntryWithData> > result = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result = backend_->Query(1, 100); EXPECT_TRUE(result.get() != NULL); EXPECT_EQ(49u, result->size());
diff --git a/chrome/browser/android/history_report/delta_file_service.cc b/chrome/browser/android/history_report/delta_file_service.cc index 9af69e1..c542177 100644 --- a/chrome/browser/android/history_report/delta_file_service.cc +++ b/chrome/browser/android/history_report/delta_file_service.cc
@@ -30,12 +30,12 @@ finished->Signal(); } -void DoQuery( - history_report::DeltaFileBackend* backend, - int64_t last_seq_no, - int32_t limit, - base::WaitableEvent* finished, - scoped_ptr<std::vector<history_report::DeltaFileEntryWithData>>* result) { +void DoQuery(history_report::DeltaFileBackend* backend, + int64_t last_seq_no, + int32_t limit, + base::WaitableEvent* finished, + std::unique_ptr< + std::vector<history_report::DeltaFileEntryWithData>>* result) { *result = backend->Query(last_seq_no, limit); finished->Signal(); } @@ -111,10 +111,10 @@ return result; } -scoped_ptr<std::vector<DeltaFileEntryWithData>> DeltaFileService::Query( +std::unique_ptr<std::vector<DeltaFileEntryWithData>> DeltaFileService::Query( int64_t last_seq_no, int32_t limit) { - scoped_ptr<std::vector<DeltaFileEntryWithData> > result; + std::unique_ptr<std::vector<DeltaFileEntryWithData>> result; base::WaitableEvent finished(false, false); base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); pool->PostSequencedWorkerTaskWithShutdownBehavior(
diff --git a/chrome/browser/android/history_report/delta_file_service.h b/chrome/browser/android/history_report/delta_file_service.h index dda4e86..63425142 100644 --- a/chrome/browser/android/history_report/delta_file_service.h +++ b/chrome/browser/android/history_report/delta_file_service.h
@@ -7,11 +7,11 @@ #include <stdint.h> +#include <memory> #include <string> #include <vector> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/sequenced_worker_pool.h" class GURL; @@ -42,8 +42,9 @@ // entries for given urls. bool Recreate(const std::vector<std::string>& urls); // Provides up to limit delta file entries with seqno > last_seq_no. - scoped_ptr<std::vector<DeltaFileEntryWithData>> Query(int64_t last_seq_no, - int32_t limit); + std::unique_ptr<std::vector<DeltaFileEntryWithData>> Query( + int64_t last_seq_no, + int32_t limit); // Removes all entries from delta file. void Clear(); @@ -53,7 +54,7 @@ private: base::SequencedWorkerPool::SequenceToken worker_pool_token_; - scoped_ptr<DeltaFileBackend> delta_file_backend_; + std::unique_ptr<DeltaFileBackend> delta_file_backend_; DISALLOW_COPY_AND_ASSIGN(DeltaFileService); };
diff --git a/chrome/browser/android/history_report/history_report_jni_bridge.cc b/chrome/browser/android/history_report/history_report_jni_bridge.cc index 86d2456..ee8d0a04 100644 --- a/chrome/browser/android/history_report/history_report_jni_bridge.cc +++ b/chrome/browser/android/history_report/history_report_jni_bridge.cc
@@ -87,7 +87,7 @@ const JavaParamRef<jobject>& obj, jlong last_seq_no, jint limit) { - scoped_ptr<std::vector<DeltaFileEntryWithData> > entries = + std::unique_ptr<std::vector<DeltaFileEntryWithData>> entries = data_provider_->Query(last_seq_no, limit); ScopedJavaLocalRef<jobjectArray> jentries_array = history_report::Java_HistoryReportJniBridge_createDeltaFileEntriesArray( @@ -119,7 +119,7 @@ HistoryReportJniBridge::GetUsageReportsBatch(JNIEnv* env, const JavaParamRef<jobject>& obj, jint batch_size) { - scoped_ptr<std::vector<UsageReport> > reports = + std::unique_ptr<std::vector<UsageReport>> reports = usage_reports_buffer_service_->GetUsageReportsBatch(batch_size); ScopedJavaLocalRef<jobjectArray> jreports_array = history_report::Java_HistoryReportJniBridge_createUsageReportsArray(env,
diff --git a/chrome/browser/android/history_report/history_report_jni_bridge.h b/chrome/browser/android/history_report/history_report_jni_bridge.h index 7251817..ec77d4f 100644 --- a/chrome/browser/android/history_report/history_report_jni_bridge.h +++ b/chrome/browser/android/history_report/history_report_jni_bridge.h
@@ -6,12 +6,13 @@ #define CHROME_BROWSER_ANDROID_HISTORY_REPORT_HISTORY_REPORT_JNI_BRIDGE_H_ #include <jni.h> + +#include <memory> #include <string> #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace bookmarks { class BookmarkModel; @@ -71,11 +72,11 @@ private: JavaObjectWeakGlobalRef weak_java_provider_; - scoped_ptr<DataObserver> data_observer_; - scoped_ptr<DataProvider> data_provider_; - scoped_ptr<DeltaFileService> delta_file_service_; - scoped_ptr<bookmarks::BookmarkModel> bookmark_model_; - scoped_ptr<UsageReportsBufferService> usage_reports_buffer_service_; + std::unique_ptr<DataObserver> data_observer_; + std::unique_ptr<DataProvider> data_provider_; + std::unique_ptr<DeltaFileService> delta_file_service_; + std::unique_ptr<bookmarks::BookmarkModel> bookmark_model_; + std::unique_ptr<UsageReportsBufferService> usage_reports_buffer_service_; DISALLOW_COPY_AND_ASSIGN(HistoryReportJniBridge); };
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_backend.cc b/chrome/browser/android/history_report/usage_reports_buffer_backend.cc index 36c1ca87..c8214a0 100644 --- a/chrome/browser/android/history_report/usage_reports_buffer_backend.cc +++ b/chrome/browser/android/history_report/usage_reports_buffer_backend.cc
@@ -77,15 +77,16 @@ LOG(WARNING) << "AddVisit failed " << status.ToString(); } -scoped_ptr<std::vector<UsageReport> > +std::unique_ptr<std::vector<UsageReport>> UsageReportsBufferBackend::GetUsageReportsBatch(int batch_size) { - scoped_ptr<std::vector<UsageReport> > reports(new std::vector<UsageReport>()); + std::unique_ptr<std::vector<UsageReport>> reports( + new std::vector<UsageReport>()); if (!db_.get()) { return reports; } reports->reserve(batch_size); leveldb::ReadOptions options; - scoped_ptr<leveldb::Iterator> db_iter(db_->NewIterator(options)); + std::unique_ptr<leveldb::Iterator> db_iter(db_->NewIterator(options)); db_iter->SeekToFirst(); while (batch_size > 0 && db_iter->Valid()) { history_report::UsageReport last_report; @@ -135,7 +136,7 @@ dump.append("num pending entries="); leveldb::ReadOptions options; int num_entries = 0; - scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); + std::unique_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); for (db_it->SeekToFirst(); db_it->Valid(); db_it->Next()) num_entries++; dump.append(base::IntToString(num_entries)); dump.append("]");
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_backend.h b/chrome/browser/android/history_report/usage_reports_buffer_backend.h index 3c275a15..3f3b120 100644 --- a/chrome/browser/android/history_report/usage_reports_buffer_backend.h +++ b/chrome/browser/android/history_report/usage_reports_buffer_backend.h
@@ -7,12 +7,12 @@ #include <stdint.h> +#include <memory> #include <string> #include <vector> #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace base { class FilePath; @@ -39,7 +39,7 @@ void AddVisit(const std::string& id, int64_t timestamp_ms, bool typed_visit); // Returns a set of up to |amount| usage reports. - scoped_ptr<std::vector<UsageReport> > GetUsageReportsBatch(int amount); + std::unique_ptr<std::vector<UsageReport>> GetUsageReportsBatch(int amount); void Remove(const std::vector<std::string>& reports); @@ -51,7 +51,7 @@ private: // NULL until Init method is called. - scoped_ptr<leveldb::DB> db_; + std::unique_ptr<leveldb::DB> db_; base::FilePath db_file_name_; DISALLOW_COPY_AND_ASSIGN(UsageReportsBufferBackend);
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_backend_unittest.cc b/chrome/browser/android/history_report/usage_reports_buffer_backend_unittest.cc index 16a3b04f..4eab218 100644 --- a/chrome/browser/android/history_report/usage_reports_buffer_backend_unittest.cc +++ b/chrome/browser/android/history_report/usage_reports_buffer_backend_unittest.cc
@@ -6,10 +6,11 @@ #include <stdint.h> +#include <memory> + #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/history_report/usage_report_util.h" #include "chrome/browser/android/proto/delta_file.pb.h" #include "testing/gtest/include/gtest/gtest.h" @@ -39,7 +40,7 @@ EXPECT_TRUE(buffer_->Init()); } - scoped_ptr<UsageReportsBufferBackend> buffer_; + std::unique_ptr<UsageReportsBufferBackend> buffer_; base::ScopedTempDir temp_dir_; private: @@ -49,7 +50,7 @@ TEST_F(UsageReportsBufferBackendTest, AddTypedVisit) { buffer_->AddVisit("id", 7, true); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(1); EXPECT_TRUE(result.get() != NULL); @@ -60,7 +61,7 @@ TEST_F(UsageReportsBufferBackendTest, AddNotTypedVisit) { buffer_->AddVisit("id", 7, false); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(1); EXPECT_TRUE(result.get() != NULL); @@ -74,7 +75,7 @@ buffer_->AddVisit("id3", 12, false); buffer_->AddVisit("id4", 5, true); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(5); EXPECT_TRUE(result.get() != NULL); @@ -111,7 +112,7 @@ buffer_->AddVisit("id3", 12, false); buffer_->AddVisit("id4", 5, true); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(3); EXPECT_TRUE(result.get() != NULL); @@ -145,7 +146,7 @@ TEST_F(UsageReportsBufferBackendTest, Remove) { buffer_->AddVisit("id", 7, true); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(1); EXPECT_TRUE(result.get() != NULL); @@ -179,7 +180,7 @@ TEST_F(UsageReportsBufferBackendTest, Persistence) { buffer_->AddVisit("id", 7, true); - scoped_ptr<std::vector<UsageReport> > result = + std::unique_ptr<std::vector<UsageReport>> result = buffer_->GetUsageReportsBatch(2); EXPECT_TRUE(result.get() != NULL);
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_service.cc b/chrome/browser/android/history_report/usage_reports_buffer_service.cc index 6cbc01c..a83df10c 100644 --- a/chrome/browser/android/history_report/usage_reports_buffer_service.cc +++ b/chrome/browser/android/history_report/usage_reports_buffer_service.cc
@@ -36,7 +36,7 @@ history_report::UsageReportsBufferBackend* backend, int32_t batch_size, base::WaitableEvent* finished, - scoped_ptr<std::vector<history_report::UsageReport>>* result) { + std::unique_ptr<std::vector<history_report::UsageReport>>* result) { *result = backend->GetUsageReportsBatch(batch_size); finished->Signal(); } @@ -93,9 +93,9 @@ base::SequencedWorkerPool::BLOCK_SHUTDOWN); } -scoped_ptr<std::vector<UsageReport>> +std::unique_ptr<std::vector<UsageReport>> UsageReportsBufferService::GetUsageReportsBatch(int32_t batch_size) { - scoped_ptr<std::vector<UsageReport> > result; + std::unique_ptr<std::vector<UsageReport>> result; base::WaitableEvent finished(false, false); base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); // It's ok to pass unretained pointers here because this is a synchronous
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_service.h b/chrome/browser/android/history_report/usage_reports_buffer_service.h index 2c8bdaef..da459c5 100644 --- a/chrome/browser/android/history_report/usage_reports_buffer_service.h +++ b/chrome/browser/android/history_report/usage_reports_buffer_service.h
@@ -7,11 +7,11 @@ #include <stdint.h> +#include <memory> #include <string> #include <vector> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/sequenced_worker_pool.h" namespace base { @@ -38,7 +38,8 @@ void AddVisit(const std::string& id, int64_t timestamp_ms, bool typed_visit); // Get a batch of usage reports of size up to |batch_size|. It's synchronous. - scoped_ptr<std::vector<UsageReport>> GetUsageReportsBatch(int32_t batch_size); + std::unique_ptr<std::vector<UsageReport>> GetUsageReportsBatch( + int32_t batch_size); // Remove given usage reports from buffer. It's synchronous. void Remove(const std::vector<std::string>& report_ids); @@ -53,7 +54,7 @@ // Token used to serialize buffer operations. base::SequencedWorkerPool::SequenceToken worker_pool_token_; // Non thread safe backend. - scoped_ptr<UsageReportsBufferBackend> backend_; + std::unique_ptr<UsageReportsBufferBackend> backend_; DISALLOW_COPY_AND_ASSIGN(UsageReportsBufferService); };
diff --git a/chrome/browser/android/hung_renderer_infobar_delegate.cc b/chrome/browser/android/hung_renderer_infobar_delegate.cc index ffdbbc0..8acdfa0 100644 --- a/chrome/browser/android/hung_renderer_infobar_delegate.cc +++ b/chrome/browser/android/hung_renderer_infobar_delegate.cc
@@ -19,8 +19,8 @@ InfoBarService* infobar_service, content::RenderProcessHost* render_process_host) { DCHECK(render_process_host); - infobar_service->AddInfoBar( - infobar_service->CreateConfirmInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( + infobar_service->AddInfoBar(infobar_service->CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate>( new HungRendererInfoBarDelegate(render_process_host)))); }
diff --git a/chrome/browser/android/large_icon_bridge.h b/chrome/browser/android/large_icon_bridge.h index 3160b13..955c7f7 100644 --- a/chrome/browser/android/large_icon_bridge.h +++ b/chrome/browser/android/large_icon_bridge.h
@@ -7,9 +7,10 @@ #include <jni.h> +#include <memory> + #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" // The C++ counterpart to Java's LargeIconBridge. Together these classes expose
diff --git a/chrome/browser/android/location_settings_impl.h b/chrome/browser/android/location_settings_impl.h index 46d962a4..8391912 100644 --- a/chrome/browser/android/location_settings_impl.h +++ b/chrome/browser/android/location_settings_impl.h
@@ -5,10 +5,11 @@ #ifndef CHROME_BROWSER_ANDROID_LOCATION_SETTINGS_IMPL_H_ #define CHROME_BROWSER_ANDROID_LOCATION_SETTINGS_IMPL_H_ +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/location_settings.h" class LocationSettingsImpl : public LocationSettings {
diff --git a/chrome/browser/android/logo_bridge.h b/chrome/browser/android/logo_bridge.h index a5f1edc..83ba4d8 100644 --- a/chrome/browser/android/logo_bridge.h +++ b/chrome/browser/android/logo_bridge.h
@@ -48,7 +48,7 @@ // The URLFetcher currently fetching the animated logo. NULL when not // fetching. - scoped_ptr<net::URLFetcher> fetcher_; + std::unique_ptr<net::URLFetcher> fetcher_; // The timestamp for the last time the animated logo started downloading. base::TimeTicks animated_logo_download_start_time_;
diff --git a/chrome/browser/android/logo_service.cc b/chrome/browser/android/logo_service.cc index c6f16b9..ff639514 100644 --- a/chrome/browser/android/logo_service.cc +++ b/chrome/browser/android/logo_service.cc
@@ -116,9 +116,8 @@ logo_tracker_.reset(new LogoTracker( profile_->GetPath().Append(kCachedLogoDirectory), BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE), - BrowserThread::GetBlockingPool(), - profile_->GetRequestContext(), - scoped_ptr<search_provider_logos::LogoDelegate>( + BrowserThread::GetBlockingPool(), profile_->GetRequestContext(), + std::unique_ptr<search_provider_logos::LogoDelegate>( new ChromeLogoDelegate()))); }
diff --git a/chrome/browser/android/logo_service.h b/chrome/browser/android/logo_service.h index 6a89e4c..de9f551 100644 --- a/chrome/browser/android/logo_service.h +++ b/chrome/browser/android/logo_service.h
@@ -31,7 +31,7 @@ private: Profile* profile_; - scoped_ptr<search_provider_logos::LogoTracker> logo_tracker_; + std::unique_ptr<search_provider_logos::LogoTracker> logo_tracker_; DISALLOW_COPY_AND_ASSIGN(LogoService); };
diff --git a/chrome/browser/android/media/media_throttle_infobar_delegate.cc b/chrome/browser/android/media/media_throttle_infobar_delegate.cc index b7c7987..d646722 100644 --- a/chrome/browser/android/media/media_throttle_infobar_delegate.cc +++ b/chrome/browser/android/media/media_throttle_infobar_delegate.cc
@@ -23,9 +23,10 @@ const DecodeRequestGrantedCallback& callback) { InfoBarService* infobar_service = InfoBarService::FromWebContents(web_contents); - scoped_ptr<infobars::InfoBar> new_infobar( - infobar_service->CreateConfirmInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( - new MediaThrottleInfoBarDelegate(callback)))); + std::unique_ptr<infobars::InfoBar> new_infobar( + infobar_service->CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate>( + new MediaThrottleInfoBarDelegate(callback)))); for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { infobars::InfoBar* old_infobar = infobar_service->infobar_at(i);
diff --git a/chrome/browser/android/metrics/uma_session_stats.h b/chrome/browser/android/metrics/uma_session_stats.h index ea5ed70a..391ed24 100644 --- a/chrome/browser/android/metrics/uma_session_stats.h +++ b/chrome/browser/android/metrics/uma_session_stats.h
@@ -7,11 +7,12 @@ #include <jni.h> #include <stdint.h> + +#include <memory> #include <string> #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/time/time.h" class UserActionRateCounter;
diff --git a/chrome/browser/android/net/external_estimate_provider_android_unittest.cc b/chrome/browser/android/net/external_estimate_provider_android_unittest.cc index b5205816..1cb913b 100644 --- a/chrome/browser/android/net/external_estimate_provider_android_unittest.cc +++ b/chrome/browser/android/net/external_estimate_provider_android_unittest.cc
@@ -10,6 +10,7 @@ #include "base/at_exit.h" #include "base/test/histogram_tester.h" #include "base/time/time.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "net/base/network_quality_estimator.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,7 +37,7 @@ class TestNetworkQualityEstimator : public net::NetworkQualityEstimator { public: TestNetworkQualityEstimator( - scoped_ptr<chrome::android::ExternalEstimateProviderAndroid> + std::unique_ptr<chrome::android::ExternalEstimateProviderAndroid> external_estimate_provider, const std::map<std::string, std::string>& variation_params) : NetworkQualityEstimator(std::move(external_estimate_provider), @@ -74,9 +75,13 @@ // Tests if the |ExternalEstimateProviderAndroid| notifies // |NetworkQualityEstimator|. TEST(ExternalEstimateProviderAndroidTest, DelegateTest) { + content::TestBrowserThreadBundle thread_bundle( + content::TestBrowserThreadBundle::IO_MAINLOOP); + base::ShadowingAtExitManager at_exit_manager; base::HistogramTester histogram_tester; - scoped_ptr<TestExternalEstimateProviderAndroid> external_estimate_provider; + std::unique_ptr<TestExternalEstimateProviderAndroid> + external_estimate_provider; external_estimate_provider.reset(new TestExternalEstimateProviderAndroid()); TestExternalEstimateProviderAndroid* ptr = external_estimate_provider.get();
diff --git a/chrome/browser/android/ntp/most_visited_sites.cc b/chrome/browser/android/ntp/most_visited_sites.cc index 1d5d4cbf..aa7f5dd1 100644 --- a/chrome/browser/android/ntp/most_visited_sites.cc +++ b/chrome/browser/android/ntp/most_visited_sites.cc
@@ -86,12 +86,12 @@ NUM_TILE_TYPES, }; -scoped_ptr<SkBitmap> MaybeFetchLocalThumbnail( +std::unique_ptr<SkBitmap> MaybeFetchLocalThumbnail( const GURL& url, const scoped_refptr<TopSites>& top_sites) { DCHECK_CURRENTLY_ON(BrowserThread::DB); scoped_refptr<base::RefCountedMemory> image; - scoped_ptr<SkBitmap> bitmap; + std::unique_ptr<SkBitmap> bitmap; if (top_sites && top_sites->GetPageThumbnail(url, false, &image)) bitmap.reset(gfx::JPEGCodec::Decode(image->front(), image->size())); return bitmap; @@ -262,7 +262,7 @@ const JavaParamRef<jstring>& j_url, const JavaParamRef<jobject>& j_callback_obj) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback( + std::unique_ptr<ScopedJavaGlobalRef<jobject>> j_callback( new ScopedJavaGlobalRef<jobject>()); j_callback->Reset(env, j_callback_obj); @@ -279,8 +279,8 @@ void MostVisitedSites::OnLocalThumbnailFetched( const GURL& url, - scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback, - scoped_ptr<SkBitmap> bitmap) { + std::unique_ptr<ScopedJavaGlobalRef<jobject>> j_callback, + std::unique_ptr<SkBitmap> bitmap) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!bitmap.get()) { // A thumbnail is not locally available for |url|. Make sure it is put in @@ -317,7 +317,7 @@ void MostVisitedSites::OnObtainedThumbnail( bool is_local_thumbnail, - scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback, + std::unique_ptr<ScopedJavaGlobalRef<jobject>> j_callback, const GURL& url, const SkBitmap* bitmap) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -473,7 +473,7 @@ continue; } - scoped_ptr<Suggestion> suggestion(new Suggestion()); + std::unique_ptr<Suggestion> suggestion(new Suggestion()); suggestion->title = visited.title; suggestion->url = visited.url; suggestion->source = TOP_SITES; @@ -510,7 +510,7 @@ continue; } - scoped_ptr<Suggestion> generated_suggestion(new Suggestion()); + std::unique_ptr<Suggestion> generated_suggestion(new Suggestion()); generated_suggestion->title = base::UTF8ToUTF16(suggestion.title()); generated_suggestion->url = GURL(suggestion.url()); generated_suggestion->source = SUGGESTIONS_SERVICE; @@ -563,7 +563,7 @@ continue; } - scoped_ptr<Suggestion> suggestion(new Suggestion()); + std::unique_ptr<Suggestion> suggestion(new Suggestion()); suggestion->title = whitelist->title(); suggestion->url = whitelist->entry_point(); suggestion->source = WHITELIST; @@ -610,7 +610,7 @@ if (hosts.find(host) != hosts.end()) continue; - scoped_ptr<Suggestion> suggestion(new Suggestion()); + std::unique_ptr<Suggestion> suggestion(new Suggestion()); suggestion->title = popular_site.title; suggestion->url = GURL(popular_site.url); suggestion->source = POPULAR; @@ -774,8 +774,8 @@ size_t MostVisitedSites::InsertAllSuggestions( size_t start_position, const std::vector<size_t>& insert_positions, - std::vector<scoped_ptr<Suggestion>>* src_suggestions, - std::vector<scoped_ptr<Suggestion>>* dst_suggestions) { + std::vector<std::unique_ptr<Suggestion>>* src_suggestions, + std::vector<std::unique_ptr<Suggestion>>* dst_suggestions) { size_t num_inserts = insert_positions.size(); size_t num_dests = dst_suggestions->size();
diff --git a/chrome/browser/android/ntp/most_visited_sites.h b/chrome/browser/android/ntp/most_visited_sites.h index 2b813ef..548db8c3 100644 --- a/chrome/browser/android/ntp/most_visited_sites.h +++ b/chrome/browser/android/ntp/most_visited_sites.h
@@ -8,6 +8,7 @@ #include <jni.h> #include <stddef.h> +#include <memory> #include <string> #include <vector> @@ -15,7 +16,6 @@ #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" #include "chrome/browser/supervised_user/supervised_user_service.h" @@ -103,7 +103,7 @@ DISALLOW_COPY_AND_ASSIGN(Suggestion); }; - using SuggestionsVector = std::vector<scoped_ptr<Suggestion>>; + using SuggestionsVector = std::vector<std::unique_ptr<Suggestion>>; ~MostVisitedSites() override; void QueryMostVisitedURLs(); @@ -182,14 +182,14 @@ // Runs on the UI Thread. void OnLocalThumbnailFetched( const GURL& url, - scoped_ptr<base::android::ScopedJavaGlobalRef<jobject>> j_callback, - scoped_ptr<SkBitmap> bitmap); + std::unique_ptr<base::android::ScopedJavaGlobalRef<jobject>> j_callback, + std::unique_ptr<SkBitmap> bitmap); // Callback for when the thumbnail lookup is complete. // Runs on the UI Thread. void OnObtainedThumbnail( bool is_local_thumbnail, - scoped_ptr<base::android::ScopedJavaGlobalRef<jobject>> j_callback, + std::unique_ptr<base::android::ScopedJavaGlobalRef<jobject>> j_callback, const GURL& url, const SkBitmap* bitmap); @@ -225,7 +225,7 @@ // recorded once both the previous flags are true. bool recorded_uma_; - scoped_ptr< + std::unique_ptr< suggestions::SuggestionsService::ResponseCallbackList::Subscription> suggestions_subscription_; @@ -233,7 +233,7 @@ MostVisitedSource mv_source_; - scoped_ptr<PopularSites> popular_sites_; + std::unique_ptr<PopularSites> popular_sites_; SuggestionsVector current_suggestions_;
diff --git a/chrome/browser/android/ntp/most_visited_sites_unittest.cc b/chrome/browser/android/ntp/most_visited_sites_unittest.cc index 22f12a49..6afdd8c 100644 --- a/chrome/browser/android/ntp/most_visited_sites_unittest.cc +++ b/chrome/browser/android/ntp/most_visited_sites_unittest.cc
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/android/ntp/most_visited_sites.h" + #include <stddef.h> +#include <memory> #include <vector> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/android/ntp/most_visited_sites.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -77,12 +79,12 @@ EXPECT_EQ(result_is_personal, expected_sites_is_personal); EXPECT_EQ(result_sites, expected_sites); } - static scoped_ptr<MostVisitedSites::Suggestion> MakeSuggestionFrom( + static std::unique_ptr<MostVisitedSites::Suggestion> MakeSuggestionFrom( const TitleURL& title_url, bool is_personal, bool whitelist) { - scoped_ptr<MostVisitedSites::Suggestion> suggestion = - make_scoped_ptr(new MostVisitedSites::Suggestion()); + std::unique_ptr<MostVisitedSites::Suggestion> suggestion = + base::WrapUnique(new MostVisitedSites::Suggestion()); suggestion->title = title_url.title; suggestion->url = GURL(title_url.url); suggestion->source = whitelist ? MostVisitedSites::WHITELIST
diff --git a/chrome/browser/android/ntp/popular_sites.cc b/chrome/browser/android/ntp/popular_sites.cc index 0a2255f7..6885eef3 100644 --- a/chrome/browser/android/ntp/popular_sites.cc +++ b/chrome/browser/android/ntp/popular_sites.cc
@@ -121,7 +121,7 @@ return dir.AppendASCII(kPopularSitesLocalFilename); } -scoped_ptr<std::vector<PopularSites::Site>> ReadAndParseJsonFile( +std::unique_ptr<std::vector<PopularSites::Site>> ReadAndParseJsonFile( const base::FilePath& path) { std::string json; if (!base::ReadFileToString(path, &json)) { @@ -129,7 +129,7 @@ return nullptr; } - scoped_ptr<base::Value> value = + std::unique_ptr<base::Value> value = base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); base::ListValue* list; if (!value || !value->GetAsList(&list)) { @@ -137,7 +137,7 @@ return nullptr; } - scoped_ptr<std::vector<PopularSites::Site>> sites( + std::unique_ptr<std::vector<PopularSites::Site>> sites( new std::vector<PopularSites::Site>); for (size_t i = 0; i < list->GetSize(); i++) { base::DictionaryValue* item; @@ -301,7 +301,7 @@ base::Bind(&PopularSites::OnJsonParsed, weak_ptr_factory_.GetWeakPtr())); } -void PopularSites::OnJsonParsed(scoped_ptr<std::vector<Site>> sites) { +void PopularSites::OnJsonParsed(std::unique_ptr<std::vector<Site>> sites) { if (sites) sites_.swap(*sites); else
diff --git a/chrome/browser/android/ntp/popular_sites.h b/chrome/browser/android/ntp/popular_sites.h index 3735414..c7dd59f5 100644 --- a/chrome/browser/android/ntp/popular_sites.h +++ b/chrome/browser/android/ntp/popular_sites.h
@@ -5,13 +5,13 @@ #ifndef CHROME_BROWSER_ANDROID_NTP_POPULAR_SITES_H_ #define CHROME_BROWSER_ANDROID_NTP_POPULAR_SITES_H_ +#include <memory> #include <string> #include <vector> #include "base/callback.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "chrome/browser/net/file_downloader.h" @@ -102,10 +102,10 @@ void OnDownloadDone(bool is_fallback, FileDownloader::Result result); void ParseSiteList(const base::FilePath& path); - void OnJsonParsed(scoped_ptr<std::vector<Site>> sites); + void OnJsonParsed(std::unique_ptr<std::vector<Site>> sites); FinishedCallback callback_; - scoped_ptr<FileDownloader> downloader_; + std::unique_ptr<FileDownloader> downloader_; std::vector<Site> sites_; std::string pending_country_; std::string pending_version_;
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc index c5021b8..eb212d3 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.cc +++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -4,11 +4,11 @@ #include "chrome/browser/android/offline_pages/offline_page_bridge.h" +#include <memory> #include <utility> #include "base/android/jni_array.h" #include "base/android/jni_string.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" #include "chrome/browser/android/offline_pages/offline_page_utils.h" @@ -226,7 +226,7 @@ content::WebContents::FromJavaWebContents(j_web_contents); GURL url(web_contents->GetLastCommittedURL()); - scoped_ptr<OfflinePageArchiver> archiver( + std::unique_ptr<OfflinePageArchiver> archiver( new OfflinePageMHTMLArchiver(web_contents)); offline_pages::ClientId client_id;
diff --git a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h index 64d67e4b..118deca5 100644 --- a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h +++ b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h
@@ -35,7 +35,7 @@ // Example: // void SavePageOffline(content::WebContents* web_contents) { // const GURL& url = web_contents->GetLastCommittedURL(); -// scoped_ptr<OfflinePageMHTMLArchiver> archiver( +// std::unique_ptr<OfflinePageMHTMLArchiver> archiver( // new OfflinePageMHTMLArchiver( // web_contents, archive_dir)); // // Callback is of type OfflinePageModel::SavePageCallback.
diff --git a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc index 94370c43..76da0b1 100644 --- a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc +++ b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc
@@ -6,12 +6,13 @@ #include <stdint.h> +#include <memory> + #include "base/bind.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/test_simple_task_runner.h" @@ -87,7 +88,7 @@ ~OfflinePageMHTMLArchiverTest() override; // Creates an archiver for testing and specifies a scenario to be used. - scoped_ptr<TestMHTMLArchiver> CreateArchiver( + std::unique_ptr<TestMHTMLArchiver> CreateArchiver( const GURL& url, TestMHTMLArchiver::TestScenario scenario); @@ -141,10 +142,11 @@ OfflinePageMHTMLArchiverTest::~OfflinePageMHTMLArchiverTest() { } -scoped_ptr<TestMHTMLArchiver> OfflinePageMHTMLArchiverTest::CreateArchiver( +std::unique_ptr<TestMHTMLArchiver> OfflinePageMHTMLArchiverTest::CreateArchiver( const GURL& url, TestMHTMLArchiver::TestScenario scenario) { - return scoped_ptr<TestMHTMLArchiver>(new TestMHTMLArchiver(url, scenario)); + return std::unique_ptr<TestMHTMLArchiver>( + new TestMHTMLArchiver(url, scenario)); } void OfflinePageMHTMLArchiverTest::OnCreateArchiveDone( @@ -167,9 +169,8 @@ // Tests that creation of an archiver fails when web contents is missing. TEST_F(OfflinePageMHTMLArchiverTest, WebContentsMissing) { GURL page_url = GURL(kTestURL); - scoped_ptr<TestMHTMLArchiver> archiver( - CreateArchiver(page_url, - TestMHTMLArchiver::TestScenario::WEB_CONTENTS_MISSING)); + std::unique_ptr<TestMHTMLArchiver> archiver(CreateArchiver( + page_url, TestMHTMLArchiver::TestScenario::WEB_CONTENTS_MISSING)); archiver->CreateArchive(GetTestFilePath(), kTestArcihveId, callback()); EXPECT_EQ(archiver.get(), last_archiver()); @@ -181,9 +182,8 @@ // Tests for successful creation of the offline page archive. TEST_F(OfflinePageMHTMLArchiverTest, NotAbleToGenerateArchive) { GURL page_url = GURL(kTestURL); - scoped_ptr<TestMHTMLArchiver> archiver( - CreateArchiver(page_url, - TestMHTMLArchiver::TestScenario::NOT_ABLE_TO_ARCHIVE)); + std::unique_ptr<TestMHTMLArchiver> archiver(CreateArchiver( + page_url, TestMHTMLArchiver::TestScenario::NOT_ABLE_TO_ARCHIVE)); archiver->CreateArchive(GetTestFilePath(), kTestArcihveId, callback()); EXPECT_EQ(archiver.get(), last_archiver()); @@ -196,9 +196,8 @@ // Tests for successful creation of the offline page archive. TEST_F(OfflinePageMHTMLArchiverTest, SuccessfullyCreateOfflineArchive) { GURL page_url = GURL(kTestURL); - scoped_ptr<TestMHTMLArchiver> archiver( - CreateArchiver(page_url, - TestMHTMLArchiver::TestScenario::SUCCESS)); + std::unique_ptr<TestMHTMLArchiver> archiver( + CreateArchiver(page_url, TestMHTMLArchiver::TestScenario::SUCCESS)); archiver->CreateArchive(GetTestFilePath(), kTestArcihveId, callback()); PumpLoop();
diff --git a/chrome/browser/android/offline_pages/offline_page_model_factory.cc b/chrome/browser/android/offline_pages/offline_page_model_factory.cc index 9195443f..1afa51d 100644 --- a/chrome/browser/android/offline_pages/offline_page_model_factory.cc +++ b/chrome/browser/android/offline_pages/offline_page_model_factory.cc
@@ -48,7 +48,7 @@ base::FilePath store_path = profile->GetPath().Append(chrome::kOfflinePageMetadataDirname); - scoped_ptr<OfflinePageMetadataStoreImpl> metadata_store( + std::unique_ptr<OfflinePageMetadataStoreImpl> metadata_store( new OfflinePageMetadataStoreImpl(background_task_runner, store_path)); base::FilePath archives_dir =
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc index 80a84d4..3497df1 100644 --- a/chrome/browser/android/offline_pages/offline_page_tab_helper.cc +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/android/offline_pages/offline_page_utils.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h" +#include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -32,9 +33,6 @@ void OfflinePageTabHelper::DidStartNavigation( content::NavigationHandle* navigation_handle) { - GURL last_redirect_from_url_copy = last_redirect_from_url_; - last_redirect_from_url_ = GURL(); - // Skips non-main frame. if (!navigation_handle->IsInMainFrame()) return; @@ -46,10 +44,11 @@ // Ignore navigations that are forward or back transitions in the nav stack // which are not at the head of the stack. - if (web_contents()->GetController().GetEntryCount() > 0 && - web_contents()->GetController().GetCurrentEntryIndex() != -1 && - (web_contents()->GetController().GetCurrentEntryIndex() < - web_contents()->GetController().GetEntryCount() - 1)) { + const content::NavigationController& controller = + web_contents()->GetController(); + if (controller.GetEntryCount() > 0 && + controller.GetCurrentEntryIndex() != -1 && + controller.GetCurrentEntryIndex() < controller.GetEntryCount() - 1) { return; } @@ -60,22 +59,21 @@ return; // Avoids looping between online and offline redirections. - if (last_redirect_from_url_copy == online_url) + content::NavigationEntry* entry = controller.GetPendingEntry(); + if (entry && !entry->GetRedirectChain().empty() && + entry->GetRedirectChain().back() == online_url) { return; - last_redirect_from_url_ = navigation_handle->GetURL(); + } base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::Bind(&OfflinePageTabHelper::RedirectFromOfflineToOnline, + base::Bind(&OfflinePageTabHelper::Redirect, weak_ptr_factory_.GetWeakPtr(), - online_url)); + navigation_handle->GetURL(), online_url)); } void OfflinePageTabHelper::DidFinishNavigation( content::NavigationHandle* navigation_handle) { - GURL last_redirect_from_url_copy = last_redirect_from_url_; - last_redirect_from_url_ = GURL(); - // Skips non-main frame. if (!navigation_handle->IsInMainFrame()) return; @@ -101,30 +99,23 @@ if (!offline_url.is_valid()) return; - // Avoids looping between online and offline redirections. - if (last_redirect_from_url_copy == offline_url) - return; - last_redirect_from_url_ = navigation_handle->GetURL(); - base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::Bind(&OfflinePageTabHelper::RedirectFromOnlineToOffline, + base::Bind(&OfflinePageTabHelper::Redirect, weak_ptr_factory_.GetWeakPtr(), - offline_url)); + navigation_handle->GetURL(), offline_url)); } -void OfflinePageTabHelper::RedirectFromOfflineToOnline(const GURL& online_url) { - UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOnlineCount", 1); - content::NavigationController::LoadURLParams load_params(online_url); - load_params.transition_type = ui::PAGE_TRANSITION_CLIENT_REDIRECT; - web_contents()->GetController().LoadURLWithParams(load_params); -} +void OfflinePageTabHelper::Redirect( + const GURL& from_url, const GURL& to_url) { + if (to_url.SchemeIsFile()) + UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOfflineCount", 1); + else + UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOnlineCount", 1); -void OfflinePageTabHelper::RedirectFromOnlineToOffline( - const GURL& offline_url) { - UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOfflineCount", 1); - content::NavigationController::LoadURLParams load_params(offline_url); + content::NavigationController::LoadURLParams load_params(to_url); load_params.transition_type = ui::PAGE_TRANSITION_CLIENT_REDIRECT; + load_params.redirect_chain.push_back(from_url); web_contents()->GetController().LoadURLWithParams(load_params); }
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper.h b/chrome/browser/android/offline_pages/offline_page_tab_helper.h index 041e510..f14aec4 100644 --- a/chrome/browser/android/offline_pages/offline_page_tab_helper.h +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper.h
@@ -36,10 +36,8 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; - void RedirectFromOfflineToOnline(const GURL& online_url); - void RedirectFromOnlineToOffline(const GURL& offline_url); + void Redirect(const GURL& from_url, const GURL& to_url); - GURL last_redirect_from_url_; base::WeakPtrFactory<OfflinePageTabHelper> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(OfflinePageTabHelper);
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc index 796b062..0644451 100644 --- a/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/android/offline_pages/offline_page_tab_helper.h" + +#include <memory> + #include "base/bind.h" #include "base/command_line.h" #include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" -#include "chrome/browser/android/offline_pages/offline_page_tab_helper.h" #include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/offline_pages/offline_page_item.h" @@ -78,13 +80,13 @@ // OfflinePageTestArchiver::Observer implementation: void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override; - scoped_ptr<OfflinePageTestArchiver> BuildArchiver( + std::unique_ptr<OfflinePageTestArchiver> BuildArchiver( const GURL& url, const base::FilePath& file_name); void OnSavePageDone(OfflinePageModel::SavePageResult result, int64_t offline_id); - scoped_ptr<TestNetworkChangeNotifier> network_change_notifier_; + std::unique_ptr<TestNetworkChangeNotifier> network_change_notifier_; OfflinePageTabHelper* offline_page_tab_helper_; // Not owned. int64_t offline_id_; @@ -112,7 +114,7 @@ // Saves an offline page. OfflinePageModel* model = OfflinePageModelFactory::GetForBrowserContext(browser_context()); - scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( + std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( kTestPageUrl, base::FilePath(FILE_PATH_LITERAL("page1.mhtml")))); model->SavePage( kTestPageUrl, kTestPageBookmarkId, std::move(archiver), @@ -158,10 +160,10 @@ const base::FilePath& file_path) { } -scoped_ptr<OfflinePageTestArchiver> OfflinePageTabHelperTest::BuildArchiver( - const GURL& url, - const base::FilePath& file_name) { - scoped_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( +std::unique_ptr<OfflinePageTestArchiver> +OfflinePageTabHelperTest::BuildArchiver(const GURL& url, + const base::FilePath& file_name) { + std::unique_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( this, url, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED, kTestFileSize, base::ThreadTaskRunnerHandle::Get())); archiver->set_filename(file_name);
diff --git a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc index f697070..67bc0ca 100644 --- a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc +++ b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
@@ -73,7 +73,7 @@ private: void CreateOfflinePages(); - scoped_ptr<OfflinePageTestArchiver> BuildArchiver( + std::unique_ptr<OfflinePageTestArchiver> BuildArchiver( const GURL& url, const base::FilePath& file_name); @@ -132,7 +132,7 @@ OfflinePageModelFactory::GetForBrowserContext(profile()); // Create page 1. - scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( + std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( kTestPage1Url, base::FilePath(FILE_PATH_LITERAL("page1.mhtml")))); offline_pages::ClientId client_id; client_id.name_space = BOOKMARK_NAMESPACE; @@ -164,10 +164,10 @@ .Append(FILE_PATH_LITERAL("missing_file.mhtml"))); } -scoped_ptr<OfflinePageTestArchiver> OfflinePageUtilsTest::BuildArchiver( +std::unique_ptr<OfflinePageTestArchiver> OfflinePageUtilsTest::BuildArchiver( const GURL& url, const base::FilePath& file_name) { - scoped_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( + std::unique_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( this, url, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED, kTestFileSize, base::ThreadTaskRunnerHandle::Get())); archiver->set_filename(file_name);
diff --git a/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc b/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc index c1fc3bc..b8e10fd 100644 --- a/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc +++ b/chrome/browser/android/offline_pages/test_offline_page_model_builder.cc
@@ -16,18 +16,18 @@ namespace offline_pages { -scoped_ptr<KeyedService> BuildTestOfflinePageModel( +std::unique_ptr<KeyedService> BuildTestOfflinePageModel( content::BrowserContext* context) { scoped_refptr<base::SingleThreadTaskRunner> task_runner = base::ThreadTaskRunnerHandle::Get(); - scoped_ptr<OfflinePageTestStore> metadata_store( + std::unique_ptr<OfflinePageTestStore> metadata_store( new OfflinePageTestStore(task_runner)); base::FilePath archives_dir = context->GetPath().Append(chrome::kOfflinePageArchviesDirname); - return scoped_ptr<KeyedService>(new OfflinePageModel( + return std::unique_ptr<KeyedService>(new OfflinePageModel( std::move(metadata_store), archives_dir, task_runner)); }
diff --git a/chrome/browser/android/offline_pages/test_offline_page_model_builder.h b/chrome/browser/android/offline_pages/test_offline_page_model_builder.h index 6c56d5a..46c08df 100644 --- a/chrome/browser/android/offline_pages/test_offline_page_model_builder.h +++ b/chrome/browser/android/offline_pages/test_offline_page_model_builder.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_ANDROID_OFFLINE_PAGES_TEST_OFFLINE_PAGE_MODEL_BUILDER_H_ #define CHROME_BROWSER_ANDROID_OFFLINE_PAGES_TEST_OFFLINE_PAGE_MODEL_BUILDER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> class KeyedService; @@ -18,7 +18,7 @@ // Helper function to be used with // BrowserContextKeyedServiceFactory::SetTestingFactory() that returns a // OfflinePageModel object with mocked store. -scoped_ptr<KeyedService> BuildTestOfflinePageModel( +std::unique_ptr<KeyedService> BuildTestOfflinePageModel( content::BrowserContext* context); } // namespace offline_pages
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc index b555057..cd552dc 100644 --- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc +++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" +#include "base/memory/ptr_util.h" #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -85,13 +86,13 @@ // AutocompleteControllerDelegate: void OnResultChanged(bool default_match_changed) override; - scoped_ptr<AutocompleteController> controller_; + std::unique_ptr<AutocompleteController> controller_; base::OneShotTimer expire_timer_; }; ZeroSuggestPrefetcher::ZeroSuggestPrefetcher(Profile* profile) : controller_(new AutocompleteController( - make_scoped_ptr(new ChromeAutocompleteProviderClient(profile)), + base::WrapUnique(new ChromeAutocompleteProviderClient(profile)), this, AutocompleteProvider::TYPE_ZERO_SUGGEST)) { // Creating an arbitrary fake_request_source to avoid passing in an invalid @@ -126,12 +127,11 @@ AutocompleteControllerAndroid::AutocompleteControllerAndroid(Profile* profile) : autocomplete_controller_(new AutocompleteController( - make_scoped_ptr(new ChromeAutocompleteProviderClient(profile)), + base::WrapUnique(new ChromeAutocompleteProviderClient(profile)), this, kAndroidAutocompleteProviders)), inside_synchronous_start_(false), - profile_(profile) { -} + profile_(profile) {} void AutocompleteControllerAndroid::Start( JNIEnv* env,
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.h b/chrome/browser/android/omnibox/autocomplete_controller_android.h index b7c76e9..e8bd5c6 100644 --- a/chrome/browser/android/omnibox/autocomplete_controller_android.h +++ b/chrome/browser/android/omnibox/autocomplete_controller_android.h
@@ -5,11 +5,11 @@ #ifndef CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ #define CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ +#include <memory> #include <string> #include "base/android/jni_weak_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/keyed_service/core/keyed_service.h" @@ -135,7 +135,7 @@ const base::android::JavaRef<jstring>& j_text, bool prevent_inline_autocomplete); - scoped_ptr<AutocompleteController> autocomplete_controller_; + std::unique_ptr<AutocompleteController> autocomplete_controller_; // Last input we sent to the autocomplete controller. AutocompleteInput input_;
diff --git a/chrome/browser/android/omnibox/omnibox_prerender.h b/chrome/browser/android/omnibox/omnibox_prerender.h index d8a0d61..8add1adf 100644 --- a/chrome/browser/android/omnibox/omnibox_prerender.h +++ b/chrome/browser/android/omnibox/omnibox_prerender.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_ANDROID_OMNIBOX_OMNIBOX_PRERENDER_H_ #define CHROME_BROWSER_ANDROID_OMNIBOX_OMNIBOX_PRERENDER_H_ +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" class AutocompleteResult;
diff --git a/chrome/browser/android/password_ui_view_android.cc b/chrome/browser/android/password_ui_view_android.cc index bd34251..4cc4ea76 100644 --- a/chrome/browser/android/password_ui_view_android.cc +++ b/chrome/browser/android/password_ui_view_android.cc
@@ -43,7 +43,7 @@ } void PasswordUIViewAndroid::SetPasswordList( - const std::vector<scoped_ptr<autofill::PasswordForm>>& password_list) { + const std::vector<std::unique_ptr<autofill::PasswordForm>>& password_list) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env); if (!ui_controller.is_null()) { @@ -53,7 +53,7 @@ } void PasswordUIViewAndroid::SetPasswordExceptionList( - const std::vector<scoped_ptr<autofill::PasswordForm>>& + const std::vector<std::unique_ptr<autofill::PasswordForm>>& password_exception_list) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jobject> ui_controller = weak_java_ui_controller_.get(env);
diff --git a/chrome/browser/android/password_ui_view_android.h b/chrome/browser/android/password_ui_view_android.h index d7160fe..8277577 100644 --- a/chrome/browser/android/password_ui_view_android.h +++ b/chrome/browser/android/password_ui_view_android.h
@@ -34,10 +34,10 @@ const std::string& username, const base::string16& password_value) override; void SetPasswordList( - const std::vector<scoped_ptr<autofill::PasswordForm>>& password_list) - override; + const std::vector<std::unique_ptr<autofill::PasswordForm>>& password_list) + override; void SetPasswordExceptionList( - const std::vector<scoped_ptr<autofill::PasswordForm>>& + const std::vector<std::unique_ptr<autofill::PasswordForm>>& password_exception_list) override; // Calls from Java.
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc index 4b829dd..6b1fe806 100644 --- a/chrome/browser/android/preferences/pref_service_bridge.cc +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -6,6 +6,8 @@ #include <jni.h> #include <stddef.h> + +#include <memory> #include <vector> #include "base/android/build_info.h" @@ -15,7 +17,6 @@ #include "base/android/jni_weak_ref.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/memory/scoped_ptr.h" #include "base/scoped_observer.h" #include "base/strings/string_util.h" #include "base/values.h" @@ -485,7 +486,7 @@ void OnBrowsingDataRemoverDone() override { // We delete ourselves when done. - scoped_ptr<ClearBrowsingDataObserver> auto_delete(this); + std::unique_ptr<ClearBrowsingDataObserver> auto_delete(this); JNIEnv* env = AttachCurrentThread(); if (weak_chrome_native_preferences_.get(env).is_null()) @@ -755,7 +756,7 @@ static void ResetTranslateDefaults(JNIEnv* env, const JavaParamRef<jobject>& obj) { - scoped_ptr<translate::TranslatePrefs> translate_prefs = + std::unique_ptr<translate::TranslatePrefs> translate_prefs = ChromeTranslateClient::CreateTranslatePrefs(GetPrefService()); translate_prefs->ResetToDefaults(); }
diff --git a/chrome/browser/android/preferences/website_preference_bridge.cc b/chrome/browser/android/preferences/website_preference_bridge.cc index ea29bfef..31e94cf 100644 --- a/chrome/browser/android/preferences/website_preference_bridge.cc +++ b/chrome/browser/android/preferences/website_preference_bridge.cc
@@ -577,7 +577,7 @@ // Keeps track of when we're ready to close batch processing. bool ending_batch_processing_; - scoped_ptr<CookiesTreeModel> cookies_tree_model_; + std::unique_ptr<CookiesTreeModel> cookies_tree_model_; DISALLOW_COPY_AND_ASSIGN(SiteDataDeleteHelper); };
diff --git a/chrome/browser/android/profiles/profile_downloader_android.cc b/chrome/browser/android/profiles/profile_downloader_android.cc index 292450e..4dd48be 100644 --- a/chrome/browser/android/profiles/profile_downloader_android.cc +++ b/chrome/browser/android/profiles/profile_downloader_android.cc
@@ -102,7 +102,7 @@ } // The profile image downloader instance. - scoped_ptr<ProfileDownloader> profile_image_downloader_; + std::unique_ptr<ProfileDownloader> profile_image_downloader_; // The browser profile associated with this download request. Profile* profile_;
diff --git a/chrome/browser/android/provider/chrome_browser_provider.h b/chrome/browser/android/provider/chrome_browser_provider.h index fabf3d4..3d738da 100644 --- a/chrome/browser/android/provider/chrome_browser_provider.h +++ b/chrome/browser/android/provider/chrome_browser_provider.h
@@ -5,10 +5,11 @@ #ifndef CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_ #define CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_ +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/scoped_observer.h" #include "base/synchronization/waitable_event.h" #include "base/task/cancelable_task_tracker.h" @@ -231,7 +232,7 @@ scoped_refptr<history::TopSites> top_sites_; favicon::FaviconService* favicon_service_; - scoped_ptr<AndroidHistoryProviderService> service_; + std::unique_ptr<AndroidHistoryProviderService> service_; base::CancelableTaskTracker cancelable_task_tracker_;
diff --git a/chrome/browser/android/recently_closed_tabs_bridge.cc b/chrome/browser/android/recently_closed_tabs_bridge.cc index 0ec51990..771c815e7 100644 --- a/chrome/browser/android/recently_closed_tabs_bridge.cc +++ b/chrome/browser/android/recently_closed_tabs_bridge.cc
@@ -101,7 +101,7 @@ // Find and remove the corresponding tab entry from TabRestoreService. // We take ownership of the returned tab. - scoped_ptr<sessions::TabRestoreService::Tab> tab_entry( + std::unique_ptr<sessions::TabRestoreService::Tab> tab_entry( tab_restore_service_->RemoveTabEntryById(recent_tab_id)); if (!tab_entry) return false;
diff --git a/chrome/browser/android/signin/signin_manager_android.h b/chrome/browser/android/signin/signin_manager_android.h index 488031a..6a414e7 100644 --- a/chrome/browser/android/signin/signin_manager_android.h +++ b/chrome/browser/android/signin/signin_manager_android.h
@@ -7,11 +7,11 @@ #include <jni.h> +#include <memory> #include <string> #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "components/prefs/pref_change_registrar.h"
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index 34ae44b..9c49303f 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/trace_event/trace_event.h" #include "cc/layers/layer.h" @@ -870,7 +871,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); InterceptNavigationDelegate::Associate( web_contents(), - make_scoped_ptr(new ChromeInterceptNavigationDelegate(env, delegate))); + base::WrapUnique(new ChromeInterceptNavigationDelegate(env, delegate))); } void TabAndroid::AttachToTabContentManager(
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index 021e4b3..9f10fdf 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -8,10 +8,11 @@ #include <jni.h> #include <stdint.h> +#include <memory> + #include "base/android/jni_weak_ref.h" #include "base/callback_forward.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "chrome/browser/search/instant_service_observer.h" #include "chrome/browser/sync/glue/synced_tab_delegate_android.h" @@ -279,11 +280,11 @@ scoped_refptr<cc::Layer> content_layer_; chrome::android::TabContentManager* tab_content_manager_; - scoped_ptr<content::WebContents> web_contents_; - scoped_ptr<chrome::android::TabWebContentsDelegateAndroid> + std::unique_ptr<content::WebContents> web_contents_; + std::unique_ptr<chrome::android::TabWebContentsDelegateAndroid> web_contents_delegate_; - scoped_ptr<browser_sync::SyncedTabDelegateAndroid> synced_tab_delegate_; + std::unique_ptr<browser_sync::SyncedTabDelegateAndroid> synced_tab_delegate_; DISALLOW_COPY_AND_ASSIGN(TabAndroid); };
diff --git a/chrome/browser/android/tab_state.cc b/chrome/browser/android/tab_state.cc index bd9ab3b..d98867a 100644 --- a/chrome/browser/android/tab_state.cc +++ b/chrome/browser/android/tab_state.cc
@@ -7,13 +7,14 @@ #include <jni.h> #include <stddef.h> #include <stdint.h> + #include <limits> +#include <memory> #include <vector> #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/pickle.h" #include "chrome/browser/android/tab_android.h" @@ -428,7 +429,7 @@ return NULL; Profile* profile = ProfileManager::GetActiveUserProfile(); - std::vector<scoped_ptr<content::NavigationEntry>> entries = + std::vector<std::unique_ptr<content::NavigationEntry>> entries = sessions::ContentSerializedNavigationBuilder::ToNavigationEntries( navigations, profile); @@ -436,7 +437,7 @@ profile = profile->GetOffTheRecordProfile(); WebContents::CreateParams params(profile); params.initially_hidden = initially_hidden; - scoped_ptr<WebContents> web_contents(WebContents::Create(params)); + std::unique_ptr<WebContents> web_contents(WebContents::Create(params)); web_contents->GetController().Restore( current_entry_index, NavigationController::RESTORE_CURRENT_SESSION, &entries); @@ -477,10 +478,9 @@ GURL(base::android::ConvertJavaStringToUTF8(env, referrer_url)), static_cast<blink::WebReferrerPolicy>(referrer_policy)); } - scoped_ptr<content::NavigationEntry> entry( + std::unique_ptr<content::NavigationEntry> entry( content::NavigationController::CreateNavigationEntry( - GURL(base::android::ConvertJavaStringToUTF8(env, url)), - referrer, + GURL(base::android::ConvertJavaStringToUTF8(env, url)), referrer, ui::PAGE_TRANSITION_LINK, true, // is_renderer_initiated "", // extra_headers @@ -569,7 +569,7 @@ const JavaParamRef<jclass>& clazz, const JavaParamRef<jobject>& state, jint saved_state_version) { - scoped_ptr<WebContents> web_contents(WebContents::FromJavaWebContents( + std::unique_ptr<WebContents> web_contents(WebContents::FromJavaWebContents( WebContentsState::RestoreContentsFromByteBuffer(env, clazz, state, saved_state_version, true) .obj()));
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc index eb913c3..2068778c 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android.cc +++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/command_line.h" +#include "base/memory/ptr_util.h" #include "chrome/browser/android/feature_utilities.h" #include "chrome/browser/android/hung_renderer_infobar_delegate.h" #include "chrome/browser/android/media/media_throttle_infobar_delegate.h" @@ -122,10 +123,11 @@ FileSelectHelper::RunFileChooser(web_contents, params); } -scoped_ptr<BluetoothChooser> TabWebContentsDelegateAndroid::RunBluetoothChooser( +std::unique_ptr<BluetoothChooser> +TabWebContentsDelegateAndroid::RunBluetoothChooser( content::RenderFrameHost* frame, const BluetoothChooser::EventHandler& event_handler) { - return make_scoped_ptr(new BluetoothChooserAndroid(frame, event_handler)); + return base::WrapUnique(new BluetoothChooserAndroid(frame, event_handler)); } void TabWebContentsDelegateAndroid::CloseContents(
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.h b/chrome/browser/android/tab_web_contents_delegate_android.h index cec724f..9e4ceb4 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android.h +++ b/chrome/browser/android/tab_web_contents_delegate_android.h
@@ -42,7 +42,7 @@ bool to_different_document) override; void RunFileChooser(content::WebContents* web_contents, const content::FileChooserParams& params) override; - scoped_ptr<content::BluetoothChooser> RunBluetoothChooser( + std::unique_ptr<content::BluetoothChooser> RunBluetoothChooser( content::RenderFrameHost* frame, const content::BluetoothChooser::EventHandler& event_handler) override; void CloseContents(content::WebContents* web_contents) override;
diff --git a/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h b/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h index 1bec4f1..912a4a15 100644 --- a/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h +++ b/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h
@@ -7,8 +7,9 @@ #include <stddef.h> +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "net/base/linked_hash_map.h" template <class Key, class Value> @@ -24,7 +25,7 @@ ~ScopedPtrExpiringCache() {} - void Put(const Key& key, scoped_ptr<Value> value) { + void Put(const Key& key, std::unique_ptr<Value> value) { Remove(key); map_[key] = value.release(); EvictIfFull();
diff --git a/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc b/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc index 12e68b1b..8ccf236 100644 --- a/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc +++ b/chrome/browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h" + #include <stddef.h> #include <algorithm> #include <vector> #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -23,8 +25,8 @@ class MockObject { public: - static scoped_ptr<MockObject> Create(unsigned int key) { - return make_scoped_ptr(new MockObject(key)); + static std::unique_ptr<MockObject> Create(unsigned int key) { + return base::WrapUnique(new MockObject(key)); } unsigned int value() const { return value_; }
diff --git a/chrome/browser/android/thumbnail/thumbnail.cc b/chrome/browser/android/thumbnail/thumbnail.cc index 744b1d4..0ad9dc7 100644 --- a/chrome/browser/android/thumbnail/thumbnail.cc +++ b/chrome/browser/android/thumbnail/thumbnail.cc
@@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/android/thumbnail/thumbnail.h" + #include "base/bind.h" #include "base/location.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/thread_task_runner_handle.h" -#include "chrome/browser/android/thumbnail/thumbnail.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/android/resources/ui_resource_provider.h" @@ -26,13 +28,13 @@ } // anonymous namespace -scoped_ptr<Thumbnail> Thumbnail::Create( +std::unique_ptr<Thumbnail> Thumbnail::Create( TabId tab_id, const base::Time& time_stamp, float scale, ui::UIResourceProvider* ui_resource_provider, ThumbnailDelegate* thumbnail_delegate) { - return make_scoped_ptr(new Thumbnail( + return base::WrapUnique(new Thumbnail( tab_id, time_stamp, scale, ui_resource_provider, thumbnail_delegate)); }
diff --git a/chrome/browser/android/thumbnail/thumbnail.h b/chrome/browser/android/thumbnail/thumbnail.h index ed2a2dd..f443bec 100644 --- a/chrome/browser/android/thumbnail/thumbnail.h +++ b/chrome/browser/android/thumbnail/thumbnail.h
@@ -36,7 +36,7 @@ class Thumbnail : public cc::UIResourceClient { public: - static scoped_ptr<Thumbnail> Create( + static std::unique_ptr<Thumbnail> Create( TabId tab_id, const base::Time& time_stamp, float scale,
diff --git a/chrome/browser/android/thumbnail/thumbnail_cache.cc b/chrome/browser/android/thumbnail/thumbnail_cache.cc index 0781c05..5db6030 100644 --- a/chrome/browser/android/thumbnail/thumbnail_cache.cc +++ b/chrome/browser/android/thumbnail/thumbnail_cache.cc
@@ -169,7 +169,7 @@ DCHECK(thumbnail_meta_data_.find(tab_id) != thumbnail_meta_data_.end()); base::Time time_stamp = thumbnail_meta_data_[tab_id].capture_time(); - scoped_ptr<Thumbnail> thumbnail = Thumbnail::Create( + std::unique_ptr<Thumbnail> thumbnail = Thumbnail::Create( tab_id, time_stamp, thumbnail_scale, ui_resource_provider_, this); thumbnail->SetBitmap(bitmap); @@ -180,7 +180,7 @@ if (use_approximation_thumbnail_) { std::pair<SkBitmap, float> approximation = CreateApproximation(bitmap, thumbnail_scale); - scoped_ptr<Thumbnail> approx_thumbnail = Thumbnail::Create( + std::unique_ptr<Thumbnail> approx_thumbnail = Thumbnail::Create( tab_id, time_stamp, approximation.second, ui_resource_provider_, this); approx_thumbnail->SetBitmap(approximation.first); approximation_cache_.Put(tab_id, std::move(approx_thumbnail)); @@ -790,7 +790,7 @@ time_stamp = meta_iter->second.capture_time(); MakeSpaceForNewItemIfNecessary(tab_id); - scoped_ptr<Thumbnail> thumbnail = Thumbnail::Create( + std::unique_ptr<Thumbnail> thumbnail = Thumbnail::Create( tab_id, time_stamp, scale, ui_resource_provider_, this); thumbnail->SetCompressedBitmap(compressed_data, content_size);
diff --git a/chrome/browser/android/usb/web_usb_chooser_service_android.cc b/chrome/browser/android/usb/web_usb_chooser_service_android.cc index d31b7b06..2aa1944 100644 --- a/chrome/browser/android/usb/web_usb_chooser_service_android.cc +++ b/chrome/browser/android/usb/web_usb_chooser_service_android.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "chrome/browser/ui/android/usb_chooser_dialog_android.h" #include "content/public/browser/browser_thread.h" @@ -22,7 +23,7 @@ mojo::Array<device::usb::DeviceFilterPtr> device_filters, const GetPermissionCallback& callback) { usb_chooser_dialog_android_.push_back( - make_scoped_ptr(new UsbChooserDialogAndroid( + base::WrapUnique(new UsbChooserDialogAndroid( std::move(device_filters), render_frame_host_, callback))); }
diff --git a/chrome/browser/android/usb/web_usb_chooser_service_android.h b/chrome/browser/android/usb/web_usb_chooser_service_android.h index d83345a9..3c38004 100644 --- a/chrome/browser/android/usb/web_usb_chooser_service_android.h +++ b/chrome/browser/android/usb/web_usb_chooser_service_android.h
@@ -5,10 +5,10 @@ #ifndef CHROME_BROWSER_ANDROID_USB_WEB_USB_CHOOSER_SERVICE_ANDROID_H_ #define CHROME_BROWSER_ANDROID_USB_WEB_USB_CHOOSER_SERVICE_ANDROID_H_ +#include <memory> #include <vector> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "device/usb/public/interfaces/chooser_service.mojom.h" #include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/bindings/binding_set.h" @@ -39,7 +39,8 @@ private: content::RenderFrameHost* const render_frame_host_; mojo::BindingSet<device::usb::ChooserService> bindings_; - std::vector<scoped_ptr<UsbChooserDialogAndroid>> usb_chooser_dialog_android_; + std::vector<std::unique_ptr<UsbChooserDialogAndroid>> + usb_chooser_dialog_android_; DISALLOW_COPY_AND_ASSIGN(WebUsbChooserServiceAndroid); };
diff --git a/chrome/browser/bookmarks/bookmark_html_writer.cc b/chrome/browser/bookmarks/bookmark_html_writer.cc index 5638549..34bd5c6 100644 --- a/chrome/browser/bookmarks/bookmark_html_writer.cc +++ b/chrome/browser/bookmarks/bookmark_html_writer.cc
@@ -272,8 +272,9 @@ if (itr != favicons_map_->end()) { scoped_refptr<base::RefCountedMemory> data(itr->second.get()); std::string favicon_base64_encoded; - base::Base64Encode(std::string(data->front_as<char>(), data->size()), - &favicon_base64_encoded); + base::Base64Encode( + base::StringPiece(data->front_as<char>(), data->size()), + &favicon_base64_encoded); GURL favicon_url("data:image/png;base64," + favicon_base64_encoded); favicon_string = favicon_url.spec(); }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 1fe82adc..52fc09ca 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -50,6 +50,7 @@ #include "chrome/browser/component_updater/ev_whitelist_component_installer.h" #include "chrome/browser/component_updater/flash_component_installer.h" #include "chrome/browser/component_updater/recovery_component_installer.h" +#include "chrome/browser/component_updater/sth_set_component_installer.h" #include "chrome/browser/component_updater/supervised_user_whitelist_installer.h" #include "chrome/browser/component_updater/swiftshader_component_installer.h" #include "chrome/browser/component_updater/widevine_cdm_component_installer.h" @@ -488,6 +489,11 @@ // 1. Android: Because it currently does not have the EV indicator. // 2. Chrome OS: On Chrome OS this registration is delayed until user login. RegisterEVWhitelistComponent(cus, path); + + // Registration of the STH set fetcher here is not done for: + // Android: Because the story around CT on Mobile is not finalized yet. + // Chrome OS: On Chrome OS this registration is delayed until user login. + RegisterSTHSetComponent(cus, path); #endif // defined(OS_ANDROID) }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index f8e169cd..a4811b7a 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1087,29 +1087,6 @@ return webui::LogWebUIUrl(web_ui_url); } -net::URLRequestContextGetter* -ChromeContentBrowserClient::CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - Profile* profile = Profile::FromBrowserContext(browser_context); - return profile->CreateRequestContext(protocol_handlers, - std::move(request_interceptors)); -} - -net::URLRequestContextGetter* -ChromeContentBrowserClient::CreateRequestContextForStoragePartition( - content::BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - Profile* profile = Profile::FromBrowserContext(browser_context); - return profile->CreateRequestContextForStoragePartition( - partition_path, in_memory, protocol_handlers, - std::move(request_interceptors)); -} - bool ChromeContentBrowserClient::IsHandledURL(const GURL& url) { return ProfileIOData::IsHandledURL(url); }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index 85fc900..043218d 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -86,16 +86,6 @@ void GetAdditionalWebUIHostsToIgnoreParititionCheck( std::vector<std::string>* hosts) override; bool LogWebUIUrl(const GURL& web_ui_url) const override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - content::BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; bool IsHandledURL(const GURL& url) override; bool CanCommitURL(content::RenderProcessHost* process_host, const GURL& url) override;
diff --git a/chrome/browser/chromeos/arc/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/arc_policy_bridge.cc index 15f7bf7..e472d9ad 100644 --- a/chrome/browser/chromeos/arc/arc_policy_bridge.cc +++ b/chrome/browser/chromeos/arc/arc_policy_bridge.cc
@@ -4,9 +4,6 @@ #include "chrome/browser/chromeos/arc/arc_policy_bridge.h" -#include <string> - -#include "base/json/json_reader.h" #include "base/json/json_string_value_serializer.h" #include "base/logging.h" #include "base/values.h" @@ -21,60 +18,6 @@ namespace arc { -namespace { - -// invert_bool_value: If the Chrome policy and the ARC policy with boolean value -// have opposite semantics, set this to true so the bool is inverted before -// being added. Otherwise, set it to false. -void AddPolicy(const std::string arc_policy_name, - const std::string policy_name, - const policy::PolicyMap& policy_map, - bool invert_bool_value, - base::DictionaryValue& filtered_policies) { - const base::Value* const policy_value = policy_map.GetValue(policy_name); - if (policy_value) { - if (invert_bool_value && policy_value->IsType(base::Value::TYPE_BOOLEAN)) { - bool bool_value; - policy_value->GetAsBoolean(&bool_value); - filtered_policies.SetBoolean(arc_policy_name, !bool_value); - } else { - filtered_policies.Set(arc_policy_name, - policy_value->CreateDeepCopy().release()); - } - } -} - -std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map) { - base::DictionaryValue filtered_policies; - // Parse ArcApplicationPolicy as JSON string before adding other policies to - // the dictionary. - const base::Value* const app_policy_value = - policy_map.GetValue(policy::key::kArcApplicationPolicy); - if (app_policy_value) { - std::string app_policy_string; - app_policy_value->GetAsString(&app_policy_string); - std::unique_ptr<base::DictionaryValue> app_policy_dict = - base::DictionaryValue::From(base::JSONReader::Read(app_policy_string)); - if (app_policy_dict) { - filtered_policies.Swap(app_policy_dict.get()); - } else { - LOG(ERROR) << "Value of ArcApplicationPolicy has invalid format: " - << app_policy_string; - } - } - - // Keep them sorted by the ARC policy names. - AddPolicy("cameraDisabled", policy::key::kVideoCaptureAllowed, policy_map, - true, filtered_policies); - - std::string policy_json; - JSONStringValueSerializer serializer(&policy_json); - serializer.Serialize(filtered_policies); - return policy_json; -} - -} // namespace - ArcPolicyBridge::ArcPolicyBridge(ArcBridgeService* bridge_service) : ArcService(bridge_service), binding_(this) { VLOG(1) << "ArcPolicyBridge::ArcPolicyBridge"; @@ -146,4 +89,23 @@ ->policy_service(); } +std::string ArcPolicyBridge::GetFilteredJSONPolicies( + const policy::PolicyMap& policy_map) { + // TODO(phweiss): Implement general filtering mechanism when more policies + // need to be passed on. + // Create dictionary with the desired policies. + base::DictionaryValue filtered_policies; + const std::string policy_name = policy::key::kArcApplicationPolicy; + const base::Value* const policy_value = policy_map.GetValue(policy_name); + if (policy_value) { + filtered_policies.Set(policy_name, + policy_value->CreateDeepCopy().release()); + } + // Convert dictionary to JSON. + std::string policy_json; + JSONStringValueSerializer serializer(&policy_json); + serializer.Serialize(filtered_policies); + return policy_json; +} + } // namespace arc
diff --git a/chrome/browser/chromeos/arc/arc_policy_bridge.h b/chrome/browser/chromeos/arc/arc_policy_bridge.h index 90603e8..2177f1b 100644 --- a/chrome/browser/chromeos/arc/arc_policy_bridge.h +++ b/chrome/browser/chromeos/arc/arc_policy_bridge.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_CHROMEOS_ARC_ARC_POLICY_BRIDGE_H_ #define CHROME_BROWSER_CHROMEOS_ARC_ARC_POLICY_BRIDGE_H_ +#include <string> + #include "base/macros.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service.h" @@ -41,6 +43,7 @@ private: void InitializePolicyService(); + std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map); mojo::Binding<PolicyHost> binding_; policy::PolicyService* policy_service_ = nullptr;
diff --git a/chrome/browser/chromeos/arc/arc_policy_bridge_unittest.cc b/chrome/browser/chromeos/arc/arc_policy_bridge_unittest.cc index 1574666d..ae0ead1d 100644 --- a/chrome/browser/chromeos/arc/arc_policy_bridge_unittest.cc +++ b/chrome/browser/chromeos/arc/arc_policy_bridge_unittest.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include <memory> -#include <string> #include "base/macros.h" #include "base/values.h" @@ -69,81 +68,22 @@ DISALLOW_COPY_AND_ASSIGN(ArcPolicyBridgeTest); }; -TEST_F(ArcPolicyBridgeTest, EmptyPolicyTest) { - // No policy is set, result should be empty. - policy_bridge()->GetPolicies(PolicyStringCallback("{}")); -} - -TEST_F(ArcPolicyBridgeTest, ArcApplicationPolicyTest) { - policy_map().Set( - "ArcApplicationPolicy", policy::POLICY_LEVEL_MANDATORY, - policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - new base::StringValue( - "{\"applications\":" - "[{\"packageName\":\"com.google.android.apps.youtube.kids\"," - "\"installType\":\"REQUIRED\"," - "\"lockTaskAllowed\":false," - "\"permissionGrants\":[]" - "}]," - "\"defaultPermissionPolicy\":\"GRANT\"" - "}"), - nullptr); - policy_bridge()->GetPolicies(PolicyStringCallback( - "{\"applications\":" - "[{\"installType\":\"REQUIRED\"," - "\"lockTaskAllowed\":false," - "\"packageName\":\"com.google.android.apps.youtube.kids\"," - "\"permissionGrants\":[]" - "}]," - "\"defaultPermissionPolicy\":\"GRANT\"" - "}")); -} - -TEST_F(ArcPolicyBridgeTest, HompageLocationTest) { - // This policy will not be passed on, result should be empty. +TEST_F(ArcPolicyBridgeTest, GetPoliciesTest) { + PolicyStringCallback empty_callback("{}"); + policy_bridge()->GetPolicies(empty_callback); policy_map().Set("HomepageLocation", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, new base::StringValue("http://chromium.org"), nullptr); - policy_bridge()->GetPolicies(PolicyStringCallback("{}")); -} - -TEST_F(ArcPolicyBridgeTest, VideoCaptureAllowedTest) { - policy_map().Set("VideoCaptureAllowed", policy::POLICY_LEVEL_MANDATORY, - policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - new base::FundamentalValue(false), nullptr); - policy_bridge()->GetPolicies( - PolicyStringCallback("{\"cameraDisabled\":true}")); -} - -TEST_F(ArcPolicyBridgeTest, AllPoliciesTest) { - // Keep them in alphabetical order. + policy_bridge()->GetPolicies(empty_callback); policy_map().Set( "ArcApplicationPolicy", policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - new base::StringValue("{\"applications\":" - "[{\"packageName\":\"com.google.android.apps.youtube.kids\"," - "\"installType\":\"REQUIRED\"," - "\"lockTaskAllowed\":false," - "\"permissionGrants\":[]" - "}]," - "\"defaultPermissionPolicy\":\"GRANT\"}"), + new base::StringValue("{\"application\": \"com.android.chrome\"}"), nullptr); - policy_map().Set("HomepageLocation", policy::POLICY_LEVEL_MANDATORY, - policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - new base::StringValue("http://chromium.org"), nullptr); - policy_map().Set("VideoCaptureAllowed", policy::POLICY_LEVEL_MANDATORY, - policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - new base::FundamentalValue(false), nullptr); - policy_bridge()->GetPolicies(PolicyStringCallback( - "{\"applications\":" - "[{\"installType\":\"REQUIRED\"," - "\"lockTaskAllowed\":false," - "\"packageName\":\"com.google.android.apps.youtube.kids\"," - "\"permissionGrants\":[]" - "}]," - "\"cameraDisabled\":true," - "\"defaultPermissionPolicy\":\"GRANT\"" - "}")); + PolicyStringCallback chrome_callback( + "{\"ArcApplicationPolicy\":" + "\"{\\\"application\\\": \\\"com.android.chrome\\\"}\"}"); + policy_bridge()->GetPolicies(chrome_callback); } } // namespace arc
diff --git a/chrome/browser/chromeos/display/display_preferences.cc b/chrome/browser/chromeos/display/display_preferences.cc index 646cc95..f0a169a 100644 --- a/chrome/browser/chromeos/display/display_preferences.cc +++ b/chrome/browser/chromeos/display/display_preferences.cc
@@ -118,7 +118,7 @@ prefs::kSecondaryDisplays); for (base::DictionaryValue::Iterator it(*layouts); !it.IsAtEnd(); it.Advance()) { - scoped_ptr<ash::DisplayLayout> layout(new ash::DisplayLayout); + scoped_ptr<display::DisplayLayout> layout(new display::DisplayLayout); if (!ash::JsonToDisplayLayout(it.value(), layout.get())) { LOG(WARNING) << "Invalid preference value for " << it.key(); continue; @@ -134,7 +134,7 @@ continue; ids.push_back(id); } - ash::DisplayIdList list = + display::DisplayIdList list = ash::GenerateDisplayIdList(ids.begin(), ids.end()); layout_store->RegisterLayoutForDisplayIdList(list, std::move(layout)); } @@ -212,8 +212,8 @@ static_cast<gfx::Display::Rotation>(rotation)); } -void StoreDisplayLayoutPref(const ash::DisplayIdList& list, - const ash::DisplayLayout& display_layout) { +void StoreDisplayLayoutPref(const display::DisplayIdList& list, + const display::DisplayLayout& display_layout) { std::string name = ash::DisplayIdListToString(list); PrefService* local_state = g_browser_process->local_state(); @@ -236,8 +236,8 @@ return; } - ash::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); - const ash::DisplayLayout& display_layout = + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + const display::DisplayLayout& display_layout = display_manager->layout_store()->GetRegisteredDisplayLayout(list); StoreDisplayLayoutPref(list, display_layout); } @@ -391,8 +391,8 @@ } // Stores the display layout for given display pairs. -void StoreDisplayLayoutPrefForTest(const ash::DisplayIdList& list, - const ash::DisplayLayout& layout) { +void StoreDisplayLayoutPrefForTest(const display::DisplayIdList& list, + const display::DisplayLayout& layout) { StoreDisplayLayoutPref(list, layout); }
diff --git a/chrome/browser/chromeos/display/display_preferences.h b/chrome/browser/chromeos/display/display_preferences.h index ec14e96e..538b020 100644 --- a/chrome/browser/chromeos/display/display_preferences.h +++ b/chrome/browser/chromeos/display/display_preferences.h
@@ -7,15 +7,11 @@ #include <stdint.h> -#include "ash/display/display_layout.h" #include "third_party/cros_system_api/dbus/service_constants.h" +#include "ui/display/manager/display_layout.h" class PrefRegistrySimple; -namespace ash { -class DisplayLayout; -} - namespace gfx { class Display; class Insets; @@ -41,8 +37,8 @@ void LoadDisplayPreferences(bool first_run_after_boot); // Stores the display layout for given display pairs for tests. -void StoreDisplayLayoutPrefForTest(const ash::DisplayIdList& list, - const ash::DisplayLayout& layout); +void StoreDisplayLayoutPrefForTest(const display::DisplayIdList& list, + const display::DisplayLayout& layout); // Stores the given |power_state| for tests. void StoreDisplayPowerStateForTest(DisplayPowerState power_state);
diff --git a/chrome/browser/chromeos/display/display_preferences_unittest.cc b/chrome/browser/chromeos/display/display_preferences_unittest.cc index 297c286..13effc66 100644 --- a/chrome/browser/chromeos/display/display_preferences_unittest.cc +++ b/chrome/browser/chromeos/display/display_preferences_unittest.cc
@@ -9,7 +9,6 @@ #include <utility> #include <vector> -#include "ash/display/display_layout_builder.h" #include "ash/display/display_layout_store.h" #include "ash/display/display_manager.h" #include "ash/display/display_util.h" @@ -34,6 +33,7 @@ #include "components/prefs/scoped_user_pref_update.h" #include "components/prefs/testing_pref_service.h" #include "ui/display/chromeos/display_configurator.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/gfx/geometry/vector3d_f.h" #include "ui/gfx/screen.h" #include "ui/message_center/message_center.h" @@ -101,13 +101,14 @@ // Do not use the implementation of display_preferences.cc directly to avoid // notifying the update to the system. - void StoreDisplayLayoutPrefForList(const ash::DisplayIdList& list, - ash::DisplayPlacement::Position position, - int offset, - int64_t primary_id) { + void StoreDisplayLayoutPrefForList( + const display::DisplayIdList& list, + display::DisplayPlacement::Position position, + int offset, + int64_t primary_id) { std::string name = ash::DisplayIdListToString(list); DictionaryPrefUpdate update(&local_state_, prefs::kSecondaryDisplays); - ash::DisplayLayout display_layout; + display::DisplayLayout display_layout; display_layout.placement_list.emplace_back(position, offset); display_layout.primary_id = primary_id; @@ -124,7 +125,7 @@ pref_data->Set(name, layout_value.release()); } - void StoreDisplayPropertyForList(const ash::DisplayIdList& list, + void StoreDisplayPropertyForList(const display::DisplayIdList& list, std::string key, scoped_ptr<base::Value> value) { std::string name = ash::DisplayIdListToString(list); @@ -146,15 +147,15 @@ } } - void StoreDisplayBoolPropertyForList(const ash::DisplayIdList& list, + void StoreDisplayBoolPropertyForList(const display::DisplayIdList& list, const std::string& key, bool value) { StoreDisplayPropertyForList( list, key, make_scoped_ptr(new base::FundamentalValue(value))); } - void StoreDisplayLayoutPrefForList(const ash::DisplayIdList& list, - ash::DisplayPlacement::Position layout, + void StoreDisplayLayoutPrefForList(const display::DisplayIdList& list, + display::DisplayPlacement::Position layout, int offset) { StoreDisplayLayoutPrefForList(list, layout, offset, list[0]); } @@ -190,7 +191,8 @@ pref_data->SetInteger("orientation", static_cast<int>(rotation)); } - std::string GetRegisteredDisplayPlacementStr(const ash::DisplayIdList& list) { + std::string GetRegisteredDisplayPlacementStr( + const display::DisplayIdList& list) { return ash::Shell::GetInstance() ->display_manager() ->layout_store() @@ -217,13 +219,14 @@ ash::DisplayManager* display_manager = ash::Shell::GetInstance()->display_manager(); - ash::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); - ash::DisplayIdList dummy_list = + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList dummy_list = ash::test::CreateDisplayIdList2(list[0], list[1] + 1); ASSERT_NE(list[0], dummy_list[1]); - StoreDisplayLayoutPrefForList(list, ash::DisplayPlacement::TOP, 20); - StoreDisplayLayoutPrefForList(dummy_list, ash::DisplayPlacement::LEFT, 30); + StoreDisplayLayoutPrefForList(list, display::DisplayPlacement::TOP, 20); + StoreDisplayLayoutPrefForList(dummy_list, display::DisplayPlacement::LEFT, + 30); StoreDisplayPowerStateForTest( chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON); @@ -275,16 +278,17 @@ LoggedInAsUser(); display_manager->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::TOP, 10)); - const ash::DisplayLayout& layout = display_manager->GetCurrentDisplayLayout(); - EXPECT_EQ(ash::DisplayPlacement::TOP, layout.placement_list[0].position); + ash::test::CreateDisplayLayout(display::DisplayPlacement::TOP, 10)); + const display::DisplayLayout& layout = + display_manager->GetCurrentDisplayLayout(); + EXPECT_EQ(display::DisplayPlacement::TOP, layout.placement_list[0].position); EXPECT_EQ(10, layout.placement_list[0].offset); - ash::DisplayLayoutBuilder dummy_layout_builder(id1); - dummy_layout_builder.SetSecondaryPlacement(dummy_id, - ash::DisplayPlacement::LEFT, 20); - scoped_ptr<ash::DisplayLayout> dummy_layout(dummy_layout_builder.Build()); - ash::DisplayIdList list = ash::test::CreateDisplayIdList2(id1, dummy_id); + display::DisplayLayoutBuilder dummy_layout_builder(id1); + dummy_layout_builder.SetSecondaryPlacement( + dummy_id, display::DisplayPlacement::LEFT, 20); + scoped_ptr<display::DisplayLayout> dummy_layout(dummy_layout_builder.Build()); + display::DisplayIdList list = ash::test::CreateDisplayIdList2(id1, dummy_id); StoreDisplayLayoutPrefForTest(list, *dummy_layout); // Can't switch to a display that does not exist. @@ -305,7 +309,7 @@ base::Int64ToString(id1) + "," + base::Int64ToString(dummy_id); EXPECT_TRUE(displays->GetDictionary(dummy_key, &layout_value)); - ash::DisplayLayout stored_layout; + display::DisplayLayout stored_layout; EXPECT_TRUE(ash::JsonToDisplayLayout(*layout_value, &stored_layout)); ASSERT_EQ(1u, stored_layout.placement_list.size()); @@ -402,9 +406,9 @@ EXPECT_TRUE(ash::JsonToDisplayLayout(*layout_value, &stored_layout)); ASSERT_EQ(1u, stored_layout.placement_list.size()); - const ash::DisplayPlacement& stored_placement = + const display::DisplayPlacement& stored_placement = stored_layout.placement_list[0]; - EXPECT_EQ(ash::DisplayPlacement::BOTTOM, stored_placement.position); + EXPECT_EQ(display::DisplayPlacement::BOTTOM, stored_placement.position); EXPECT_EQ(-10, stored_placement.offset); EXPECT_EQ(id1, stored_placement.display_id); EXPECT_EQ(id2, stored_placement.parent_display_id); @@ -421,7 +425,7 @@ EXPECT_EQ(base::Int64ToString(id2), primary_id_str); display_manager->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::BOTTOM, 20)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 20)); UpdateDisplay("1+0-200x200*2,1+0-200x200"); // Mirrored. @@ -576,12 +580,12 @@ { const base::DictionaryValue* new_value = nullptr; EXPECT_TRUE(displays->GetDictionary(key, &new_value)); - ash::DisplayLayout stored_layout; + display::DisplayLayout stored_layout; EXPECT_TRUE(ash::JsonToDisplayLayout(*new_value, &stored_layout)); ASSERT_EQ(1u, stored_layout.placement_list.size()); - const ash::DisplayPlacement& stored_placement = + const display::DisplayPlacement& stored_placement = stored_layout.placement_list[0]; - EXPECT_EQ(ash::DisplayPlacement::LEFT, stored_placement.position); + EXPECT_EQ(display::DisplayPlacement::LEFT, stored_placement.position); EXPECT_EQ(0, stored_placement.offset); EXPECT_EQ(id1, stored_placement.display_id); EXPECT_EQ(id2, stored_placement.parent_display_id); @@ -591,15 +595,15 @@ // Updating layout with primary swapped should save the correct value. { ash::Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::TOP, 10)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::TOP, 10)); const base::DictionaryValue* new_value = nullptr; EXPECT_TRUE(displays->GetDictionary(key, &new_value)); - ash::DisplayLayout stored_layout; + display::DisplayLayout stored_layout; EXPECT_TRUE(ash::JsonToDisplayLayout(*new_value, &stored_layout)); ASSERT_EQ(1u, stored_layout.placement_list.size()); - const ash::DisplayPlacement& stored_placement = + const display::DisplayPlacement& stored_placement = stored_layout.placement_list[0]; - EXPECT_EQ(ash::DisplayPlacement::TOP, stored_placement.position); + EXPECT_EQ(display::DisplayPlacement::TOP, stored_placement.position); EXPECT_EQ(10, stored_placement.offset); EXPECT_EQ(id1, stored_placement.display_id); EXPECT_EQ(id2, stored_placement.parent_display_id); @@ -611,14 +615,14 @@ ash::test::SwapPrimaryDisplay(); const base::DictionaryValue* new_value = nullptr; EXPECT_TRUE(displays->GetDictionary(key, &new_value)); - ash::DisplayLayout stored_layout; + display::DisplayLayout stored_layout; EXPECT_TRUE(displays->GetDictionary(key, &new_value)); EXPECT_TRUE(ash::JsonToDisplayLayout(*new_value, &stored_layout)); ASSERT_EQ(1u, stored_layout.placement_list.size()); - const ash::DisplayPlacement& stored_placement = + const display::DisplayPlacement& stored_placement = stored_layout.placement_list[0]; - EXPECT_EQ(ash::DisplayPlacement::BOTTOM, stored_placement.position); + EXPECT_EQ(display::DisplayPlacement::BOTTOM, stored_placement.position); EXPECT_EQ(-10, stored_placement.offset); EXPECT_EQ(id2, stored_placement.display_id); EXPECT_EQ(id1, stored_placement.parent_display_id); @@ -668,7 +672,7 @@ ash::DisplayManager* display_manager = ash::Shell::GetInstance()->display_manager(); display_manager->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::TOP, 10)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::TOP, 10)); ash::SetDisplayUIScale(id1, 1.25f); window_tree_host_manager->SetPrimaryDisplayId(id2); int64_t new_primary = gfx::Screen::GetScreen()->GetPrimaryDisplay().id(); @@ -686,9 +690,9 @@ // Settings are still notified to the system. gfx::Screen* screen = gfx::Screen::GetScreen(); EXPECT_EQ(id2, screen->GetPrimaryDisplay().id()); - const ash::DisplayPlacement& placement = + const display::DisplayPlacement& placement = display_manager->GetCurrentDisplayLayout().placement_list[0]; - EXPECT_EQ(ash::DisplayPlacement::BOTTOM, placement.position); + EXPECT_EQ(display::DisplayPlacement::BOTTOM, placement.position); EXPECT_EQ(-10, placement.offset); const gfx::Display& primary_display = screen->GetPrimaryDisplay(); EXPECT_EQ("178x176", primary_display.bounds().size().ToString()); @@ -960,7 +964,7 @@ display_manager->SetUnifiedDesktopEnabled(true); UpdateDisplay("200x200,100x100"); - ash::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); EXPECT_EQ("400x200", gfx::Screen::GetScreen()->GetPrimaryDisplay().size().ToString()); @@ -970,7 +974,7 @@ EXPECT_TRUE(secondary_displays->GetDictionary( ash::DisplayIdListToString(list), &new_value)); - ash::DisplayLayout stored_layout; + display::DisplayLayout stored_layout; EXPECT_TRUE(ash::JsonToDisplayLayout(*new_value, &stored_layout)); EXPECT_TRUE(stored_layout.default_unified); EXPECT_FALSE(stored_layout.mirrored); @@ -1014,7 +1018,7 @@ TEST_F(DisplayPreferencesTest, RestoreUnifiedMode) { int64_t id1 = gfx::Screen::GetScreen()->GetPrimaryDisplay().id(); - ash::DisplayIdList list = ash::test::CreateDisplayIdList2(id1, id1 + 1); + display::DisplayIdList list = ash::test::CreateDisplayIdList2(id1, id1 + 1); StoreDisplayBoolPropertyForList(list, "default_unified", true); StoreDisplayPropertyForList( list, "primary-id", @@ -1059,14 +1063,14 @@ ash::Shell::GetInstance()->display_manager(); UpdateDisplay("200x200,200x200,300x300"); - ash::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList list = display_manager->GetCurrentDisplayIdList(); ASSERT_EQ(3u, list.size()); - ash::DisplayLayoutBuilder builder(list[0]); - builder.AddDisplayPlacement(list[1], list[0], ash::DisplayPlacement::RIGHT, - 0); - builder.AddDisplayPlacement(list[2], list[0], ash::DisplayPlacement::BOTTOM, - 100); + display::DisplayLayoutBuilder builder(list[0]); + builder.AddDisplayPlacement(list[1], list[0], + display::DisplayPlacement::RIGHT, 0); + builder.AddDisplayPlacement(list[2], list[0], + display::DisplayPlacement::BOTTOM, 100); display_manager->SetLayoutForCurrentDisplays(builder.Build()); const base::DictionaryValue* secondary_displays = @@ -1081,18 +1085,19 @@ ash::DisplayManager* display_manager = ash::Shell::GetInstance()->display_manager(); int64_t id1 = gfx::Screen::GetScreen()->GetPrimaryDisplay().id(); - ash::DisplayIdList list = + display::DisplayIdList list = ash::test::CreateDisplayIdListN(3, id1, id1 + 1, id1 + 2); - ash::DisplayLayoutBuilder builder(list[0]); - builder.AddDisplayPlacement(list[1], list[0], ash::DisplayPlacement::LEFT, 0); - builder.AddDisplayPlacement(list[2], list[1], ash::DisplayPlacement::BOTTOM, - 100); + display::DisplayLayoutBuilder builder(list[0]); + builder.AddDisplayPlacement(list[1], list[0], display::DisplayPlacement::LEFT, + 0); + builder.AddDisplayPlacement(list[2], list[1], + display::DisplayPlacement::BOTTOM, 100); StoreDisplayLayoutPrefForTest(list, *builder.Build()); LoadDisplayPreferences(false); UpdateDisplay("200x200,200x200,300x300"); - ash::DisplayIdList new_list = display_manager->GetCurrentDisplayIdList(); + display::DisplayIdList new_list = display_manager->GetCurrentDisplayIdList(); ASSERT_EQ(3u, list.size()); ASSERT_EQ(list[0], new_list[0]); ASSERT_EQ(list[1], new_list[1]);
diff --git a/chrome/browser/chromeos/extensions/wallpaper_apitest.cc b/chrome/browser/chromeos/extensions/wallpaper_apitest.cc index 1e6a19d..66e69e5 100644 --- a/chrome/browser/chromeos/extensions/wallpaper_apitest.cc +++ b/chrome/browser/chromeos/extensions/wallpaper_apitest.cc
@@ -5,8 +5,7 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "net/dns/mock_host_resolver.h" -// Disabled due to flakiness. See http://crbug.com/468632. -IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_Wallpaper) { +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Wallpaper) { host_resolver()->AddRule("a.com", "127.0.0.1"); ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionTest("wallpaper")) << message_;
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc index ce46325..39903b39 100644 --- a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc +++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
@@ -21,6 +21,7 @@ #include "base/macros.h" #include "base/memory/ref_counted_memory.h" #include "base/memory/scoped_ptr.h" +#include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" @@ -61,6 +62,7 @@ namespace save_thumbnail = wallpaper_private::SaveThumbnail; namespace get_offline_wallpaper_list = wallpaper_private::GetOfflineWallpaperList; +namespace record_wallpaper_uma = wallpaper_private::RecordWallpaperUMA; namespace { @@ -269,6 +271,22 @@ window->RemoveObserver(this); } +user_manager::User::WallpaperType getWallpaperType( + wallpaper_private::WallpaperSource source) { + switch (source) { + case wallpaper_private::WALLPAPER_SOURCE_ONLINE: + return user_manager::User::ONLINE; + case wallpaper_private::WALLPAPER_SOURCE_DAILY: + return user_manager::User::DAILY; + case wallpaper_private::WALLPAPER_SOURCE_CUSTOM: + return user_manager::User::CUSTOMIZED; + case wallpaper_private::WALLPAPER_SOURCE_OEM: + return user_manager::User::DEFAULT; + default: + return user_manager::User::ONLINE; + } +} + } // namespace bool WallpaperPrivateGetStringsFunction::RunSync() { @@ -937,3 +955,14 @@ SetResult(results); SendResponse(true); } + +bool WallpaperPrivateRecordWallpaperUMAFunction::RunSync() { + scoped_ptr<record_wallpaper_uma::Params> params( + record_wallpaper_uma::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + + user_manager::User::WallpaperType source = getWallpaperType(params->source); + UMA_HISTOGRAM_ENUMERATION("Ash.Wallpaper.Source", source, + user_manager::User::WALLPAPER_TYPE_COUNT); + return true; +}
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.h b/chrome/browser/chromeos/extensions/wallpaper_private_api.h index 3636978..21a5a4b5 100644 --- a/chrome/browser/chromeos/extensions/wallpaper_private_api.h +++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.h
@@ -307,4 +307,19 @@ base::SequencedWorkerPool::SequenceToken sequence_token_; }; +// The wallpaper UMA is recorded when a new wallpaper is set, either by the +// built-in Wallpaper Picker App, or by a third party App. +class WallpaperPrivateRecordWallpaperUMAFunction + : public SyncExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("wallpaperPrivate.recordWallpaperUMA", + WALLPAPERPRIVATE_RECORDWALLPAPERUMA) + + protected: + ~WallpaperPrivateRecordWallpaperUMAFunction() override {} + + // SyncExtensionFunction overrides. + bool RunSync() override; +}; + #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_WALLPAPER_PRIVATE_API_H_
diff --git a/chrome/browser/chromeos/login/hwid_checker.cc b/chrome/browser/chromeos/login/hwid_checker.cc index 2b370f0..2158da35 100644 --- a/chrome/browser/chromeos/login/hwid_checker.cc +++ b/chrome/browser/chromeos/login/hwid_checker.cc
@@ -19,6 +19,8 @@ namespace { +const char kVMSystemVendor[] = "QEMU"; + unsigned CalculateCRC32(const std::string& data) { return static_cast<unsigned>(crc32( 0, @@ -118,9 +120,18 @@ return true; if (!base::SysInfo::IsRunningOnChromeOS()) return true; - std::string hwid; chromeos::system::StatisticsProvider* stats = chromeos::system::StatisticsProvider::GetInstance(); + + std::string system_vendor; + if (stats->GetMachineStatistic(chromeos::system::kSystemVendorKey, + &system_vendor) && + system_vendor == kVMSystemVendor) { + // We are running in a VM. + return true; + } + + std::string hwid; if (!stats->GetMachineStatistic(chromeos::system::kHardwareClassKey, &hwid)) { LOG(ERROR) << "Couldn't get machine statistic 'hardware_class'."; return false;
diff --git a/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc b/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc index 8429c93..2f02827 100644 --- a/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc +++ b/chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.cc
@@ -49,7 +49,7 @@ user_session_mgr->InitRlz(profile()); user_session_mgr->InitializeCerts(profile()); user_session_mgr->InitializeCRLSetFetcher(user); - user_session_mgr->InitializeEVCertificatesWhitelistComponent(user); + user_session_mgr->InitializeCertificateTransparencyComponents(user); // Send the PROFILE_PREPARED notification and call SessionStarted() // so that the Launcher and other Profile dependent classes are created.
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 2a75b4c..e0b4eec 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -60,6 +60,7 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/component_updater/ev_whitelist_component_installer.h" +#include "chrome/browser/component_updater/sth_set_component_installer.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/google/google_brand_chromeos.h" #include "chrome/browser/lifetime/application_lifetime.h" @@ -112,6 +113,7 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/content_switches.h" +#include "net/cert/sth_distributor.h" #include "ui/base/ime/chromeos/input_method_descriptor.h" #include "ui/base/ime/chromeos/input_method_manager.h" #include "url/gurl.h" @@ -1148,7 +1150,7 @@ InitRlz(profile); InitializeCerts(profile); InitializeCRLSetFetcher(user); - InitializeEVCertificatesWhitelistComponent(user); + InitializeCertificateTransparencyComponents(user); if (arc::ArcBridgeService::GetEnabled( base::CommandLine::ForCurrentProcess())) { @@ -1415,7 +1417,7 @@ } } -void UserSessionManager::InitializeEVCertificatesWhitelistComponent( +void UserSessionManager::InitializeCertificateTransparencyComponents( const user_manager::User* user) { const std::string username_hash = user->username_hash(); component_updater::ComponentUpdateService* cus = @@ -1423,7 +1425,10 @@ if (!username_hash.empty() && cus) { const base::FilePath path = ProfileHelper::GetProfilePathByUserIdHash(username_hash); + // EV whitelist. RegisterEVWhitelistComponent(cus, path); + // STH set fetcher. + RegisterSTHSetComponent(cus, path); } }
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.h b/chrome/browser/chromeos/login/session/user_session_manager.h index 31b7367..551bd10 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.h +++ b/chrome/browser/chromeos/login/session/user_session_manager.h
@@ -163,8 +163,9 @@ // Starts loading CRL set. void InitializeCRLSetFetcher(const user_manager::User* user); - // Starts loading EV Certificates whitelist. - void InitializeEVCertificatesWhitelistComponent( + // Starts loading CT-related components, which are the EV Certificates + // whitelist and the STHSet. + void InitializeCertificateTransparencyComponents( const user_manager::User* user); // Invoked when the user is logging in for the first time, or is logging in to
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc index d073a91..7c8b192 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc
@@ -35,7 +35,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/theme_provider.h" #include "ui/views/background.h" -#include "ui/views/bubble/bubble_delegate.h" #include "ui/views/controls/webview/webview.h" #include "ui/views/layout/grid_layout.h" #include "ui/views/layout/layout_constants.h" @@ -297,11 +296,6 @@ return toolbar_model_.get(); } -views::Widget* SimpleWebViewDialog::CreateViewsBubble( - views::BubbleDelegateView* bubble_delegate) { - return views::BubbleDelegateView::CreateBubble(bubble_delegate); -} - ContentSettingBubbleModelDelegate* SimpleWebViewDialog::GetContentSettingBubbleModelDelegate() { return bubble_model_delegate_.get();
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h index 684a0838b..302c118 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h
@@ -77,8 +77,6 @@ content::WebContents* GetWebContents() override; ToolbarModel* GetToolbarModel() override; const ToolbarModel* GetToolbarModel() const override; - views::Widget* CreateViewsBubble( - views::BubbleDelegateView* bubble_delegate) override; PageActionImageView* CreatePageActionImageView( LocationBarView* owner, ExtensionAction* action) override;
diff --git a/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc b/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc index 111defe..cee8718 100644 --- a/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc +++ b/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc
@@ -30,6 +30,7 @@ #include "chromeos/settings/cros_settings_names.h" #include "content/public/test/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/display.h" namespace em = enterprise_management; @@ -56,7 +57,7 @@ << "Requested rotation of second display while there was only one."; return gfx::Display::ROTATE_0; } - const ash::DisplayIdList display_id_pair = + const display::DisplayIdList display_id_pair = display_manager->GetCurrentDisplayIdList(); const gfx::Display& second_display = display_manager->GetDisplayForId(display_id_pair[1]);
diff --git a/chrome/browser/component_updater/sth_set_component_installer.cc b/chrome/browser/component_updater/sth_set_component_installer.cc new file mode 100644 index 0000000..7b1bf7b --- /dev/null +++ b/chrome/browser/component_updater/sth_set_component_installer.cc
@@ -0,0 +1,198 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/component_updater/sth_set_component_installer.h" + +#include <utility> + +#include "base/bind.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/strings/string_number_conversions.h" +#include "base/values.h" +#include "base/version.h" +#include "components/component_updater/component_updater_paths.h" +#include "components/safe_json/safe_json_parser.h" +#include "content/public/browser/browser_thread.h" +#include "crypto/sha2.h" +#include "net/cert/ct_known_logs_static.h" +#include "net/cert/ct_log_response_parser.h" +#include "net/cert/signed_tree_head.h" +#include "net/cert/sth_distributor.h" +#include "net/cert/sth_observer.h" + +using component_updater::ComponentUpdateService; + +namespace { +const base::FilePath::CharType kSTHsDirName[] = FILE_PATH_LITERAL("sths"); + +base::FilePath GetInstalledPath(const base::FilePath& base) { + return base.Append(FILE_PATH_LITERAL("_platform_specific")) + .Append(FILE_PATH_LITERAL("all")) + .Append(kSTHsDirName); +} + +} // namespace + +namespace component_updater { + +// The SHA256 of the SubjectPublicKeyInfo used to sign the extension. +// The extension id is: ojjgnpkioondelmggbekfhllhdaimnho +const uint8_t kPublicKeySHA256[32] = { + 0xe9, 0x96, 0xdf, 0xa8, 0xee, 0xd3, 0x4b, 0xc6, 0x61, 0x4a, 0x57, + 0xbb, 0x73, 0x08, 0xcd, 0x7e, 0x51, 0x9b, 0xcc, 0x69, 0x08, 0x41, + 0xe1, 0x96, 0x9f, 0x7c, 0xb1, 0x73, 0xef, 0x16, 0x80, 0x0a}; + +const char kSTHSetFetcherManifestName[] = "Signed Tree Heads"; + +STHSetComponentInstallerTraits::STHSetComponentInstallerTraits( + scoped_ptr<net::ct::STHObserver> sth_observer) + : sth_observer_(std::move(sth_observer)) {} + +STHSetComponentInstallerTraits::~STHSetComponentInstallerTraits() {} + +bool STHSetComponentInstallerTraits::CanAutoUpdate() const { + return true; +} + +// Public data is delivered via this component, no need for encryption. +bool STHSetComponentInstallerTraits::RequiresNetworkEncryption() const { + return false; +} + +bool STHSetComponentInstallerTraits::OnCustomInstall( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) { + return true; // Nothing custom here. +} + +void STHSetComponentInstallerTraits::ComponentReady( + const base::Version& version, + const base::FilePath& install_dir, + scoped_ptr<base::DictionaryValue> manifest) { + if (!content::BrowserThread::PostBlockingPoolTask( + FROM_HERE, + base::Bind(&STHSetComponentInstallerTraits::LoadSTHsFromDisk, + base::Unretained(this), GetInstalledPath(install_dir), + version))) { + NOTREACHED(); + } +} + +// Called during startup and installation before ComponentReady(). +bool STHSetComponentInstallerTraits::VerifyInstallation( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) const { + return base::PathExists(GetInstalledPath(install_dir)); +} + +base::FilePath STHSetComponentInstallerTraits::GetBaseDirectory() const { + base::FilePath result; + PathService::Get(DIR_CERT_TRANS_TREE_STATES, &result); + return result; +} + +void STHSetComponentInstallerTraits::GetHash(std::vector<uint8_t>* hash) const { + hash->assign(std::begin(kPublicKeySHA256), std::end(kPublicKeySHA256)); +} + +std::string STHSetComponentInstallerTraits::GetName() const { + return kSTHSetFetcherManifestName; +} + +void STHSetComponentInstallerTraits::LoadSTHsFromDisk( + const base::FilePath& sths_path, + const base::Version& version) { + if (sths_path.empty()) + return; + + base::FileEnumerator sth_file_enumerator(sths_path, false, + base::FileEnumerator::FILES, + FILE_PATH_LITERAL("*.sth")); + base::FilePath sth_file_path; + + while (!(sth_file_path = sth_file_enumerator.Next()).empty()) { + DVLOG(1) << "Reading STH from file: " << sth_file_path.value(); + + const std::string log_id_hex = + sth_file_path.BaseName().RemoveExtension().MaybeAsASCII(); + if (log_id_hex.empty()) { + DVLOG(1) << "Error extracting log_id from: " + << sth_file_path.BaseName().LossyDisplayName(); + continue; + } + + std::vector<uint8_t> decoding_output; + if (!base::HexStringToBytes(log_id_hex, &decoding_output)) { + DVLOG(1) << "Failed to decode Log ID: " << log_id_hex; + continue; + } + + const std::string log_id(reinterpret_cast<const char*>(&decoding_output[0]), + decoding_output.size()); + + std::string json_sth; + if (!base::ReadFileToString(sth_file_path, &json_sth)) { + DVLOG(1) << "Failed reading from " << sth_file_path.value(); + continue; + } + + DVLOG(1) << "STH: Successfully read: " << json_sth; + safe_json::SafeJsonParser::Parse( + json_sth, + base::Bind(&STHSetComponentInstallerTraits::OnJsonParseSuccess, + base::Unretained(this), log_id), + base::Bind(&STHSetComponentInstallerTraits::OnJsonParseError, + base::Unretained(this), log_id)); + } +} + +void STHSetComponentInstallerTraits::OnJsonParseSuccess( + const std::string& log_id, + scoped_ptr<base::Value> parsed_json) { + net::ct::SignedTreeHead signed_tree_head; + DVLOG(1) << "STH parsing success for log: " + << base::HexEncode(log_id.data(), log_id.length()); + if (!net::ct::FillSignedTreeHead(*(parsed_json.get()), &signed_tree_head)) { + LOG(ERROR) << "Failed to fill in signed tree head."; + return; + } + + // The log id is not a part of the response, fill in manually. + signed_tree_head.log_id = log_id; + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&net::ct::STHObserver::NewSTHObserved, + base::Unretained(sth_observer_.get()), signed_tree_head)); +} + +void STHSetComponentInstallerTraits::OnJsonParseError( + const std::string& log_id, + const std::string& error) { + DVLOG(1) << "STH loading failed: " << error + << " for log: " << base::HexEncode(log_id.data(), log_id.length()); +} + +void RegisterSTHSetComponent(ComponentUpdateService* cus, + const base::FilePath& user_data_dir) { + DVLOG(1) << "Registering STH Set fetcher component."; + + // TODO(eranm): The next step in auditing CT logs (crbug.com/506227) is to + // pass the distributor to the IOThread so it can be used in a per-profile + // context for checking inclusion of SCTs. + scoped_ptr<net::ct::STHDistributor> distributor( + new net::ct::STHDistributor()); + + scoped_ptr<ComponentInstallerTraits> traits( + new STHSetComponentInstallerTraits(std::move(distributor))); + // |cus| will take ownership of |installer| during installer->Register(cus). + DefaultComponentInstaller* installer = + new DefaultComponentInstaller(std::move(traits)); + installer->Register(cus, base::Closure()); +} + +} // namespace component_updater
diff --git a/chrome/browser/component_updater/sth_set_component_installer.h b/chrome/browser/component_updater/sth_set_component_installer.h new file mode 100644 index 0000000..0b99544c --- /dev/null +++ b/chrome/browser/component_updater/sth_set_component_installer.h
@@ -0,0 +1,85 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_COMPONENT_UPDATER_STH_SET_COMPONENT_INSTALLER_H_ +#define CHROME_BROWSER_COMPONENT_UPDATER_STH_SET_COMPONENT_INSTALLER_H_ + +#include <stdint.h> + +#include <string> +#include <vector> + +#include "base/gtest_prod_util.h" +#include "base/memory/scoped_ptr.h" +#include "components/component_updater/default_component_installer.h" + +namespace base { +class FilePath; +class Value; +} // namespace base + +namespace net { +namespace ct { +class STHObserver; +} // namespace ct +} // namespace net + +namespace component_updater { + +class ComponentUpdateService; + +// Component for receiving Signed Tree Heads updates for Certificate +// Transparency logs recognized in Chrome. +// The STHs are in JSON format. +// To identify the log each STH belongs to, the name of the file is +// hex-encoded Log ID of the log that produced this STH. +// +// Notifications of each of the new STHs are sent to the net::ct::STHObserver, +// so that it can take appropriate steps, including possible persistence. +class STHSetComponentInstallerTraits : public ComponentInstallerTraits { + public: + // The |sth_distributor| will be notified each time a new STH is observed. + explicit STHSetComponentInstallerTraits( + scoped_ptr<net::ct::STHObserver> sth_observer); + ~STHSetComponentInstallerTraits() override; + + private: + friend class STHSetComponentInstallerTest; + + // ComponentInstallerTraits implementation. + bool CanAutoUpdate() const override; + bool RequiresNetworkEncryption() const override; + bool OnCustomInstall(const base::DictionaryValue& manifest, + const base::FilePath& install_dir) override; + bool VerifyInstallation(const base::DictionaryValue& manifest, + const base::FilePath& install_dir) const override; + void ComponentReady(const base::Version& version, + const base::FilePath& install_dir, + scoped_ptr<base::DictionaryValue> manifest) override; + base::FilePath GetBaseDirectory() const override; + void GetHash(std::vector<uint8_t>* hash) const override; + std::string GetName() const override; + + // Reads and parses the on-disk json. + void LoadSTHsFromDisk(const base::FilePath& sths_file_path, + const base::Version& version); + + // Handle successful parsing of JSON by distributing the new STH. + void OnJsonParseSuccess(const std::string& log_id, + scoped_ptr<base::Value> parsed_json); + + // STH parsing failed - do nothing. + void OnJsonParseError(const std::string& log_id, const std::string& error); + + scoped_ptr<net::ct::STHObserver> sth_observer_; + + DISALLOW_COPY_AND_ASSIGN(STHSetComponentInstallerTraits); +}; + +void RegisterSTHSetComponent(ComponentUpdateService* cus, + const base::FilePath& user_data_dir); + +} // namespace component_updater + +#endif // CHROME_BROWSER_COMPONENT_UPDATER_STH_SET_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/sth_set_component_installer_unittest.cc b/chrome/browser/component_updater/sth_set_component_installer_unittest.cc new file mode 100644 index 0000000..4f2480b4 --- /dev/null +++ b/chrome/browser/component_updater/sth_set_component_installer_unittest.cc
@@ -0,0 +1,150 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/component_updater/sth_set_component_installer.h" + +#include <map> +#include <string> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/run_loop.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "base/version.h" +#include "components/safe_json/testing_json_parser.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "net/cert/signed_tree_head.h" +#include "net/cert/sth_observer.h" +#include "net/test/ct_test_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + +namespace component_updater { + +class StoringSTHObserver : public net::ct::STHObserver { + public: + void NewSTHObserved(const net::ct::SignedTreeHead& sth) override { + sths[sth.log_id] = sth; + } + + std::map<std::string, net::ct::SignedTreeHead> sths; +}; + +class STHSetComponentInstallerTest : public PlatformTest { + public: + STHSetComponentInstallerTest() {} + void SetUp() override { + PlatformTest::SetUp(); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + + scoped_ptr<StoringSTHObserver> observer(new StoringSTHObserver()); + observer_ = observer.get(); + traits_.reset(new STHSetComponentInstallerTraits(std::move(observer))); + } + + void WriteSTHToFile(const std::string& sth_json, + const base::FilePath& filename) { + ASSERT_EQ(static_cast<int32_t>(sth_json.length()), + base::WriteFile(filename, sth_json.data(), sth_json.length())); + } + + base::FilePath GetSTHsDir() { + return temp_dir_.path() + .Append(FILE_PATH_LITERAL("_platform_specific")) + .Append(FILE_PATH_LITERAL("all")) + .Append(FILE_PATH_LITERAL("sths")); + } + + void CreateSTHsDir(const base::DictionaryValue& manifest, + const base::FilePath& sths_dir) { + ASSERT_FALSE(traits_->VerifyInstallation(manifest, temp_dir_.path())); + ASSERT_TRUE(base::CreateDirectory(sths_dir)); + } + + void LoadSTHs(const base::DictionaryValue& manifest, + const base::FilePath& sths_dir) { + ASSERT_TRUE(traits_->VerifyInstallation(manifest, temp_dir_.path())); + + const base::Version v("1.0"); + traits_->LoadSTHsFromDisk(sths_dir, v); + // Drain the RunLoop created by the TestBrowserThreadBundle + base::RunLoop().RunUntilIdle(); + } + + protected: + content::TestBrowserThreadBundle thread_bundle_; + + base::ScopedTempDir temp_dir_; + scoped_ptr<STHSetComponentInstallerTraits> traits_; + StoringSTHObserver* observer_; + safe_json::TestingJsonParser::ScopedFactoryOverride factory_override_; + + private: + DISALLOW_COPY_AND_ASSIGN(STHSetComponentInstallerTest); +}; + +// Parses valid STH JSON in a file with valid hex encoding of log id. +TEST_F(STHSetComponentInstallerTest, CanLoadAllSTHs) { + const base::DictionaryValue manifest; + const base::FilePath sths_dir(GetSTHsDir()); + CreateSTHsDir(manifest, sths_dir); + + const std::string good_sth_json = net::ct::GetSampleSTHAsJson(); + const base::FilePath first_sth_file = + sths_dir.Append(FILE_PATH_LITERAL("616263.sth")); + WriteSTHToFile(good_sth_json, first_sth_file); + + const base::FilePath second_sth_file = + sths_dir.Append(FILE_PATH_LITERAL("610064.sth")); + WriteSTHToFile(good_sth_json, second_sth_file); + + LoadSTHs(manifest, sths_dir); + + EXPECT_EQ(2u, observer_->sths.size()); + + const std::string first_log_id("abc"); + ASSERT_TRUE(observer_->sths.find(first_log_id) != observer_->sths.end()); + const net::ct::SignedTreeHead& first_sth(observer_->sths[first_log_id]); + EXPECT_EQ(21u, first_sth.tree_size); + + const std::string second_log_id("a\00d", 3); + ASSERT_TRUE(observer_->sths.find(second_log_id) != observer_->sths.end()); +} + +// Does not notify of invalid STH JSON. +TEST_F(STHSetComponentInstallerTest, DoesNotLoadInvalidJSON) { + const base::DictionaryValue manifest; + const base::FilePath sths_dir(GetSTHsDir()); + CreateSTHsDir(manifest, sths_dir); + + const base::FilePath invalid_sth = + sths_dir.Append(FILE_PATH_LITERAL("010101.sth")); + WriteSTHToFile(std::string("{invalid json}"), invalid_sth); + + LoadSTHs(manifest, sths_dir); + EXPECT_EQ(0u, observer_->sths.size()); +} + +// Does not notify of valid JSON but in a file not hex-encoded log id. +TEST_F(STHSetComponentInstallerTest, + DoesNotLoadValidJSONFromFileNotHexEncoded) { + const base::DictionaryValue manifest; + const base::FilePath sths_dir(GetSTHsDir()); + CreateSTHsDir(manifest, sths_dir); + + const base::FilePath not_hex_sth_file = + sths_dir.Append(FILE_PATH_LITERAL("nothex.sth")); + WriteSTHToFile(net::ct::GetSampleSTHAsJson(), not_hex_sth_file); + + LoadSTHs(manifest, sths_dir); + EXPECT_EQ(0u, observer_->sths.size()); +} + +} // namespace component_updater
diff --git a/chrome/browser/download/all_download_item_notifier_unittest.cc b/chrome/browser/download/all_download_item_notifier_unittest.cc index 6793886..2a4de9e8 100644 --- a/chrome/browser/download/all_download_item_notifier_unittest.cc +++ b/chrome/browser/download/all_download_item_notifier_unittest.cc
@@ -71,8 +71,8 @@ private: NiceMock<content::MockDownloadItem> item_; - scoped_ptr<content::MockDownloadManager> download_manager_; - scoped_ptr<AllDownloadItemNotifier> notifier_; + std::unique_ptr<content::MockDownloadManager> download_manager_; + std::unique_ptr<AllDownloadItemNotifier> notifier_; NiceMock<MockNotifierObserver> observer_; DISALLOW_COPY_AND_ASSIGN(AllDownloadItemNotifierTest);
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index e8213ae..4caf254 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -456,7 +456,7 @@ content::WebContents* web_contents = download->GetWebContents(); Browser* browser = web_contents ? chrome::FindBrowserWithWebContents(web_contents) : NULL; - scoped_ptr<chrome::ScopedTabbedBrowserDisplayer> browser_displayer; + std::unique_ptr<chrome::ScopedTabbedBrowserDisplayer> browser_displayer; if (!browser || !browser->CanSupportWindowFeature(Browser::FEATURE_TABSTRIP)) { browser_displayer.reset(new chrome::ScopedTabbedBrowserDisplayer(profile_)); @@ -727,7 +727,7 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined( int32_t download_id, const content::DownloadTargetCallback& callback, - scoped_ptr<DownloadTargetInfo> target_info) { + std::unique_ptr<DownloadTargetInfo> target_info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DownloadItem* item = download_manager_->GetDownload(download_id); if (item) {
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h index 508966f..04e2540b 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.h +++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -7,10 +7,11 @@ #include <stdint.h> +#include <memory> + #include "base/compiler_specific.h" #include "base/containers/hash_tables.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/download/download_path_reservation_tracker.h" #include "chrome/browser/download/download_target_determiner_delegate.h" @@ -153,7 +154,7 @@ void OnDownloadTargetDetermined( int32_t download_id, const content::DownloadTargetCallback& callback, - scoped_ptr<DownloadTargetInfo> target_info); + std::unique_ptr<DownloadTargetInfo> target_info); // Returns true if |path| should open in the browser. bool IsOpenInBrowserPreferreredForFile(const base::FilePath& path); @@ -161,7 +162,7 @@ Profile* profile_; uint32_t next_download_id_; IdCallbackVector id_callbacks_; - scoped_ptr<DownloadPrefs> download_prefs_; + std::unique_ptr<DownloadPrefs> download_prefs_; #if defined(ENABLE_EXTENSIONS) // Maps from pending extension installations to DownloadItem IDs.
diff --git a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc index 505c56b..d3e21f8 100644 --- a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc +++ b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
@@ -157,7 +157,8 @@ void VerifyAndClearExpectations(); // Creates MockDownloadItem and sets up default expectations. - scoped_ptr<content::MockDownloadItem> CreateActiveDownloadItem(int32_t id); + std::unique_ptr<content::MockDownloadItem> CreateActiveDownloadItem( + int32_t id); // Given the relative path |path|, returns the full path under the temporary // downloads directory. @@ -183,8 +184,8 @@ private: syncable_prefs::TestingPrefServiceSyncable* pref_service_; base::ScopedTempDir test_download_dir_; - scoped_ptr<content::MockDownloadManager> download_manager_; - scoped_ptr<TestChromeDownloadManagerDelegate> delegate_; + std::unique_ptr<content::MockDownloadManager> download_manager_; + std::unique_ptr<TestChromeDownloadManagerDelegate> delegate_; MockWebContentsDelegate web_contents_delegate_; }; @@ -215,9 +216,9 @@ ::testing::Mock::VerifyAndClearExpectations(delegate_.get()); } -scoped_ptr<content::MockDownloadItem> +std::unique_ptr<content::MockDownloadItem> ChromeDownloadManagerDelegateTest::CreateActiveDownloadItem(int32_t id) { - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( new ::testing::NiceMock<content::MockDownloadItem>()); ON_CALL(*item, GetBrowserContext()) .WillByDefault(Return(profile())); @@ -332,7 +333,7 @@ TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_LastSavePath) { GURL download_url("http://example.com/foo.txt"); - scoped_ptr<content::MockDownloadItem> save_as_download = + std::unique_ptr<content::MockDownloadItem> save_as_download = CreateActiveDownloadItem(0); EXPECT_CALL(*save_as_download, GetURL()) .Times(::testing::AnyNumber()) @@ -341,7 +342,7 @@ .Times(::testing::AnyNumber()) .WillRepeatedly(Return(DownloadItem::TARGET_DISPOSITION_PROMPT)); - scoped_ptr<content::MockDownloadItem> automatic_download = + std::unique_ptr<content::MockDownloadItem> automatic_download = CreateActiveDownloadItem(1); EXPECT_CALL(*automatic_download, GetURL()) .Times(::testing::AnyNumber()) @@ -405,7 +406,7 @@ TEST_F(ChromeDownloadManagerDelegateTest, MaybeDangerousContent) { GURL url("http://example.com/foo"); - scoped_ptr<content::MockDownloadItem> download_item = + std::unique_ptr<content::MockDownloadItem> download_item = CreateActiveDownloadItem(0); EXPECT_CALL(*download_item, GetURL()).WillRepeatedly(ReturnRef(url)); EXPECT_CALL(*download_item, GetTargetDisposition()) @@ -463,7 +464,7 @@ default_download_path().AppendASCII("bar"); base::WriteFile(existing_path, kData, kDataLength); - scoped_ptr<content::MockDownloadItem> download_item = + std::unique_ptr<content::MockDownloadItem> download_item = CreateActiveDownloadItem(1); EXPECT_CALL(*download_item, GetTargetFilePath()) .WillRepeatedly(ReturnRef(existing_path)); @@ -511,7 +512,8 @@ } private: - scoped_ptr<TestDownloadProtectionService> test_download_protection_service_; + std::unique_ptr<TestDownloadProtectionService> + test_download_protection_service_; }; void ChromeDownloadManagerDelegateTestWithSafeBrowsing::SetUp() { @@ -637,7 +639,7 @@ TEST_P(ChromeDownloadManagerDelegateTestWithSafeBrowsing, CheckClientDownload) { const SafeBrowsingTestParameters& kParameters = GetParam(); - scoped_ptr<content::MockDownloadItem> download_item = + std::unique_ptr<content::MockDownloadItem> download_item = CreateActiveDownloadItem(0); EXPECT_CALL(*delegate(), GetDownloadProtectionService()); EXPECT_CALL(*download_protection_service(), MockCheckClientDownload())
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index 88ad87c..c9401185 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc
@@ -263,7 +263,7 @@ : profile_(profile), result_valid_(false) {} bool WaitForDownloadInfo( - scoped_ptr<std::vector<history::DownloadRow> >* results) { + std::unique_ptr<std::vector<history::DownloadRow>>* results) { history::HistoryService* hs = HistoryServiceFactory::GetForProfile( profile_, ServiceAccessType::EXPLICIT_ACCESS); DCHECK(hs); @@ -280,14 +280,14 @@ private: void OnQueryDownloadsComplete( - scoped_ptr<std::vector<history::DownloadRow> > entries) { + std::unique_ptr<std::vector<history::DownloadRow>> entries) { result_valid_ = true; results_ = std::move(entries); base::MessageLoopForUI::current()->QuitWhenIdle(); } Profile* profile_; - scoped_ptr<std::vector<history::DownloadRow> > results_; + std::unique_ptr<std::vector<history::DownloadRow>> results_; bool result_valid_; DISALLOW_COPY_AND_ASSIGN(DownloadsHistoryDataCollector); @@ -420,7 +420,7 @@ void SetUpOnMainThread() override { base::FeatureList::ClearInstanceForTesting(); - scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); feature_list->InitializeFromCommandLine( features::kDownloadResumption.name, std::string()); base::FeatureList::SetInstance(std::move(feature_list)); @@ -589,7 +589,7 @@ WindowOpenDisposition disposition, int browser_test_flags) { // Setup notification, navigate, and block. - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( CreateWaiter(browser, 1)); // This call will block until the condition specified by // |browser_test_flags|, but will not wait for the download to finish. @@ -666,7 +666,7 @@ } DownloadItem* CreateSlowTestDownload() { - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( CreateInProgressDownloadObserver(1)); GURL slow_download_url(net::URLRequestSlowDownloadJob::kUnknownSizeUrl); DownloadManager* manager = DownloadManagerForBrowser(browser()); @@ -718,7 +718,7 @@ // Download a partial web page in a background tab and wait. // The mock system will not complete until it gets a special URL. - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( CreateWaiter(browser, 1)); ui_test_utils::NavigateToURL(browser, url); @@ -866,7 +866,7 @@ browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_contents); - scoped_ptr<content::DownloadTestObserver> observer; + std::unique_ptr<content::DownloadTestObserver> observer; if (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) { observer.reset(new content::DownloadTestObserverTerminal( download_manager, 1, @@ -882,7 +882,7 @@ scoped_refptr<content::DownloadTestItemCreationObserver> creation_observer(new content::DownloadTestItemCreationObserver); - scoped_ptr<DownloadUrlParameters> params( + std::unique_ptr<DownloadUrlParameters> params( DownloadUrlParameters::FromWebContents(web_contents, starting_url)); params->set_callback(creation_observer->callback()); DownloadManagerForBrowser(browser())->DownloadUrl(std::move(params)); @@ -1034,9 +1034,9 @@ error_info.error = error; error_injector->InjectError(error_info); - scoped_ptr<content::DownloadTestObserver> observer( - new DownloadTestObserverResumable( - DownloadManagerForBrowser(browser()), 1)); + std::unique_ptr<content::DownloadTestObserver> observer( + new DownloadTestObserverResumable(DownloadManagerForBrowser(browser()), + 1)); GURL url = URLRequestMockHTTPJob::GetMockUrl(kDownloadTest1Path); ui_test_utils::NavigateToURL(browser(), url); @@ -1070,7 +1070,7 @@ // Location of the downloads directory for these tests base::ScopedTempDir downloads_directory_; - scoped_ptr<DownloadTestFileActivityObserver> file_activity_observer_; + std::unique_ptr<DownloadTestFileActivityObserver> file_activity_observer_; }; namespace { @@ -1147,7 +1147,7 @@ } protected: - scoped_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_; + std::unique_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_; }; } // namespace @@ -1203,10 +1203,9 @@ // Download the file and wait. We expect the Select File dialog to appear // due to the MIME type, but we still wait until the download completes. - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( new content::DownloadTestObserverTerminal( - DownloadManagerForBrowser(browser()), - 1, + DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); ui_test_utils::NavigateToURL(browser(), url); observer->WaitForFinished(); @@ -1245,9 +1244,9 @@ // S -> C: HTTP/1.1 200 OK // Content-Type: foo/bar // ... -static scoped_ptr<net::test_server::HttpResponse> RespondWithContentTypeHandler( - const net::test_server::HttpRequest& request) { - scoped_ptr<net::test_server::BasicHttpResponse> response( +static std::unique_ptr<net::test_server::HttpResponse> +RespondWithContentTypeHandler(const net::test_server::HttpRequest& request) { + std::unique_ptr<net::test_server::BasicHttpResponse> response( new net::test_server::BasicHttpResponse()); response->set_content_type(request.relative_url.substr(1)); response->set_code(net::HTTP_OK); @@ -1647,8 +1646,8 @@ // download be canceled by having the file picker act like the user canceled // the download. The 2nd tab should be closed automatically. IN_PROC_BROWSER_TEST_F(DownloadTest, CloseNewTab4) { - scoped_ptr<content::DownloadTestObserver> observer( - CreateWaiter(browser(), 1)); + std::unique_ptr<content::DownloadTestObserver> observer( + CreateWaiter(browser(), 1)); DownloadManager* manager = DownloadManagerForBrowser(browser()); EXPECT_EQ(0, manager->InProgressCount()); EnableFileChooser(false); @@ -1667,7 +1666,7 @@ EXPECT_EQ(2, browser()->tab_strip_model()->count()); // Download a file in that new tab, having it open a file picker - scoped_ptr<DownloadUrlParameters> params( + std::unique_ptr<DownloadUrlParameters> params( DownloadUrlParameters::FromWebContents(new_tab, slow_download_url)); params->set_prompt(true); manager->DownloadUrl(std::move(params)); @@ -1691,9 +1690,9 @@ // S -> C: HTTP/1.1 301 Moved Permanently // Location: http://example.com // ... -static scoped_ptr<net::test_server::HttpResponse> ServerRedirectRequestHandler( - const net::test_server::HttpRequest& request) { - scoped_ptr<net::test_server::BasicHttpResponse> response( +static std::unique_ptr<net::test_server::HttpResponse> +ServerRedirectRequestHandler(const net::test_server::HttpRequest& request) { + std::unique_ptr<net::test_server::BasicHttpResponse> response( new net::test_server::BasicHttpResponse()); size_t query_position = request.relative_url.find('?'); @@ -1739,7 +1738,7 @@ observer.WaitForStored(); // Get the details on what was stored into the history. - scoped_ptr<std::vector<history::DownloadRow> > downloads_in_database; + std::unique_ptr<std::vector<history::DownloadRow>> downloads_in_database; ASSERT_TRUE(DownloadsHistoryDataCollector( browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); ASSERT_EQ(1u, downloads_in_database->size()); @@ -1767,7 +1766,7 @@ // Finish the download. We're ok relying on the history to be flushed // at this point as our queries will be behind the history updates // invoked by completion. - scoped_ptr<content::DownloadTestObserver> download_observer( + std::unique_ptr<content::DownloadTestObserver> download_observer( new content::DownloadTestObserverInterrupted( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -1823,7 +1822,7 @@ URLRequestMockHTTPJob::GetMockUrl("downloads/dangerous/dangerous.swf")); // Download the url and wait until the object has been stored. - scoped_ptr<content::DownloadTestObserver> download_observer( + std::unique_ptr<content::DownloadTestObserver> download_observer( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE)); @@ -1834,7 +1833,7 @@ observer.WaitForStored(); // Get the details on what was stored into the history. - scoped_ptr<std::vector<history::DownloadRow> > downloads_in_database; + std::unique_ptr<std::vector<history::DownloadRow>> downloads_in_database; ASSERT_TRUE(DownloadsHistoryDataCollector( browser()->profile()).WaitForDownloadInfo(&downloads_in_database)); ASSERT_EQ(1u, downloads_in_database->size()); @@ -1931,7 +1930,7 @@ // Create a download, wait until it's complete, and confirm // we're in the expected state. - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( CreateWaiter(browser(), 1)); ui_test_utils::NavigateToURL(browser(), url); observer->WaitForFinished(); @@ -1979,7 +1978,7 @@ GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY)); @@ -2006,7 +2005,7 @@ GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); @@ -2041,7 +2040,7 @@ extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( extensions::ScopedTestDialogAutoConfirm::ACCEPT); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); @@ -2074,7 +2073,7 @@ extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( extensions::ScopedTestDialogAutoConfirm::ACCEPT); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); @@ -2101,7 +2100,7 @@ extensions::ScopedTestDialogAutoConfirm auto_confirm_install_prompt( extensions::ScopedTestDialogAutoConfirm::ACCEPT); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT)); @@ -2140,7 +2139,7 @@ new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); - scoped_ptr<DownloadUrlParameters> params( + std::unique_ptr<DownloadUrlParameters> params( DownloadUrlParameters::FromWebContents(web_contents, url)); params->set_prompt(true); DownloadManagerForBrowser(browser())->DownloadUrl(std::move(params)); @@ -2168,7 +2167,7 @@ base::FilePath target_file_full_path = other_directory.path().Append(file.BaseName()); content::DownloadTestObserver* observer(CreateWaiter(browser(), 1)); - scoped_ptr<DownloadUrlParameters> params( + std::unique_ptr<DownloadUrlParameters> params( DownloadUrlParameters::FromWebContents(web_contents, url)); params->set_file_path(target_file_full_path); DownloadManagerForBrowser(browser())->DownloadUrl(std::move(params)); @@ -2210,7 +2209,7 @@ // reachable. ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - scoped_ptr<content::DownloadTestObserver> waiter( + std::unique_ptr<content::DownloadTestObserver> waiter( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2226,7 +2225,7 @@ ASSERT_EQ(url, download_items[0]->GetOriginalUrl()); // Try to download it via a context menu. - scoped_ptr<content::DownloadTestObserver> waiter_context_menu( + std::unique_ptr<content::DownloadTestObserver> waiter_context_menu( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2256,9 +2255,9 @@ // A EmbeddedTestServer::HandleRequestCallback function that checks for requests // with query string ?allow-post-only, and returns a 404 response if the method // is not POST. -static scoped_ptr<net::test_server::HttpResponse> FilterPostOnlyURLsHandler( - const net::test_server::HttpRequest& request) { - scoped_ptr<net::test_server::BasicHttpResponse> response; +static std::unique_ptr<net::test_server::HttpResponse> +FilterPostOnlyURLsHandler(const net::test_server::HttpRequest& request) { + std::unique_ptr<net::test_server::BasicHttpResponse> response; if (request.relative_url.find("?allow-post-only") != std::string::npos && request.method != net::test_server::METHOD_POST) { response.reset(new net::test_server::BasicHttpResponse()); @@ -2308,7 +2307,7 @@ // reachable. This will also fail if it tries to be retrieved via "GET" // rather than "POST". ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - scoped_ptr<content::DownloadTestObserver> waiter( + std::unique_ptr<content::DownloadTestObserver> waiter( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2324,7 +2323,7 @@ ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); // Try to download it via a context menu. - scoped_ptr<content::DownloadTestObserver> waiter_context_menu( + std::unique_ptr<content::DownloadTestObserver> waiter_context_menu( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2546,14 +2545,14 @@ // Content-Type: text/plain // // http://example.com/foo -static scoped_ptr<net::test_server::HttpResponse> EchoReferrerRequestHandler( - const net::test_server::HttpRequest& request) { +static std::unique_ptr<net::test_server::HttpResponse> +EchoReferrerRequestHandler(const net::test_server::HttpRequest& request) { const std::string kReferrerHeader = "Referer"; // SIC if (request.relative_url.find("/echoreferrer") != 0) - return scoped_ptr<net::test_server::HttpResponse>(); + return std::unique_ptr<net::test_server::HttpResponse>(); - scoped_ptr<net::test_server::BasicHttpResponse> response( + std::unique_ptr<net::test_server::BasicHttpResponse> response( new net::test_server::BasicHttpResponse()); response->set_code(net::HTTP_OK); response->set_content_type("text/plain"); @@ -2579,7 +2578,7 @@ ASSERT_TRUE(url.is_valid()); ui_test_utils::NavigateToURL(browser(), url); - scoped_ptr<content::DownloadTestObserver> waiter( + std::unique_ptr<content::DownloadTestObserver> waiter( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2633,7 +2632,7 @@ ASSERT_TRUE(url.is_valid()); ui_test_utils::NavigateToURL(browser(), url); - scoped_ptr<content::DownloadTestObserver> waiter( + std::unique_ptr<content::DownloadTestObserver> waiter( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2688,7 +2687,7 @@ ui_test_utils::NavigateToURL(browser(), url); // Try to download an image via a context menu. - scoped_ptr<content::DownloadTestObserver> waiter_context_menu( + std::unique_ptr<content::DownloadTestObserver> waiter_context_menu( new content::DownloadTestObserverTerminal( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -2727,8 +2726,8 @@ switches::kDisablePermissionsBubbles); // Create a downloads observer. - scoped_ptr<content::DownloadTestObserver> downloads_observer( - CreateWaiter(browser(), 2)); + std::unique_ptr<content::DownloadTestObserver> downloads_observer( + CreateWaiter(browser(), 2)); // Create an infobar observer. content::WindowedNotificationObserver infobar_added_1( @@ -2775,8 +2774,8 @@ #endif // Create a downloads observer. - scoped_ptr<content::DownloadTestObserver> downloads_observer( - CreateWaiter(browser(), 2)); + std::unique_ptr<content::DownloadTestObserver> downloads_observer( + CreateWaiter(browser(), 2)); PermissionBubbleManager* permission_bubble_manager = PermissionBubbleManager::FromWebContents( @@ -2972,7 +2971,7 @@ ASSERT_LE(size, free_space) << "Not enough disk space to download. Got " << free_space; GURL file_url(net::FilePathToFileURL(file_path)); - scoped_ptr<content::DownloadTestObserver> progress_waiter( + std::unique_ptr<content::DownloadTestObserver> progress_waiter( CreateInProgressWaiter(browser(), 1)); // Start downloading a file, wait for it to be created. @@ -3008,7 +3007,7 @@ scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); - scoped_ptr<content::DownloadTestObserver> completion_observer( + std::unique_ptr<content::DownloadTestObserver> completion_observer( CreateWaiter(browser(), 1)); EnableFileChooser(true); @@ -3031,7 +3030,7 @@ scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); - scoped_ptr<content::DownloadTestObserver> completion_observer( + std::unique_ptr<content::DownloadTestObserver> completion_observer( CreateWaiter(browser(), 1)); EnableFileChooser(true); @@ -3055,7 +3054,7 @@ scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); - scoped_ptr<content::DownloadTestObserver> completion_observer( + std::unique_ptr<content::DownloadTestObserver> completion_observer( CreateWaiter(browser(), 1)); EnableFileChooser(true); @@ -3093,7 +3092,7 @@ // only care that it is greater than 1. EXPECT_GT(1u, error_injector->TotalFileCount()); - scoped_ptr<content::DownloadTestObserver> completion_observer( + std::unique_ptr<content::DownloadTestObserver> completion_observer( CreateWaiter(browser(), 1)); download->Resume(); completion_observer->WaitForFinished(); @@ -3109,13 +3108,13 @@ scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create( DownloadManagerForBrowser(browser()))); - scoped_ptr<DownloadTestObserverNotInProgress> completion_observer( + std::unique_ptr<DownloadTestObserverNotInProgress> completion_observer( new DownloadTestObserverNotInProgress( DownloadManagerForBrowser(browser()), 1)); // Wait for two transitions to a resumable state - scoped_ptr<content::DownloadTestObserver> resumable_observer( - new DownloadTestObserverResumable( - DownloadManagerForBrowser(browser()), 2)); + std::unique_ptr<content::DownloadTestObserver> resumable_observer( + new DownloadTestObserverResumable(DownloadManagerForBrowser(browser()), + 2)); EnableFileChooser(true); DownloadItem* download = StartMockDownloadAndInjectError( @@ -3221,11 +3220,11 @@ true); GURL download_url = net::URLRequestMockHTTPJob::GetMockUrl(kDangerousMockFilePath); - scoped_ptr<content::DownloadTestObserver> dangerous_observer( + std::unique_ptr<content::DownloadTestObserver> dangerous_observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); - scoped_ptr<content::DownloadTestObserver> in_progress_observer( + std::unique_ptr<content::DownloadTestObserver> in_progress_observer( new DisableSafeBrowsingOnInProgressDownload(browser())); ui_test_utils::NavigateToURLWithDisposition(browser(), download_url, @@ -3257,7 +3256,7 @@ GURL download_url = net::URLRequestMockHTTPJob::GetMockUrl(kDangerousMockFilePath); - scoped_ptr<content::DownloadTestObserver> dangerous_observer( + std::unique_ptr<content::DownloadTestObserver> dangerous_observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); @@ -3300,7 +3299,7 @@ // Make a dangerous file. GURL download_url(net::URLRequestMockHTTPJob::GetMockUrl( "downloads/dangerous/dangerous.swf")); - scoped_ptr<content::DownloadTestObserverInterrupted> observer( + std::unique_ptr<content::DownloadTestObserverInterrupted> observer( new content::DownloadTestObserverInterrupted( DownloadManagerForBrowser(browser()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); @@ -3356,7 +3355,7 @@ // Make a dangerous file. GURL download_url( net::URLRequestMockHTTPJob::GetMockUrl(kDangerousMockFilePath)); - scoped_ptr<content::DownloadTestObserver> dangerous_observer( + std::unique_ptr<content::DownloadTestObserver> dangerous_observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); @@ -3392,7 +3391,7 @@ // Make a dangerous file. GURL download_url( net::URLRequestMockHTTPJob::GetMockUrl(kDangerousMockFilePath)); - scoped_ptr<content::DownloadTestObserver> dangerous_observer( + std::unique_ptr<content::DownloadTestObserver> dangerous_observer( DangerousDownloadWaiter( browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); @@ -3622,7 +3621,7 @@ GURL url(URLRequestMockHTTPJob::GetMockUrl(kDownloadTest1Path)); DownloadManager* download_manager = DownloadManagerForBrowser(browser()); - scoped_ptr<content::DownloadTestObserver> observer( + std::unique_ptr<content::DownloadTestObserver> observer( new content::DownloadTestObserverTerminal( download_manager, 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); @@ -3630,7 +3629,7 @@ // Download and set IsHiddenDownload to true. WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - scoped_ptr<DownloadUrlParameters> params( + std::unique_ptr<DownloadUrlParameters> params( DownloadUrlParameters::FromWebContents(web_contents, url)); params->set_callback(base::Bind(&SetHiddenDownloadCallback)); download_manager->DownloadUrl(std::move(params)); @@ -3662,8 +3661,10 @@ GURL extension_url(URLRequestMockHTTPJob::GetMockUrl(kGoodCrxPath)); - scoped_ptr<content::DownloadTestObserver> observer(DangerousDownloadWaiter( - browser(), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY)); + std::unique_ptr<content::DownloadTestObserver> observer( + DangerousDownloadWaiter( + browser(), 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY)); ui_test_utils::NavigateToURL(browser(), extension_url); observer->WaitForFinished();
diff --git a/chrome/browser/download/download_crx_util.cc b/chrome/browser/download/download_crx_util.cc index 12281d8..13fd68e 100644 --- a/chrome/browser/download/download_crx_util.cc +++ b/chrome/browser/download/download_crx_util.cc
@@ -34,7 +34,7 @@ // Called to get an extension install UI object. In tests, will return // a mock if the test calls download_util::SetMockInstallPromptForTesting() // to set one. -scoped_ptr<ExtensionInstallPrompt> CreateExtensionInstallPrompt( +std::unique_ptr<ExtensionInstallPrompt> CreateExtensionInstallPrompt( Profile* profile, const DownloadItem& download_item) { // Use a mock if one is present. Otherwise, create a real extensions @@ -42,7 +42,7 @@ if (mock_install_prompt_for_testing) { ExtensionInstallPrompt* result = mock_install_prompt_for_testing; mock_install_prompt_for_testing = NULL; - return scoped_ptr<ExtensionInstallPrompt>(result); + return std::unique_ptr<ExtensionInstallPrompt>(result); } else { content::WebContents* web_contents = download_item.GetWebContents(); if (!web_contents) { @@ -52,7 +52,7 @@ new Browser(Browser::CreateParams(Browser::TYPE_TABBED, profile)); web_contents = browser->tab_strip_model()->GetActiveWebContents(); } - return scoped_ptr<ExtensionInstallPrompt>( + return std::unique_ptr<ExtensionInstallPrompt>( new ExtensionInstallPrompt(web_contents)); } } @@ -62,7 +62,7 @@ // Tests can call this method to inject a mock ExtensionInstallPrompt // to be used to confirm permissions on a downloaded CRX. void SetMockInstallPromptForTesting( - scoped_ptr<ExtensionInstallPrompt> mock_prompt) { + std::unique_ptr<ExtensionInstallPrompt> mock_prompt) { mock_install_prompt_for_testing = mock_prompt.release(); }
diff --git a/chrome/browser/download/download_crx_util.h b/chrome/browser/download/download_crx_util.h index d76ee45..cd84fab 100644 --- a/chrome/browser/download/download_crx_util.h +++ b/chrome/browser/download/download_crx_util.h
@@ -7,9 +7,9 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_CRX_UTIL_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_CRX_UTIL_H_ +#include <memory> #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" class ExtensionInstallPrompt; class Profile; @@ -27,7 +27,7 @@ // Allow tests to install a mock ExtensionInstallPrompt object, to fake // user clicks on the permissions dialog. void SetMockInstallPromptForTesting( - scoped_ptr<ExtensionInstallPrompt> mock_prompt); + std::unique_ptr<ExtensionInstallPrompt> mock_prompt); // Create and pre-configure a CrxInstaller for a given |download_item|. scoped_refptr<extensions::CrxInstaller> CreateCrxInstaller(
diff --git a/chrome/browser/download/download_danger_prompt.cc b/chrome/browser/download/download_danger_prompt.cc index a062f4a..f5b2e8f4 100644 --- a/chrome/browser/download/download_danger_prompt.cc +++ b/chrome/browser/download/download_danger_prompt.cc
@@ -74,7 +74,7 @@ bool show_context_; OnDone done_; - scoped_ptr<ExperienceSamplingEvent> sampling_event_; + std::unique_ptr<ExperienceSamplingEvent> sampling_event_; DISALLOW_COPY_AND_ASSIGN(DownloadDangerPromptImpl); };
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc index 6125dd6..9986c5d6 100644 --- a/chrome/browser/download/download_danger_prompt_browsertest.cc +++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -181,7 +181,7 @@ DownloadDangerPrompt* prompt_; DownloadDangerPrompt::Action expected_action_; bool did_receive_callback_; - scoped_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_; + std::unique_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_; std::string expected_serialized_report_; bool report_sent_;
diff --git a/chrome/browser/download/download_dir_policy_handler.cc b/chrome/browser/download/download_dir_policy_handler.cc index 680f619..c49ddfb6 100644 --- a/chrome/browser/download/download_dir_policy_handler.cc +++ b/chrome/browser/download/download_dir_policy_handler.cc
@@ -6,8 +6,10 @@ #include <stddef.h> +#include <memory> + #include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/download/download_prefs.h" @@ -103,7 +105,7 @@ if (expanded_value.empty()) expanded_value = DownloadPrefs::GetDefaultDownloadDirectory().value(); prefs->SetValue(prefs::kDownloadDefaultDirectory, - make_scoped_ptr(new base::StringValue(expanded_value))); + base::WrapUnique(new base::StringValue(expanded_value))); // If the policy is mandatory, prompt for download should be disabled. // Otherwise, it would enable a user to bypass the mandatory policy.
diff --git a/chrome/browser/download/download_dir_policy_handler_unittest.cc b/chrome/browser/download/download_dir_policy_handler_unittest.cc index 0b78adb..3051a25c9 100644 --- a/chrome/browser/download/download_dir_policy_handler_unittest.cc +++ b/chrome/browser/download/download_dir_policy_handler_unittest.cc
@@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/download/download_dir_policy_handler.h" + #include <string> #include "base/compiler_specific.h" #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/values.h" #include "build/build_config.h" -#include "chrome/browser/download/download_dir_policy_handler.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/common/pref_names.h" #include "components/drive/drive_pref_names.h" @@ -53,7 +55,7 @@ &handler_list_, policy::POLICY_LEVEL_RECOMMENDED); handler_list_.AddHandler( - make_scoped_ptr<policy::ConfigurationPolicyHandler>( + base::WrapUnique<policy::ConfigurationPolicyHandler>( new DownloadDirPolicyHandler)); }
diff --git a/chrome/browser/download/download_history.cc b/chrome/browser/download/download_history.cc index 84d8067..eb4e2e9 100644 --- a/chrome/browser/download/download_history.cc +++ b/chrome/browser/download/download_history.cc
@@ -105,7 +105,7 @@ static const char kKey[]; PersistenceState state_; - scoped_ptr<history::DownloadRow> info_; + std::unique_ptr<history::DownloadRow> info_; bool was_restored_from_history_; DISALLOW_COPY_AND_ASSIGN(DownloadHistoryData); @@ -213,7 +213,7 @@ } DownloadHistory::DownloadHistory(content::DownloadManager* manager, - scoped_ptr<HistoryAdapter> history) + std::unique_ptr<HistoryAdapter> history) : notifier_(manager, this), history_(std::move(history)), loading_id_(content::DownloadItem::kInvalidId), @@ -263,7 +263,7 @@ download->GetId() == loading_id_; } -void DownloadHistory::QueryCallback(scoped_ptr<InfoVector> infos) { +void DownloadHistory::QueryCallback(std::unique_ptr<InfoVector> infos) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // ManagerGoingDown() may have happened before the history loaded. if (!notifier_.GetManager())
diff --git a/chrome/browser/download/download_history.h b/chrome/browser/download/download_history.h index e6d943b..6b763d9 100644 --- a/chrome/browser/download/download_history.h +++ b/chrome/browser/download/download_history.h
@@ -84,9 +84,8 @@ // Neither |manager| nor |history| may be NULL. // DownloadService creates DownloadHistory some time after DownloadManager is // created and destroys DownloadHistory as DownloadManager is shutting down. - DownloadHistory( - content::DownloadManager* manager, - scoped_ptr<HistoryAdapter> history); + DownloadHistory(content::DownloadManager* manager, + std::unique_ptr<HistoryAdapter> history); ~DownloadHistory() override; @@ -106,8 +105,7 @@ // Callback from |history_| containing all entries in the downloads database // table. - void QueryCallback( - scoped_ptr<std::vector<history::DownloadRow> > infos); + void QueryCallback(std::unique_ptr<std::vector<history::DownloadRow>> infos); // May add |item| to |history_|. void MaybeAddToHistory(content::DownloadItem* item); @@ -136,7 +134,7 @@ AllDownloadItemNotifier notifier_; - scoped_ptr<HistoryAdapter> history_; + std::unique_ptr<HistoryAdapter> history_; // Identifier of the item being created in QueryCallback(), matched up with // created items in OnDownloadCreated() so that the item is not re-added to
diff --git a/chrome/browser/download/download_history_unittest.cc b/chrome/browser/download/download_history_unittest.cc index bef3b28..63961cc 100644 --- a/chrome/browser/download/download_history_unittest.cc +++ b/chrome/browser/download/download_history_unittest.cc
@@ -101,7 +101,7 @@ } } - void ExpectWillQueryDownloads(scoped_ptr<InfoVector> infos) { + void ExpectWillQueryDownloads(std::unique_ptr<InfoVector> infos) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); expect_query_downloads_ = std::move(infos); } @@ -165,7 +165,7 @@ bool fail_create_download_; base::Closure create_download_callback_; history::DownloadRow update_download_; - scoped_ptr<InfoVector> expect_query_downloads_; + std::unique_ptr<InfoVector> expect_query_downloads_; IdSet remove_downloads_; history::DownloadRow create_download_info_; @@ -208,7 +208,7 @@ return manager_observer_; } - void CreateDownloadHistory(scoped_ptr<InfoVector> infos) { + void CreateDownloadHistory(std::unique_ptr<InfoVector> infos) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); CHECK(infos.get()); EXPECT_CALL(manager(), AddObserver(_)).WillOnce(WithArg<0>(Invoke( @@ -248,7 +248,8 @@ history_->ExpectWillQueryDownloads(std::move(infos)); EXPECT_CALL(*manager_.get(), GetAllDownloads(_)).WillRepeatedly(Return()); download_history_.reset(new DownloadHistory( - &manager(), scoped_ptr<DownloadHistory::HistoryAdapter>(history_))); + &manager(), + std::unique_ptr<DownloadHistory::HistoryAdapter>(history_))); content::RunAllPendingInMessageLoop(content::BrowserThread::UI); history_->ExpectQueryDownloadsDone(); } @@ -467,9 +468,9 @@ base::MessageLoopForUI loop_; content::TestBrowserThread ui_thread_; std::vector<StrictMockDownloadItem*> items_; - scoped_ptr<content::MockDownloadManager> manager_; + std::unique_ptr<content::MockDownloadManager> manager_; FakeHistoryAdapter* history_; - scoped_ptr<DownloadHistory> download_history_; + std::unique_ptr<DownloadHistory> download_history_; content::DownloadManager::Observer* manager_observer_; size_t download_created_index_; DownloadItemCallback pre_on_create_handler_; @@ -489,7 +490,7 @@ "http://example.com/referrer.html", &info); { - scoped_ptr<InfoVector> infos(new InfoVector()); + std::unique_ptr<InfoVector> infos(new InfoVector()); infos->push_back(info); CreateDownloadHistory(std::move(infos)); ExpectNoDownloadCreated(); @@ -528,20 +529,20 @@ TestDownloadHistoryObserver observer; history::HistoryService::DownloadQueryCallback query_callback; - scoped_ptr<TestHistoryAdapter> test_history_adapter( + std::unique_ptr<TestHistoryAdapter> test_history_adapter( new TestHistoryAdapter(&query_callback)); // Create a new DownloadHistory object. This should cause // TestHistoryAdapter::QueryDownloads() to be called. The TestHistoryAdapter // stored the completion callback. - scoped_ptr<DownloadHistory> history( + std::unique_ptr<DownloadHistory> history( new DownloadHistory(&manager(), std::move(test_history_adapter))); history->AddObserver(&observer); EXPECT_FALSE(observer.on_history_query_complete_called_); ASSERT_FALSE(query_callback.is_null()); // Now invoke the query completion callback. - scoped_ptr<std::vector<history::DownloadRow>> query_results( + std::unique_ptr<std::vector<history::DownloadRow>> query_results( new std::vector<history::DownloadRow>()); query_callback.Run(std::move(query_results)); EXPECT_TRUE(observer.on_history_query_complete_called_); @@ -552,7 +553,7 @@ // observer that was added after the initial history query completing. TEST_F(DownloadHistoryTest, DownloadHistoryTest_OnHistoryQueryComplete_Post) { TestDownloadHistoryObserver observer; - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); download_history()->AddObserver(&observer); EXPECT_TRUE(observer.on_history_query_complete_called_); download_history()->RemoveObserver(&observer); @@ -576,7 +577,7 @@ "http://example.com/bar.pdf", "http://example.com/referrer.html", &info); - scoped_ptr<InfoVector> infos(new InfoVector()); + std::unique_ptr<InfoVector> infos(new InfoVector()); infos->push_back(info); CreateDownloadHistory(std::move(infos)); @@ -594,7 +595,7 @@ // Create a DownloadHistory with no history downloads. No // DownloadManager::CreateDownload() calls are expected. - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); // Notify DownloadHistory that a new download was created. The above test // expecation should verify that WasRestoredFromHistory is correct for this @@ -613,7 +614,7 @@ TEST_F(DownloadHistoryTest, DownloadHistoryTest_Create) { // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, // OnDownloadRemoved. - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -642,7 +643,7 @@ // Test that changes to persisted fields in a DownloadItem triggers database // updates. TEST_F(DownloadHistoryTest, DownloadHistoryTest_Update) { - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -738,7 +739,7 @@ TEST_F(DownloadHistoryTest, DownloadHistoryTest_Temporary) { // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, // OnDownloadRemoved. - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -781,7 +782,7 @@ // Test removing downloads while they're still being added. TEST_F(DownloadHistoryTest, DownloadHistoryTest_RemoveWhileAdding) { - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -831,7 +832,7 @@ "http://example.com/referrer1.html", &info1); { - scoped_ptr<InfoVector> infos(new InfoVector()); + std::unique_ptr<InfoVector> infos(new InfoVector()); infos->push_back(info0); infos->push_back(info1); CreateDownloadHistory(std::move(infos)); @@ -854,7 +855,7 @@ TEST_F(DownloadHistoryTest, DownloadHistoryTest_CreateFailed) { // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, // OnDownloadRemoved. - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -878,7 +879,7 @@ TEST_F(DownloadHistoryTest, DownloadHistoryTest_UpdateWhileAdding) { // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, // OnDownloadRemoved. - CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector())); + CreateDownloadHistory(std::unique_ptr<InfoVector>(new InfoVector())); history::DownloadRow info; InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
diff --git a/chrome/browser/download/download_path_reservation_tracker_unittest.cc b/chrome/browser/download/download_path_reservation_tracker_unittest.cc index 2a65597..fa9f99c 100644 --- a/chrome/browser/download/download_path_reservation_tracker_unittest.cc +++ b/chrome/browser/download/download_path_reservation_tracker_unittest.cc
@@ -162,7 +162,7 @@ // A basic reservation is acquired and committed. TEST_F(DownloadPathReservationTrackerTest, BasicReservation) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); ASSERT_FALSE(IsPathInUse(path)); @@ -192,7 +192,7 @@ // A download that is interrupted should lose its reservation. TEST_F(DownloadPathReservationTrackerTest, InterruptedDownload) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); ASSERT_FALSE(IsPathInUse(path)); @@ -221,7 +221,7 @@ // A completed download should also lose its reservation. TEST_F(DownloadPathReservationTrackerTest, CompleteDownload) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); ASSERT_FALSE(IsPathInUse(path)); @@ -254,7 +254,7 @@ // If there are files on the file system, a unique reservation should uniquify // around it. TEST_F(DownloadPathReservationTrackerTest, ConflictingFiles) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); base::FilePath path1( @@ -296,7 +296,7 @@ // Multiple reservations for the same path should uniquify around each other. TEST_F(DownloadPathReservationTrackerTest, ConflictingReservations) { - scoped_ptr<MockDownloadItem> item1(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item1(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); base::FilePath uniquified_path( @@ -324,7 +324,7 @@ { // Requesting a reservation for the same path with uniquification results in // a uniquified path. - scoped_ptr<MockDownloadItem> item2(CreateDownloadItem(2)); + std::unique_ptr<MockDownloadItem> item2(CreateDownloadItem(2)); base::FilePath reserved_path2; CallGetReservedPath( item2.get(), @@ -345,7 +345,7 @@ { // Since the previous download item was removed, requesting a reservation // for the same path should result in the same uniquified path. - scoped_ptr<MockDownloadItem> item2(CreateDownloadItem(2)); + std::unique_ptr<MockDownloadItem> item2(CreateDownloadItem(2)); base::FilePath reserved_path2; CallGetReservedPath( item2.get(), @@ -363,7 +363,7 @@ // Now acquire an overwriting reservation. We should end up with the same // non-uniquified path for both reservations. - scoped_ptr<MockDownloadItem> item3(CreateDownloadItem(2)); + std::unique_ptr<MockDownloadItem> item3(CreateDownloadItem(2)); base::FilePath reserved_path3; conflict_action = DownloadPathReservationTracker::OVERWRITE; CallGetReservedPath( @@ -389,7 +389,7 @@ TEST_F(DownloadPathReservationTrackerTest, UnresolvedConflicts) { base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); - scoped_ptr<MockDownloadItem> + std::unique_ptr<MockDownloadItem> items[DownloadPathReservationTracker::kMaxUniqueFiles + 1]; DownloadPathReservationTracker::FilenameConflictAction conflict_action = DownloadPathReservationTracker::UNIQUIFY; @@ -421,7 +421,7 @@ EXPECT_TRUE(verified); } // The next reservation for |path| will fail to be unique. - scoped_ptr<MockDownloadItem> item( + std::unique_ptr<MockDownloadItem> item( CreateDownloadItem(DownloadPathReservationTracker::kMaxUniqueFiles + 1)); base::FilePath reserved_path; bool verified = true; @@ -443,7 +443,7 @@ // If the target directory is unwriteable, then callback should be notified that // verification failed. TEST_F(DownloadPathReservationTrackerTest, UnwriteableDirectory) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); base::FilePath dir(path.DirName()); @@ -484,7 +484,7 @@ bool create_directory = false; { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath reserved_path; bool verified = true; CallGetReservedPath( @@ -500,7 +500,7 @@ } ASSERT_FALSE(IsPathInUse(path)); { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath reserved_path; bool verified = true; set_default_download_path(dir); @@ -521,7 +521,7 @@ // If the target path of the download item changes, the reservation should be // updated to match. TEST_F(DownloadPathReservationTrackerTest, UpdatesToTargetPath) { - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path( GetPathInDownloadsDirectory(FILE_PATH_LITERAL("foo.txt"))); ASSERT_FALSE(IsPathInUse(path)); @@ -580,7 +580,7 @@ // ".crdownload". So take it into account. Should be removed in the future. const size_t max_length = real_max_length - 11; - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path(GetLongNamePathInDownloadsDirectory( max_length, FILE_PATH_LITERAL(".txt"))); ASSERT_FALSE(IsPathInUse(path)); @@ -612,7 +612,7 @@ ASSERT_NE(-1, real_max_length); const size_t max_length = real_max_length - 11; - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path(GetLongNamePathInDownloadsDirectory( max_length, FILE_PATH_LITERAL(".txt"))); base::FilePath path0(GetLongNamePathInDownloadsDirectory( @@ -652,7 +652,7 @@ ASSERT_NE(-1, real_max_length); const size_t max_length = real_max_length - 11; - scoped_ptr<MockDownloadItem> item(CreateDownloadItem(1)); + std::unique_ptr<MockDownloadItem> item(CreateDownloadItem(1)); base::FilePath path(GetPathInDownloadsDirectory( (FILE_PATH_LITERAL("a.") + base::FilePath::StringType(max_length, 'b')).c_str()));
diff --git a/chrome/browser/download/download_query.cc b/chrome/browser/download/download_query.cc index 941d400..4b717c6 100644 --- a/chrome/browser/download/download_query.cc +++ b/chrome/browser/download/download_query.cc
@@ -8,6 +8,7 @@ #include <algorithm> #include <limits> +#include <memory> #include <string> #include <vector> @@ -17,7 +18,6 @@ #include "base/i18n/case_conversion.h" #include "base/i18n/string_search.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/stl_util.h" #include "base/strings/string16.h" #include "base/strings/string_split.h" @@ -186,7 +186,7 @@ std::string (*accessor)(const DownloadItem&)) { std::string regex_str; if (!GetAs(regex_value, ®ex_str)) return DownloadQuery::FilterCallback(); - scoped_ptr<RE2> pattern(new RE2(regex_str)); + std::unique_ptr<RE2> pattern(new RE2(regex_str)); if (!pattern->ok()) return DownloadQuery::FilterCallback(); return base::Bind(&FindRegex, base::Owned(pattern.release()), base::Bind(accessor));
diff --git a/chrome/browser/download/download_query_unittest.cc b/chrome/browser/download/download_query_unittest.cc index 37fba0c..e8fcad5 100644 --- a/chrome/browser/download/download_query_unittest.cc +++ b/chrome/browser/download/download_query_unittest.cc
@@ -2,23 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/download/download_query.h" + #include <stddef.h> #include <stdint.h> #include <limits> +#include <memory> #include <string> #include "base/bind.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/stl_util.h" #include "base/strings/string16.h" #include "base/time/time.h" #include "base/values.h" #include "build/build_config.h" -#include "chrome/browser/download/download_query.h" #include "content/public/test/mock_download_item.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -104,13 +105,13 @@ template<> void DownloadQueryTest::AddFilter( DownloadQuery::FilterType name, bool cpp_value) { - scoped_ptr<base::Value> value(new base::FundamentalValue(cpp_value)); + std::unique_ptr<base::Value> value(new base::FundamentalValue(cpp_value)); CHECK(query_.AddFilter(name, *value.get())); } template<> void DownloadQueryTest::AddFilter( DownloadQuery::FilterType name, int cpp_value) { - scoped_ptr<base::Value> value(new base::FundamentalValue(cpp_value)); + std::unique_ptr<base::Value> value(new base::FundamentalValue(cpp_value)); CHECK(query_.AddFilter(name, *value.get())); } @@ -131,7 +132,7 @@ template<> void DownloadQueryTest::AddFilter( DownloadQuery::FilterType name, std::vector<base::string16> cpp_value) { - scoped_ptr<base::ListValue> list(new base::ListValue()); + std::unique_ptr<base::ListValue> list(new base::ListValue()); for (std::vector<base::string16>::const_iterator it = cpp_value.begin(); it != cpp_value.end(); ++it) { list->Append(new base::StringValue(*it)); @@ -141,7 +142,7 @@ template<> void DownloadQueryTest::AddFilter( DownloadQuery::FilterType name, std::vector<std::string> cpp_value) { - scoped_ptr<base::ListValue> list(new base::ListValue()); + std::unique_ptr<base::ListValue> list(new base::ListValue()); for (std::vector<std::string>::const_iterator it = cpp_value.begin(); it != cpp_value.end(); ++it) { list->Append(new base::StringValue(*it)); @@ -162,7 +163,7 @@ } TEST_F(DownloadQueryTest, DownloadQueryTest_InvalidFilter) { - scoped_ptr<base::Value> value(new base::FundamentalValue(0)); + std::unique_ptr<base::Value> value(new base::FundamentalValue(0)); EXPECT_FALSE(query()->AddFilter(static_cast<DownloadQuery::FilterType>( std::numeric_limits<int32_t>::max()), *value.get()));
diff --git a/chrome/browser/download/download_request_infobar_delegate_android.cc b/chrome/browser/download/download_request_infobar_delegate_android.cc index dc8265e..93ca380 100644 --- a/chrome/browser/download/download_request_infobar_delegate_android.cc +++ b/chrome/browser/download/download_request_infobar_delegate_android.cc
@@ -39,7 +39,7 @@ host->Cancel(); } else { infobar_service->AddInfoBar(infobar_service->CreateConfirmInfoBar( - scoped_ptr<ConfirmInfoBarDelegate>( + std::unique_ptr<ConfirmInfoBarDelegate>( new DownloadRequestInfoBarDelegateAndroid(host)))); } }
diff --git a/chrome/browser/download/download_request_infobar_delegate_android.h b/chrome/browser/download/download_request_infobar_delegate_android.h index eab8f13..bf2c4446 100644 --- a/chrome/browser/download/download_request_infobar_delegate_android.h +++ b/chrome/browser/download/download_request_infobar_delegate_android.h
@@ -31,9 +31,9 @@ base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host); #if defined(UNIT_TEST) - static scoped_ptr<DownloadRequestInfoBarDelegateAndroid> Create( + static std::unique_ptr<DownloadRequestInfoBarDelegateAndroid> Create( base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host) { - return scoped_ptr<DownloadRequestInfoBarDelegateAndroid>( + return std::unique_ptr<DownloadRequestInfoBarDelegateAndroid>( new DownloadRequestInfoBarDelegateAndroid(host)); } #endif
diff --git a/chrome/browser/download/download_request_infobar_delegate_unittest.cc b/chrome/browser/download/download_request_infobar_delegate_unittest.cc index 1c1544a0..63df351 100644 --- a/chrome/browser/download/download_request_infobar_delegate_unittest.cc +++ b/chrome/browser/download/download_request_infobar_delegate_unittest.cc
@@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/download/download_request_infobar_delegate_android.h" #include "chrome/browser/download/download_request_limiter.h" @@ -28,7 +29,7 @@ private: // The actual infobar delegate we're listening to. - scoped_ptr<DownloadRequestInfoBarDelegateAndroid> infobar_delegate_; + std::unique_ptr<DownloadRequestInfoBarDelegateAndroid> infobar_delegate_; // True if we have gotten some sort of response. bool responded_;
diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc index ad4cdc1..e5c3e45 100644 --- a/chrome/browser/download/download_request_limiter_unittest.cc +++ b/chrome/browser/download/download_request_limiter_unittest.cc
@@ -132,7 +132,7 @@ } private: - scoped_ptr<MockPermissionBubbleFactory> mock_permission_bubble_factory_; + std::unique_ptr<MockPermissionBubbleFactory> mock_permission_bubble_factory_; }; #endif } // namespace @@ -249,7 +249,7 @@ TestingDelegate testing_delegate_; private: - scoped_ptr<TestingProfile> profile_; + std::unique_ptr<TestingProfile> profile_; }; TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_Allow) { @@ -462,7 +462,7 @@ #if defined(OS_ANDROID) TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_RawWebContents) { - scoped_ptr<WebContents> web_contents(CreateTestWebContents()); + std::unique_ptr<WebContents> web_contents(CreateTestWebContents()); GURL url("http://foo.com/bar"); web_contents->GetController().LoadURL(
diff --git a/chrome/browser/download/download_resource_throttle.cc b/chrome/browser/download/download_resource_throttle.cc index 041a44d..6fab62091 100644 --- a/chrome/browser/download/download_resource_throttle.cc +++ b/chrome/browser/download/download_resource_throttle.cc
@@ -31,7 +31,7 @@ } void CanDownload( - scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) { + std::unique_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); info->limiter->CanDownload(info->web_contents_getter, info->url, info->request_method, info->continue_callback); @@ -39,7 +39,7 @@ #if defined(OS_ANDROID) void OnAcquireFileAccessPermissionDone( - scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info, + std::unique_ptr<DownloadResourceThrottle::DownloadRequestInfo> info, bool granted) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (granted) @@ -50,7 +50,7 @@ #endif void CanDownloadOnUIThread( - scoped_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) { + std::unique_ptr<DownloadResourceThrottle::DownloadRequestInfo> info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); #if defined(OS_ANDROID) content::WebContents* contents = info->web_contents_getter.Run(); @@ -93,11 +93,11 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind( - &CanDownloadOnUIThread, - base::Passed(scoped_ptr<DownloadRequestInfo>(new DownloadRequestInfo( - limiter, web_contents_getter, url, request_method, - base::Bind(&OnCanDownloadDecided, AsWeakPtr())))))); + base::Bind(&CanDownloadOnUIThread, + base::Passed(std::unique_ptr<DownloadRequestInfo>( + new DownloadRequestInfo( + limiter, web_contents_getter, url, request_method, + base::Bind(&OnCanDownloadDecided, AsWeakPtr())))))); } DownloadResourceThrottle::~DownloadResourceThrottle() {
diff --git a/chrome/browser/download/download_resource_throttle_unittest.cc b/chrome/browser/download/download_resource_throttle_unittest.cc index 8c320f7..7c771f78 100644 --- a/chrome/browser/download/download_resource_throttle_unittest.cc +++ b/chrome/browser/download/download_resource_throttle_unittest.cc
@@ -104,7 +104,7 @@ MockWebContentsDelegate delegate_; scoped_refptr<DownloadRequestLimiter> limiter_; ::testing::NiceMock<MockResourceController> resource_controller_; - scoped_ptr<base::RunLoop> run_loop_; + std::unique_ptr<base::RunLoop> run_loop_; #if BUILDFLAG(ANDROID_JAVA_UI) chrome::android::MockDownloadControllerAndroid download_controller_; #endif
diff --git a/chrome/browser/download/download_service.h b/chrome/browser/download/download_service.h index 552256e8..44a61f9 100644 --- a/chrome/browser/download/download_service.h +++ b/chrome/browser/download/download_service.h
@@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/core/keyed_service.h" class ChromeDownloadManagerDelegate; @@ -62,7 +63,7 @@ // its DownloadManager. Takes ownership of |delegate|, and destroys // the previous delegate. For testing. virtual void SetDownloadManagerDelegateForTesting( - scoped_ptr<ChromeDownloadManagerDelegate> delegate) = 0; + std::unique_ptr<ChromeDownloadManagerDelegate> delegate) = 0; // Returns false if at least one extension has disabled the shelf, true // otherwise.
diff --git a/chrome/browser/download/download_service_impl.cc b/chrome/browser/download/download_service_impl.cc index 89634ea..5d184bda 100644 --- a/chrome/browser/download/download_service_impl.cc +++ b/chrome/browser/download/download_service_impl.cc
@@ -60,14 +60,14 @@ history->GetNextDownloadId( manager_delegate_->GetDownloadIdReceiverCallback()); download_history_.reset(new DownloadHistory( - manager, scoped_ptr<DownloadHistory::HistoryAdapter>( + manager, std::unique_ptr<DownloadHistory::HistoryAdapter>( new DownloadHistory::HistoryAdapter(history)))); } // Pass an empty delegate when constructing the DownloadUIController. The // default delegate does all the notifications we need. download_ui_.reset(new DownloadUIController( - manager, scoped_ptr<DownloadUIController::Delegate>())); + manager, std::unique_ptr<DownloadUIController::Delegate>())); // Include this download manager in the set monitored by the // global status updater. @@ -118,7 +118,7 @@ } void DownloadServiceImpl::SetDownloadManagerDelegateForTesting( - scoped_ptr<ChromeDownloadManagerDelegate> new_delegate) { + std::unique_ptr<ChromeDownloadManagerDelegate> new_delegate) { manager_delegate_.swap(new_delegate); DownloadManager* dm = BrowserContext::GetDownloadManager(profile_); dm->SetDelegate(manager_delegate_.get());
diff --git a/chrome/browser/download/download_service_impl.h b/chrome/browser/download/download_service_impl.h index e41f6aef..1030df5 100644 --- a/chrome/browser/download/download_service_impl.h +++ b/chrome/browser/download/download_service_impl.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_IMPL_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_IMPL_H_ +#include <memory> + #include "base/callback_forward.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/download/download_service.h" #include "components/keyed_service/core/keyed_service.h" @@ -41,7 +42,7 @@ int NonMaliciousDownloadCount() const override; void CancelDownloads() override; void SetDownloadManagerDelegateForTesting( - scoped_ptr<ChromeDownloadManagerDelegate> delegate) override; + std::unique_ptr<ChromeDownloadManagerDelegate> delegate) override; bool IsShelfEnabled() override; // KeyedService @@ -54,16 +55,16 @@ // ChromeDownloadManagerDelegate may be the target of callbacks from // the history service/DB thread and must be kept alive for those // callbacks. - scoped_ptr<ChromeDownloadManagerDelegate> manager_delegate_; + std::unique_ptr<ChromeDownloadManagerDelegate> manager_delegate_; - scoped_ptr<DownloadHistory> download_history_; + std::unique_ptr<DownloadHistory> download_history_; // The UI controller is responsible for observing the download manager and // notifying the UI of any new downloads. Its lifetime matches that of the // associated download manager. // Note on destruction order: download_ui_ depends on download_history_ and // should be destroyed before the latter. - scoped_ptr<DownloadUIController> download_ui_; + std::unique_ptr<DownloadUIController> download_ui_; // On Android, GET downloads are not handled by the DownloadManager. // Once we have extensions on android, we probably need the EventRouter @@ -76,7 +77,8 @@ // should be a separate EDER for on-record and off-record managers. // There does not appear to be a separate ExtensionSystem for on-record and // off-record profiles, so ExtensionSystem cannot own the EDER. - scoped_ptr<extensions::ExtensionDownloadsEventRouter> extension_event_router_; + std::unique_ptr<extensions::ExtensionDownloadsEventRouter> + extension_event_router_; #endif DISALLOW_COPY_AND_ASSIGN(DownloadServiceImpl);
diff --git a/chrome/browser/download/download_shelf_context_menu.h b/chrome/browser/download/download_shelf_context_menu.h index 859aead..51b4d188 100644 --- a/chrome/browser/download/download_shelf_context_menu.h +++ b/chrome/browser/download/download_shelf_context_menu.h
@@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "build/build_config.h" #include "chrome/browser/download/download_commands.h" @@ -64,16 +65,16 @@ // We show slightly different menus if the download is in progress vs. if the // download has finished. - scoped_ptr<ui::SimpleMenuModel> in_progress_download_menu_model_; - scoped_ptr<ui::SimpleMenuModel> in_progress_download_paused_menu_model_; - scoped_ptr<ui::SimpleMenuModel> finished_download_menu_model_; - scoped_ptr<ui::SimpleMenuModel> interrupted_download_menu_model_; - scoped_ptr<ui::SimpleMenuModel> maybe_malicious_download_menu_model_; - scoped_ptr<ui::SimpleMenuModel> malicious_download_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> in_progress_download_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> in_progress_download_paused_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> finished_download_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> interrupted_download_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> maybe_malicious_download_menu_model_; + std::unique_ptr<ui::SimpleMenuModel> malicious_download_menu_model_; // Information source. content::DownloadItem* download_item_; - scoped_ptr<DownloadCommands> download_commands_; + std::unique_ptr<DownloadCommands> download_commands_; #if defined(OS_WIN) bool is_adobe_pdf_reader_up_to_date_;
diff --git a/chrome/browser/download/download_shelf_unittest.cc b/chrome/browser/download/download_shelf_unittest.cc index f54faffd..c59e6a0 100644 --- a/chrome/browser/download/download_shelf_unittest.cc +++ b/chrome/browser/download/download_shelf_unittest.cc
@@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <memory> + #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "chrome/browser/chrome_notification_types.h" @@ -51,14 +52,14 @@ } private: - scoped_ptr<content::MockDownloadItem> GetInProgressMockDownload(); + std::unique_ptr<content::MockDownloadItem> GetInProgressMockDownload(); base::MessageLoopForUI message_loop_; content::TestBrowserThread ui_thread_; - scoped_ptr<content::MockDownloadItem> download_item_; - scoped_ptr<content::MockDownloadManager> download_manager_; + std::unique_ptr<content::MockDownloadItem> download_item_; + std::unique_ptr<content::MockDownloadManager> download_manager_; TestDownloadShelf shelf_; - scoped_ptr<TestingProfile> profile_; + std::unique_ptr<TestingProfile> profile_; }; DownloadShelfTest::DownloadShelfTest()
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc index aeaa328..5e7649da 100644 --- a/chrome/browser/download/download_target_determiner.cc +++ b/chrome/browser/download/download_target_determiner.cc
@@ -742,7 +742,7 @@ << " Should prompt:" << should_prompt_ << " Danger type:" << danger_type_ << " Danger level:" << danger_level_; - scoped_ptr<DownloadTargetInfo> target_info(new DownloadTargetInfo); + std::unique_ptr<DownloadTargetInfo> target_info(new DownloadTargetInfo); target_info->target_path = local_path_; target_info->target_disposition =
diff --git a/chrome/browser/download/download_target_determiner.h b/chrome/browser/download/download_target_determiner.h index 53fc2656..7e6cb877 100644 --- a/chrome/browser/download/download_target_determiner.h +++ b/chrome/browser/download/download_target_determiner.h
@@ -5,10 +5,11 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TARGET_DETERMINER_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TARGET_DETERMINER_H_ +#include <memory> + #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "build/build_config.h" @@ -53,7 +54,7 @@ class DownloadTargetDeterminer : public content::DownloadItem::Observer { public: - typedef base::Callback<void(scoped_ptr<DownloadTargetInfo>)> + typedef base::Callback<void(std::unique_ptr<DownloadTargetInfo>)> CompletionCallback; // Start the process of determing the target of |download|.
diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc index 295929d..8cf1fa35 100644 --- a/chrome/browser/download/download_target_determiner_unittest.cc +++ b/chrome/browser/download/download_target_determiner_unittest.cc
@@ -233,7 +233,7 @@ // Runs |test_case| with |item|. When the DownloadTargetDeterminer is done, // returns the resulting DownloadTargetInfo. - scoped_ptr<DownloadTargetInfo> RunDownloadTargetDeterminer( + std::unique_ptr<DownloadTargetInfo> RunDownloadTargetDeterminer( const base::FilePath& initial_virtual_path, content::MockDownloadItem* item); @@ -266,7 +266,7 @@ } private: - scoped_ptr<DownloadPrefs> download_prefs_; + std::unique_ptr<DownloadPrefs> download_prefs_; ::testing::NiceMock<MockDownloadTargetDeterminerDelegate> delegate_; NullWebContentsDelegate web_contents_delegate_; base::ScopedTempDir test_download_dir_; @@ -377,24 +377,24 @@ const DownloadTestCase& test_case, const base::FilePath& initial_virtual_path, content::MockDownloadItem* item) { - scoped_ptr<DownloadTargetInfo> target_info = + std::unique_ptr<DownloadTargetInfo> target_info = RunDownloadTargetDeterminer(initial_virtual_path, item); VerifyDownloadTarget(test_case, target_info.get()); } void CompletionCallbackWrapper( const base::Closure& closure, - scoped_ptr<DownloadTargetInfo>* target_info_receiver, - scoped_ptr<DownloadTargetInfo> target_info) { + std::unique_ptr<DownloadTargetInfo>* target_info_receiver, + std::unique_ptr<DownloadTargetInfo> target_info) { target_info_receiver->swap(target_info); base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure); } -scoped_ptr<DownloadTargetInfo> +std::unique_ptr<DownloadTargetInfo> DownloadTargetDeterminerTest::RunDownloadTargetDeterminer( const base::FilePath& initial_virtual_path, content::MockDownloadItem* item) { - scoped_ptr<DownloadTargetInfo> target_info; + std::unique_ptr<DownloadTargetInfo> target_info; base::RunLoop run_loop; DownloadTargetDeterminer::Start( item, initial_virtual_path, download_prefs_.get(), delegate(), @@ -410,7 +410,7 @@ const DownloadTestCase test_cases[], size_t test_case_count) { for (size_t i = 0; i < test_case_count; ++i) { - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_cases[i])); SCOPED_TRACE(testing::Message() << "Running test case " << i); RunTestCase(test_cases[i], base::FilePath(), item.get()); @@ -893,7 +893,7 @@ for (size_t i = 0; i < arraysize(kInactiveTestCases); ++i) { SCOPED_TRACE(testing::Message() << "Running test case " << i); const DownloadTestCase& test_case = kInactiveTestCases[i]; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_case)); EXPECT_CALL(*item.get(), GetState()) .WillRepeatedly(Return(content::DownloadItem::CANCELLED)); @@ -1248,7 +1248,7 @@ EXPECT_CRDOWNLOAD}; const DownloadTestCase& test_case = kNotifyExtensionsTestCase; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(0, test_case)); base::FilePath overridden_path(FILE_PATH_LITERAL("overridden/foo.txt")); base::FilePath full_overridden_path = @@ -1296,7 +1296,7 @@ EXPECT_CRDOWNLOAD}; const DownloadTestCase& test_case = kNotifyExtensionsTestCase; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(0, test_case)); base::FilePath overridden_path(FILE_PATH_LITERAL("overridden/foo.txt")); base::FilePath full_overridden_path = @@ -1338,7 +1338,7 @@ EXPECT_CRDOWNLOAD}; const DownloadTestCase& test_case = kInitialPathTestCase; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(1, test_case)); EXPECT_CALL(*item, GetLastReason()) .WillRepeatedly(Return( @@ -1408,7 +1408,7 @@ for (size_t i = 0; i < arraysize(kResumedTestCases); ++i) { SCOPED_TRACE(testing::Message() << "Running test case " << i); const DownloadTestCase& test_case = kResumedTestCases[i]; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_case)); base::FilePath expected_path = GetPathInDownloadDir(test_case.expected_local_path); @@ -1451,7 +1451,7 @@ const DownloadTestCase& test_case = kResumedForcedDownload; base::FilePath expected_path = GetPathInDownloadDir(test_case.expected_local_path); - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(0, test_case)); ON_CALL(*item.get(), GetLastReason()) .WillByDefault(Return(content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE)); @@ -1536,7 +1536,7 @@ const DownloadTestCase& test_case = kResumedTestCases[i]; base::FilePath expected_path = GetPathInDownloadDir(test_case.expected_local_path); - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_case)); ON_CALL(*item.get(), GetLastReason()) .WillByDefault(Return( @@ -1649,7 +1649,7 @@ for (size_t i = 0; i < arraysize(kIntermediateNameTestCases); ++i) { SCOPED_TRACE(testing::Message() << "Running test case " << i); const IntermediateNameTestCase& test_case = kIntermediateNameTestCases[i]; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_case.general)); ON_CALL(*item.get(), GetLastReason()) @@ -1661,7 +1661,7 @@ ON_CALL(*item.get(), GetDangerType()) .WillByDefault(Return(test_case.general.expected_danger_type)); - scoped_ptr<DownloadTargetInfo> target_info = + std::unique_ptr<DownloadTargetInfo> target_info = RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), item.get()); VerifyDownloadTarget(test_case.general, target_info.get()); @@ -1758,9 +1758,9 @@ for (size_t i = 0; i < arraysize(kMIMETypeTestCases); ++i) { SCOPED_TRACE(testing::Message() << "Running test case " << i); const MIMETypeTestCase& test_case = kMIMETypeTestCases[i]; - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(i, test_case.general)); - scoped_ptr<DownloadTargetInfo> target_info = + std::unique_ptr<DownloadTargetInfo> target_info = RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), item.get()); EXPECT_EQ(test_case.expected_mime_type, target_info->mime_type); @@ -1918,11 +1918,10 @@ GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _)) .WillByDefault(WithArg<1>( ScheduleCallback(kTestMIMEType))); - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(1, kSecureHandlingTestCase)); - scoped_ptr<DownloadTargetInfo> target_info = - RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), - item.get()); + std::unique_ptr<DownloadTargetInfo> target_info = RunDownloadTargetDeterminer( + GetPathInDownloadDir(kInitialPath), item.get()); EXPECT_FALSE(target_info->is_filetype_handled_safely); // Register a PPAPI plugin. This should count as handling the filetype @@ -1988,11 +1987,10 @@ GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _)) .WillByDefault(WithArg<1>( ScheduleCallback(kTestMIMEType))); - scoped_ptr<content::MockDownloadItem> item( + std::unique_ptr<content::MockDownloadItem> item( CreateActiveDownloadItem(1, kSecureHandlingTestCase)); - scoped_ptr<DownloadTargetInfo> target_info = - RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), - item.get()); + std::unique_ptr<DownloadTargetInfo> target_info = RunDownloadTargetDeterminer( + GetPathInDownloadDir(kInitialPath), item.get()); EXPECT_FALSE(target_info->is_filetype_handled_safely); // Register a BrowserPlugin. This should count as handling the filetype
diff --git a/chrome/browser/download/download_test_file_activity_observer.cc b/chrome/browser/download/download_test_file_activity_observer.cc index 7a9a721b5..95602c9 100644 --- a/chrome/browser/download/download_test_file_activity_observer.cc +++ b/chrome/browser/download/download_test_file_activity_observer.cc
@@ -73,7 +73,7 @@ DownloadTestFileActivityObserver::DownloadTestFileActivityObserver( Profile* profile) { - scoped_ptr<MockDownloadManagerDelegate> mock_delegate( + std::unique_ptr<MockDownloadManagerDelegate> mock_delegate( new MockDownloadManagerDelegate(profile)); test_delegate_ = mock_delegate->GetWeakPtr(); DownloadServiceFactory::GetForBrowserContext(profile)
diff --git a/chrome/browser/download/download_ui_controller.cc b/chrome/browser/download/download_ui_controller.cc index 5fee080..6608261 100644 --- a/chrome/browser/download/download_ui_controller.cc +++ b/chrome/browser/download/download_ui_controller.cc
@@ -116,7 +116,7 @@ } DownloadUIController::DownloadUIController(content::DownloadManager* manager, - scoped_ptr<Delegate> delegate) + std::unique_ptr<Delegate> delegate) : download_notifier_(manager, this), delegate_(std::move(delegate)) { #if defined(OS_ANDROID) if (!delegate_)
diff --git a/chrome/browser/download/download_ui_controller.h b/chrome/browser/download/download_ui_controller.h index e0f58a44..10947b36 100644 --- a/chrome/browser/download/download_ui_controller.h +++ b/chrome/browser/download/download_ui_controller.h
@@ -5,10 +5,10 @@ #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UI_CONTROLLER_H_ #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UI_CONTROLLER_H_ +#include <memory> #include <set> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/download/all_download_item_notifier.h" // This class handles the task of observing a single DownloadManager for @@ -35,7 +35,7 @@ // // Currently explicit delegates are only used for testing. DownloadUIController(content::DownloadManager* manager, - scoped_ptr<Delegate> delegate); + std::unique_ptr<Delegate> delegate); ~DownloadUIController() override; @@ -47,7 +47,7 @@ AllDownloadItemNotifier download_notifier_; - scoped_ptr<Delegate> delegate_; + std::unique_ptr<Delegate> delegate_; DISALLOW_COPY_AND_ASSIGN(DownloadUIController); };
diff --git a/chrome/browser/download/download_ui_controller_unittest.cc b/chrome/browser/download/download_ui_controller_unittest.cc index f1be1c7..f5452ce 100644 --- a/chrome/browser/download/download_ui_controller_unittest.cc +++ b/chrome/browser/download/download_ui_controller_unittest.cc
@@ -4,13 +4,14 @@ #include "chrome/browser/download/download_ui_controller.h" +#include <memory> #include <utility> #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "chrome/browser/download/download_history.h" @@ -64,13 +65,13 @@ explicit TestDownloadService(Profile* profile); ~TestDownloadService() override; - void set_download_history(scoped_ptr<DownloadHistory> download_history) { + void set_download_history(std::unique_ptr<DownloadHistory> download_history) { download_history_.swap(download_history); } DownloadHistory* GetDownloadHistory() override; private: - scoped_ptr<DownloadHistory> download_history_; + std::unique_ptr<DownloadHistory> download_history_; }; TestDownloadService::TestDownloadService(Profile* profile) @@ -95,7 +96,7 @@ // Returns a TestDelegate. Invoking OnNewDownloadReady on the returned // delegate results in the DownloadItem* being stored in |notified_item_|. - scoped_ptr<DownloadUIController::Delegate> GetTestDelegate(); + std::unique_ptr<DownloadUIController::Delegate> GetTestDelegate(); MockDownloadManager* manager() { return manager_.get(); } @@ -120,7 +121,7 @@ return download_history_manager_observer_; } - scoped_ptr<MockDownloadItem> CreateMockInProgressDownload(); + std::unique_ptr<MockDownloadItem> CreateMockInProgressDownload(); private: // A private history adapter that stores the DownloadQueryCallback when @@ -138,10 +139,10 @@ }; // Constructs and returns a TestDownloadService. - static scoped_ptr<KeyedService> TestingDownloadServiceFactory( + static std::unique_ptr<KeyedService> TestingDownloadServiceFactory( content::BrowserContext* browser_context); - scoped_ptr<MockDownloadManager> manager_; + std::unique_ptr<MockDownloadManager> manager_; content::DownloadManager::Observer* download_history_manager_observer_; content::DownloadManager::Observer* manager_observer_; content::DownloadItem* notified_item_; @@ -151,10 +152,10 @@ }; // static -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> DownloadUIControllerTest::TestingDownloadServiceFactory( content::BrowserContext* browser_context) { - return make_scoped_ptr( + return base::WrapUnique( new TestDownloadService(Profile::FromBrowserContext(browser_context))); } @@ -179,9 +180,9 @@ static_cast<content::DownloadManager::Observer*>(NULL))); EXPECT_CALL(*manager_, GetAllDownloads(_)).Times(AnyNumber()); - scoped_ptr<HistoryAdapter> history_adapter(new HistoryAdapter); + std::unique_ptr<HistoryAdapter> history_adapter(new HistoryAdapter); history_adapter_ = history_adapter.get(); - scoped_ptr<DownloadHistory> download_history( + std::unique_ptr<DownloadHistory> download_history( new DownloadHistory(manager_.get(), std::move(history_adapter))); ASSERT_TRUE(download_history_manager_observer_); @@ -199,9 +200,9 @@ download_service->set_download_history(std::move(download_history)); } -scoped_ptr<MockDownloadItem> +std::unique_ptr<MockDownloadItem> DownloadUIControllerTest::CreateMockInProgressDownload() { - scoped_ptr<MockDownloadItem> item( + std::unique_ptr<MockDownloadItem> item( new testing::StrictMock<MockDownloadItem>()); EXPECT_CALL(*item, GetBrowserContext()) .WillRepeatedly(Return(browser_context())); @@ -241,9 +242,9 @@ return item; } -scoped_ptr<DownloadUIController::Delegate> +std::unique_ptr<DownloadUIController::Delegate> DownloadUIControllerTest::GetTestDelegate() { - scoped_ptr<DownloadUIController::Delegate> delegate( + std::unique_ptr<DownloadUIController::Delegate> delegate( new TestDelegate(notified_item_receiver_factory_.GetWeakPtr())); return delegate; } @@ -251,7 +252,7 @@ // New downloads should be presented to the UI when GetTargetFilePath() returns // a non-empty path. I.e. once the download target has been determined. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyBasic) { - scoped_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); + std::unique_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); DownloadUIController controller(manager(), GetTestDelegate()); EXPECT_CALL(*item, GetTargetFilePath()) .WillOnce(ReturnRefOfCopy(base::FilePath())); @@ -273,7 +274,7 @@ // A download that's created in an interrupted state should also be displayed. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyBasic_Interrupted) { - scoped_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); + std::unique_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); DownloadUIController controller(manager(), GetTestDelegate()); EXPECT_CALL(*item, GetState()) .WillRepeatedly(Return(content::DownloadItem::INTERRUPTED)); @@ -287,7 +288,7 @@ // state should be displayed in the UI immediately without requiring an // additional OnDownloadUpdated() notification. TEST_F(DownloadUIControllerTest, DownloadUIController_NotifyReadyOnCreate) { - scoped_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); + std::unique_ptr<MockDownloadItem> item(CreateMockInProgressDownload()); DownloadUIController controller(manager(), GetTestDelegate()); ASSERT_TRUE(manager_observer()); @@ -309,14 +310,14 @@ // from history. ASSERT_TRUE(download_history_manager_observer()); - scoped_ptr<std::vector<history::DownloadRow> > history_downloads; + std::unique_ptr<std::vector<history::DownloadRow>> history_downloads; history_downloads.reset(new std::vector<history::DownloadRow>()); history_downloads->push_back(history::DownloadRow()); history_downloads->front().id = 1; std::vector<GURL> url_chain; GURL url; - scoped_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); + std::unique_ptr<MockDownloadItem> item = CreateMockInProgressDownload(); EXPECT_CALL(*item, GetOriginalMimeType()); EXPECT_CALL(*manager(), CheckForHistoryFilesRemoval());
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc index 975ec2a..7907f1b 100644 --- a/chrome/browser/download/notification/download_item_notification.cc +++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -412,7 +412,8 @@ UpdateNotificationIcon(); std::vector<message_center::ButtonInfo> notification_actions; - scoped_ptr<std::vector<DownloadCommands::Command>> actions(GetExtraActions()); + std::unique_ptr<std::vector<DownloadCommands::Command>> actions( + GetExtraActions()); button_actions_.reset(new std::vector<DownloadCommands::Command>); for (auto it = actions->begin(); it != actions->end(); it++) { @@ -627,9 +628,9 @@ UpdateNotificationData(UPDATE); } -scoped_ptr<std::vector<DownloadCommands::Command>> +std::unique_ptr<std::vector<DownloadCommands::Command>> DownloadItemNotification::GetExtraActions() const { - scoped_ptr<std::vector<DownloadCommands::Command>> actions( + std::unique_ptr<std::vector<DownloadCommands::Command>> actions( new std::vector<DownloadCommands::Command>()); if (item_->IsDangerous()) {
diff --git a/chrome/browser/download/notification/download_item_notification.h b/chrome/browser/download/notification/download_item_notification.h index 760686d..f47e131c 100644 --- a/chrome/browser/download/notification/download_item_notification.h +++ b/chrome/browser/download/notification/download_item_notification.h
@@ -101,7 +101,8 @@ Profile* profile() const; // Returns the list of possible extra (all except the default) actions. - scoped_ptr<std::vector<DownloadCommands::Command>> GetExtraActions() const; + std::unique_ptr<std::vector<DownloadCommands::Command>> GetExtraActions() + const; // Flag to show the notification on next update. If true, the notification // goes visible. The initial value is true so it gets shown on initial update. @@ -116,9 +117,9 @@ content::DownloadItem::DownloadState previous_download_state_ = content::DownloadItem::MAX_DOWNLOAD_STATE; // As uninitialized state bool previous_dangerous_state_ = false; - scoped_ptr<Notification> notification_; + std::unique_ptr<Notification> notification_; content::DownloadItem* item_; - scoped_ptr<std::vector<DownloadCommands::Command>> button_actions_; + std::unique_ptr<std::vector<DownloadCommands::Command>> button_actions_; // Status of the preview image decode. ImageDecodeStatus image_decode_status_ = NOT_STARTED;
diff --git a/chrome/browser/download/notification/download_item_notification_unittest.cc b/chrome/browser/download/notification/download_item_notification_unittest.cc index 211349f4..16c5235 100644 --- a/chrome/browser/download/notification/download_item_notification_unittest.cc +++ b/chrome/browser/download/notification/download_item_notification_unittest.cc
@@ -74,7 +74,8 @@ ASSERT_TRUE(profile_manager_->SetUp()); profile_ = profile_manager_->CreateTestingProfile("test-user"); - scoped_ptr<NotificationUIManager> ui_manager(new StubNotificationUIManager); + std::unique_ptr<NotificationUIManager> ui_manager( + new StubNotificationUIManager); TestingBrowserProcess::GetGlobal()->SetNotificationUIManager( std::move(ui_manager)); @@ -170,13 +171,13 @@ base::MessageLoopForUI message_loop_; content::TestBrowserThread ui_thread_; - scoped_ptr<TestingProfileManager> profile_manager_; + std::unique_ptr<TestingProfileManager> profile_manager_; Profile* profile_; - scoped_ptr<NiceMock<content::MockDownloadItem>> download_item_; - scoped_ptr<DownloadNotificationManagerForProfile> + std::unique_ptr<NiceMock<content::MockDownloadItem>> download_item_; + std::unique_ptr<DownloadNotificationManagerForProfile> download_notification_manager_; - scoped_ptr<MockMessageCenter> message_center_; + std::unique_ptr<MockMessageCenter> message_center_; DownloadItemNotification* download_item_notification_; };
diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc index fe7205c..01feac9 100644 --- a/chrome/browser/download/notification/download_notification_browsertest.cc +++ b/chrome/browser/download/notification/download_notification_browsertest.cc
@@ -105,7 +105,7 @@ } private: - scoped_ptr<base::RunLoop> run_loop_; + std::unique_ptr<base::RunLoop> run_loop_; DISALLOW_COPY_AND_ASSIGN(MessageCenterChangeObserver); }; @@ -334,7 +334,7 @@ void SetUpOnMainThread() override { Profile* profile = browser()->profile(); - scoped_ptr<TestChromeDownloadManagerDelegate> test_delegate; + std::unique_ptr<TestChromeDownloadManagerDelegate> test_delegate; test_delegate.reset(new TestChromeDownloadManagerDelegate(profile)); test_delegate->GetDownloadIdReceiverCallback().Run( content::DownloadItem::kInvalidId + 1); @@ -356,7 +356,7 @@ ASSERT_TRUE(CreateAndSetDownloadsDirectory(incognito_browser_)); - scoped_ptr<TestChromeDownloadManagerDelegate> incognito_test_delegate; + std::unique_ptr<TestChromeDownloadManagerDelegate> incognito_test_delegate; incognito_test_delegate.reset( new TestChromeDownloadManagerDelegate(incognito_profile)); DownloadServiceFactory::GetForBrowserContext(incognito_profile)
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc index a5b0124..8f98d346 100644 --- a/chrome/browser/download/save_package_file_picker.cc +++ b/chrome/browser/download/save_package_file_picker.cc
@@ -236,7 +236,7 @@ void SavePackageFilePicker::FileSelected( const base::FilePath& path, int index, void* unused_params) { - scoped_ptr<SavePackageFilePicker> delete_this(this); + std::unique_ptr<SavePackageFilePicker> delete_this(this); RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); if (!process) return;
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc index daa8e12..0c497e9 100644 --- a/chrome/browser/download/save_page_browsertest.cc +++ b/chrome/browser/download/save_page_browsertest.cc
@@ -501,7 +501,7 @@ #endif IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, MAYBE_SaveHTMLOnlyTabDestroy) { GURL url = NavigateToMockURL("a"); - scoped_ptr<DelayingDownloadManagerDelegate> delaying_delegate( + std::unique_ptr<DelayingDownloadManagerDelegate> delaying_delegate( new DelayingDownloadManagerDelegate(browser()->profile())); delaying_delegate->GetDownloadIdReceiverCallback().Run( content::DownloadItem::kInvalidId + 1);
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc index e19393b4..d871f09 100644 --- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc +++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -590,7 +590,7 @@ } std::string base_64; - base::Base64Encode(std::string(data->front_as<char>(), data->size()), + base::Base64Encode(base::StringPiece(data->front_as<char>(), data->size()), &base_64); const char kDataUrlPrefix[] = "data:image/png;base64,"; return GURL(kDataUrlPrefix + base_64).spec();
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc index 201e09a..168de50 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -81,13 +81,7 @@ } }; -// http://crbug.com/601433 -#if defined(OS_CHROMEOS) -#define MAYBE_ShowFeedback DISABLED_ShowFeedback -#else -#define MAYBE_ShowFeedback ShowFeedback -#endif -IN_PROC_BROWSER_TEST_F(FeedbackTest, MAYBE_ShowFeedback) { +IN_PROC_BROWSER_TEST_F(FeedbackTest, ShowFeedback) { WaitForExtensionViewsToLoad(); ASSERT_TRUE(IsFeedbackAppAvailable()); @@ -95,13 +89,7 @@ VerifyFeedbackAppLaunch(); } -// http://crbug.com/601306 -#if defined(OS_CHROMEOS) -#define MAYBE_ShowLoginFeedback DISABLED_ShowLoginFeedback -#else -#define MAYBE_ShowLoginFeedback ShowLoginFeedback -#endif -IN_PROC_BROWSER_TEST_F(FeedbackTest, MAYBE_ShowLoginFeedback) { +IN_PROC_BROWSER_TEST_F(FeedbackTest, ShowLoginFeedback) { WaitForExtensionViewsToLoad(); ASSERT_TRUE(IsFeedbackAppAvailable());
diff --git a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc index 812f7769..3a08745 100644 --- a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc +++ b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc
@@ -82,8 +82,10 @@ } std::string base64_encoded_ciphertext; - base::Base64Encode(std::string(ciphertext.begin(), ciphertext.end()), - &base64_encoded_ciphertext); + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(ciphertext.data()), + ciphertext.size()), + &base64_encoded_ciphertext); return base64_encoded_ciphertext; }
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc index a473703..d997fd7 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_mac.cc
@@ -66,8 +66,10 @@ } std::string base64_encoded_ciphertext; - base::Base64Encode(std::string(ciphertext.begin(), ciphertext.end()), - &base64_encoded_ciphertext); + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(ciphertext.data()), + ciphertext.size()), + &base64_encoded_ciphertext); callback.Run(base64_encoded_ciphertext, ""); }
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc index 932c58d..891cd44 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc
@@ -9,6 +9,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/macros.h" +#include "base/strings/string_piece.h" #include "base/thread_task_runner_handle.h" #include "base/threading/sequenced_worker_pool.h" #include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" @@ -89,8 +90,10 @@ } std::string base64_encoded_key_data; - base::Base64Encode(std::string(ciphertext.begin(), ciphertext.end()), - &base64_encoded_key_data); + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(ciphertext.data()), + ciphertext.size()), + &base64_encoded_key_data); callback_.Run(base64_encoded_key_data, ""); } else { callback_.Run("", "Get Credentials Failed");
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index ad9a1e539..ab647b1 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -1667,6 +1667,10 @@ return true; } +bool TabsCaptureVisibleTabFunction::ClientAllowsTransparency() { + return false; +} + WebContents* TabsCaptureVisibleTabFunction::GetWebContentsForID(int window_id) { Browser* browser = NULL; if (!GetBrowserFromWindowID(&chrome_details_, window_id, &browser))
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.h b/chrome/browser/extensions/api/tabs/tabs_api.h index e0a5f241..f0695eb 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.h +++ b/chrome/browser/extensions/api/tabs/tabs_api.h
@@ -217,6 +217,7 @@ // extensions::WebContentsCaptureClient: bool IsScreenshotEnabled() override; + bool ClientAllowsTransparency() override; void OnCaptureSuccess(const SkBitmap& bitmap) override; void OnCaptureFailure(FailureReason reason) override;
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc index 5ee161f..0b4d32b4 100644 --- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -193,7 +193,8 @@ &enable_referrers_, NULL, NULL, NULL, profile_.GetTestingPrefService()); network_delegate_.reset( - new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_)); + new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_, + metrics::UpdateUsagePrefCallbackType())); network_delegate_->set_profile(&profile_); network_delegate_->set_cookie_settings( CookieSettingsFactory::GetForProfile(&profile_).get()); @@ -871,7 +872,8 @@ &enable_referrers_, NULL, NULL, NULL, profile_.GetTestingPrefService()); network_delegate_.reset( - new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_)); + new ChromeNetworkDelegate(event_router_.get(), &enable_referrers_, + metrics::UpdateUsagePrefCallbackType())); network_delegate_->set_profile(&profile_); network_delegate_->set_cookie_settings( CookieSettingsFactory::GetForProfile(&profile_).get());
diff --git a/chrome/browser/extensions/convert_user_script.cc b/chrome/browser/extensions/convert_user_script.cc index bbd787b..42133ab 100644 --- a/chrome/browser/extensions/convert_user_script.cc +++ b/chrome/browser/extensions/convert_user_script.cc
@@ -82,7 +82,7 @@ char raw[crypto::kSHA256Length] = {0}; std::string key; crypto::SHA256HashString(script_name, raw, crypto::kSHA256Length); - base::Base64Encode(std::string(raw, crypto::kSHA256Length), &key); + base::Base64Encode(base::StringPiece(raw, crypto::kSHA256Length), &key); // The script may not have a name field, but we need one for an extension. If // it is missing, use the filename of the original URL.
diff --git a/chrome/browser/extensions/convert_web_app.cc b/chrome/browser/extensions/convert_web_app.cc index f12ab4c0..e920b45 100644 --- a/chrome/browser/extensions/convert_web_app.cc +++ b/chrome/browser/extensions/convert_web_app.cc
@@ -56,7 +56,7 @@ std::string key; crypto::SHA256HashString(app_url.spec().c_str(), raw, crypto::kSHA256Length); - base::Base64Encode(std::string(raw, crypto::kSHA256Length), &key); + base::Base64Encode(base::StringPiece(raw, crypto::kSHA256Length), &key); return key; }
diff --git a/chrome/browser/extensions/display_info_provider_chromeos.cc b/chrome/browser/extensions/display_info_provider_chromeos.cc index 769baa2..ff18c3a 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos.cc +++ b/chrome/browser/extensions/display_info_provider_chromeos.cc
@@ -11,6 +11,7 @@ #include "ash/shell.h" #include "base/strings/string_number_conversions.h" #include "extensions/common/api/system_display.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/display.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" @@ -66,7 +67,7 @@ static_cast<int64_t>(point.y()) * static_cast<int64_t>(vector.x()); } -// Created ash::DisplayPlacement value for |rectangle| compared to the +// Created display::DisplayPlacement value for |rectangle| compared to the // |reference| // rectangle. // The layout consists of two values: @@ -97,7 +98,7 @@ // // The rectangle shares an egde with the reference's bottom edge, but it's // center point is in the left area. -ash::DisplayPlacement CreatePlacementForRectangles( +display::DisplayPlacement CreatePlacementForRectangles( const gfx::Rect& reference, const gfx::Rect& rectangle) { // Translate coordinate system so origin is in the reference's top left point @@ -120,13 +121,13 @@ bool is_bottom_right = PointIsOverRadiusVector(center, up_diag); - ash::DisplayPlacement::Position position; + display::DisplayPlacement::Position position; if (is_top_right) { - position = is_bottom_right ? ash::DisplayPlacement::RIGHT - : ash::DisplayPlacement::TOP; + position = is_bottom_right ? display::DisplayPlacement::RIGHT + : display::DisplayPlacement::TOP; } else { - position = is_bottom_right ? ash::DisplayPlacement::BOTTOM - : ash::DisplayPlacement::LEFT; + position = is_bottom_right ? display::DisplayPlacement::BOTTOM + : display::DisplayPlacement::LEFT; } // If the rectangle with the calculated position would not have common side @@ -135,25 +136,25 @@ if (is_top_right == is_bottom_right) { if (rectangle.y() > reference.y() + reference.height()) { // The rectangle is left or right, but completely under the reference. - position = ash::DisplayPlacement::BOTTOM; + position = display::DisplayPlacement::BOTTOM; } else if (rectangle.y() + rectangle.height() < reference.y()) { // The rectangle is left or right, but completely over the reference. - position = ash::DisplayPlacement::TOP; + position = display::DisplayPlacement::TOP; } } else { if (rectangle.x() > reference.x() + reference.width()) { // The rectangle is over or under, but completely right of the reference. - position = ash::DisplayPlacement::RIGHT; + position = display::DisplayPlacement::RIGHT; } else if (rectangle.x() + rectangle.width() < reference.x()) { // The rectangle is over or under, but completely left of the reference. - position = ash::DisplayPlacement::LEFT; + position = display::DisplayPlacement::LEFT; } } - int offset = (position == ash::DisplayPlacement::LEFT || - position == ash::DisplayPlacement::RIGHT) + int offset = (position == display::DisplayPlacement::LEFT || + position == display::DisplayPlacement::RIGHT) ? rectangle.y() : rectangle.x(); - return ash::DisplayPlacement(position, offset); + return display::DisplayPlacement(position, offset); } // Updates the display layout for the target display in reference to the primary @@ -162,12 +163,12 @@ int64_t primary_display_id, const gfx::Rect& target_display_bounds, int64_t target_display_id) { - ash::DisplayPlacement placement(CreatePlacementForRectangles( + display::DisplayPlacement placement(CreatePlacementForRectangles( primary_display_bounds, target_display_bounds)); placement.display_id = target_display_id; placement.parent_display_id = primary_display_id; - scoped_ptr<ash::DisplayLayout> layout(new ash::DisplayLayout); + scoped_ptr<display::DisplayLayout> layout(new display::DisplayLayout); layout->placement_list.push_back(placement); layout->primary_id = primary_display_id;
diff --git a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc index 3e4e5c7..44dd3d5 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc +++ b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc
@@ -19,6 +19,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "extensions/common/api/system_display.h" +#include "ui/display/manager/display_layout.h" #include "ui/gfx/display.h" #include "ui/gfx/geometry/rect.h" @@ -401,7 +402,7 @@ TEST_F(DisplayInfoProviderChromeosTest, GetBounds) { UpdateDisplay("600x600, 400x520"); GetDisplayManager()->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::LEFT, -40)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::LEFT, -40)); DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); @@ -411,7 +412,7 @@ SystemInfoDisplayBoundsToString(result[1].bounds)); GetDisplayManager()->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::TOP, 40)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::TOP, 40)); result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); @@ -421,7 +422,7 @@ SystemInfoDisplayBoundsToString(result[1].bounds)); GetDisplayManager()->SetLayoutForCurrentDisplays( - ash::test::CreateDisplayLayout(ash::DisplayPlacement::BOTTOM, 80)); + ash::test::CreateDisplayLayout(display::DisplayPlacement::BOTTOM, 80)); result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); ASSERT_EQ(2u, result.size());
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index bfce6763..cd55393e 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc
@@ -47,6 +47,7 @@ #include "components/data_usage/core/data_use_aggregator.h" #include "components/data_usage/core/data_use_amortizer.h" #include "components/data_usage/core/data_use_annotator.h" +#include "components/metrics/metrics_service.h" #include "components/net_log/chrome_net_log.h" #include "components/policy/core/common/policy_service.h" #include "components/prefs/pref_registry_simple.h" @@ -503,6 +504,14 @@ if (value) value->GetAsBoolean(&is_quic_allowed_by_policy_); + // Some unit tests use IOThread but do not initialize MetricsService. In that + // case it is fine not to have |metrics_data_use_forwarder_|. + if (g_browser_process->metrics_service()) { + // Callback for updating data use prefs should be obtained on UI thread. + metrics_data_use_forwarder_ = + g_browser_process->metrics_service()->GetDataUseForwardingCallback(); + } + BrowserThread::SetDelegate(BrowserThread::IO, this); } @@ -609,7 +618,8 @@ "466432 IOThread::InitAsync::ChromeNetworkDelegate")); scoped_ptr<ChromeNetworkDelegate> chrome_network_delegate( new ChromeNetworkDelegate(extension_event_router_forwarder(), - &system_enable_referrers_)); + &system_enable_referrers_, + metrics_data_use_forwarder_)); // By default, data usage is considered off the record. chrome_network_delegate->set_data_use_aggregator( globals_->data_use_aggregator.get(), @@ -1767,3 +1777,8 @@ // profile. return context; } + +const metrics::UpdateUsagePrefCallbackType& +IOThread::GetMetricsDataUseForwarder() { + return metrics_data_use_forwarder_; +}
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index 9a29abf2..34987fbe 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h
@@ -433,6 +433,9 @@ // a result of a field trial or a command line flag. static bool ShouldEnableQuicForDataReductionProxy(); + // Returns the callback for updating data use prefs. + const metrics::UpdateUsagePrefCallbackType& GetMetricsDataUseForwarder(); + private: // Provide SystemURLRequestContextGetter with access to // InitSystemRequestContext(). @@ -565,6 +568,10 @@ const base::TimeTicks creation_time_; + // Callback for updating data use prefs which needs to be initialized on UI + // thread and passed to |ChromeNetworkDelegate|. + metrics::UpdateUsagePrefCallbackType metrics_data_use_forwarder_; + base::WeakPtrFactory<IOThread> weak_factory_; DISALLOW_COPY_AND_ASSIGN(IOThread);
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 5f19fb2..2767d20b 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -684,3 +684,7 @@ void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { metrics_service_->OnApplicationNotIdle(); } + +bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { + return IsCellularLogicEnabled(); +}
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.h b/chrome/browser/metrics/chrome_metrics_service_client.h index 303c984..8c91871c 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.h +++ b/chrome/browser/metrics/chrome_metrics_service_client.h
@@ -77,6 +77,7 @@ void OnPluginLoadingError(const base::FilePath& plugin_path) override; bool IsReportingPolicyManaged() override; EnableMetricsDefault GetDefaultOptIn() override; + bool IsUMACellularUploadLogicEnabled() override; private: explicit ChromeMetricsServiceClient(
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc index ee6dff8e..c333cf056 100644 --- a/chrome/browser/net/chrome_network_delegate.cc +++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -286,7 +286,8 @@ ChromeNetworkDelegate::ChromeNetworkDelegate( extensions::EventRouterForwarder* event_router, - BooleanPrefMember* enable_referrers) + BooleanPrefMember* enable_referrers, + const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) : profile_(NULL), enable_referrers_(enable_referrers), enable_do_not_track_(NULL), @@ -294,9 +295,10 @@ force_youtube_safety_mode_(NULL), url_blacklist_manager_(NULL), domain_reliability_monitor_(NULL), + data_use_measurement_(metrics_data_use_forwarder), experimental_web_platform_features_enabled_( - base::CommandLine::ForCurrentProcess() - ->HasSwitch(switches::kEnableExperimentalWebPlatformFeatures)), + base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableExperimentalWebPlatformFeatures)), data_use_aggregator_(nullptr), is_data_usage_off_the_record_(true) { DCHECK(enable_referrers);
diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h index 0d0f753..f807f86a 100644 --- a/chrome/browser/net/chrome_network_delegate.h +++ b/chrome/browser/net/chrome_network_delegate.h
@@ -17,6 +17,7 @@ #include "base/values.h" #include "build/build_config.h" #include "components/data_use_measurement/content/data_use_measurement.h" +#include "components/metrics/data_use_tracker.h" #include "net/base/network_delegate_impl.h" class ChromeExtensionsNetworkDelegate; @@ -67,8 +68,10 @@ // |enable_referrers| (and all of the other optional PrefMembers) should be // initialized on the UI thread (see below) beforehand. This object's owner is // responsible for cleaning them up at shutdown. - ChromeNetworkDelegate(extensions::EventRouterForwarder* event_router, - BooleanPrefMember* enable_referrers); + ChromeNetworkDelegate( + extensions::EventRouterForwarder* event_router, + BooleanPrefMember* enable_referrers, + const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder); ~ChromeNetworkDelegate() override; // Pass through to ChromeExtensionsNetworkDelegate::set_extension_info_map().
diff --git a/chrome/browser/net/chrome_network_delegate_unittest.cc b/chrome/browser/net/chrome_network_delegate_unittest.cc index b6feec3..ab99886 100644 --- a/chrome/browser/net/chrome_network_delegate_unittest.cc +++ b/chrome/browser/net/chrome_network_delegate_unittest.cc
@@ -157,7 +157,8 @@ void Initialize() { network_delegate_.reset( - new ChromeNetworkDelegate(forwarder(), &enable_referrers_)); + new ChromeNetworkDelegate(forwarder(), &enable_referrers_, + metrics::UpdateUsagePrefCallbackType())); context_->set_client_socket_factory(&socket_factory_); context_->set_network_delegate(network_delegate_.get()); context_->Init(); @@ -348,7 +349,8 @@ protected: scoped_ptr<net::NetworkDelegate> CreateNetworkDelegate() { scoped_ptr<ChromeNetworkDelegate> network_delegate( - new ChromeNetworkDelegate(forwarder(), &enable_referrers_)); + new ChromeNetworkDelegate(forwarder(), &enable_referrers_, + metrics::UpdateUsagePrefCallbackType())); network_delegate->set_force_google_safe_search(&force_google_safe_search_); network_delegate->set_force_youtube_safety_mode( &force_youtube_safety_mode_); @@ -446,7 +448,8 @@ protected: scoped_ptr<ChromeNetworkDelegate> CreateNetworkDelegate() { scoped_ptr<ChromeNetworkDelegate> network_delegate( - new ChromeNetworkDelegate(forwarder(), &enable_referrers_)); + new ChromeNetworkDelegate(forwarder(), &enable_referrers_, + metrics::UpdateUsagePrefCallbackType())); network_delegate->set_cookie_settings(cookie_settings_); return network_delegate; }
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc index 205c79f2..148ee64 100644 --- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
@@ -63,6 +63,10 @@ "PageLoad.Timing2.ParseBlockedOnScriptLoad"; const char kHistogramParseBlockedOnScriptLoadParseComplete[] = "PageLoad.Timing2.ParseBlockedOnScriptLoad.ParseComplete"; +const char kHistogramParseBlockedOnScriptLoadDocumentWrite[] = + "PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite"; +const char kHistogramParseBlockedOnScriptLoadDocumentWriteParseComplete[] = + "PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite.ParseComplete"; const char kBackgroundHistogramCommit[] = "PageLoad.Timing2.NavigationToCommit.Background"; @@ -86,6 +90,12 @@ "PageLoad.Timing2.ParseBlockedOnScriptLoad.Background"; const char kBackgroundHistogramParseBlockedOnScriptLoadParseComplete[] = "PageLoad.Timing2.ParseBlockedOnScriptLoad.ParseComplete.Background"; +const char kBackgroundHistogramParseBlockedOnScriptLoadDocumentWrite[] = + "PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite.Background"; +const char + kBackgroundHistogramParseBlockedOnScriptLoadDocumentWriteParseComplete[] = + "PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite." + "ParseComplete.Background"; const char kHistogramFirstContentfulPaintHigh[] = "PageLoad.Timing2.NavigationToFirstContentfulPaint.HighResolutionClock"; @@ -290,10 +300,16 @@ WasStartedInForegroundEventInForeground(timing.parse_stop, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramParseBlockedOnScriptLoad, timing.parse_blocked_on_script_load_duration); + PAGE_LOAD_HISTOGRAM( + internal::kHistogramParseBlockedOnScriptLoadDocumentWrite, + timing.parse_blocked_on_script_load_from_document_write_duration); } else { PAGE_LOAD_HISTOGRAM( internal::kBackgroundHistogramParseBlockedOnScriptLoad, timing.parse_blocked_on_script_load_duration); + PAGE_LOAD_HISTOGRAM( + internal::kBackgroundHistogramParseBlockedOnScriptLoadDocumentWrite, + timing.parse_blocked_on_script_load_from_document_write_duration); } } if (!timing.parse_stop.is_zero()) { @@ -303,12 +319,20 @@ PAGE_LOAD_HISTOGRAM( internal::kHistogramParseBlockedOnScriptLoadParseComplete, timing.parse_blocked_on_script_load_duration); + PAGE_LOAD_HISTOGRAM( + internal:: + kHistogramParseBlockedOnScriptLoadDocumentWriteParseComplete, + timing.parse_blocked_on_script_load_from_document_write_duration); } else { PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramParseDuration, parse_duration); PAGE_LOAD_HISTOGRAM( internal::kBackgroundHistogramParseBlockedOnScriptLoadParseComplete, timing.parse_blocked_on_script_load_duration); + PAGE_LOAD_HISTOGRAM( + internal:: + kBackgroundHistogramParseBlockedOnScriptLoadDocumentWriteParseComplete, + timing.parse_blocked_on_script_load_from_document_write_duration); } }
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h index 1339c4e..8ca5c06 100644 --- a/chrome/browser/profiles/profile.h +++ b/chrome/browser/profiles/profile.h
@@ -223,29 +223,6 @@ // the user started chrome. virtual base::Time GetStartTime() const = 0; - // Creates the main net::URLRequestContextGetter that will be returned by - // GetRequestContext(). Should only be called once per ContentBrowserClient - // object. This function is exposed because of the circular dependency where - // GetStoragePartition() is used to retrieve the request context, but creation - // still has to happen in the Profile so the StoragePartition calls - // ContextBrowserClient to call this function. - // TODO(ajwong): Remove once http://crbug.com/159193 is resolved. - virtual net::URLRequestContextGetter* CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) = 0; - - // Creates the net::URLRequestContextGetter for a StoragePartition. Should - // only be called once per partition_path per ContentBrowserClient object. - // This function is exposed because the request context is retrieved from the - // StoragePartition, but creation still has to happen in the Profile so the - // StoragePartition calls ContextBrowserClient to call this function. - // TODO(ajwong): Remove once http://crbug.com/159193 is resolved. - virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) = 0; - // Returns the last directory that was chosen for uploading or opening a file. virtual base::FilePath last_selected_directory() = 0; virtual void set_last_selected_directory(const base::FilePath& path) = 0;
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index 5569ad7..022ab42 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc
@@ -913,15 +913,6 @@ return otr_prefs_.get(); } -net::URLRequestContextGetter* ProfileImpl::CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return io_data_.CreateMainRequestContextGetter( - protocol_handlers, std::move(request_interceptors), - g_browser_process->io_thread()) - .get(); -} - net::URLRequestContextGetter* ProfileImpl::GetRequestContext() { return GetDefaultStoragePartition(this)->GetURLRequestContext(); } @@ -957,18 +948,6 @@ return io_data_.GetExtensionsRequestContextGetter().get(); } -net::URLRequestContextGetter* -ProfileImpl::CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return io_data_.CreateIsolatedAppRequestContextGetter( - partition_path, in_memory, protocol_handlers, - std::move(request_interceptors)) - .get(); -} - net::SSLConfigService* ProfileImpl::GetSSLConfigService() { // If ssl_config_service_manager_ is null, this typically means that some // KeyedService is trying to create a RequestContext at startup, @@ -1019,6 +998,27 @@ return BackgroundSyncControllerFactory::GetForProfile(this); } +net::URLRequestContextGetter* ProfileImpl::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return io_data_.CreateMainRequestContextGetter( + protocol_handlers, std::move(request_interceptors), + g_browser_process->io_thread()) + .get(); +} + +net::URLRequestContextGetter* +ProfileImpl::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return io_data_.CreateIsolatedAppRequestContextGetter( + partition_path, in_memory, protocol_handlers, + std::move(request_interceptors)) + .get(); +} + bool ProfileImpl::IsSameProfile(Profile* profile) { if (profile == static_cast<Profile*>(this)) return true;
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h index 8286c05..f8c5bdf 100644 --- a/chrome/browser/profiles/profile_impl.h +++ b/chrome/browser/profiles/profile_impl.h
@@ -96,6 +96,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; // Profile implementation: scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() override; @@ -120,14 +128,6 @@ net::SSLConfigService* GetSSLConfigService() override; bool IsSameProfile(Profile* profile) override; base::Time GetStartTime() const override; - net::URLRequestContextGetter* CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; base::FilePath last_selected_directory() override; void set_last_selected_directory(const base::FilePath& path) override; chrome_browser_net::Predictor* GetNetworkPredictor() override;
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc index 3d439fb..fd71009 100644 --- a/chrome/browser/profiles/profile_io_data.cc +++ b/chrome/browser/profiles/profile_io_data.cc
@@ -63,6 +63,7 @@ #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h" #include "components/dom_distiller/core/url_constants.h" #include "components/metrics/metrics_pref_names.h" +#include "components/metrics/metrics_service.h" #include "components/net_log/chrome_net_log.h" #include "components/policy/core/browser/url_blacklist_manager.h" #include "components/policy/core/common/cloud/policy_header_io_helper.h" @@ -1016,14 +1017,13 @@ main_request_context_.reset(new net::URLRequestContext()); extensions_request_context_.reset(new net::URLRequestContext()); - scoped_ptr<ChromeNetworkDelegate> network_delegate( - new ChromeNetworkDelegate( + scoped_ptr<ChromeNetworkDelegate> network_delegate(new ChromeNetworkDelegate( #if defined(ENABLE_EXTENSIONS) - io_thread_globals->extension_event_router_forwarder.get(), + io_thread_globals->extension_event_router_forwarder.get(), #else - NULL, + NULL, #endif - &enable_referrers_)); + &enable_referrers_, io_thread->GetMetricsDataUseForwarder())); #if defined(ENABLE_EXTENSIONS) network_delegate->set_extension_info_map( profile_params_->extension_info_map.get()); @@ -1291,9 +1291,10 @@ net::HttpNetworkSession::Params params(io_thread->NetworkSessionParams()); net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(context, ¶ms); - if (!IsOffTheRecord()) { + if (!IsOffTheRecord() && io_thread->globals()->network_quality_estimator) { params.socket_performance_watcher_factory = - io_thread->globals()->network_quality_estimator.get(); + io_thread->globals() + ->network_quality_estimator->GetSocketPerformanceWatcherFactory(); } if (data_reduction_proxy_io_data_.get()) params.proxy_delegate = data_reduction_proxy_io_data_->proxy_delegate();
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js index 3e1f728..018b850 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js
@@ -64,6 +64,7 @@ */ WallpaperSourceEnum: { Online: 'ONLINE', + Daily: 'DAILY', OEM: 'OEM', Custom: 'CUSTOM', AddNew: 'ADDNEW',
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js index 4fd4193..91c97886 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js
@@ -162,7 +162,7 @@ var wallpaperURL = wallpaper.base_url + Constants.HighResolutionSuffix; var onSuccess = function() { WallpaperUtil.saveWallpaperInfo(wallpaperURL, wallpaper.default_layout, - Constants.WallpaperSourceEnum.Online); + Constants.WallpaperSourceEnum.Daily, ''); WallpaperUtil.saveToLocalStorage( Constants.AccessLastSurpriseWallpaperChangedDate, dateString, function() { @@ -198,7 +198,7 @@ 'surprise_wallpaper', onSuccess); WallpaperUtil.saveWallpaperInfo(url, layout, - Constants.WallpaperSourceEnum.Online); + Constants.WallpaperSourceEnum.Daily, ''); var dateString = new Date().toDateString(); WallpaperUtil.saveToLocalStorage( Constants.AccessLastSurpriseWallpaperChangedDate,
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js index 0cb7857..3614c4cb 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js
@@ -310,6 +310,13 @@ * set by the built-in wallpaper picker, it is set to an empty string. */ WallpaperUtil.saveWallpaperInfo = function(url, layout, source, appName) { + chrome.wallpaperPrivate.recordWallpaperUMA(source); + + // In order to keep the wallpaper sync working across different versions, we + // have to revert DAILY type wallpaper info to ONLINE type after record the + // correct UMA stats. + source = (source == Constants.WallpaperSourceEnum.Daily) ? + Constants.WallpaperSourceEnum.Online : source; var wallpaperInfo = { url: url, layout: layout, @@ -378,8 +385,6 @@ if (xhr.response != null) { chrome.wallpaperPrivate.setWallpaper(xhr.response, layout, url, onSuccess); - self.saveWallpaperInfo( - url, layout, Constants.WallpaperSourceEnum.Online, ''); } else { onFailure(); }
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_images_grid.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_images_grid.js index 8b59268..0d8bf7c 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_images_grid.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_images_grid.js
@@ -163,8 +163,12 @@ } }); break; + case Constants.WallpaperSourceEnum.Daily: + // It's impossible to manually select a DAILY type wallpaper. + console.error('Unsupported wallpaper source.'); + break; default: - console.error('Unsupported image source.'); + console.error('Unsupported wallpaper source.'); // Delay dispatching the completion callback until all items have // begun loading and are tracked. window.setTimeout(this.callback_.bind(this, this.dataModelId_), 0);
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js index 991fd6f..d8e3454c 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
@@ -668,6 +668,9 @@ onFailure, self.wallpaperRequest_); }); break; + case Constants.WallpaperSourceEnum.Daily: + console.error('Unsupported wallpaper source.'); + break; default: console.error('Unsupported wallpaper source.'); }
diff --git a/chrome/browser/resources/settings/people_page/manage_profile.js b/chrome/browser/resources/settings/people_page/manage_profile.js index 243548d..2851f68 100644 --- a/chrome/browser/resources/settings/people_page/manage_profile.js +++ b/chrome/browser/resources/settings/people_page/manage_profile.js
@@ -45,11 +45,12 @@ /** @override */ attached: function() { - this.addWebUIListener('available-icons-changed', function(iconUrls) { + var setIcons = function(iconUrls) { this.availableIconUrls = iconUrls; - }.bind(this)); + }.bind(this); - this.browserProxy_.getAvailableIcons(); + this.addWebUIListener('available-icons-changed', setIcons); + this.browserProxy_.getAvailableIcons().then(setIcons); }, /**
diff --git a/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js b/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js index 1607fd9..48c03b7e 100644 --- a/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js +++ b/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js
@@ -12,8 +12,8 @@ ManageProfileBrowserProxy.prototype = { /** - * Gets the available profile icons to choose from. As a response, the C++ - * sends the 'available-icons-changed' WebUIListener event. + * Gets the available profile icons to choose from. + * @return {!Promise<!Array<string>>} */ getAvailableIcons: function() {}, @@ -37,7 +37,7 @@ ManageProfileBrowserProxyImpl.prototype = { /** @override */ getAvailableIcons: function() { - chrome.send('getAvailableIcons'); + return cr.sendWithPromise('getAvailableIcons'); }, /** @override */
diff --git a/chrome/browser/safe_browsing/local_database_manager.cc b/chrome/browser/safe_browsing/local_database_manager.cc index 22818cbf..940d15a 100644 --- a/chrome/browser/safe_browsing/local_database_manager.cc +++ b/chrome/browser/safe_browsing/local_database_manager.cc
@@ -1254,7 +1254,7 @@ check_timeout_); } -bool LocalSafeBrowsingDatabaseManager::download_protection_enabled() const { +bool LocalSafeBrowsingDatabaseManager::IsDownloadProtectionEnabled() const { return enable_download_protection_; }
diff --git a/chrome/browser/safe_browsing/local_database_manager.h b/chrome/browser/safe_browsing/local_database_manager.h index 6e9025d..59e7e3f 100644 --- a/chrome/browser/safe_browsing/local_database_manager.h +++ b/chrome/browser/safe_browsing/local_database_manager.h
@@ -135,7 +135,7 @@ void StartOnIOThread(net::URLRequestContextGetter* request_context_getter, const V4ProtocolConfig& config) override; void StopOnIOThread(bool shutdown) override; - bool download_protection_enabled() const override; + bool IsDownloadProtectionEnabled() const override; protected: ~LocalSafeBrowsingDatabaseManager() override;
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc index 939b4f3..5a9da1e 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -346,7 +346,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); #if defined(FULL_SAFE_BROWSING) - return (database_manager_->download_protection_enabled() && + return (database_manager_->IsDownloadProtectionEnabled() && ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled()) || (download_protection_service() && download_protection_service()->enabled());
diff --git a/chrome/browser/search/suggestions/suggestions_source.cc b/chrome/browser/search/suggestions/suggestions_source.cc index 922b953..e8804f7 100644 --- a/chrome/browser/search/suggestions/suggestions_source.cc +++ b/chrome/browser/search/suggestions/suggestions_source.cc
@@ -205,8 +205,10 @@ gfx::PNGCodec::EncodeBGRASkBitmap(*bitmap, false, &output); std::string encoded_output; - base::Base64Encode(std::string(output.begin(), output.end()), - &encoded_output); + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(output.data()), + output.size()), + &encoded_output); context->base64_encoded_pngs[url] = "data:image/png;base64,"; context->base64_encoded_pngs[url] += encoded_output; }
diff --git a/chrome/browser/ssl/chrome_expect_ct_reporter.cc b/chrome/browser/ssl/chrome_expect_ct_reporter.cc index 601800c..983a2cad 100644 --- a/chrome/browser/ssl/chrome_expect_ct_reporter.cc +++ b/chrome/browser/ssl/chrome_expect_ct_reporter.cc
@@ -10,6 +10,8 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/json/json_writer.h" +#include "base/metrics/histogram_macros.h" +#include "base/metrics/sparse_histogram.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/values.h" @@ -101,13 +103,20 @@ list->Append(std::move(list_item)); } +// Records an UMA histogram of the net errors when Expect CT reports +// fails to send. +void RecordUMAOnFailure(const GURL& report_uri, int net_error) { + UMA_HISTOGRAM_SPARSE_SLOWLY("SSL.ExpectCTReportFailure", net_error); +} + } // namespace ChromeExpectCTReporter::ChromeExpectCTReporter( net::URLRequestContext* request_context) : report_sender_(new net::CertificateReportSender( request_context, - net::CertificateReportSender::DO_NOT_SEND_COOKIES)) {} + net::CertificateReportSender::DO_NOT_SEND_COOKIES, + base::Bind(RecordUMAOnFailure))) {} ChromeExpectCTReporter::~ChromeExpectCTReporter() {}
diff --git a/chrome/browser/ssl/chrome_expect_ct_reporter_unittest.cc b/chrome/browser/ssl/chrome_expect_ct_reporter_unittest.cc index 61219a4..bebe06f 100644 --- a/chrome/browser/ssl/chrome_expect_ct_reporter_unittest.cc +++ b/chrome/browser/ssl/chrome_expect_ct_reporter_unittest.cc
@@ -10,12 +10,17 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/json/json_reader.h" +#include "base/run_loop.h" +#include "base/test/histogram_tester.h" #include "base/values.h" #include "chrome/common/chrome_features.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "net/base/test_data_directory.h" #include "net/ssl/signed_certificate_timestamp_and_status.h" #include "net/test/cert_test_util.h" +#include "net/test/url_request/url_request_failed_job.h" #include "net/url_request/certificate_report_sender.h" +#include "net/url_request/url_request_filter.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -250,6 +255,67 @@ *report_invalid_scts, *report_valid_scts)); } +// A test network delegate that allows the user to specify a callback to +// be run whenever a net::URLRequest is destroyed. +class TestExpectCTNetworkDelegate : public net::NetworkDelegateImpl { + public: + TestExpectCTNetworkDelegate() + : url_request_destroyed_callback_(base::Bind(&base::DoNothing)) {} + + void set_url_request_destroyed_callback(const base::Closure& callback) { + url_request_destroyed_callback_ = callback; + } + + // net::NetworkDelegateImpl: + void OnURLRequestDestroyed(net::URLRequest* request) override { + url_request_destroyed_callback_.Run(); + } + + private: + base::Closure url_request_destroyed_callback_; + + DISALLOW_COPY_AND_ASSIGN(TestExpectCTNetworkDelegate); +}; + +// A test fixture that allows tests to send a report and wait until the +// net::URLRequest that sent the report is destroyed. +class ChromeExpectCTReporterWaitTest : public ::testing::Test { + public: + ChromeExpectCTReporterWaitTest() + : context_(true), + thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { + context_.set_network_delegate(&network_delegate_); + context_.Init(); + } + + void SetUp() override { net::URLRequestFailedJob::AddUrlHandler(); } + + void TearDown() override { + net::URLRequestFilter::GetInstance()->ClearHandlers(); + } + + net::TestURLRequestContext* context() { return &context_; } + + protected: + void SendReport(ChromeExpectCTReporter* reporter, + const net::HostPortPair& host_port, + const GURL& report_uri, + const net::SSLInfo& ssl_info) { + base::RunLoop run_loop; + network_delegate_.set_url_request_destroyed_callback( + run_loop.QuitClosure()); + reporter->OnExpectCTFailed(host_port, report_uri, ssl_info); + run_loop.Run(); + } + + private: + TestExpectCTNetworkDelegate network_delegate_; + net::TestURLRequestContext context_; + content::TestBrowserThreadBundle thread_bundle_; + + DISALLOW_COPY_AND_ASSIGN(ChromeExpectCTReporterWaitTest); +}; + void EnableFeature() { base::FeatureList::ClearInstanceForTesting(); std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); @@ -299,6 +365,31 @@ EXPECT_TRUE(sender->latest_serialized_report().empty()); } +// Test that if a report fails to send, the UMA metric is recorded. +TEST_F(ChromeExpectCTReporterWaitTest, SendReportFailure) { + EnableFeature(); + base::HistogramTester histograms; + const std::string histogram_name = "SSL.ExpectCTReportFailure"; + histograms.ExpectTotalCount(histogram_name, 0); + + ChromeExpectCTReporter reporter(context()); + + net::SSLInfo ssl_info; + ssl_info.cert = + net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); + ssl_info.unverified_cert = net::ImportCertFromFile( + net::GetTestCertsDirectory(), "localhost_cert.pem"); + + net::HostPortPair host_port("example.test", 443); + GURL report_uri( + net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_CONNECTION_FAILED)); + + SendReport(&reporter, host_port, report_uri, ssl_info); + + histograms.ExpectTotalCount(histogram_name, 1); + histograms.ExpectBucketCount(histogram_name, net::ERR_CONNECTION_FAILED, 1); +} + // Test that a sent report has the right format. TEST(ChromeExpectCTReporterTest, SendReport) { EnableFeature();
diff --git a/chrome/browser/thumbnails/thumbnail_list_source.cc b/chrome/browser/thumbnails/thumbnail_list_source.cc index 51d51ac..2892157 100644 --- a/chrome/browser/thumbnails/thumbnail_list_source.cc +++ b/chrome/browser/thumbnails/thumbnail_list_source.cc
@@ -146,8 +146,9 @@ for (size_t i = 0; i < num_mv; ++i) { scoped_refptr<base::RefCountedMemory> data; if (thumbnail_service_->GetPageThumbnail(mvurl_list[i].url, false, &data)) { - base::Base64Encode(std::string(data->front_as<char>(), data->size()), - &base64_encoded_pngs[i]); + base::Base64Encode( + base::StringPiece(data->front_as<char>(), data->size()), + &base64_encoded_pngs[i]); ++num_mv_with_thumb; } }
diff --git a/chrome/browser/ui/app_list/test/fake_profile.cc b/chrome/browser/ui/app_list/test/fake_profile.cc index 7c278c0..22c7c6c 100644 --- a/chrome/browser/ui/app_list/test/fake_profile.cc +++ b/chrome/browser/ui/app_list/test/fake_profile.cc
@@ -86,6 +86,21 @@ return nullptr; } +net::URLRequestContextGetter* FakeProfile::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + +net::URLRequestContextGetter* +FakeProfile::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + scoped_refptr<base::SequencedTaskRunner> FakeProfile::GetIOTaskRunner() { return scoped_refptr<base::SequencedTaskRunner>(); @@ -153,21 +168,6 @@ return base::Time(); } -net::URLRequestContextGetter* FakeProfile::CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return nullptr; -} - -net::URLRequestContextGetter* -FakeProfile::CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return nullptr; -} - base::FilePath FakeProfile::last_selected_directory() { return base::FilePath(); }
diff --git a/chrome/browser/ui/app_list/test/fake_profile.h b/chrome/browser/ui/app_list/test/fake_profile.h index b6945a611..f6da0a9 100644 --- a/chrome/browser/ui/app_list/test/fake_profile.h +++ b/chrome/browser/ui/app_list/test/fake_profile.h
@@ -52,6 +52,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() override; Profile* GetOffTheRecordProfile() override; void DestroyOffTheRecordProfile() override; @@ -69,14 +77,6 @@ net::SSLConfigService* GetSSLConfigService() override; bool IsSameProfile(Profile* profile) override; base::Time GetStartTime() const override; - net::URLRequestContextGetter* CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; base::FilePath last_selected_directory() override; void set_last_selected_directory(const base::FilePath& path) override;
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc new file mode 100644 index 0000000..db462979 --- /dev/null +++ b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
@@ -0,0 +1,35 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h" + +#include "ash/shelf/shelf_item_types.h" +#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" +#include "chrome/grit/generated_resources.h" + +ArcLauncherContextMenu::ArcLauncherContextMenu( + ChromeLauncherController* controller, + const ash::ShelfItem* item, + ash::Shelf* shelf) + : LauncherContextMenu(controller, item, shelf) { + Init(); +} + +ArcLauncherContextMenu::~ArcLauncherContextMenu() {} + +void ArcLauncherContextMenu::Init() { + AddItemWithStringId(MENU_OPEN_NEW, IDS_APP_CONTEXT_MENU_ACTIVATE_ARC); + AddSeparator(ui::NORMAL_SEPARATOR); + AddPinMenu(); + if (controller()->IsOpen(item().id)) + AddItemWithStringId(MENU_CLOSE, IDS_LAUNCHER_CONTEXT_MENU_CLOSE); + AddSeparator(ui::NORMAL_SEPARATOR); + AddShelfOptionsMenu(); +} + +bool ArcLauncherContextMenu::IsCommandIdEnabled(int command_id) const { + if (command_id == MENU_OPEN_NEW) + return true; + return LauncherContextMenu::IsCommandIdEnabled(command_id); +}
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h new file mode 100644 index 0000000..10c18a1 --- /dev/null +++ b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
@@ -0,0 +1,35 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_ +#define CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_ + +#include "base/macros.h" +#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h" + +class ChromeLauncherController; + +namespace ash { +class Shelf; +struct ShelfItem; +} + +// Class for context menu which is shown for Arc app in the shelf. +class ArcLauncherContextMenu : public LauncherContextMenu { + public: + ArcLauncherContextMenu(ChromeLauncherController* controller, + const ash::ShelfItem* item, + ash::Shelf* shelf); + ~ArcLauncherContextMenu() override; + + // ui::SimpleMenuModel::Delegate overrides: + bool IsCommandIdEnabled(int command_id) const override; + + private: + void Init(); + + DISALLOW_COPY_AND_ASSIGN(ArcLauncherContextMenu); +}; + +#endif // CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc index 907c1638..9a6cad0 100644 --- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
@@ -24,6 +24,11 @@ #include "grit/ash_strings.h" #include "ui/base/l10n/l10n_util.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h" +#endif // defined(OS_CHROMEOS) + namespace { // Returns true if the user can modify the |shelf|'s auto-hide behavior. @@ -45,6 +50,15 @@ if (!item || item->id == 0) return new DesktopShellLauncherContextMenu(controller, item, shelf); +// Create ArcLauncherContextMenu if the item is an Arc app. +#if defined(OS_CHROMEOS) + const std::string& app_id = controller->GetAppIDForShelfID(item->id); + ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(controller->profile()); + DCHECK(arc_prefs); + if (arc_prefs->IsRegistered(app_id)) + return new ArcLauncherContextMenu(controller, item, shelf); +#endif // defined(OS_CHROMEOS) + // Create ExtensionLauncherContextMenu for the item. return new ExtensionLauncherContextMenu(controller, item, shelf); }
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc index 8a5b3f21..7591e31 100644 --- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc +++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -20,6 +20,10 @@ #include "components/prefs/pref_service.h" #include "ui/aura/window_event_dispatcher.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h" +#endif // defined(OS_CHROMEOS) + class LauncherContextMenuTest : public ash::test::AshTestBase { protected: static bool IsItemPresentInMenu(LauncherContextMenu* menu, int command_id) { @@ -53,6 +57,15 @@ return LauncherContextMenu::Create(controller_.get(), item, shelf); } +#if defined(OS_CHROMEOS) + LauncherContextMenu* CreateLauncherContextMenuForArcApp() { + ash::ShelfItem item; + item.id = 1; // dummy id + ash::Shelf* shelf = ash::Shelf::ForWindow(CurrentContext()); + return new ArcLauncherContextMenu(controller_.get(), &item, shelf); + } +#endif + Profile* profile() { return profile_.get(); } private: @@ -129,3 +142,26 @@ menu->IsCommandIdEnabled(LauncherContextMenu::MENU_CHANGE_WALLPAPER)); #endif } + +// Verifies contextmenu items for Arc app +#if defined(OS_CHROMEOS) +TEST_F(LauncherContextMenuTest, ArcLauncherContextMenuItemCheck) { + scoped_ptr<LauncherContextMenu> menu(CreateLauncherContextMenuForArcApp()); + EXPECT_TRUE( + IsItemPresentInMenu(menu.get(), LauncherContextMenu::MENU_OPEN_NEW)); + EXPECT_TRUE(menu->IsCommandIdEnabled(LauncherContextMenu::MENU_OPEN_NEW)); + EXPECT_TRUE( + IsItemPresentInMenu(menu.get(), LauncherContextMenu::MENU_AUTO_HIDE)); + EXPECT_TRUE(menu->IsCommandIdEnabled(LauncherContextMenu::MENU_AUTO_HIDE)); + EXPECT_TRUE(IsItemPresentInMenu(menu.get(), + LauncherContextMenu::MENU_ALIGNMENT_MENU)); + EXPECT_TRUE( + menu->IsCommandIdEnabled(LauncherContextMenu::MENU_ALIGNMENT_MENU)); + // By default, screen is not locked and ChangeWallPaper item is added in + // menu. ChangeWallPaper item is not enabled in default mode. + EXPECT_TRUE(IsItemPresentInMenu(menu.get(), + LauncherContextMenu::MENU_CHANGE_WALLPAPER)); + EXPECT_FALSE( + menu->IsCommandIdEnabled(LauncherContextMenu::MENU_CHANGE_WALLPAPER)); +} +#endif
diff --git a/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc b/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc index b33892ee..fe613eba 100644 --- a/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc +++ b/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc
@@ -336,6 +336,7 @@ ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); FlushHistoryService(); + ASSERT_TRUE(content::ExecuteScript(web_contents, "Polymer.dom.flush();")); EXPECT_EQ(1, FindInPageASCII(web_contents, download_url.spec(), kFwd, kIgnoreCase, NULL)); }
diff --git a/chrome/browser/ui/task_manager/task_manager_table_model.cc b/chrome/browser/ui/task_manager/task_manager_table_model.cc index b757e102..75bf306 100644 --- a/chrome/browser/ui/task_manager/task_manager_table_model.cc +++ b/chrome/browser/ui/task_manager/task_manager_table_model.cc
@@ -518,8 +518,15 @@ case IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN: { int64_t allocated1, allocated2, used1, used2; - observed_task_manager()->GetV8Memory(tasks_[row1], &allocated1, &used1); - observed_task_manager()->GetV8Memory(tasks_[row2], &allocated2, &used2); + bool row1_valid = observed_task_manager()->GetV8Memory(tasks_[row1], + &allocated1, + &used1); + bool row2_valid = observed_task_manager()->GetV8Memory(tasks_[row2], + &allocated2, + &used2); + if (!row1_valid || !row2_valid) + return OrderUnavailableValue(row1_valid, row2_valid); + return ValueCompare(allocated1, allocated2); }
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model.cc b/chrome/browser/ui/toolbar/toolbar_actions_model.cc index bea6022..8b8077ba 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_model.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
@@ -228,7 +228,19 @@ content::BrowserContext* browser_context, const extensions::Extension* extension, extensions::UnloadedExtensionInfo::Reason reason) { + size_t index = 0u; + while (toolbar_items().size() > index && + toolbar_items()[index].id != extension->id()) + ++index; + bool was_visible_and_has_overflow = + index < visible_icon_count() && !all_icons_visible(); RemoveExtension(extension); + // If the extension was previously visible and there are overflowed + // extensions, and this extension is being uninstalled, we reduce the visible + // count so that we don't pop out a previously-hidden extension. + if (was_visible_and_has_overflow && + reason == extensions::UnloadedExtensionInfo::REASON_UNINSTALL) + SetVisibleIconCount(visible_icon_count() - 1); } void ToolbarActionsModel::OnExtensionUninstalled(
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc b/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc index aa0ec50..4aefede 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc
@@ -5,6 +5,7 @@ #include <stddef.h> #include "base/callback.h" +#include "base/callback_helpers.h" #include "base/files/file_util.h" #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -1458,6 +1459,30 @@ } TEST_F(ToolbarActionsModelUnitTest, + TestUninstallVisibleExtensionDoesntBringOutOther) { + Init(); + ASSERT_TRUE(AddBrowserActionExtensions()); + toolbar_model()->SetVisibleIconCount(2u); + EXPECT_EQ(3u, num_toolbar_items()); + EXPECT_EQ(2u, toolbar_model()->visible_icon_count()); + EXPECT_EQ(browser_action_a()->id(), GetActionIdAtIndex(0u)); + EXPECT_EQ(browser_action_b()->id(), GetActionIdAtIndex(1u)); + EXPECT_EQ(browser_action_c()->id(), GetActionIdAtIndex(2u)); + + service()->UninstallExtension( + browser_action_b()->id(), + extensions::UNINSTALL_REASON_FOR_TESTING, + base::Bind(&base::DoNothing), + nullptr); + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(2u, num_toolbar_items()); + EXPECT_EQ(1u, toolbar_model()->visible_icon_count()); + EXPECT_EQ(browser_action_a()->id(), GetActionIdAtIndex(0u)); + EXPECT_EQ(browser_action_c()->id(), GetActionIdAtIndex(1u)); +} + +TEST_F(ToolbarActionsModelUnitTest, NoMigrationToComponentActionWithoutExtension) { extensions::FeatureSwitch::ScopedOverride enable_redesign( extensions::FeatureSwitch::extension_action_redesign(), true);
diff --git a/chrome/browser/ui/views/browser_dialogs_views_mac.cc b/chrome/browser/ui/views/browser_dialogs_views_mac.cc index 7254c45..329033a 100644 --- a/chrome/browser/ui/views/browser_dialogs_views_mac.cc +++ b/chrome/browser/ui/views/browser_dialogs_views_mac.cc
@@ -54,7 +54,7 @@ views::BubbleBorder::Arrow::TOP_RIGHT); contents->set_parent_window(parent_view); contents->SetAnchorRect(gfx::Rect(anchor, gfx::Size())); - views::BubbleDelegateView::CreateBubble(contents)->Show(); + views::BubbleDialogDelegateView::CreateBubble(contents)->Show(); } } // namespace chrome
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index bb3691e..140d08c 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -138,7 +138,7 @@ views::View* anchor_view, views::BubbleBorder::Arrow arrow) : content::WebContentsObserver(web_contents), - BubbleDelegateView(anchor_view, arrow), + BubbleDialogDelegateView(anchor_view, arrow), content_setting_bubble_model_(content_setting_bubble_model), custom_link_(NULL), manage_link_(NULL), @@ -373,34 +373,29 @@ bubble_content_empty = false; } - const int kDoubleColumnSetId = 1; - views::ColumnSet* double_column_set = - layout->AddColumnSet(kDoubleColumnSetId); if (!bubble_content_empty) { - layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); - layout->StartRow(0, kSingleColumnSetId); - layout->AddView(new views::Separator(views::Separator::HORIZONTAL), 1, 1, - GridLayout::FILL, GridLayout::FILL); - layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); - } + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); + layout->StartRow(0, kSingleColumnSetId); + layout->AddView(new views::Separator(views::Separator::HORIZONTAL), 1, 1, + GridLayout::FILL, GridLayout::FILL); + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); + } +} - double_column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, - GridLayout::USE_PREF, 0, 0); - double_column_set->AddPaddingColumn( - 0, views::kUnrelatedControlHorizontalSpacing); - double_column_set->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 0, - GridLayout::USE_PREF, 0, 0); +views::View* ContentSettingBubbleContents::CreateExtraView() { + manage_link_ = new views::Link(base::UTF8ToUTF16( + content_setting_bubble_model_->bubble_content().manage_link)); + manage_link_->set_listener(this); + return manage_link_; +} - layout->StartRow(0, kDoubleColumnSetId); - manage_link_ = - new views::Link(base::UTF8ToUTF16(bubble_content.manage_link)); - manage_link_->set_listener(this); - layout->AddView(manage_link_); +int ContentSettingBubbleContents::GetDialogButtons() const { + return ui::DIALOG_BUTTON_OK; +} - close_button_ = - new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE)); - close_button_->SetStyle(views::Button::STYLE_BUTTON); - layout->AddView(close_button_); +base::string16 ContentSettingBubbleContents::GetDialogButtonLabel( + ui::DialogButton button) const { + return l10n_util::GetStringUTF16(IDS_DONE); } void ContentSettingBubbleContents::DidNavigateMainFrame(
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.h b/chrome/browser/ui/views/content_setting_bubble_contents.h index 86b2e10..46689f12 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.h +++ b/chrome/browser/ui/views/content_setting_bubble_contents.h
@@ -12,7 +12,7 @@ #include "components/content_settings/core/common/content_settings_types.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/common/media_stream_request.h" -#include "ui/views/bubble/bubble_delegate.h" +#include "ui/views/bubble/bubble_dialog_delegate.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/button/menu_button_listener.h" #include "ui/views/controls/link_listener.h" @@ -46,7 +46,7 @@ // get to a more comprehensive settings management dialog. A few types have // more or fewer controls than this. class ContentSettingBubbleContents : public content::WebContentsObserver, - public views::BubbleDelegateView, + public views::BubbleDialogDelegateView, public views::ButtonListener, public views::LinkListener, public views::MenuButtonListener { @@ -65,8 +65,11 @@ const std::string& label); protected: - // views::BubbleDelegateView: + // views::BubbleDialogDelegateView: void Init() override; + View* CreateExtraView() override; + int GetDialogButtons() const override; + base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; private: class Favicon;
diff --git a/chrome/browser/ui/views/download/download_item_view_md.cc b/chrome/browser/ui/views/download/download_item_view_md.cc index 0d3082d..6e896de 100644 --- a/chrome/browser/ui/views/download/download_item_view_md.cc +++ b/chrome/browser/ui/views/download/download_item_view_md.cc
@@ -462,6 +462,7 @@ void DownloadItemViewMd::OnThemeChanged() { UpdateColorsFromTheme(); + SchedulePaint(); } void DownloadItemViewMd::AddInkDropLayer(ui::Layer* ink_drop_layer) { @@ -588,6 +589,13 @@ } void DownloadItemViewMd::OnPaint(gfx::Canvas* canvas) { + // Make sure to draw |this| opaquely. Since the toolbar color can be partially + // transparent, start with a black backdrop (which is the default initialized + // color for opaque canvases). + canvas->DrawColor(SK_ColorBLACK); + canvas->DrawColor( + GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)); + DrawStatusText(canvas); DrawFilename(canvas); DrawIcon(canvas);
diff --git a/chrome/browser/ui/views/extensions/bundle_installed_bubble.cc b/chrome/browser/ui/views/extensions/bundle_installed_bubble.cc index f192c05..a37af3b6 100644 --- a/chrome/browser/ui/views/extensions/bundle_installed_bubble.cc +++ b/chrome/browser/ui/views/extensions/bundle_installed_bubble.cc
@@ -10,8 +10,8 @@ #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "ui/base/resource/resource_bundle.h" #include "ui/resources/grit/ui_resources.h" -#include "ui/views/bubble/bubble_delegate.h" -#include "ui/views/controls/button/image_button.h" +#include "ui/views/bubble/bubble_dialog_delegate.h" +#include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/grid_layout.h" #include "ui/views/layout/layout_constants.h" @@ -33,13 +33,13 @@ // The size of extension icons, and width of the corresponding column. const int kIconSize = 32; -class BundleInstalledBubble : public views::BubbleDelegateView, +class BundleInstalledBubble : public views::BubbleDialogDelegateView, public views::ButtonListener { public: BundleInstalledBubble(const BundleInstaller* bundle, View* anchor_view, views::BubbleBorder::Arrow arrow) - : views::BubbleDelegateView(anchor_view, arrow) { + : views::BubbleDialogDelegateView(anchor_view, arrow) { GridLayout* layout = GridLayout::CreatePanel(this); SetLayoutManager(layout); @@ -116,7 +116,7 @@ BundleInstaller::Item::STATE_FAILED)); } - views::BubbleDelegateView::CreateBubble(this)->Show(); + views::BubbleDialogDelegateView::CreateBubble(this)->Show(); } void AddItemList(GridLayout* layout, const BundleInstaller::ItemList& items) { @@ -142,16 +142,7 @@ } void AddCloseButton(GridLayout* layout, views::ButtonListener* listener) { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - - views::ImageButton* button = new views::ImageButton(listener); - button->SetImage(views::CustomButton::STATE_NORMAL, - rb.GetImageSkiaNamed(IDR_CLOSE_2)); - button->SetImage(views::CustomButton::STATE_HOVERED, - rb.GetImageSkiaNamed(IDR_CLOSE_2_H)); - button->SetImage(views::CustomButton::STATE_PRESSED, - rb.GetImageSkiaNamed(IDR_CLOSE_2_P)); - layout->AddView(button); + layout->AddView(views::BubbleFrameView::CreateCloseButton(listener)); } void AddHeading(GridLayout* layout, const base::string16& heading) { @@ -164,6 +155,9 @@ layout->AddView(heading_label); } + // views::BubbleDialogDelegate implementation: + int GetDialogButtons() const override { return ui::DIALOG_BUTTON_NONE; } + // views::ButtonListener implementation: void ButtonPressed(views::Button* sender, const ui::Event& event) override { GetWidget()->Close();
diff --git a/chrome/browser/ui/views/first_run_bubble_unittest.cc b/chrome/browser/ui/views/first_run_bubble_unittest.cc index 7cdf5f8..3c32c96 100644 --- a/chrome/browser/ui/views/first_run_bubble_unittest.cc +++ b/chrome/browser/ui/views/first_run_bubble_unittest.cc
@@ -5,7 +5,6 @@ #include "base/macros.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/views/first_run_bubble.h" -#include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" @@ -60,15 +59,14 @@ // Overrides from views::ViewsTestBase: void SetUp() override; - void TearDown() override; void CreateAndCloseBubbleOnEventTest(ui::Event* event); protected: - TestingProfile* profile() { return profile_.get(); } + TestingProfile* profile() { return &profile_; } private: - scoped_ptr<TestingProfile> profile_; + TestingProfile profile_; DISALLOW_COPY_AND_ASSIGN(FirstRunBubbleTest); }; @@ -79,20 +77,13 @@ void FirstRunBubbleTest::SetUp() { ViewsTestBase::SetUp(); - profile_.reset(new TestingProfile()); TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( - profile_.get(), &TemplateURLServiceFactory::BuildInstanceFor); + profile(), &TemplateURLServiceFactory::BuildInstanceFor); TemplateURLService* turl_model = - TemplateURLServiceFactory::GetForProfile(profile_.get()); + TemplateURLServiceFactory::GetForProfile(profile()); turl_model->Load(); } -void FirstRunBubbleTest::TearDown() { - ViewsTestBase::TearDown(); - profile_.reset(); - TestingBrowserProcess::DeleteInstance(); -} - void FirstRunBubbleTest::CreateAndCloseBubbleOnEventTest(ui::Event* event) { // Create the anchor and parent widgets. views::Widget::InitParams params =
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index bfb23b6..4e63db8 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -218,22 +218,22 @@ canvas->FillRect(gfx::Rect(0, y, view->width(), thickness), color); } -// TODO(kuan): These functions are temporarily for the bookmark bar while its -// detached state is at the top of the page; it'll be moved to float on the -// content page in the very near future, at which time, these local functions -// will be removed. void PaintDetachedBookmarkBar(gfx::Canvas* canvas, - BookmarkBarView* view, - Profile* profile) { + BookmarkBarView* view) { // Paint background for detached state; if animating, this is fade in/out. - const ui::ThemeProvider& tp = - ThemeService::GetThemeProviderForProfile(profile); + const ui::ThemeProvider* tp = view->GetThemeProvider(); + // In detached mode, the bar is meant to overlap with |contents_container_|. + // Since the layer for |view| is opaque, we have to recreate that base color + // here. (The detached background color may be partially transparent.) canvas->DrawColor( - tp.GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND)); + tp->GetColor(ThemeProperties::COLOR_CONTROL_BACKGROUND)); + canvas->DrawColor( + tp->GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND)); + // Draw the separators above and below bookmark bar; // if animating, these are fading in/out. SkColor separator_color = - tp.GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR); + tp->GetColor(ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR); if (ui::MaterialDesignController::IsModeMaterial()) { BrowserView::Paint1pxHorizontalLine( @@ -262,8 +262,7 @@ const ui::ThemeProvider* theme_provider, const gfx::Rect& bounds, const gfx::Point& background_origin) { - canvas->FillRect(bounds, - theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR)); + canvas->DrawColor(theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR)); // Always tile the background image in pre-MD. In MD, only tile if there's a // non-default image. @@ -439,7 +438,7 @@ // While animating, set opacity to cross-fade between attached and detached // backgrounds including their respective separators. canvas->SaveLayerAlpha(detached_alpha); - PaintDetachedBookmarkBar(canvas, bookmark_bar_view_, browser_->profile()); + PaintDetachedBookmarkBar(canvas, bookmark_bar_view_); canvas->Restore(); }
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc index fc23d2e..f1a33e4 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc +++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -273,7 +273,7 @@ web_contents, parent_->profile()), web_contents, this, views::BubbleBorder::TOP_RIGHT); views::Widget* bubble_widget = - parent_->delegate()->CreateViewsBubble(bubble_view_); + views::BubbleDialogDelegateView::CreateBubble(bubble_view_); bubble_widget->AddObserver(this); // This is triggered by an input event. If the user clicks the icon while // it's not animating, the icon will be placed in an active state, so the
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.h b/chrome/browser/ui/views/location_bar/content_setting_image_view.h index 3f311c5..620e616 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_image_view.h +++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.h
@@ -28,7 +28,7 @@ } namespace views { -class BubbleDelegateView; +class BubbleDialogDelegateView; class ImageView; class InkDropDelegate; class Label; @@ -95,7 +95,7 @@ gfx::SlideAnimation slide_animator_; bool pause_animation_; double pause_animation_state_; - views::BubbleDelegateView* bubble_view_; + views::BubbleDialogDelegateView* bubble_view_; // This is used to check if the bubble was showing during the mouse pressed // event. If this is true then the mouse released event is ignored to prevent
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h index 6192f60..1d08b95 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -54,7 +54,6 @@ } namespace views { -class BubbleDelegateView; class Label; class Widget; } @@ -85,10 +84,6 @@ virtual ToolbarModel* GetToolbarModel() = 0; virtual const ToolbarModel* GetToolbarModel() const = 0; - // Creates Widget for the given delegate. - virtual views::Widget* CreateViewsBubble( - views::BubbleDelegateView* bubble_delegate) = 0; - // Creates PageActionImageView. Caller gets an ownership. virtual PageActionImageView* CreatePageActionImageView( LocationBarView* owner,
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc index 32fab33b..d0dc53f 100644 --- a/chrome/browser/ui/views/network_profile_bubble_view.cc +++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/views/network_profile_bubble_view.h" - +#include "base/macros.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/layout_constants.h" @@ -17,40 +16,42 @@ #include "components/prefs/pref_service.h" #include "grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/views/controls/button/label_button.h" +#include "ui/views/bubble/bubble_dialog_delegate.h" #include "ui/views/controls/label.h" #include "ui/views/controls/link.h" -#include "ui/views/layout/grid_layout.h" +#include "ui/views/controls/link_listener.h" +#include "ui/views/layout/fill_layout.h" #include "ui/views/layout/layout_constants.h" namespace { // Bubble layout constants. -const int kInset = 2; const int kNotificationBubbleWidth = 250; -} // namespace +class NetworkProfileBubbleView : public views::BubbleDialogDelegateView, + public views::LinkListener { + public: + NetworkProfileBubbleView(views::View* anchor, + content::PageNavigator* navigator, + Profile* profile); + private: + ~NetworkProfileBubbleView() override; -// static -void NetworkProfileBubble::ShowNotification(Browser* browser) { - views::View* anchor = NULL; - BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); - if (browser_view && browser_view->GetToolbarView()) - anchor = browser_view->GetToolbarView()->app_menu_button(); - NetworkProfileBubbleView* bubble = - new NetworkProfileBubbleView(anchor, browser, browser->profile()); - views::BubbleDelegateView::CreateBubble(bubble)->Show(); - NetworkProfileBubble::SetNotificationShown(true); + // views::BubbleDialogDelegateView: + void Init() override; + views::View* CreateExtraView() override; + int GetDialogButtons() const override; + bool Accept() override; - // Mark the time of the last bubble and reduce the number of warnings left - // before the next silence period starts. - PrefService* prefs = browser->profile()->GetPrefs(); - prefs->SetInt64(prefs::kNetworkProfileLastWarningTime, - base::Time::Now().ToTimeT()); - int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); - if (left_warnings > 0) - prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, --left_warnings); -} + // views::LinkListener: + void LinkClicked(views::Link* source, int event_flags) override; + + // Used for loading pages. + content::PageNavigator* navigator_; + Profile* profile_; + + DISALLOW_COPY_AND_ASSIGN(NetworkProfileBubbleView); +}; //////////////////////////////////////////////////////////////////////////////// // NetworkProfileBubbleView, public: @@ -59,7 +60,7 @@ views::View* anchor, content::PageNavigator* navigator, Profile* profile) - : BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), + : BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), navigator_(navigator), profile_(profile) { // Compensate for built-in vertical padding in the anchor view's image. @@ -74,51 +75,31 @@ } void NetworkProfileBubbleView::Init() { - views::GridLayout* layout = views::GridLayout::CreatePanel(this); - layout->SetInsets(0, kInset, kInset, kInset); - SetLayoutManager(layout); - - views::ColumnSet* columns = layout->AddColumnSet(0); - columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::LEADING, 0, - views::GridLayout::USE_PREF, 0, 0); - - layout->StartRow(0, 0); - - views::Label* title = new views::Label( + SetLayoutManager(new views::FillLayout()); + views::Label* label = new views::Label( l10n_util::GetStringFUTF16(IDS_PROFILE_ON_NETWORK_WARNING, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); - title->SetMultiLine(true); - title->SizeToFit(kNotificationBubbleWidth); - title->SetHorizontalAlignment(gfx::ALIGN_LEFT); - layout->AddView(title); + label->SetMultiLine(true); + label->SizeToFit(kNotificationBubbleWidth); + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); + AddChildView(label); +} - views::ColumnSet* bottom_columns = layout->AddColumnSet(1); - bottom_columns->AddColumn(views::GridLayout::CENTER, - views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); - bottom_columns->AddPaddingColumn(1, 0); - bottom_columns->AddColumn(views::GridLayout::CENTER, - views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); - layout->StartRowWithPadding(0, 1, 0, - views::kRelatedControlSmallVerticalSpacing); - +views::View* NetworkProfileBubbleView::CreateExtraView() { views::Link* learn_more = new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); learn_more->set_listener(this); - layout->AddView(learn_more); - - views::LabelButton* ok_button = new views::LabelButton( - this, l10n_util::GetStringUTF16(IDS_OK)); - ok_button->SetStyle(views::Button::STYLE_BUTTON); - ok_button->SetIsDefault(true); - layout->AddView(ok_button); + return learn_more; } -void NetworkProfileBubbleView::ButtonPressed(views::Button* sender, - const ui::Event& event) { +int NetworkProfileBubbleView::GetDialogButtons() const { + return ui::DIALOG_BUTTON_OK; +} + +bool NetworkProfileBubbleView::Accept() { NetworkProfileBubble::RecordUmaEvent( NetworkProfileBubble::METRIC_ACKNOWLEDGED); - - GetWidget()->Close(); + return true; } void NetworkProfileBubbleView::LinkClicked(views::Link* source, @@ -142,3 +123,27 @@ prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, ++left_warnings); GetWidget()->Close(); } + +} // namespace + +// static +void NetworkProfileBubble::ShowNotification(Browser* browser) { + views::View* anchor = NULL; + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); + if (browser_view && browser_view->GetToolbarView()) + anchor = browser_view->GetToolbarView()->app_menu_button(); + NetworkProfileBubbleView* bubble = + new NetworkProfileBubbleView(anchor, browser, browser->profile()); + views::BubbleDialogDelegateView::CreateBubble(bubble)->Show(); + + NetworkProfileBubble::SetNotificationShown(true); + + // Mark the time of the last bubble and reduce the number of warnings left + // before the next silence period starts. + PrefService* prefs = browser->profile()->GetPrefs(); + prefs->SetInt64(prefs::kNetworkProfileLastWarningTime, + base::Time::Now().ToTimeT()); + int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); + if (left_warnings > 0) + prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, --left_warnings); +}
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.h b/chrome/browser/ui/views/network_profile_bubble_view.h deleted file mode 100644 index c349c12e..0000000 --- a/chrome/browser/ui/views/network_profile_bubble_view.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_NETWORK_PROFILE_BUBBLE_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_NETWORK_PROFILE_BUBBLE_VIEW_H_ - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "ui/views/bubble/bubble_delegate.h" -#include "ui/views/controls/button/button.h" -#include "ui/views/controls/link_listener.h" - -class Profile; - -namespace content { -class PageNavigator; -} - -class NetworkProfileBubbleView : public views::BubbleDelegateView, - public views::ButtonListener, - public views::LinkListener { - public: - NetworkProfileBubbleView(views::View* anchor, - content::PageNavigator* navigator, - Profile* profile); - private: - ~NetworkProfileBubbleView() override; - - // views::BubbleDelegateView: - void Init() override; - - // views::ButtonListener: - void ButtonPressed(views::Button* sender, const ui::Event& event) override; - - // views::LinkListener: - void LinkClicked(views::Link* source, int event_flags) override; - - // Used for loading pages. - content::PageNavigator* navigator_; - Profile* profile_; - - DISALLOW_COPY_AND_ASSIGN(NetworkProfileBubbleView); -}; - -#endif // CHROME_BROWSER_UI_VIEWS_NETWORK_PROFILE_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index d632c9d..c2a1345 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -399,11 +399,6 @@ chrome::ShowWebsiteSettings(browser_, web_contents, url, security_info); } -views::Widget* ToolbarView::CreateViewsBubble( - views::BubbleDelegateView* bubble_delegate) { - return views::BubbleDelegateView::CreateBubble(bubble_delegate); -} - PageActionImageView* ToolbarView::CreatePageActionImageView( LocationBarView* owner, ExtensionAction* action) { return new PageActionImageView(owner, action, browser_);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h index c776828..2bffd23 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -112,8 +112,6 @@ content::WebContents* GetWebContents() override; ToolbarModel* GetToolbarModel() override; const ToolbarModel* GetToolbarModel() const override; - views::Widget* CreateViewsBubble( - views::BubbleDelegateView* bubble_delegate) override; PageActionImageView* CreatePageActionImageView( LocationBarView* owner, ExtensionAction* action) override;
diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc index 95970ab..7638ae8 100644 --- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc +++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc
@@ -32,8 +32,6 @@ #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/checkbox.h" -#include "ui/views/controls/button/label_button.h" -#include "ui/views/controls/button/label_button_border.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/button/menu_button_listener.h" #include "ui/views/controls/combobox/combobox.h" @@ -49,9 +47,6 @@ // Spacing between major items should be 9px. const int kItemMajorSpacing = 9; -// Button border size, draws inside the spacing distance. -const int kButtonBorderSize = 2; - // (Square) pixel size of icon. const int kIconSize = 18; @@ -147,32 +142,33 @@ /////////////////////////////////////////////////////////////////////////////// // View implementation for the permissions bubble. -class PermissionsBubbleDelegateView : public views::BubbleDelegateView, - public views::ButtonListener, - public PermissionCombobox::Listener { +class PermissionsBubbleDialogDelegateView + : public views::BubbleDialogDelegateView, + public PermissionCombobox::Listener { public: - PermissionsBubbleDelegateView( + PermissionsBubbleDialogDelegateView( views::View* anchor_view, views::BubbleBorder::Arrow anchor_arrow, PermissionBubbleViewViews* owner, const std::vector<PermissionBubbleRequest*>& requests, const std::vector<bool>& accept_state); - ~PermissionsBubbleDelegateView() override; + ~PermissionsBubbleDialogDelegateView() override; - void Close(); + void CloseBubble(); void SizeToContents(); - // BubbleDelegateView: + // BubbleDialogDelegateView: bool ShouldShowCloseButton() const override; - bool ShouldShowWindowTitle() const override; const gfx::FontList& GetTitleFontList() const override; base::string16 GetWindowTitle() const override; void OnWidgetDestroying(views::Widget* widget) override; gfx::Size GetPreferredSize() const override; void GetAccessibleState(ui::AXViewState* state) override; - - // ButtonListener: - void ButtonPressed(views::Button* button, const ui::Event& event) override; + bool Cancel() override; + bool Accept() override; + bool Close() override; + int GetDialogButtons() const override; + base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; // PermissionCombobox::Listener: void PermissionSelectionChanged(int index, bool allowed) override; @@ -184,28 +180,25 @@ private: PermissionBubbleViewViews* owner_; - views::Button* allow_; - views::Button* deny_; + bool multiple_requests_; base::string16 display_origin_; scoped_ptr<PermissionMenuModel> menu_button_model_; std::vector<PermissionCombobox*> customize_comboboxes_; - DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDelegateView); + DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDialogDelegateView); }; -PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( +PermissionsBubbleDialogDelegateView::PermissionsBubbleDialogDelegateView( views::View* anchor_view, views::BubbleBorder::Arrow anchor_arrow, PermissionBubbleViewViews* owner, const std::vector<PermissionBubbleRequest*>& requests, const std::vector<bool>& accept_state) - : views::BubbleDelegateView(anchor_view, anchor_arrow), + : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), owner_(owner), - allow_(nullptr), - deny_(nullptr) { + multiple_requests_(requests.size() > 1) { DCHECK(!requests.empty()); - set_close_on_esc(true); set_close_on_deactivate(false); SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, @@ -263,115 +256,100 @@ AddChildView(row); } - - views::View* button_row = new views::View(); - views::GridLayout* button_layout = new views::GridLayout(button_row); - views::ColumnSet* columns = button_layout->AddColumnSet(0); - button_row->SetLayoutManager(button_layout); - AddChildView(button_row); - - // For multiple permissions: just an "OK" button. - if (requests.size() > 1) { - columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, - 100, views::GridLayout::USE_PREF, 0, 0); - button_layout->StartRowWithPadding(0, 0, 0, 4); - views::LabelButton* ok_button = - new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK)); - ok_button->SetStyle(views::Button::STYLE_BUTTON); - button_layout->AddView(ok_button); - allow_ = ok_button; - return; - } - - // For a single permission: lay out the Deny/Allow buttons. - columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, - 100, views::GridLayout::USE_PREF, 0, 0); - columns->AddPaddingColumn(0, kItemMajorSpacing - (2*kButtonBorderSize)); - columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, - 0, views::GridLayout::USE_PREF, 0, 0); - button_layout->StartRow(0, 0); - - base::string16 allow_text = l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW); - views::LabelButton* allow_button = new views::LabelButton(this, allow_text); - allow_button->SetStyle(views::Button::STYLE_BUTTON); - button_layout->AddView(allow_button); - allow_ = allow_button; - - base::string16 deny_text = l10n_util::GetStringUTF16(IDS_PERMISSION_DENY); - views::LabelButton* deny_button = new views::LabelButton(this, deny_text); - deny_button->SetStyle(views::Button::STYLE_BUTTON); - button_layout->AddView(deny_button); - deny_ = deny_button; } -PermissionsBubbleDelegateView::~PermissionsBubbleDelegateView() { +PermissionsBubbleDialogDelegateView::~PermissionsBubbleDialogDelegateView() { if (owner_) owner_->Closing(); } -void PermissionsBubbleDelegateView::Close() { +void PermissionsBubbleDialogDelegateView::CloseBubble() { owner_ = nullptr; GetWidget()->Close(); } -bool PermissionsBubbleDelegateView::ShouldShowCloseButton() const { +bool PermissionsBubbleDialogDelegateView::ShouldShowCloseButton() const { return true; } -bool PermissionsBubbleDelegateView::ShouldShowWindowTitle() const { - return true; -} - -const gfx::FontList& PermissionsBubbleDelegateView::GetTitleFontList() const { +const gfx::FontList& PermissionsBubbleDialogDelegateView::GetTitleFontList() + const { ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); return rb.GetFontList(ui::ResourceBundle::BaseFont); } -base::string16 PermissionsBubbleDelegateView::GetWindowTitle() const { +base::string16 PermissionsBubbleDialogDelegateView::GetWindowTitle() const { return l10n_util::GetStringFUTF16(IDS_PERMISSIONS_BUBBLE_PROMPT, display_origin_); } -void PermissionsBubbleDelegateView::SizeToContents() { - BubbleDelegateView::SizeToContents(); +void PermissionsBubbleDialogDelegateView::SizeToContents() { + BubbleDialogDelegateView::SizeToContents(); } -void PermissionsBubbleDelegateView::OnWidgetDestroying(views::Widget* widget) { - views::BubbleDelegateView::OnWidgetDestroying(widget); +void PermissionsBubbleDialogDelegateView::OnWidgetDestroying( + views::Widget* widget) { + views::BubbleDialogDelegateView::OnWidgetDestroying(widget); if (owner_) { owner_->Closing(); owner_ = nullptr; } } -gfx::Size PermissionsBubbleDelegateView::GetPreferredSize() const { +gfx::Size PermissionsBubbleDialogDelegateView::GetPreferredSize() const { // TODO(estade): bubbles should default to this width. const int kWidth = 320 - GetInsets().width(); return gfx::Size(kWidth, GetHeightForWidth(kWidth)); } -void PermissionsBubbleDelegateView::GetAccessibleState(ui::AXViewState* state) { - views::BubbleDelegateView::GetAccessibleState(state); +void PermissionsBubbleDialogDelegateView::GetAccessibleState( + ui::AXViewState* state) { + views::BubbleDialogDelegateView::GetAccessibleState(state); state->role = ui::AX_ROLE_ALERT_DIALOG; } -void PermissionsBubbleDelegateView::ButtonPressed(views::Button* button, - const ui::Event& event) { - if (!owner_) - return; - - if (button == allow_) - owner_->Accept(); - else if (button == deny_) - owner_->Deny(); +int PermissionsBubbleDialogDelegateView::GetDialogButtons() const { + int buttons = ui::DIALOG_BUTTON_OK; + if (!multiple_requests_) + buttons |= ui::DIALOG_BUTTON_CANCEL; + return buttons; } -void PermissionsBubbleDelegateView::PermissionSelectionChanged( - int index, bool allowed) { +base::string16 PermissionsBubbleDialogDelegateView::GetDialogButtonLabel( + ui::DialogButton button) const { + if (button == ui::DIALOG_BUTTON_CANCEL) + return l10n_util::GetStringUTF16(IDS_PERMISSION_DENY); + + // The text differs based on whether OK is the only visible button. + return l10n_util::GetStringUTF16(GetDialogButtons() == ui::DIALOG_BUTTON_OK + ? IDS_OK + : IDS_PERMISSION_ALLOW); +} + +bool PermissionsBubbleDialogDelegateView::Cancel() { + if (owner_) + owner_->Deny(); + return true; +} + +bool PermissionsBubbleDialogDelegateView::Accept() { + if (owner_) + owner_->Accept(); + return true; +} + +bool PermissionsBubbleDialogDelegateView::Close() { + // Neither explicit accept nor explicit deny. + return true; +} + +void PermissionsBubbleDialogDelegateView::PermissionSelectionChanged( + int index, + bool allowed) { owner_->Toggle(index, allowed); } -void PermissionsBubbleDelegateView::UpdateAnchor( +void PermissionsBubbleDialogDelegateView::UpdateAnchor( views::View* anchor_view, views::BubbleBorder::Arrow anchor_arrow) { if (GetAnchorView() == anchor_view && arrow() == anchor_arrow) @@ -381,7 +359,7 @@ // Update the border in the bubble: will either add or remove the arrow. views::BubbleFrameView* frame = - views::BubbleDelegateView::GetBubbleFrameView(); + views::BubbleDialogDelegateView::GetBubbleFrameView(); views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; if (base::i18n::IsRTL()) adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); @@ -437,18 +415,17 @@ const std::vector<PermissionBubbleRequest*>& requests, const std::vector<bool>& values) { if (bubble_delegate_) - bubble_delegate_->Close(); + bubble_delegate_->CloseBubble(); - bubble_delegate_ = - new PermissionsBubbleDelegateView(GetAnchorView(), GetAnchorArrow(), this, - requests, values); + bubble_delegate_ = new PermissionsBubbleDialogDelegateView( + GetAnchorView(), GetAnchorArrow(), this, requests, values); // Set |parent_window| because some valid anchors can become hidden. views::Widget* widget = views::Widget::GetWidgetForNativeWindow( browser_->window()->GetNativeWindow()); bubble_delegate_->set_parent_window(widget->GetNativeView()); - views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); + views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show(); bubble_delegate_->SizeToContents(); } @@ -458,7 +435,7 @@ void PermissionBubbleViewViews::Hide() { if (bubble_delegate_) { - bubble_delegate_->Close(); + bubble_delegate_->CloseBubble(); bubble_delegate_ = nullptr; } }
diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h index a9d1836..ccc94de 100644 --- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h +++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h
@@ -17,7 +17,7 @@ } class Browser; -class PermissionsBubbleDelegateView; +class PermissionsBubbleDialogDelegateView; class PermissionBubbleViewViews : public PermissionBubbleView { public: @@ -45,7 +45,7 @@ Browser* browser_; Delegate* delegate_; - PermissionsBubbleDelegateView* bubble_delegate_; + PermissionsBubbleDialogDelegateView* bubble_delegate_; DISALLOW_COPY_AND_ASSIGN(PermissionBubbleViewViews); };
diff --git a/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc index da31e34..45a2d4c 100644 --- a/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/display_options_handler.cc
@@ -10,7 +10,6 @@ #include <string> #include "ash/display/display_configuration_controller.h" -#include "ash/display/display_layout_builder.h" #include "ash/display/display_manager.h" #include "ash/display/resolution_notification_controller.h" #include "ash/display/window_tree_host_manager.h" @@ -29,6 +28,8 @@ #include "content/public/browser/web_ui.h" #include "grit/ash_strings.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/display/manager/display_layout.h" +#include "ui/display/manager/display_layout_builder.h" #include "ui/gfx/display.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size_conversions.h" @@ -339,7 +340,7 @@ js_display->Set("availableColorProfiles", available_color_profiles); if (display_manager->GetNumDisplays() > 1) { - const ash::DisplayPlacement placement = + const display::DisplayPlacement placement = display_manager->GetCurrentDisplayLayout().FindPlacementById( display.id()); if (placement.display_id != gfx::Display::kInvalidDisplayID) { @@ -409,7 +410,8 @@ content::RecordAction(base::UserMetricsAction("Options_DisplayRearrange")); ash::DisplayManager* display_manager = GetDisplayManager(); - ash::DisplayLayoutBuilder builder(display_manager->GetCurrentDisplayLayout()); + display::DisplayLayoutBuilder builder( + display_manager->GetCurrentDisplayLayout()); builder.ClearPlacements(); for (const base::Value* layout : *layouts) { const base::DictionaryValue* dictionary; @@ -435,11 +437,11 @@ builder.AddDisplayPlacement( display_id, parent_id, - static_cast<ash::DisplayPlacement::Position>(position), offset); + static_cast<display::DisplayPlacement::Position>(position), offset); } - scoped_ptr<ash::DisplayLayout> layout = builder.Build(); - if (!ash::DisplayLayout::Validate(display_manager->GetCurrentDisplayIdList(), - *layout)) { + scoped_ptr<display::DisplayLayout> layout = builder.Build(); + if (!display::DisplayLayout::Validate( + display_manager->GetCurrentDisplayIdList(), *layout)) { LOG(ERROR) << "Invalid layout: " << layout->ToString(); return; }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 57ec8ea..f57b988 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1360,8 +1360,8 @@ void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) { // BASE64 encode the job data. - std::string raw_data(reinterpret_cast<const char*>(data->front()), - data->size()); + const base::StringPiece raw_data(reinterpret_cast<const char*>(data->front()), + data->size()); std::string base64_data; base::Base64Encode(raw_data, &base64_data); base::StringValue data_value(base64_data);
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc index 8a957cdb..bb6d8e0 100644 --- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
@@ -72,7 +72,9 @@ void ManageProfileHandler::OnProfileAvatarChanged( const base::FilePath& profile_path) { // This is necessary to send the potentially updated GAIA photo. - SendAvailableIcons(); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("available-icons-changed"), + *GetAvailableIcons()); } void ManageProfileHandler::HandleGetAvailableIcons( @@ -86,11 +88,14 @@ profiles::UpdateGaiaProfileInfoIfNeeded(profile_); - SendAvailableIcons(); + CHECK_EQ(1U, args->GetSize()); + const base::Value* callback_id; + CHECK(args->Get(0, &callback_id)); + ResolveJavascriptCallback(*callback_id, *GetAvailableIcons()); } -void ManageProfileHandler::SendAvailableIcons() { - base::ListValue image_url_list; +scoped_ptr<base::ListValue> ManageProfileHandler::GetAvailableIcons() { + scoped_ptr<base::ListValue> image_url_list(new base::ListValue()); // First add the GAIA picture if it is available. ProfileAttributesEntry* entry; @@ -100,19 +105,17 @@ if (icon) { gfx::Image icon2 = profiles::GetAvatarIconForWebUI(*icon, true); gaia_picture_url_ = webui::GetBitmapDataUrl(icon2.AsBitmap()); - image_url_list.AppendString(gaia_picture_url_); + image_url_list->AppendString(gaia_picture_url_); } } // Next add the default avatar icons and names. for (size_t i = 0; i < profiles::GetDefaultAvatarIconCount(); i++) { std::string url = profiles::GetDefaultAvatarIconUrl(i); - image_url_list.AppendString(url); + image_url_list->AppendString(url); } - web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", - base::StringValue("available-icons-changed"), - image_url_list); + return image_url_list; } void ManageProfileHandler::HandleSetProfileIconAndName(
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h index 548e8c2..af260070 100644 --- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h +++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h
@@ -34,15 +34,16 @@ void OnProfileAvatarChanged(const base::FilePath& profile_path) override; private: - FRIEND_TEST_ALL_PREFIXES(ManageProfileHandlerTest, SetProfileIconAndName); - FRIEND_TEST_ALL_PREFIXES(ManageProfileHandlerTest, GetAvailableIcons); + FRIEND_TEST_ALL_PREFIXES(ManageProfileHandlerTest, + HandleSetProfileIconAndName); + FRIEND_TEST_ALL_PREFIXES(ManageProfileHandlerTest, HandleGetAvailableIcons); // Callback for the "getAvailableIcons" message. // Sends the array of default profile icon URLs and profile names to WebUI. void HandleGetAvailableIcons(const base::ListValue* args); - // Send all the available profile icons to choose from. - void SendAvailableIcons(); + // Get all the available profile icons to choose from. + scoped_ptr<base::ListValue> GetAvailableIcons(); // Callback for the "setProfileIconAndName" message. Sets the name and icon // of a given profile.
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc index 7569be5..d960db2e 100644 --- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
@@ -42,6 +42,19 @@ handler_->set_web_ui(&web_ui_); } + void VerifyIconList(const base::Value* value) { + const base::ListValue* icon_urls = nullptr; + ASSERT_TRUE(value->GetAsList(&icon_urls)); + + // Expect the list of icon URLs to be a non-empty list of non-empty strings. + EXPECT_FALSE(icon_urls->empty()); + for (size_t i = 0; i < icon_urls->GetSize(); ++i) { + std::string icon_url; + EXPECT_TRUE(icon_urls->GetString(i, &icon_url)); + EXPECT_FALSE(icon_url.empty()); + } + } + content::TestWebUI* web_ui() { return &web_ui_; } Profile* profile() const { return profile_; } TestManageProfileHandler* handler() const { return handler_.get(); } @@ -55,7 +68,7 @@ scoped_ptr<TestManageProfileHandler> handler_; }; -TEST_F(ManageProfileHandlerTest, SetProfileIconAndName) { +TEST_F(ManageProfileHandlerTest, HandleSetProfileIconAndName) { base::ListValue list_args; list_args.Append( new base::StringValue("chrome://theme/IDR_PROFILE_AVATAR_15")); @@ -70,28 +83,36 @@ EXPECT_EQ("New Profile Name", pref_service->GetString(prefs::kProfileName)); } -TEST_F(ManageProfileHandlerTest, GetAvailableIcons) { - handler()->HandleGetAvailableIcons(nullptr); +TEST_F(ManageProfileHandlerTest, HandleGetAvailableIcons) { + base::ListValue list_args; + list_args.Append(new base::StringValue("get-icons-callback-id")); + handler()->HandleGetAvailableIcons(&list_args); + + EXPECT_EQ(1U, web_ui()->call_data().size()); + + const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); + EXPECT_EQ("cr.webUIResponse", data.function_name()); + + std::string callback_id; + ASSERT_TRUE(data.arg1()->GetAsString(&callback_id)); + EXPECT_EQ("get-icons-callback-id", callback_id); + + VerifyIconList(data.arg3()); +} + +TEST_F(ManageProfileHandlerTest, ProfileAvatarChangedWebUIEvent) { + handler()->OnProfileAvatarChanged(base::FilePath()); EXPECT_EQ(1U, web_ui()->call_data().size()); const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); EXPECT_EQ("cr.webUIListenerCallback", data.function_name()); - std::string callback_id; - ASSERT_TRUE(data.arg1()->GetAsString(&callback_id)); - EXPECT_EQ("available-icons-changed", callback_id); + std::string event_id; + ASSERT_TRUE(data.arg1()->GetAsString(&event_id)); + EXPECT_EQ("available-icons-changed", event_id); - const base::ListValue* icon_urls = nullptr; - ASSERT_TRUE(data.arg2()->GetAsList(&icon_urls)); - - // Expect the list of icon URLs to be a non-empty list of non-empty strings. - EXPECT_FALSE(icon_urls->empty()); - for (size_t i = 0; i < icon_urls->GetSize(); ++i) { - std::string icon_url; - EXPECT_TRUE(icon_urls->GetString(i, &icon_url)); - EXPECT_FALSE(icon_url.empty()); - } + VerifyIconList(data.arg2()); } } // namespace settings
diff --git a/chrome/cdb.isolate b/chrome/cdb.isolate new file mode 100644 index 0000000..0b2f14a --- /dev/null +++ b/chrome/cdb.isolate
@@ -0,0 +1,14 @@ +# Copyright (c) 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +{ + 'conditions': [ + ['OS=="win"', { + 'variables': { + 'files': [ + '<(PRODUCT_DIR)/cdb/', + ], + }, + }], + ], +}
diff --git a/chrome/chrome.isolate b/chrome/chrome.isolate index 7bfbc62d..429aa47 100644 --- a/chrome/chrome.isolate +++ b/chrome/chrome.isolate
@@ -46,6 +46,13 @@ ], }, }], + ['OS=="win" and (fastbuild==0 or fastbuild==1)', { + 'variables': { + 'files': [ + '<(PRODUCT_DIR)/chrome<(EXECUTABLE_SUFFIX).pdb', + ], + }, + }], ['disable_nacl==0 and (OS=="win" or (OS=="linux" and target_arch=="x64"))', { 'variables': { 'files': [ @@ -114,6 +121,13 @@ ], }, }], + ['OS=="win" and component=="static_library" and (fastbuild==0 or fastbuild==1)', { + 'variables': { + 'files': [ + '<(PRODUCT_DIR)/chrome_child.dll.pdb', + ], + }, + }], ['OS=="win" and kasko==1', { 'variables': { 'files': [ @@ -121,13 +135,6 @@ ], }, }], - ['OS=="win" and (fastbuild==0 or fastbuild==1)', { - 'variables': { - 'files': [ - '<(PRODUCT_DIR)/chrome.exe.pdb', - ], - }, - }], ['OS=="win" and component=="shared_library" and (fastbuild==0 or fastbuild==1)', { 'variables': { 'files': [
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index ec73df5..fd92749c 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -168,6 +168,8 @@ 'browser/component_updater/pnacl_component_installer.h', 'browser/component_updater/recovery_component_installer.cc', 'browser/component_updater/recovery_component_installer.h', + 'browser/component_updater/sth_set_component_installer.cc', + 'browser/component_updater/sth_set_component_installer.h', 'browser/component_updater/supervised_user_whitelist_installer.cc', 'browser/component_updater/supervised_user_whitelist_installer.h', 'browser/component_updater/sw_reporter_installer_win.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index a727eda..40b5ec3 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -745,6 +745,8 @@ 'browser/ui/ash/launcher/arc_app_window_launcher_controller.h', 'browser/ui/ash/launcher/arc_app_window_launcher_item_controller.cc', 'browser/ui/ash/launcher/arc_app_window_launcher_item_controller.h', + 'browser/ui/ash/launcher/arc_launcher_context_menu.cc', + 'browser/ui/ash/launcher/arc_launcher_context_menu.h', 'browser/ui/ash/launcher/launcher_arc_app_updater.cc', 'browser/ui/ash/launcher/launcher_arc_app_updater.h', ], @@ -2591,7 +2593,6 @@ 'browser/ui/views/frame/glass_browser_frame_view.h', 'browser/ui/views/frame/native_browser_frame_factory_aurawin.cc', 'browser/ui/views/network_profile_bubble_view.cc', - 'browser/ui/views/network_profile_bubble_view.h', 'browser/ui/views/uninstall_view.cc', 'browser/ui/views/uninstall_view.h', 'browser/ui/webui/conflicts_ui.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 4bed869..d29a158 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi
@@ -1014,6 +1014,7 @@ 'test/data/webui/settings/settings_page_browsertest.js', 'test/data/webui/settings/settings_passwords_section_browsertest.js', 'test/data/webui/settings/settings_subpage_browsertest.js', + 'test/data/webui/text_defaults_browsertest.js', 'test/data/webui/webui_resource_async_browsertest.js', ], # TODO(rockot) bug 505926: These should be moved to a target in @@ -3265,6 +3266,12 @@ '../third_party/crashpad/crashpad/tools/tools.gyp:crashpad_database_util', ], }], + ['OS=="win"', { + 'dependencies': [ + # TODO(kbr): port this dependency to GN. + 'copy_cdb_to_output', + ], + }], ], }, { @@ -3421,6 +3428,34 @@ }, ], 'conditions': [ + ['OS=="win"', { + 'targets': [ + { + # TODO(kbr): port this target to GN. + 'target_name': 'copy_cdb_to_output', + 'type': 'none', + 'actions': [ + { + 'action_name': 'copy_cdb', + 'inputs': [ + '<(DEPTH)/build/win/copy_cdb_to_output.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/cdb/cdb.exe', + '<(PRODUCT_DIR)/cdb/dbgeng.dll', + '<(PRODUCT_DIR)/cdb/dbghelp.dll', + '<(PRODUCT_DIR)/cdb/dbgmodel.dll', + ], + 'action': ['python', + '<(DEPTH)/build/win/copy_cdb_to_output.py', + '<(PRODUCT_DIR)/cdb', + '<(target_arch)'], + 'message': 'Copying cdb and deps to <(PRODUCT_DIR)/cdb', + }, + ], + }, + ], + }], ['archive_gpu_tests==1', { 'targets': [ {
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 096dc8d..084c7e8 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -66,6 +66,7 @@ 'browser/command_updater_unittest.cc', 'browser/component_updater/chrome_component_updater_configurator_unittest.cc', 'browser/component_updater/cld_component_installer_unittest.cc', + 'browser/component_updater/sth_set_component_installer_unittest.cc', 'browser/component_updater/supervised_user_whitelist_installer_unittest.cc', 'browser/content_settings/content_settings_default_provider_unittest.cc', 'browser/content_settings/content_settings_mock_observer.cc',
diff --git a/chrome/common/extensions/api/wallpaper_private.json b/chrome/common/extensions/api/wallpaper_private.json index 5e8c27a..56b22d8 100644 --- a/chrome/common/extensions/api/wallpaper_private.json +++ b/chrome/common/extensions/api/wallpaper_private.json
@@ -13,7 +13,7 @@ { "id": "WallpaperSource", "type": "string", - "enum": [ "ONLINE", "OEM" ] + "enum": [ "ONLINE", "OEM", "DAILY", "CUSTOM" ] } ], "functions": [ @@ -254,6 +254,18 @@ ] } ] + }, + { + "name": "recordWallpaperUMA", + "type": "function", + "description": "Record wallpaper UMA when a new wallpaper is set, either by Wallpaper Picker App, or by a third party App.", + "nodoc": "true", + "parameters": [ + { + "name": "source", + "$ref": "WallpaperSource" + } + ] } ], "events": [
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/display.html b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/display.html new file mode 100644 index 0000000..2dfdc4f3 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/display.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> + <head> + <title>Display Screenshot</title> + <style type="text/css"> +body { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg=='); + margin: 0; +} + </style> + </head> + <body> + </body> +</html>
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/main.js b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/main.js new file mode 100644 index 0000000..91816208 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/main.js
@@ -0,0 +1,12 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +chrome.app.runtime.onLaunched.addListener(function() { + chrome.app.window.create('test.html', { + innerBounds: { + 'width': 1280, + 'height': 800 + } + }); +});
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/manifest.json b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/manifest.json new file mode 100644 index 0000000..6b27ec4 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/manifest.json
@@ -0,0 +1,22 @@ +{ + "manifest_version": 2, + "name": "Webview transparency", + "description": "Sample of the webview.captureVisibleRegion api", + "version": "1", + "app": { + "background": { + "scripts": ["main.js"] + } + }, + "permissions": [ + "webview" + ], + "webview": { + "partitions": [ + { + "name": "partition", + "accessible_resources": [ "test2.html" ] + } + ] + } +}
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.html b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.html new file mode 100644 index 0000000..b5d498048 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> + <head> + <script src="test.js"></script> +<style type="text/css"> +.ib { + position: relative; + display: inline-block; +} +.controls { + margin: 4px; + position: absolute; + right: 0px; + top: 0px; +} +</style> + </head> + <body bgColor='teal'> + <br> + <button id="add_wv">Add webview</button> + <button id="delete_wv">Delete webview</button> + <span><input type="checkbox" id="transparent" checked="checked"><label for="transparent">Transparent</label></span> + <br> + </body> +</html>
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.js b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.js new file mode 100644 index 0000000..c5a92c9 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test.js
@@ -0,0 +1,95 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +document.addEventListener('DOMContentLoaded', function() { + + var deleteNode = function(node) { + node.parentNode.removeChild(node); + }; + + var deleteAWebview = function() { + deleteNode(document.querySelector('.ib')); + }; + + var findContainer = function(node) { + var container = node; + while (container && !container.classList.contains('ib')) { + container = container.parentElement; + } + return container; + }; + + var handleDelete = function(event) { + var container = findContainer(event.target); + if (container) { + deleteNode(container); + } + }; + + var viewScreenshot = function(wv) { + return function(data) { + chrome.app.window.create('display.html', { + innerBounds: { width: wv.clientWidth, height: wv.clientHeight } + }, + function(aw) { + var d = aw.contentWindow.document; + d.addEventListener('DOMContentLoaded', function() { + var img = d.createElement('img'); + img.src = data; + d.body.appendChild(img); + }); + }); + }; + }; + + var handleScreenshot = function(event) { + var container = findContainer(event.target); + var wv = container.querySelector('webview'); + wv.captureVisibleRegion({format:'png'}, viewScreenshot(wv)); + }; + + var getControls = (function() { + var controls = document.createElement('div'); + controls.className = 'controls'; + controls.innerHTML = '<button id="screenshot">Screenshot</button>' + + '<button id="delete">Delete webview</button>'; + + return function() { + var c = controls.cloneNode(true); + c.querySelector('#delete').addEventListener('click', handleDelete); + c.querySelector('#screenshot'). + addEventListener('click', handleScreenshot); + return c; + }; + })(); + + var createWebview = (function(){ + var id = 0; + return function() { + var wv = document.createElement('webview'); + wv.partition = "partition"; + wv.src = 'test2.html'; + wv.allowtransparency = document.getElementById('transparent').checked; + wv.style.width = "640px"; + wv.style.height = "480px"; + + var container = document.createElement('div'); + container.id = 'wvid0' + id; + id++; + + container.className = 'ib'; + + container.appendChild(wv); + container.appendChild(getControls()); + return container; + }; + })(); + + document.getElementById('delete_wv'). + addEventListener('click', deleteAWebview); + document.getElementById('add_wv'). + addEventListener('click', function() { + document.body.appendChild(createWebview()); + }); +});
diff --git a/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test2.html b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test2.html new file mode 100644 index 0000000..6d31d82 --- /dev/null +++ b/chrome/common/extensions/docs/examples/api/webview/capturevisibleregion/test2.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> + <head></head> + <body> + Hello world! + + <button id="newwindow" onclick="window.open('http://www.google.com/');">newwindow</button> + </body> +</html>
diff --git a/chrome/test/base/chrome_unit_test_suite.cc b/chrome/test/base/chrome_unit_test_suite.cc index 5942f49..cc735ba 100644 --- a/chrome/test/base/chrome_unit_test_suite.cc +++ b/chrome/test/base/chrome_unit_test_suite.cc
@@ -61,6 +61,20 @@ content_client_.reset(); content::SetContentClient(NULL); + // AsyncPolicyProvider is a lazily created KeyedService that may need to be + // shut down here. However, AsyncPolicyProvider::Shutdown() will want to + // post tasks to delete its policy loaders. This goes through + // BrowserThreadTaskRunner::PostNonNestableDelayedTask(), which can invoke + // LazyInstance<BrowserThreadGlobals>::Get() and try to create it for the + // first time. It might be created during the test, but it might not (see + // comments in TestingBrowserProcess::browser_policy_connector()). Since + // creating BrowserThreadGlobals requires creating a SequencedWorkerPool, + // and that needs a MessageLoop, make sure there is one here so that tests + // don't get obscure errors. Tests can also invoke TestingBrowserProcess:: + // DeleteInstance() themselves (after ensuring any TestingProfile instances + // are deleted). But they shouldn't have to worry about that. + DCHECK(!base::MessageLoop::current()); + base::MessageLoopForUI message_loop; TestingBrowserProcess::DeleteInstance(); }
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc index 35dbb7b3..3e5b7288 100644 --- a/chrome/test/base/testing_browser_process.cc +++ b/chrome/test/base/testing_browser_process.cc
@@ -150,6 +150,13 @@ EXPECT_FALSE(created_browser_policy_connector_); created_browser_policy_connector_ = true; browser_policy_connector_ = platform_part_->CreateBrowserPolicyConnector(); + + // Note: creating the ChromeBrowserPolicyConnector invokes BrowserThread:: + // GetMessageLoopProxyForThread(), which initializes a base::LazyInstance of + // BrowserThreadTaskRunners. However, the threads that these task runners + // would run tasks on are *also* created lazily and might not exist yet. + // Creating them requires a MessageLoop, which a test can optionally create + // and manage itself, so don't do it here. } return browser_policy_connector_.get(); }
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc index 9d254cb4..e759d74 100644 --- a/chrome/test/base/testing_profile.cc +++ b/chrome/test/base/testing_profile.cc
@@ -796,13 +796,6 @@ return GetDefaultStoragePartition(this)->GetURLRequestContext(); } -net::URLRequestContextGetter* TestingProfile::CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return new net::TestURLRequestContextGetter( - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); -} - net::URLRequestContextGetter* TestingProfile::GetMediaRequestContext() { return NULL; } @@ -832,17 +825,6 @@ return GetRequestContext()->GetURLRequestContext()->ssl_config_service(); } -net::URLRequestContextGetter* -TestingProfile::CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - // We don't test storage partitions here yet, so returning the same dummy - // context is sufficient for now. - return GetRequestContext(); -} - content::ResourceContext* TestingProfile::GetResourceContext() { if (!resource_context_) resource_context_ = new content::MockResourceContext(); @@ -948,6 +930,24 @@ return nullptr; } +net::URLRequestContextGetter* TestingProfile::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return new net::TestURLRequestContextGetter( + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); +} + +net::URLRequestContextGetter* +TestingProfile::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + // We don't test storage partitions here yet, so returning the same dummy + // context is sufficient for now. + return GetRequestContext(); +} + bool TestingProfile::WasCreatedByVersionOrLater(const std::string& version) { return true; }
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h index daab7ac..f42fb81 100644 --- a/chrome/test/base/testing_profile.h +++ b/chrome/test/base/testing_profile.h
@@ -223,9 +223,6 @@ bool IsOffTheRecord() const override; content::DownloadManagerDelegate* GetDownloadManagerDelegate() override; net::URLRequestContextGetter* GetRequestContext() override; - net::URLRequestContextGetter* CreateRequestContext( - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; content::ResourceContext* GetResourceContext() override; content::BrowserPluginGuestManager* GetGuestManager() override; storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; @@ -233,6 +230,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; TestingProfile* AsTestingProfile() override; @@ -285,11 +290,6 @@ net::URLRequestContextGetter* GetMediaRequestContextForStoragePartition( const base::FilePath& partition_path, bool in_memory) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - const base::FilePath& partition_path, - bool in_memory, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; net::SSLConfigService* GetSSLConfigService() override; void set_last_session_exited_cleanly(bool value) { last_session_exited_cleanly_ = value;
diff --git a/chrome/test/base/web_ui_browser_test.cc b/chrome/test/base/web_ui_browser_test.cc index d3498f14..a356b9f3 100644 --- a/chrome/test/base/web_ui_browser_test.cc +++ b/chrome/test/base/web_ui_browser_test.cc
@@ -32,6 +32,7 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_message_handler.h" +#include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "net/base/filename_util.h" @@ -384,6 +385,8 @@ test_factory_->AddFactoryOverride(GURL(kDummyURL).host(), mock_provider_.Pointer()); + test_factory_->AddFactoryOverride(content::kChromeUIResourcesHost, + mock_provider_.Pointer()); } void WebUIBrowserTest::TearDownOnMainThread() {
diff --git a/chrome/test/chromedriver/chrome/browser_info.cc b/chrome/test/chromedriver/chrome/browser_info.cc index d70f82b..37340ae 100644 --- a/chrome/test/chromedriver/chrome/browser_info.cc +++ b/chrome/test/chromedriver/chrome/browser_info.cc
@@ -20,21 +20,21 @@ } // namespace BrowserInfo::BrowserInfo() - : browser_name(std::string()), - browser_version(std::string()), - major_version(0), + : major_version(0), build_no(kToTBuildNo), blink_revision(kToTBlinkRevision), is_android(false) { } -BrowserInfo::BrowserInfo(std::string browser_name, +BrowserInfo::BrowserInfo(std::string android_package, + std::string browser_name, std::string browser_version, int major_version, int build_no, int blink_revision, bool is_android) - : browser_name(browser_name), + : android_package(android_package), + browser_name(browser_name), browser_version(browser_version), major_version(major_version), build_no(build_no), @@ -52,6 +52,11 @@ return Status(kUnknownError, "version info not a dictionary"); bool has_android_package = dict->HasKey("Android-Package"); + if (has_android_package) { + if (!dict->GetString("Android-Package", &browser_info->android_package)) + return Status(kUnknownError, "'Android-Package' is not a string"); + } + std::string browser_string; if (!dict->GetString("Browser", &browser_string)) return Status(kUnknownError, "version doesn't include 'Browser'");
diff --git a/chrome/test/chromedriver/chrome/browser_info.h b/chrome/test/chromedriver/chrome/browser_info.h index f97215c4..abb9b3e 100644 --- a/chrome/test/chromedriver/chrome/browser_info.h +++ b/chrome/test/chromedriver/chrome/browser_info.h
@@ -17,13 +17,15 @@ struct BrowserInfo { BrowserInfo(); - BrowserInfo(std::string browser_name_, + BrowserInfo(std::string android_package_, + std::string browser_name_, std::string browser_version_, int major_version_, int build_no_, int blink_revision_, bool is_android_); + std::string android_package; std::string browser_name; std::string browser_version; int major_version;
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc index ce29f03..a8c6cc5 100644 --- a/chrome/test/chromedriver/chrome_launcher.cc +++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -495,6 +495,14 @@ return status; } + std::string package = devtools_http_client->browser_info()->android_package; + if (package != capabilities.android_package) { + device->TearDown(); + return Status( + kSessionNotCreatedException, + base::StringPrintf("please close %s and try again", package.c_str())); + } + scoped_ptr<DevToolsClient> devtools_websocket_client; status = CreateBrowserwideDevToolsClientAndConnect( NetAddress(port), capabilities.perf_logging_prefs, socket_factory,
diff --git a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js index eb9640e..61da30a5 100644 --- a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js +++ b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js
@@ -204,6 +204,7 @@ switch (key) { case Constants.AccessLocalSurpriseMeEnabledKey: items[Constants.AccessLocalSurpriseMeEnabledKey] = true; + break; case Constants.AccessLocalWallpaperInfoKey: if (TestConstants.isPowerwashed) { items[Constants.AccessLocalWallpaperInfoKey] = null; @@ -214,6 +215,18 @@ 'source': Constants.WallpaperSourceEnum.Custom }; } + break; + case Constants.AccessLocalManifestKey: + items[Constants.AccessLocalManifestKey] = { + 'wallpaper_list': [ + { + 'available_for_surprise_me': true, + 'base_url': 'dummy', + 'default_layout': 'dummy' + } + ] + }; + break; } callback(items); }, @@ -226,9 +239,11 @@ switch (key) { case Constants.AccessSyncSurpriseMeEnabledKey: items[Constants.AccessSyncSurpriseMeEnabledKey] = true; + break; case Constants.AccessLastSurpriseWallpaperChangedDate: items[Constants.AccessLastSurpriseWallpaperChangedDate] = new Date().toDateString(); + break; } callback(items); },
diff --git a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js index 0ab021a..c79515a 100644 --- a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js +++ b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js
@@ -5,12 +5,6 @@ var mockController; -WallpaperUtil.enabledSyncThemesCallback = function(callback) { - chrome.wallpaperPrivate.getSyncSetting(function(setting) { - callback(setting.syncThemes); - }); -}; - function setUp() { mockController = new MockController(); installMockXMLHttpRequest(); @@ -125,3 +119,20 @@ chrome.storage.onChanged.dispatch(changes); } + +// Test the surprise wallpaper's UMA stats is recorded correctly. +function testSurpriseWallpaper() { + var mockSetWallpaperIfExists = mockController.createFunctionMock( + chrome.wallpaperPrivate, 'setWallpaperIfExists'); + mockSetWallpaperIfExists.addExpectation( + 'dummy_high_resolution.jpg', + 'dummy'); + mockSetWallpaperIfExists.callbackData = [true]; + + var mockRecordWallpaperUMA = mockController.createFunctionMock( + chrome.wallpaperPrivate, 'recordWallpaperUMA'); + mockRecordWallpaperUMA.addExpectation(Constants.WallpaperSourceEnum.Daily); + + var dateString = new Date().toDateString(); + SurpriseWallpaper.getInstance().setRandomWallpaper_(dateString); +}
diff --git a/chrome/test/data/extensions/api_test/wallpaper/test.js b/chrome/test/data/extensions/api_test/wallpaper/test.js index 827ceab..9302d1bb 100644 --- a/chrome/test/data/extensions/api_test/wallpaper/test.js +++ b/chrome/test/data/extensions/api_test/wallpaper/test.js
@@ -96,8 +96,11 @@ expectError); }, function newRequestCancelPreviousRequest() { - // The first request should be canceled. - testSetWallpaperFromURL('test.png', + // The first request should be canceled. The wallpaper in the first + // request is chosen from one of the high-resolution built-in wallpapers + // to make sure the first setWallpaper request hasn't finished yet when + // the second request sends out. + testSetWallpaperFromURL('test_image_high_resolution.jpg', false, 'Set wallpaper was canceled.'); testSetWallpaperFromURL('test.jpg', true);
diff --git a/chrome/test/data/extensions/api_test/wallpaper/test_image_high_resolution.jpg b/chrome/test/data/extensions/api_test/wallpaper/test_image_high_resolution.jpg new file mode 100644 index 0000000..8abc2d60 --- /dev/null +++ b/chrome/test/data/extensions/api_test/wallpaper/test_image_high_resolution.jpg Binary files differ
diff --git a/chrome/test/data/webui/text_defaults_browsertest.js b/chrome/test/data/webui/text_defaults_browsertest.js new file mode 100644 index 0000000..47491bb --- /dev/null +++ b/chrome/test/data/webui/text_defaults_browsertest.js
@@ -0,0 +1,59 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Test fixture for testing async methods of cr.js. + * @constructor + * @extends testing.Test + */ +function TextDefaultsTest() {} + +TextDefaultsTest.prototype = { + __proto__: testing.Test.prototype, + + /** + * Must be on same domain as text_defaults.css (chrome://resources). + * @override + */ + browsePreload: 'chrome://resources/html/assert.html', + + /** @override */ + isAsync: true, +}; + +/** + * @param {string} html Text, possibly with HTML &entities; in it. + * @return {string} The HTML decoded text. + */ +function decodeHtmlEntities(html) { + var element = document.createElement('div'); + element.innerHTML = html; + return element.textContent; +} + +TEST_F('TextDefaultsTest', 'ScrapeStyles', function() { + var link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = 'chrome://resources/css/text_defaults.css'; + link.onload = function() { + var fontFamily = link.sheet.rules[1].style['font-family']; + assertNotEquals('', fontFamily); + assertEquals(decodeHtmlEntities(fontFamily), fontFamily); + testDone(); + }; + document.body.appendChild(link); +}); + +TEST_F('TextDefaultsTest', 'ScrapeMDStyles', function() { + var link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = 'chrome://resources/css/text_defaults_md.css'; + link.onload = function() { + var fontFamily = link.sheet.rules[2].style['font-family']; + assertNotEquals('', fontFamily); + assertEquals(decodeHtmlEntities(fontFamily), fontFamily); + testDone(); + }; + document.body.appendChild(link); +});
diff --git a/chromecast/browser/cast_browser_context.cc b/chromecast/browser/cast_browser_context.cc index de508a9..b229b66 100644 --- a/chromecast/browser/cast_browser_context.cc +++ b/chromecast/browser/cast_browser_context.cc
@@ -154,5 +154,21 @@ return nullptr; } +net::URLRequestContextGetter* CastBrowserContext::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return url_request_context_factory_->CreateMainGetter( + this, protocol_handlers, std::move(request_interceptors)); +} + +net::URLRequestContextGetter* +CastBrowserContext::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + } // namespace shell } // namespace chromecast
diff --git a/chromecast/browser/cast_browser_context.h b/chromecast/browser/cast_browser_context.h index a7b108f..cd366d4 100644 --- a/chromecast/browser/cast_browser_context.h +++ b/chromecast/browser/cast_browser_context.h
@@ -45,6 +45,14 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; net::URLRequestContextGetter* GetSystemRequestContext();
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc index 70881c6..189b411 100644 --- a/chromecast/browser/cast_content_browser_client.cc +++ b/chromecast/browser/cast_content_browser_client.cc
@@ -188,14 +188,6 @@ host->AddFilter(network_hints_message_filter.get()); } -net::URLRequestContextGetter* CastContentBrowserClient::CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - return url_request_context_factory_->CreateMainGetter( - browser_context, protocol_handlers, std::move(request_interceptors)); -} - bool CastContentBrowserClient::IsHandledURL(const GURL& url) { if (!url.is_valid()) return false;
diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h index 31d6e57..c57b5a8 100644 --- a/chromecast/browser/cast_content_browser_client.h +++ b/chromecast/browser/cast_content_browser_client.h
@@ -96,11 +96,6 @@ content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams& parameters) override; void RenderProcessWillLaunch(content::RenderProcessHost* host) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) - override; bool IsHandledURL(const GURL& url) override; void AppendExtraCommandLineSwitches(base::CommandLine* command_line, int child_process_id) override;
diff --git a/chromecast/browser/url_request_context_factory.h b/chromecast/browser/url_request_context_factory.h index 31bbf14..6bd2342 100644 --- a/chromecast/browser/url_request_context_factory.h +++ b/chromecast/browser/url_request_context_factory.h
@@ -5,6 +5,7 @@ #ifndef CHROMECAST_BROWSER_URL_REQUEST_CONTEXT_FACTORY_H_ #define CHROMECAST_BROWSER_URL_REQUEST_CONTEXT_FACTORY_H_ +#include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "net/http/http_network_session.h"
diff --git a/chromeos/system/statistics_provider.cc b/chromeos/system/statistics_provider.cc index b1e0b13..276feafd 100644 --- a/chromeos/system/statistics_provider.cc +++ b/chromeos/system/statistics_provider.cc
@@ -45,6 +45,9 @@ const char kHardwareClassCrosSystemKey[] = "hwid"; const char kUnknownHardwareClass[] = "unknown"; +// File to get system vendor information from. +const char kSystemVendorFile[] = "/sys/class/dmi/id/sys_vendor"; + // Key/value delimiters of machine hardware info file. machine-info is generated // only for OOBE and enterprise enrollment and may not be present. See // login-manager/init/machine-info.conf. @@ -153,6 +156,7 @@ const char kFirmwareTypeValueNonchrome[] = "nonchrome"; const char kFirmwareTypeValueNormal[] = "normal"; const char kHardwareClassKey[] = "hardware_class"; +const char kSystemVendorKey[] = "system_vendor"; const char kOffersCouponCodeKey[] = "ubind_attribute"; const char kOffersGroupCodeKey[] = "gbind_attribute"; const char kRlzBrandCodeKey[] = "rlz_brand_code"; @@ -441,6 +445,12 @@ } } + if (base::SysInfo::IsRunningOnChromeOS()) { + std::string system_vendor; + base::ReadFileToString(base::FilePath(kSystemVendorFile), &system_vendor); + machine_info_[kSystemVendorKey] = system_vendor; + } + parser.GetNameValuePairsFromFile(machine_info_path, kMachineHardwareInfoEq, kMachineHardwareInfoDelim);
diff --git a/chromeos/system/statistics_provider.h b/chromeos/system/statistics_provider.h index c1b725a..4863e11 100644 --- a/chromeos/system/statistics_provider.h +++ b/chromeos/system/statistics_provider.h
@@ -41,6 +41,11 @@ // HWID key. CHROMEOS_EXPORT extern const char kHardwareClassKey[]; +// System vendor key. +// The value is used to check if Chrome is running on a VM or a real Chrome OS +// device. On QEMU VMs this value is QEMU. +CHROMEOS_EXPORT extern const char kSystemVendorKey[]; + // OEM customization flag that permits exiting enterprise enrollment flow in // OOBE when 'oem_enterprise_managed' flag is set. CHROMEOS_EXPORT extern const char kOemCanExitEnterpriseEnrollmentKey[];
diff --git a/components/bitmap_uploader/DEPS b/components/bitmap_uploader/DEPS index d24de36..83f38a0 100644 --- a/components/bitmap_uploader/DEPS +++ b/components/bitmap_uploader/DEPS
@@ -6,6 +6,5 @@ "+mojo/converters/geometry", "+mojo/converters/surfaces", "+mojo/public", - "+mojo/services/network/public/interfaces", "+ui/gfx/geometry", ]
diff --git a/components/component_updater/component_updater_paths.cc b/components/component_updater/component_updater_paths.cc index 834b1cf..697d8def 100644 --- a/components/component_updater/component_updater_paths.cc +++ b/components/component_updater/component_updater_paths.cc
@@ -47,6 +47,9 @@ case DIR_SUPERVISED_USER_WHITELISTS: cur = cur.Append(FILE_PATH_LITERAL("SupervisedUserWhitelists")); break; + case DIR_CERT_TRANS_TREE_STATES: + cur = cur.Append(FILE_PATH_LITERAL("CertificateTransparency")); + break; default: return false; }
diff --git a/components/component_updater/component_updater_paths.h b/components/component_updater/component_updater_paths.h index 7b8fd6e1..994353ce 100644 --- a/components/component_updater/component_updater_paths.h +++ b/components/component_updater/component_updater_paths.h
@@ -19,6 +19,7 @@ DIR_SW_REPORTER, // Path to the SwReporter component. DIR_COMPONENT_EV_WHITELIST, // EV whitelist for CT files. DIR_SUPERVISED_USER_WHITELISTS, // Supervised user whitelists. + DIR_CERT_TRANS_TREE_STATES, // Signed Tree Heads for CT logs. PATH_END };
diff --git a/components/component_updater/default_component_installer.cc b/components/component_updater/default_component_installer.cc index 8f5bba6..cb40ea2 100644 --- a/components/component_updater/default_component_installer.cc +++ b/components/component_updater/default_component_installer.cc
@@ -286,7 +286,8 @@ void DefaultComponentInstaller::ComponentReady( scoped_ptr<base::DictionaryValue> manifest) { - VLOG(1) << "ComponentReady"; + VLOG(1) << "Component ready, version " << current_version_.GetString() + << " in " << GetInstallDirectory().value(); installer_traits_->ComponentReady(current_version_, GetInstallDirectory(), std::move(manifest)); }
diff --git a/components/components_tests.gyp b/components/components_tests.gyp index b502a71e3..36eae94 100644 --- a/components/components_tests.gyp +++ b/components/components_tests.gyp
@@ -358,6 +358,7 @@ 'metrics/file_metrics_provider_unittest.cc', 'metrics/histogram_encoder_unittest.cc', 'metrics/machine_id_provider_win_unittest.cc', + 'metrics/data_use_tracker_unittest.cc', 'metrics/metrics_log_manager_unittest.cc', 'metrics/metrics_log_unittest.cc', 'metrics/metrics_reporting_scheduler_unittest.cc',
diff --git a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java index b92afc3..07e04b4 100644 --- a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java +++ b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java
@@ -728,7 +728,8 @@ public abstract void shutdown(); /** - * Starts NetLog logging to a file. The NetLog is useful for debugging. + * Starts NetLog logging to a file. The NetLog will contain events emitted + * by all live CronetEngines. The NetLog is useful for debugging. * The file can be viewed using a Chrome browser navigated to * chrome://net-internals/#import * @param fileName the complete file path. It must not be empty. If the file
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc index 8242f0a..883cdc68 100644 --- a/components/cronet/android/cronet_url_request_context_adapter.cc +++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -17,6 +17,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_file.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_vector.h" @@ -57,6 +58,10 @@ namespace { +// Use a global NetLog instance. See crbug.com/486120. +static base::LazyInstance<net::NetLog>::Leaky g_net_log = + LAZY_INSTANCE_INITIALIZER; + const char kHttpServerProperties[] = "net.http_server_properties"; // Current version of disk storage. const int32_t kStorageVersion = 1; @@ -480,7 +485,6 @@ context_builder.set_http_network_session_params( custom_http_network_session_params); - net_log_.reset(new net::NetLog); scoped_ptr<net::NetworkDelegate> network_delegate(new BasicNetworkDelegate()); #if defined(DATA_REDUCTION_PROXY_SUPPORT) DCHECK(!data_reduction_proxy_); @@ -491,7 +495,7 @@ config->data_reduction_proxy_key, config->data_reduction_primary_proxy, config->data_reduction_fallback_proxy, config->data_reduction_secure_proxy_check_url, config->user_agent, - GetNetworkTaskRunner(), net_log_.get())); + GetNetworkTaskRunner(), g_net_log.Pointer())); network_delegate = data_reduction_proxy_->CreateNetworkDelegate( std::move(network_delegate)); context_builder.set_proxy_delegate( @@ -502,17 +506,17 @@ } #endif // defined(DATA_REDUCTION_PROXY_SUPPORT) context_builder.set_network_delegate(std::move(network_delegate)); - context_builder.set_net_log(net_log_.get()); + context_builder.set_net_log(g_net_log.Pointer()); // Android provides a local HTTP proxy server that handles proxying when a PAC // URL is present. Create a proxy service without a resolver and rely on this // local HTTP proxy. See: crbug.com/432539. context_builder.set_proxy_service( net::ProxyService::CreateWithoutProxyResolver( - std::move(proxy_config_service_), net_log_.get())); + std::move(proxy_config_service_), g_net_log.Pointer())); - config->ConfigureURLRequestContextBuilder(&context_builder, net_log_.get(), - GetFileThread()->task_runner()); + config->ConfigureURLRequestContextBuilder( + &context_builder, g_net_log.Pointer(), GetFileThread()->task_runner()); // Set up pref file if storage path is specified. if (!config->storage_path.empty()) {
diff --git a/components/cronet/android/cronet_url_request_context_adapter.h b/components/cronet/android/cronet_url_request_context_adapter.h index 81c07ddd..81d865c 100644 --- a/components/cronet/android/cronet_url_request_context_adapter.h +++ b/components/cronet/android/cronet_url_request_context_adapter.h
@@ -166,7 +166,6 @@ // |pref_service_| should outlive the HttpServerPropertiesManager owned by // |context_|. scoped_ptr<PrefService> pref_service_; - scoped_ptr<net::NetLog> net_log_; scoped_ptr<net::URLRequestContext> context_; scoped_ptr<net::ProxyConfigService> proxy_config_service_; scoped_refptr<JsonPrefStore> json_pref_store_;
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java index c55b974..51aa9824 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
@@ -45,6 +45,7 @@ private EmbeddedTestServer mTestServer; private String mUrl; private String mUrl404; + private String mUrl500; CronetTestFramework mTestFramework; @Override @@ -53,6 +54,7 @@ mTestServer = EmbeddedTestServer.createAndStartDefaultServer(getContext()); mUrl = mTestServer.getURL("/echo?status=200"); mUrl404 = mTestServer.getURL("/echo?status=404"); + mUrl500 = mTestServer.getURL("/echo?status=500"); } @Override @@ -620,6 +622,94 @@ @SmallTest @Feature({"Cronet"}) + @OnlyRunNativeCronet + // Tests that NetLog contains events emitted by all live CronetEngines. + public void testNetLogContainEventsFromAllLiveEngines() throws Exception { + Context context = getContext(); + File directory = new File(PathUtils.getDataDirectory(context)); + File file1 = File.createTempFile("cronet1", "json", directory); + File file2 = File.createTempFile("cronet2", "json", directory); + CronetEngine cronetEngine1 = new CronetUrlRequestContext( + new CronetEngine.Builder(context).setLibraryName("cronet_tests")); + CronetEngine cronetEngine2 = new CronetUrlRequestContext( + new CronetEngine.Builder(context).setLibraryName("cronet_tests")); + + cronetEngine1.startNetLogToFile(file1.getPath(), false); + cronetEngine2.startNetLogToFile(file2.getPath(), false); + + // Warm CronetEngine and make sure both CronetUrlRequestContexts are + // initialized before testing the logs. + makeRequestAndCheckStatus(cronetEngine1, mUrl, 200); + makeRequestAndCheckStatus(cronetEngine2, mUrl, 200); + + // Use cronetEngine1 to make a request to mUrl404. + makeRequestAndCheckStatus(cronetEngine1, mUrl404, 404); + + // Use cronetEngine2 to make a request to mUrl500. + makeRequestAndCheckStatus(cronetEngine2, mUrl500, 500); + + cronetEngine1.stopNetLog(); + cronetEngine2.stopNetLog(); + assertTrue(file1.exists()); + assertTrue(file2.exists()); + // Make sure both files contain the two requests made separately using + // different engines. + assertTrue(containsStringInNetLog(file1, mUrl404)); + assertTrue(containsStringInNetLog(file1, mUrl500)); + assertTrue(containsStringInNetLog(file2, mUrl404)); + assertTrue(containsStringInNetLog(file2, mUrl500)); + assertTrue(file1.delete()); + assertTrue(file2.delete()); + } + + @SmallTest + @Feature({"Cronet"}) + @OnlyRunNativeCronet + // Tests that if CronetEngine is shut down when reading from disk cache, + // there isn't a crash. See crbug.com/486120. + public void testShutDownEngineWhenReadingFromDiskCache() throws Exception { + enableCache(CronetEngine.Builder.HTTP_CACHE_DISK); + String url = NativeTestServer.getFileURL("/cacheable.txt"); + // Make a request to a cacheable resource. + checkRequestCaching(url, false); + + // Shut down the server. + NativeTestServer.shutdownNativeTestServer(); + class CancelUrlRequestCallback extends TestUrlRequestCallback { + @Override + public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { + super.onResponseStarted(request, info); + request.cancel(); + // Shut down CronetEngine immediately after request is destroyed. + mTestFramework.mCronetEngine.shutdown(); + } + + @Override + public void onSucceeded(UrlRequest request, UrlResponseInfo info) { + // onSucceeded will not happen, because the request is canceled + // after sending first read and the executor is single threaded. + throw new RuntimeException("Unexpected"); + } + + @Override + public void onFailed( + UrlRequest request, UrlResponseInfo info, UrlRequestException error) { + throw new RuntimeException("Unexpected"); + } + } + CancelUrlRequestCallback callback = new CancelUrlRequestCallback(); + UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( + url, callback, callback.getExecutor(), mTestFramework.mCronetEngine); + urlRequestBuilder.build().start(); + callback.blockForDone(); + assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); + assertTrue(callback.mResponseInfo.wasCached()); + assertTrue(callback.mOnCanceledCalled); + } + + @SmallTest + @Feature({"Cronet"}) + @OnlyRunNativeCronet public void testNetLogAfterShutdown() throws Exception { mTestFramework = startCronetTestFramework(); TestUrlRequestCallback callback = new TestUrlRequestCallback(); @@ -719,11 +809,15 @@ } private boolean hasBytesInNetLog(File logFile) throws Exception { + return containsStringInNetLog(logFile, "\"hex_encoded_bytes\""); + } + + private boolean containsStringInNetLog(File logFile, String content) throws Exception { BufferedReader logReader = new BufferedReader(new FileReader(logFile)); try { String logLine; while ((logLine = logReader.readLine()) != null) { - if (logLine.contains("\"hex_encoded_bytes\"")) { + if (logLine.contains(content)) { return true; } } @@ -733,6 +827,20 @@ } } + /** + * Helper method to make a request to {@code url}, wait for it to + * complete, and check that the status code is the same as {@code expectedStatusCode}. + */ + private void makeRequestAndCheckStatus( + CronetEngine engine, String url, int expectedStatusCode) { + TestUrlRequestCallback callback = new TestUrlRequestCallback(); + UrlRequest request = + new UrlRequest.Builder(url, callback, callback.getExecutor(), engine).build(); + request.start(); + callback.blockForDone(); + assertEquals(expectedStatusCode, callback.mResponseInfo.getHttpStatusCode()); + } + private void enableCache(int cacheType) throws Exception { String cacheTypeString = ""; if (cacheType == CronetEngine.Builder.HTTP_CACHE_DISK) { @@ -762,6 +870,7 @@ urlRequestBuilder.build().start(); callback.blockForDone(); assertEquals(expectCached, callback.mResponseInfo.wasCached()); + assertEquals("this is a cacheable file\n", callback.mResponseAsString); } @SmallTest
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/DiskStorageTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/DiskStorageTest.java index 38ef644..327e798 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/DiskStorageTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/DiskStorageTest.java
@@ -8,7 +8,6 @@ import org.chromium.base.FileUtils; import org.chromium.base.PathUtils; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import java.io.BufferedReader; @@ -45,7 +44,6 @@ @Feature({"Cronet"}) @OnlyRunNativeCronet // Crashing on Android Cronet Builder, see crbug.com/601409. - @DisabledTest public void testReadOnlyStorageDirectory() throws Exception { mReadOnlyStoragePath = PathUtils.getDataDirectory(getContext()) + "/read_only"; File readOnlyStorage = new File(mReadOnlyStoragePath); @@ -90,7 +88,6 @@ @Feature({"Cronet"}) @OnlyRunNativeCronet // Crashing on Android Cronet Builder, see crbug.com/601409. - @DisabledTest public void testPurgeOldVersion() throws Exception { String testStorage = CronetTestFramework.getTestStorage(getContext()); File versionFile = new File(testStorage + "/version");
diff --git a/components/data_use_measurement/content/BUILD.gn b/components/data_use_measurement/content/BUILD.gn index 3f7c06ed..f4a7f64 100644 --- a/components/data_use_measurement/content/BUILD.gn +++ b/components/data_use_measurement/content/BUILD.gn
@@ -10,6 +10,7 @@ deps = [ "//base", "//components/data_use_measurement/core", + "//components/metrics", "//content/public/browser", "//net", ]
diff --git a/components/data_use_measurement/content/DEPS b/components/data_use_measurement/content/DEPS index 75cbca33..06cbe67 100644 --- a/components/data_use_measurement/content/DEPS +++ b/components/data_use_measurement/content/DEPS
@@ -3,4 +3,5 @@ "+net", "+testing", "+url", + "+components/metrics", ]
diff --git a/components/data_use_measurement/content/data_use_measurement.cc b/components/data_use_measurement/content/data_use_measurement.cc index 23f916c6..31b3eb3 100644 --- a/components/data_use_measurement/content/data_use_measurement.cc +++ b/components/data_use_measurement/content/data_use_measurement.cc
@@ -44,9 +44,12 @@ } // namespace -DataUseMeasurement::DataUseMeasurement() +DataUseMeasurement::DataUseMeasurement( + const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) + : metrics_data_use_forwarder_(metrics_data_use_forwarder) #if defined(OS_ANDROID) - : app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), + , + app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), app_listener_(new base::android::ApplicationStatusListener( base::Bind(&DataUseMeasurement::OnApplicationStateChange, base::Unretained(this)))) @@ -75,26 +78,37 @@ int64_t total_upload_bytes = request->GetTotalSentBytes(); int64_t total_received_bytes = request->GetTotalReceivedBytes(); + bool is_connection_cellular = + net::NetworkChangeNotifier::IsConnectionCellular( + net::NetworkChangeNotifier::GetConnectionType()); RecordUMAHistogramCount( GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User" : "DataUse.TrafficSize.System", - UPSTREAM), + UPSTREAM, is_connection_cellular), total_upload_bytes); RecordUMAHistogramCount( GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User" : "DataUse.TrafficSize.System", - DOWNSTREAM), + DOWNSTREAM, is_connection_cellular), total_received_bytes); DataUseUserData* attached_service_data = reinterpret_cast<DataUseUserData*>( request->GetUserData(DataUseUserData::kUserDataKey)); - + DataUseUserData::ServiceName service_name = + attached_service_data ? attached_service_data->service_name() + : DataUseUserData::NOT_TAGGED; if (!is_user_traffic) { - DataUseUserData::ServiceName service_name = - attached_service_data ? attached_service_data->service_name() - : DataUseUserData::NOT_TAGGED; - ReportDataUsageServices(service_name, UPSTREAM, total_upload_bytes); - ReportDataUsageServices(service_name, DOWNSTREAM, total_received_bytes); + ReportDataUsageServices(service_name, UPSTREAM, is_connection_cellular, + total_upload_bytes); + ReportDataUsageServices(service_name, DOWNSTREAM, is_connection_cellular, + total_received_bytes); + } + + // Update data use prefs for cellular connections. + if (!metrics_data_use_forwarder_.is_null()) { + metrics_data_use_forwarder_.Run( + attached_service_data->GetServiceNameAsString(service_name), + total_upload_bytes + total_received_bytes, is_connection_cellular); } } @@ -114,15 +128,15 @@ return FOREGROUND; } -std::string DataUseMeasurement::GetHistogramName(const char* prefix, - TrafficDirection dir) const { +std::string DataUseMeasurement::GetHistogramName( + const char* prefix, + TrafficDirection dir, + bool is_connection_cellular) const { AppState app_state = CurrentAppState(); - bool is_conn_cellular = net::NetworkChangeNotifier::IsConnectionCellular( - net::NetworkChangeNotifier::GetConnectionType()); return base::StringPrintf( "%s.%s.%s.%s", prefix, dir == UPSTREAM ? "Upstream" : "Downstream", app_state == BACKGROUND ? "Background" : "Foreground", - is_conn_cellular ? "Cellular" : "NotCellular"); + is_connection_cellular ? "Cellular" : "NotCellular"); } #if defined(OS_ANDROID) @@ -135,14 +149,16 @@ void DataUseMeasurement::ReportDataUsageServices( DataUseUserData::ServiceName service, TrafficDirection dir, + bool is_connection_cellular, int64_t message_size) const { RecordUMAHistogramCount( "DataUse.MessageSize." + DataUseUserData::GetServiceNameAsString(service), message_size); if (message_size > 0) { IncreaseSparseHistogramByValue( - GetHistogramName("DataUse.MessageSize.AllServices", dir), service, - message_size); + GetHistogramName("DataUse.MessageSize.AllServices", dir, + is_connection_cellular), + service, message_size); } }
diff --git a/components/data_use_measurement/content/data_use_measurement.h b/components/data_use_measurement/content/data_use_measurement.h index a5b8f71..3d9636e 100644 --- a/components/data_use_measurement/content/data_use_measurement.h +++ b/components/data_use_measurement/content/data_use_measurement.h
@@ -9,10 +9,12 @@ #include <string> +#include "base/callback.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "build/build_config.h" #include "components/data_use_measurement/core/data_use_user_data.h" +#include "components/metrics/data_use_tracker.h" #if defined(OS_ANDROID) #include "base/android/application_status_listener.h" @@ -32,7 +34,8 @@ // http://crbug.com/527460 class DataUseMeasurement { public: - DataUseMeasurement(); + explicit DataUseMeasurement( + const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder); ~DataUseMeasurement(); // Records the data use of the |request|, thus |request| must be non-null. @@ -63,7 +66,9 @@ // ("Downstream") path, whether the app was in the "Foreground" or // "Background", and whether a "Cellular" or "WiFi" network was use. For // example, "Prefix.Upstream.Foreground.Cellular" is a possible output. - std::string GetHistogramName(const char* prefix, TrafficDirection dir) const; + std::string GetHistogramName(const char* prefix, + TrafficDirection dir, + bool is_connection_cellular) const; #if defined(OS_ANDROID) // Called whenever the application transitions from foreground to background @@ -79,8 +84,15 @@ void ReportDataUsageServices( data_use_measurement::DataUseUserData::ServiceName service, TrafficDirection dir, + bool is_connection_cellular, int64_t message_size) const; + // Callback for updating data use prefs. + // TODO(rajendrant): If a similar mechanism would need be used for components + // other than metrics, then the better approach would be to refactor this + // class to support registering arbitrary observers. crbug.com/601185 + metrics::UpdateUsagePrefCallbackType metrics_data_use_forwarder_; + #if defined(OS_ANDROID) // Application listener store the last known state of the application in this // field.
diff --git a/components/data_use_measurement/content/data_use_measurement_unittest.cc b/components/data_use_measurement/content/data_use_measurement_unittest.cc index 242a1ae..9d96c53 100644 --- a/components/data_use_measurement/content/data_use_measurement_unittest.cc +++ b/components/data_use_measurement/content/data_use_measurement_unittest.cc
@@ -27,18 +27,20 @@ class DataUseMeasurementTest : public testing::Test { public: - DataUseMeasurementTest() { + DataUseMeasurementTest() + : data_use_measurement_( + base::Bind(&DataUseMeasurementTest::FakeDataUseforwarder, + base::Unretained(this))) { // During the test it is expected to not have cellular connection. DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular( net::NetworkChangeNotifier::GetConnectionType())); } - // This function makes a user request and confirms that its effect is - // reflected in proper histograms. - void TestForAUserRequest(const std::string& target_dimension) { + // Sends a request and reports data use attaching either user data or service + // data based on |is_user_request|. + void SendRequest(bool is_user_request) { net::TestDelegate test_delegate; InitializeContext(); - base::HistogramTester histogram_tester; net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n" "Content-Length: 12\r\n\r\n"), net::MockRead("Test Content")}; @@ -48,14 +50,28 @@ scoped_ptr<net::URLRequest> request(context_->CreateRequest( GURL("http://foo.com"), net::DEFAULT_PRIORITY, &test_delegate)); - request->SetUserData( - data_use_measurement::DataUseUserData::kUserDataKey, - new data_use_measurement::DataUseUserData( - data_use_measurement::DataUseUserData::SUGGESTIONS)); + if (is_user_request) { + request->SetUserData( + data_use_measurement::DataUseUserData::kUserDataKey, + new data_use_measurement::DataUseUserData( + data_use_measurement::DataUseUserData::SUGGESTIONS)); + } else { + content::ResourceRequestInfo::AllocateForTesting( + request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr, -2, -2, -2, + true, false, true, true, false); + } + request->Start(); loop_.RunUntilIdle(); data_use_measurement_.ReportDataUseUMA(request.get()); + } + + // This function makes a user request and confirms that its effect is + // reflected in proper histograms. + void TestForAUserRequest(const std::string& target_dimension) { + base::HistogramTester histogram_tester; + SendRequest(true); histogram_tester.ExpectTotalCount("DataUse.TrafficSize.System.Downstream." + target_dimension + kConnectionType, 1); @@ -69,26 +85,8 @@ // This function makes a service request and confirms that its effect is // reflected in proper histograms. void TestForAServiceRequest(const std::string& target_dimension) { - net::TestDelegate test_delegate; - InitializeContext(); base::HistogramTester histogram_tester; - - net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n" - "Content-Length: 12\r\n\r\n"), - net::MockRead("Test Content")}; - net::StaticSocketDataProvider socket_data(reads, arraysize(reads), nullptr, - 0); - socket_factory_->AddSocketDataProvider(&socket_data); - - scoped_ptr<net::URLRequest> request(context_->CreateRequest( - GURL("http://foo.com"), net::DEFAULT_PRIORITY, &test_delegate)); - content::ResourceRequestInfo::AllocateForTesting( - request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr, -2, -2, -2, - true, false, true, true, false); - request->Start(); - loop_.RunUntilIdle(); - - data_use_measurement_.ReportDataUseUMA(request.get()); + SendRequest(false); histogram_tester.ExpectTotalCount("DataUse.TrafficSize.User.Downstream." + target_dimension + kConnectionType, 1); @@ -107,6 +105,8 @@ DataUseMeasurement* data_use_measurement() { return &data_use_measurement_; } + bool IsDataUseForwarderCalled() { return is_data_use_forwarder_called_; } + private: void InitializeContext() { context_.reset(new net::TestURLRequestContext(true)); @@ -115,11 +115,18 @@ context_->Init(); } + void FakeDataUseforwarder(const std::string& service_name, + int message_size, + bool is_celllular) { + is_data_use_forwarder_called_ = true; + } + base::MessageLoopForIO loop_; DataUseMeasurement data_use_measurement_; scoped_ptr<net::MockClientSocketFactory> socket_factory_; scoped_ptr<net::TestURLRequestContext> context_; const std::string kConnectionType = "NotCellular"; + bool is_data_use_forwarder_called_ = false; DISALLOW_COPY_AND_ASSIGN(DataUseMeasurementTest); }; @@ -150,4 +157,10 @@ } #endif +TEST_F(DataUseMeasurementTest, DataUseForwarderIsCalled) { + EXPECT_FALSE(IsDataUseForwarderCalled()); + SendRequest(true); + EXPECT_TRUE(IsDataUseForwarderCalled()); +} + } // namespace data_use_measurement
diff --git a/components/leveldb/BUILD.gn b/components/leveldb/BUILD.gn index b521188a..9d4a3e5 100644 --- a/components/leveldb/BUILD.gn +++ b/components/leveldb/BUILD.gn
@@ -16,12 +16,11 @@ "leveldb_mojo_proxy.h", "leveldb_service_impl.cc", "leveldb_service_impl.h", - "util.cc", - "util.h", ] deps = [ "//components/filesystem/public/interfaces", + "//components/leveldb/public/cpp", "//components/leveldb/public/interfaces", "//mojo/common", "//mojo/message_pump", @@ -62,11 +61,13 @@ test("leveldb_service_unittests") { sources = [ "leveldb_service_unittest.cc", + "remote_iterator_unittest.cc", ] deps = [ "//base", "//components/filesystem/public/interfaces", + "//components/leveldb/public/cpp", "//components/leveldb/public/interfaces", "//mojo/common", "//mojo/platform_handle", @@ -74,6 +75,7 @@ "//mojo/shell/public/cpp:shell_test_support", "//mojo/shell/public/cpp:sources", "//mojo/shell/public/cpp/test:run_all_shelltests", + "//third_party/leveldatabase", ] data_deps = [
diff --git a/components/leveldb/leveldb.gyp b/components/leveldb/leveldb.gyp index 7c367bc4..6d1a8ef 100644 --- a/components/leveldb/leveldb.gyp +++ b/components/leveldb/leveldb.gyp
@@ -26,13 +26,29 @@ 'leveldb_mojo_proxy.h', 'leveldb_service_impl.cc', 'leveldb_service_impl.h', - 'util.cc', - 'util.h', + ], + 'dependencies': [ + 'leveldb_public_lib', + '../../components/filesystem/filesystem.gyp:filesystem_lib', + '../../mojo/mojo_base.gyp:mojo_application_base', + '../../mojo/mojo_public.gyp:mojo_cpp_bindings', + '../../third_party/leveldatabase/leveldatabase.gyp:leveldatabase', + ] + }, + { + # GN version: //components/leveldb/public/cpp:cpp + 'target_name': 'leveldb_public_lib', + 'type': 'static_library', + 'sources': [ + 'public/cpp/remote_iterator.cc', + 'public/cpp/remote_iterator.h', + 'public/cpp/util.cc', + 'public/cpp/util.h', ], 'dependencies': [ 'leveldb_bindings_mojom', - '../../components/filesystem/filesystem.gyp:filesystem_lib', '../../mojo/mojo_base.gyp:mojo_application_base', + '../../mojo/mojo_edk.gyp:mojo_system_impl', '../../mojo/mojo_public.gyp:mojo_cpp_bindings', '../../third_party/leveldatabase/leveldatabase.gyp:leveldatabase', ]
diff --git a/components/leveldb/leveldb_database_impl.cc b/components/leveldb/leveldb_database_impl.cc index 857c73df..6a64706 100644 --- a/components/leveldb/leveldb_database_impl.cc +++ b/components/leveldb/leveldb_database_impl.cc
@@ -9,7 +9,7 @@ #include "base/rand_util.h" #include "components/leveldb/env_mojo.h" -#include "components/leveldb/util.h" +#include "components/leveldb/public/cpp/util.h" #include "mojo/common/common_type_converters.h" #include "third_party/leveldatabase/src/include/leveldb/db.h" #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" @@ -122,4 +122,119 @@ callback.Run(LeveldbStatusToError(status), mojo::Array<uint8_t>::From(value)); } +void LevelDBDatabaseImpl::NewIterator(const NewIteratorCallback& callback) { + Iterator* iterator = db_->NewIterator(leveldb::ReadOptions()); + uint64_t new_id = GetSafeRandomId(iterator_map_); + iterator_map_.insert(std::make_pair(new_id, iterator)); + callback.Run(new_id); +} + +void LevelDBDatabaseImpl::NewIteratorFromSnapshot( + uint64_t snapshot_id, + const NewIteratorCallback& callback) { + // If the snapshot id is invalid, send back invalid argument + auto it = snapshot_map_.find(snapshot_id); + if (it == snapshot_map_.end()) { + callback.Run(0); + return; + } + + leveldb::ReadOptions options; + options.snapshot = it->second; + + Iterator* iterator = db_->NewIterator(options); + uint64_t new_id = GetSafeRandomId(iterator_map_); + iterator_map_.insert(std::make_pair(new_id, iterator)); + callback.Run(new_id); +} + +void LevelDBDatabaseImpl::ReleaseIterator(uint64_t iterator_id) { + auto it = iterator_map_.find(iterator_id); + if (it != iterator_map_.end()) { + delete it->second; + iterator_map_.erase(it); + } +} + +void LevelDBDatabaseImpl::IteratorSeekToFirst( + uint64_t iterator_id, + const IteratorSeekToFirstCallback& callback) { + auto it = iterator_map_.find(iterator_id); + if (it == iterator_map_.end()) { + callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + return; + } + + it->second->SeekToFirst(); + + ReplyToIteratorMessage(it->second, callback); +} + +void LevelDBDatabaseImpl::IteratorSeekToLast( + uint64_t iterator_id, + const IteratorSeekToLastCallback& callback) { + auto it = iterator_map_.find(iterator_id); + if (it == iterator_map_.end()) { + callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + return; + } + + it->second->SeekToLast(); + + ReplyToIteratorMessage(it->second, callback); +} + +void LevelDBDatabaseImpl::IteratorSeek( + uint64_t iterator_id, + mojo::Array<uint8_t> target, + const IteratorSeekToLastCallback& callback) { + auto it = iterator_map_.find(iterator_id); + if (it == iterator_map_.end()) { + callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + return; + } + + it->second->Seek(GetSliceFor(target)); + + ReplyToIteratorMessage(it->second, callback); +} + +void LevelDBDatabaseImpl::IteratorNext(uint64_t iterator_id, + const IteratorNextCallback& callback) { + auto it = iterator_map_.find(iterator_id); + if (it == iterator_map_.end()) { + callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + return; + } + + it->second->Next(); + + ReplyToIteratorMessage(it->second, callback); +} + +void LevelDBDatabaseImpl::IteratorPrev(uint64_t iterator_id, + const IteratorPrevCallback& callback) { + auto it = iterator_map_.find(iterator_id); + if (it == iterator_map_.end()) { + callback.Run(false, DatabaseError::INVALID_ARGUMENT, nullptr, nullptr); + return; + } + + it->second->Prev(); + + ReplyToIteratorMessage(it->second, callback); +} + +void LevelDBDatabaseImpl::ReplyToIteratorMessage( + leveldb::Iterator* it, + const IteratorSeekToFirstCallback& callback) { + if (!it->Valid()) { + callback.Run(false, LeveldbStatusToError(it->status()), nullptr, nullptr); + return; + } + + callback.Run(true, LeveldbStatusToError(it->status()), GetArrayFor(it->key()), + GetArrayFor(it->value())); +} + } // namespace leveldb
diff --git a/components/leveldb/leveldb_database_impl.h b/components/leveldb/leveldb_database_impl.h index 0f218d3..a6ccab77d 100644 --- a/components/leveldb/leveldb_database_impl.h +++ b/components/leveldb/leveldb_database_impl.h
@@ -37,8 +37,30 @@ void GetFromSnapshot(uint64_t snapshot_id, mojo::Array<uint8_t> key, const GetCallback& callback) override; + void NewIterator(const NewIteratorCallback& callback) override; + void NewIteratorFromSnapshot(uint64_t snapshot_id, + const NewIteratorCallback& callback) override; + void ReleaseIterator(uint64_t iterator_id) override; + void IteratorSeekToFirst( + uint64_t iterator_id, + const IteratorSeekToFirstCallback& callback) override; + void IteratorSeekToLast(uint64_t iterator_id, + const IteratorSeekToLastCallback& callback) override; + void IteratorSeek(uint64_t iterator_id, + mojo::Array<uint8_t> target, + const IteratorSeekToLastCallback& callback) override; + void IteratorNext(uint64_t iterator_id, + const IteratorNextCallback& callback) override; + void IteratorPrev(uint64_t iterator_id, + const IteratorPrevCallback& callback) override; private: + // Returns the state of |it| to a caller. Note: This assumes that all the + // iterator movement methods have the same callback signature. We don't + // directly reference the underlying type in case of bindings change. + void ReplyToIteratorMessage(leveldb::Iterator* it, + const IteratorSeekToFirstCallback& callback); + mojo::StrongBinding<LevelDBDatabase> binding_; scoped_ptr<leveldb::Env> environment_; scoped_ptr<leveldb::DB> db_;
diff --git a/components/leveldb/leveldb_service_impl.cc b/components/leveldb/leveldb_service_impl.cc index 69c1f63..9c4a540 100644 --- a/components/leveldb/leveldb_service_impl.cc +++ b/components/leveldb/leveldb_service_impl.cc
@@ -6,7 +6,7 @@ #include "components/leveldb/env_mojo.h" #include "components/leveldb/leveldb_database_impl.h" -#include "components/leveldb/util.h" +#include "components/leveldb/public/cpp/util.h" #include "third_party/leveldatabase/env_chromium.h" #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" #include "third_party/leveldatabase/src/include/leveldb/db.h" @@ -26,18 +26,26 @@ const mojo::String& dbname, leveldb::LevelDBDatabaseRequest database, const OpenCallback& callback) { - // This is the place where we open a database. + OpenWithOptions(leveldb::OpenOptions::New(), std::move(directory), dbname, + std::move(database), callback); +} + +void LevelDBServiceImpl::OpenWithOptions( + leveldb::OpenOptionsPtr open_options, + filesystem::DirectoryPtr directory, + const mojo::String& dbname, + leveldb::LevelDBDatabaseRequest database, + const OpenCallback& callback) { leveldb::Options options; - options.create_if_missing = true; - options.paranoid_checks = true; - // TODO(erg): Do we need a filter policy? + options.create_if_missing = open_options->create_if_missing; + options.error_if_exists = open_options->error_if_exists; + options.paranoid_checks = open_options->paranoid_checks; + options.write_buffer_size = open_options->write_buffer_size; + options.max_open_files = open_options->max_open_files; + options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; options.compression = leveldb::kSnappyCompression; - // For info about the troubles we've run into with this parameter, see: - // https://code.google.com/p/chromium/issues/detail?id=227313#c11 - options.max_open_files = 80; - // Register our directory with the file thread. LevelDBMojoProxy::OpaqueDir* dir = thread_->RegisterDirectory(std::move(directory)); @@ -61,7 +69,6 @@ leveldb::Options options; options.create_if_missing = true; options.max_open_files = 0; // Use minimum. - options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; scoped_ptr<leveldb::Env> env(leveldb::NewMemEnv(leveldb::Env::Default())); options.env = env.get();
diff --git a/components/leveldb/leveldb_service_impl.h b/components/leveldb/leveldb_service_impl.h index c234fd5..910a8d5 100644 --- a/components/leveldb/leveldb_service_impl.h +++ b/components/leveldb/leveldb_service_impl.h
@@ -23,6 +23,11 @@ const mojo::String& dbname, leveldb::LevelDBDatabaseRequest database, const OpenCallback& callback) override; + void OpenWithOptions(leveldb::OpenOptionsPtr open_options, + filesystem::DirectoryPtr directory, + const mojo::String& dbname, + leveldb::LevelDBDatabaseRequest database, + const OpenCallback& callback) override; void OpenInMemory(leveldb::LevelDBDatabaseRequest database, const OpenInMemoryCallback& callback) override;
diff --git a/components/leveldb/leveldb_service_unittest.cc b/components/leveldb/leveldb_service_unittest.cc index 96c7e05..5fa31e86 100644 --- a/components/leveldb/leveldb_service_unittest.cc +++ b/components/leveldb/leveldb_service_unittest.cc
@@ -19,10 +19,10 @@ namespace leveldb { namespace { -class LevelDBApptest : public mojo::test::ShellTest { +class LevelDBServiceTest : public mojo::test::ShellTest { public: - LevelDBApptest() : ShellTest("exe:leveldb_service_unittests") {} - ~LevelDBApptest() override {} + LevelDBServiceTest() : ShellTest("exe:leveldb_service_unittests") {} + ~LevelDBServiceTest() override {} protected: // Overridden from mojo::test::ApplicationTestBase: @@ -55,10 +55,10 @@ filesystem::FileSystemPtr files_; LevelDBServicePtr leveldb_; - DISALLOW_COPY_AND_ASSIGN(LevelDBApptest); + DISALLOW_COPY_AND_ASSIGN(LevelDBServiceTest); }; -TEST_F(LevelDBApptest, Basic) { +TEST_F(LevelDBServiceTest, Basic) { filesystem::DirectoryPtr directory; GetUserDataDir(&directory); @@ -103,7 +103,7 @@ EXPECT_EQ("", value.To<std::string>()); } -TEST_F(LevelDBApptest, WriteBatch) { +TEST_F(LevelDBServiceTest, WriteBatch) { filesystem::DirectoryPtr directory; GetUserDataDir(&directory); @@ -156,7 +156,7 @@ EXPECT_EQ("more", value.To<std::string>()); } -TEST_F(LevelDBApptest, Reconnect) { +TEST_F(LevelDBServiceTest, Reconnect) { DatabaseError error; { @@ -202,7 +202,7 @@ } } -TEST_F(LevelDBApptest, GetSnapshotSimple) { +TEST_F(LevelDBServiceTest, GetSnapshotSimple) { DatabaseError error; filesystem::DirectoryPtr directory; @@ -220,7 +220,7 @@ EXPECT_NE(static_cast<uint64_t>(0), snapshot_id); } -TEST_F(LevelDBApptest, GetFromSnapshots) { +TEST_F(LevelDBServiceTest, GetFromSnapshots) { DatabaseError error; filesystem::DirectoryPtr directory; @@ -274,7 +274,7 @@ EXPECT_EQ("value", value.To<std::string>()); } -TEST_F(LevelDBApptest, InvalidArgumentOnInvalidSnapshot) { +TEST_F(LevelDBServiceTest, InvalidArgumentOnInvalidSnapshot) { filesystem::DirectoryPtr directory; GetUserDataDir(&directory); @@ -297,7 +297,7 @@ EXPECT_EQ(DatabaseError::INVALID_ARGUMENT, error); } -TEST_F(LevelDBApptest, MemoryDBReadWrite) { +TEST_F(LevelDBServiceTest, MemoryDBReadWrite) { LevelDBDatabasePtr database; DatabaseError error = DatabaseError::INVALID_ARGUMENT; leveldb()->OpenInMemory(GetProxy(&database), Capture(&error));
diff --git a/components/leveldb/public/cpp/BUILD.gn b/components/leveldb/public/cpp/BUILD.gn new file mode 100644 index 0000000..29e773a --- /dev/null +++ b/components/leveldb/public/cpp/BUILD.gn
@@ -0,0 +1,20 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("cpp") { + sources = [ + "remote_iterator.cc", + "remote_iterator.h", + "util.cc", + "util.h", + ] + + deps = [ + "//base", + "//components/leveldb/public/interfaces", + "//mojo/common", + "//mojo/shell/public/cpp", + "//third_party/leveldatabase", + ] +}
diff --git a/components/leveldb/public/cpp/remote_iterator.cc b/components/leveldb/public/cpp/remote_iterator.cc new file mode 100644 index 0000000..39577a68 --- /dev/null +++ b/components/leveldb/public/cpp/remote_iterator.cc
@@ -0,0 +1,60 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/leveldb/public/cpp/remote_iterator.h" + +#include "components/leveldb/public/cpp/util.h" + +namespace leveldb { + +RemoteIterator::RemoteIterator(LevelDBDatabase* database, uint64_t iterator_id) + : database_(database), + iterator_id_(iterator_id), + valid_(false), + status_(DatabaseError::OK) {} + +RemoteIterator::~RemoteIterator() { + database_->ReleaseIterator(iterator_id_); +} + +bool RemoteIterator::Valid() const { + return valid_; +} + +void RemoteIterator::SeekToFirst() { + database_->IteratorSeekToFirst(iterator_id_, &valid_, &status_, &key_, + &value_); +} + +void RemoteIterator::SeekToLast() { + database_->IteratorSeekToLast(iterator_id_, &valid_, &status_, &key_, + &value_); +} + +void RemoteIterator::Seek(const Slice& target) { + database_->IteratorSeek(iterator_id_, GetArrayFor(target), &valid_, &status_, + &key_, &value_); +} + +void RemoteIterator::Next() { + database_->IteratorNext(iterator_id_, &valid_, &status_, &key_, &value_); +} + +void RemoteIterator::Prev() { + database_->IteratorPrev(iterator_id_, &valid_, &status_, &key_, &value_); +} + +Slice RemoteIterator::key() const { + return GetSliceFor(key_); +} + +Slice RemoteIterator::value() const { + return GetSliceFor(value_); +} + +Status RemoteIterator::status() const { + return DatabaseErrorToStatus(status_, GetSliceFor(key_), GetSliceFor(value_)); +} + +} // namespace leveldb
diff --git a/components/leveldb/public/cpp/remote_iterator.h b/components/leveldb/public/cpp/remote_iterator.h new file mode 100644 index 0000000..056a2bf96 --- /dev/null +++ b/components/leveldb/public/cpp/remote_iterator.h
@@ -0,0 +1,50 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_LEVELDB_PUBLIC_CPP_REMOTE_ITERATOR_H_ +#define COMPONENTS_LEVELDB_PUBLIC_CPP_REMOTE_ITERATOR_H_ + +#include "components/leveldb/public/interfaces/leveldb.mojom.h" +#include "mojo/public/cpp/bindings/array.h" +#include "third_party/leveldatabase/src/include/leveldb/iterator.h" + +namespace leveldb { + +class LevelDBDatabase; + +// A wrapper around the raw iterator movement methods on the mojo leveldb +// interface to allow drop in replacement to current leveldb usage. +// +// Note: Next(), Prev() and all the Seek*() calls cause mojo sync calls. +class RemoteIterator : public Iterator { + public: + RemoteIterator(LevelDBDatabase* database, uint64_t iterator_id); + ~RemoteIterator() override; + + // Overridden from leveldb::Iterator: + bool Valid() const override; + void SeekToFirst() override; + void SeekToLast() override; + void Seek(const Slice& target) override; + void Next() override; + void Prev() override; + Slice key() const override; + Slice value() const override; + Status status() const override; + + private: + LevelDBDatabase* database_; + uint64_t iterator_id_; + + bool valid_; + DatabaseError status_; + mojo::Array<uint8_t> key_; + mojo::Array<uint8_t> value_; + + DISALLOW_COPY_AND_ASSIGN(RemoteIterator); +}; + +} // namespace leveldb + +#endif // COMPONENTS_LEVELDB_PUBLIC_CPP_REMOTE_ITERATOR_H_
diff --git a/components/leveldb/public/cpp/util.cc b/components/leveldb/public/cpp/util.cc new file mode 100644 index 0000000..3d60ea2 --- /dev/null +++ b/components/leveldb/public/cpp/util.cc
@@ -0,0 +1,63 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/leveldb/public/cpp/util.h" + +#include "third_party/leveldatabase/src/include/leveldb/status.h" + +namespace leveldb { + +DatabaseError LeveldbStatusToError(const leveldb::Status& s) { + if (s.ok()) + return DatabaseError::OK; + if (s.IsNotFound()) + return DatabaseError::NOT_FOUND; + if (s.IsCorruption()) + return DatabaseError::CORRUPTION; + if (s.IsNotSupportedError()) + return DatabaseError::NOT_SUPPORTED; + if (s.IsIOError()) + return DatabaseError::IO_ERROR; + return DatabaseError::INVALID_ARGUMENT; +} + +leveldb::Status DatabaseErrorToStatus(DatabaseError e, + const Slice& msg, + const Slice& msg2) { + switch (e) { + case DatabaseError::OK: + return leveldb::Status::OK(); + case DatabaseError::NOT_FOUND: + return leveldb::Status::NotFound(msg, msg2); + case DatabaseError::CORRUPTION: + return leveldb::Status::Corruption(msg, msg2); + case DatabaseError::NOT_SUPPORTED: + return leveldb::Status::NotSupported(msg, msg2); + case DatabaseError::INVALID_ARGUMENT: + return leveldb::Status::InvalidArgument(msg, msg2); + case DatabaseError::IO_ERROR: + return leveldb::Status::IOError(msg, msg2); + } + + // This will never be reached, but we still have configurations which don't + // do switch enum checking. + return leveldb::Status::InvalidArgument(msg, msg2); +} + +leveldb::Slice GetSliceFor(const mojo::Array<uint8_t>& key) { + if (key.size() == 0) + return leveldb::Slice(); + return leveldb::Slice(reinterpret_cast<const char*>(&key.front()), + key.size()); +} + +mojo::Array<uint8_t> GetArrayFor(const leveldb::Slice& s) { + if (s.size() == 0) + return mojo::Array<uint8_t>(); + return mojo::Array<uint8_t>(std::vector<uint8_t>( + reinterpret_cast<const uint8_t*>(s.data()), + reinterpret_cast<const uint8_t*>(s.data() + s.size()))); +} + +} // namespace leveldb
diff --git a/components/leveldb/public/cpp/util.h b/components/leveldb/public/cpp/util.h new file mode 100644 index 0000000..2540be5 --- /dev/null +++ b/components/leveldb/public/cpp/util.h
@@ -0,0 +1,35 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_LEVELDB_PUBLIC_CPP_UTIL_H_ +#define COMPONENTS_LEVELDB_PUBLIC_CPP_UTIL_H_ + +#include "components/leveldb/public/interfaces/leveldb.mojom.h" + +namespace leveldb { + +class Slice; +class Status; + +// Builds a mojo DatabaseError from a leveldb::Status object. +DatabaseError LeveldbStatusToError(const leveldb::Status& s); + +// Creates a leveldb Status object form a database error and two optional +// messages. A mojoification of the various static leveldb::Status +// constructors. +leveldb::Status DatabaseErrorToStatus(DatabaseError e, + const Slice& msg, + const Slice& msg2); + +// Builds a Slice pointing to the data inside |a|. This is not a type-converter +// as it is not a copy operation; the returned Slice points into |a| and must +// outlive |a|. +leveldb::Slice GetSliceFor(const mojo::Array<uint8_t>& a); + +// Copies the data that |s| points to into a mojo::Array. +mojo::Array<uint8_t> GetArrayFor(const leveldb::Slice& s); + +} // namespace leveldb + +#endif // COMPONENTS_LEVELDB_PUBLIC_CPP_UTIL_H_
diff --git a/components/leveldb/public/interfaces/leveldb.mojom b/components/leveldb/public/interfaces/leveldb.mojom index d595f315..72bcc69 100644 --- a/components/leveldb/public/interfaces/leveldb.mojom +++ b/components/leveldb/public/interfaces/leveldb.mojom
@@ -26,12 +26,42 @@ array<uint8>? value; }; +// Options which control the behavior of a database. (This struct corresponds +// with the struct in leveldb's options.h.) +struct OpenOptions { + // TODO(erg): Find all comparators and copy them into the service. + + // If true, the database will be created if it is missing. + bool create_if_missing = false; + + // If true, an error is raised if the database already exists. + bool error_if_exists = false; + + // If true, the implementation will do aggressive checking of the + // data it is processing and will stop early if it detects any + // errors. + bool paranoid_checks = false; + + // Default size is 4 megabytes. + uint64 write_buffer_size = 4194304; + + // Number of open files that can be used by the DB. (Note: we globally set + // the default here to 80 instead of leveldb's default 1000 because we don't + // want to consume all file descriptors. See + // https://code.google.com/p/chromium/issues/detail?id=227313#c11 for + // details.) + int32 max_open_files = 80; +}; + // Service which hands out databases. interface LevelDBService { - // TODO(erg): What options do we want to export? All? None? Open(filesystem.Directory directory, string dbname, LevelDBDatabase& database) => (DatabaseError status); + OpenWithOptions(OpenOptions options, + filesystem.Directory directory, + string dbname, + LevelDBDatabase& database) => (DatabaseError status); OpenInMemory(LevelDBDatabase& database) => (DatabaseError status); }; @@ -65,4 +95,37 @@ // value. Otherwise return NOT_FOUND. GetFromSnapshot(uint64 snapshot_id, array<uint8> key) => (DatabaseError status, array<uint8> value); + + // Iteartors ------------------------------------------------------------- + + // Creates an iterator, either from the current view or from a snapshot. + NewIterator() => (uint64 iterator_id); + NewIteratorFromSnapshot(uint64 snapshot_id) => (uint64 iterator_id); + + ReleaseIterator(uint64 iterator_id); + + // Positions the iterator at the first key, last key, or the first key after + // |target|. + [Sync] + IteratorSeekToFirst(uint64 iterator_id) + => (bool valid, DatabaseError status, array<uint8>? key, + array<uint8>? value); + [Sync] + IteratorSeekToLast(uint64 iterator_id) + => (bool valid, DatabaseError status, array<uint8>? key, + array<uint8>? value); + [Sync] + IteratorSeek(uint64 iterator_id, array<uint8> target) + => (bool valid, DatabaseError status, array<uint8>? key, + array<uint8>? value); + + // Moves forward or backwards in iterator space. + [Sync] + IteratorNext(uint64 iterator_id) + => (bool valid, DatabaseError status, array<uint8>? key, + array<uint8>? value); + [Sync] + IteratorPrev(uint64 iterator_id) + => (bool valid, DatabaseError status, array<uint8>? key, + array<uint8>? value); };
diff --git a/components/leveldb/remote_iterator_unittest.cc b/components/leveldb/remote_iterator_unittest.cc new file mode 100644 index 0000000..6b97129 --- /dev/null +++ b/components/leveldb/remote_iterator_unittest.cc
@@ -0,0 +1,146 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <map> + +#include "base/macros.h" +#include "components/leveldb/public/cpp/remote_iterator.h" +#include "components/leveldb/public/interfaces/leveldb.mojom.h" +#include "mojo/common/common_type_converters.h" +#include "mojo/shell/public/cpp/shell_connection.h" +#include "mojo/shell/public/cpp/shell_test.h" +#include "mojo/util/capture_util.h" + +using mojo::Capture; + +namespace leveldb { +namespace { + +class RemoteIteratorTest : public mojo::test::ShellTest { + public: + RemoteIteratorTest() : ShellTest("exe:leveldb_service_unittests") {} + ~RemoteIteratorTest() override {} + + protected: + // Overridden from mojo::test::ApplicationTestBase: + void SetUp() override { + ShellTest::SetUp(); + connector()->ConnectToInterface("mojo:leveldb", &leveldb_); + + DatabaseError error; + leveldb()->OpenInMemory(GetProxy(&database_), Capture(&error)); + ASSERT_TRUE(leveldb().WaitForIncomingResponse()); + EXPECT_EQ(DatabaseError::OK, error); + + std::map<std::string, std::string> data{ + {"a", "first"}, {"b:suffix", "second"}, {"c", "third"}}; + + for (auto p : data) { + // Write a key to the database. + error = DatabaseError::INVALID_ARGUMENT; + database_->Put(mojo::Array<uint8_t>::From(p.first), + mojo::Array<uint8_t>::From(p.second), Capture(&error)); + ASSERT_TRUE(database_.WaitForIncomingResponse()); + EXPECT_EQ(DatabaseError::OK, error); + } + } + + void TearDown() override { + leveldb_.reset(); + ShellTest::TearDown(); + } + + LevelDBServicePtr& leveldb() { return leveldb_; } + LevelDBDatabasePtr& database() { return database_; } + + private: + LevelDBServicePtr leveldb_; + LevelDBDatabasePtr database_; + + DISALLOW_COPY_AND_ASSIGN(RemoteIteratorTest); +}; + +TEST_F(RemoteIteratorTest, Seeking) { + uint64_t iterator_id = 0; + database()->NewIterator(Capture(&iterator_id)); + ASSERT_TRUE(database().WaitForIncomingResponse()); + EXPECT_NE(0u, iterator_id); + + RemoteIterator it(database().get(), iterator_id); + EXPECT_FALSE(it.Valid()); + + it.SeekToFirst(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("a", it.key()); + EXPECT_EQ("first", it.value()); + + it.SeekToLast(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("c", it.key()); + EXPECT_EQ("third", it.value()); + + it.Seek("b"); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("b:suffix", it.key()); + EXPECT_EQ("second", it.value()); +} + +TEST_F(RemoteIteratorTest, Next) { + uint64_t iterator_id = 0; + database()->NewIterator(Capture(&iterator_id)); + ASSERT_TRUE(database().WaitForIncomingResponse()); + EXPECT_NE(0u, iterator_id); + + RemoteIterator it(database().get(), iterator_id); + EXPECT_FALSE(it.Valid()); + + it.SeekToFirst(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("a", it.key()); + EXPECT_EQ("first", it.value()); + + it.Next(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("b:suffix", it.key()); + EXPECT_EQ("second", it.value()); + + it.Next(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("c", it.key()); + EXPECT_EQ("third", it.value()); + + it.Next(); + EXPECT_FALSE(it.Valid()); +} + +TEST_F(RemoteIteratorTest, Prev) { + uint64_t iterator_id = 0; + database()->NewIterator(Capture(&iterator_id)); + ASSERT_TRUE(database().WaitForIncomingResponse()); + EXPECT_NE(0u, iterator_id); + + RemoteIterator it(database().get(), iterator_id); + EXPECT_FALSE(it.Valid()); + + it.SeekToLast(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("c", it.key()); + EXPECT_EQ("third", it.value()); + + it.Prev(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("b:suffix", it.key()); + EXPECT_EQ("second", it.value()); + + it.Prev(); + EXPECT_TRUE(it.Valid()); + EXPECT_EQ("a", it.key()); + EXPECT_EQ("first", it.value()); + + it.Prev(); + EXPECT_FALSE(it.Valid()); +} + +} // namespace +} // namespace leveldb
diff --git a/components/leveldb/util.cc b/components/leveldb/util.cc deleted file mode 100644 index cffee8d0..0000000 --- a/components/leveldb/util.cc +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/leveldb/util.h" - -#include "third_party/leveldatabase/src/include/leveldb/status.h" - -namespace leveldb { - -DatabaseError LeveldbStatusToError(const leveldb::Status& s) { - if (s.ok()) - return DatabaseError::OK; - if (s.IsNotFound()) - return DatabaseError::NOT_FOUND; - if (s.IsCorruption()) - return DatabaseError::CORRUPTION; - if (s.IsNotSupportedError()) - return DatabaseError::NOT_SUPPORTED; - if (s.IsIOError()) - return DatabaseError::IO_ERROR; - return DatabaseError::INVALID_ARGUMENT; -} - -leveldb::Slice GetSliceFor(const mojo::Array<uint8_t>& key) { - if (key.size() == 0) - return leveldb::Slice(); - return leveldb::Slice(reinterpret_cast<const char*>(&key.front()), - key.size()); -} - -} // namespace leveldb
diff --git a/components/leveldb/util.h b/components/leveldb/util.h deleted file mode 100644 index cf7a129..0000000 --- a/components/leveldb/util.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_LEVELDB_UTIL_H_ -#define COMPONENTS_LEVELDB_UTIL_H_ - -#include "components/leveldb/public/interfaces/leveldb.mojom.h" - -namespace leveldb { - -class Slice; -class Status; - -DatabaseError LeveldbStatusToError(const leveldb::Status& s); - -// Builds a Slice pointing to the data inside |a|. This is not a type-converter -// as it is not a copy operation; the returned Slice points into |a| and must -// outlive |a|. -leveldb::Slice GetSliceFor(const mojo::Array<uint8_t>& a); - -} // namespace leveldb - -#endif // COMPONENTS_LEVELDB_UTIL_H_
diff --git a/components/metrics.gypi b/components/metrics.gypi index fe68519..959f052 100644 --- a/components/metrics.gypi +++ b/components/metrics.gypi
@@ -46,6 +46,8 @@ 'metrics/machine_id_provider.h', 'metrics/machine_id_provider_stub.cc', 'metrics/machine_id_provider_win.cc', + 'metrics/data_use_tracker.cc', + 'metrics/data_use_tracker.h', 'metrics/metrics_log.cc', 'metrics/metrics_log.h', 'metrics/metrics_log_manager.cc',
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn index a6c43f5..224070db 100644 --- a/components/metrics/BUILD.gn +++ b/components/metrics/BUILD.gn
@@ -20,6 +20,8 @@ "cloned_install_detector.h", "daily_event.cc", "daily_event.h", + "data_use_tracker.cc", + "data_use_tracker.h", "drive_metrics_provider.cc", "drive_metrics_provider.h", "drive_metrics_provider_android.cc", @@ -312,6 +314,7 @@ "call_stack_profile_metrics_provider_unittest.cc", "cloned_install_detector_unittest.cc", "daily_event_unittest.cc", + "data_use_tracker_unittest.cc", "drive_metrics_provider_unittest.cc", "histogram_encoder_unittest.cc", "machine_id_provider_win_unittest.cc",
diff --git a/components/metrics/data_use_tracker.cc b/components/metrics/data_use_tracker.cc new file mode 100644 index 0000000..a74bdf1 --- /dev/null +++ b/components/metrics/data_use_tracker.cc
@@ -0,0 +1,205 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/metrics/data_use_tracker.h" + +#include <string> + +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" +#include "components/metrics/metrics_pref_names.h" +#include "components/prefs/scoped_user_pref_update.h" +#include "components/variations/variations_associated_data.h" + +namespace metrics { + +namespace { + +// This function is for forwarding metrics usage pref changes to the appropriate +// callback on the appropriate thread. +// TODO(gayane): Reduce the frequency of posting tasks from IO to UI thread. +void UpdateMetricsUsagePrefs( + const UpdateUsagePrefCallbackType& update_on_ui_callback, + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + const std::string& service_name, + int message_size, + bool is_cellular) { + ui_task_runner->PostTask( + FROM_HERE, base::Bind(update_on_ui_callback, service_name, message_size, + is_cellular)); +} + +} // namespace + +DataUseTracker::DataUseTracker(PrefService* local_state) + : local_state_(local_state), weak_ptr_factory_(this) {} + +DataUseTracker::~DataUseTracker() {} + +// static +scoped_ptr<DataUseTracker> DataUseTracker::Create(PrefService* local_state) { + scoped_ptr<DataUseTracker> data_use_tracker; + if (variations::GetVariationParamValue("UMA_EnableCellularLogUpload", + "Uma_Quota") != "" && + variations::GetVariationParamValue("UMA_EnableCellularLogUpload", + "Uma_Ratio") != "") { + data_use_tracker.reset(new DataUseTracker(local_state)); + } + return data_use_tracker; +} + +// static +void DataUseTracker::RegisterPrefs(PrefRegistrySimple* registry) { + registry->RegisterDictionaryPref(metrics::prefs::kUserCellDataUse); + registry->RegisterDictionaryPref(metrics::prefs::kUmaCellDataUse); +} + +UpdateUsagePrefCallbackType DataUseTracker::GetDataUseForwardingCallback( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner) { + DCHECK(ui_task_runner->RunsTasksOnCurrentThread()); + + return base::Bind( + &UpdateMetricsUsagePrefs, + base::Bind(&DataUseTracker::UpdateMetricsUsagePrefsOnUIThread, + weak_ptr_factory_.GetWeakPtr()), + ui_task_runner); +} + +bool DataUseTracker::ShouldUploadLogOnCellular(int log_bytes) { + DCHECK(thread_checker_.CalledOnValidThread()); + + RemoveExpiredEntries(); + + int uma_weekly_quota_bytes; + if (!GetUmaWeeklyQuota(&uma_weekly_quota_bytes)) + return true; + + int uma_total_data_use = ComputeTotalDataUse(prefs::kUmaCellDataUse); + int new_uma_total_data_use = log_bytes + uma_total_data_use; + // If the new log doesn't increase the total UMA traffic to be above the + // allowed quota then the log should be uploaded. + if (new_uma_total_data_use <= uma_weekly_quota_bytes) + return true; + + double uma_ratio; + if (!GetUmaRatio(&uma_ratio)) + return true; + + int user_total_data_use = ComputeTotalDataUse(prefs::kUserCellDataUse); + // If after adding the new log the uma ratio is still under the allowed ratio + // then the log should be uploaded and vice versa. + return new_uma_total_data_use / + static_cast<double>(log_bytes + user_total_data_use) <= + uma_ratio; +} + +void DataUseTracker::UpdateMetricsUsagePrefsOnUIThread( + const std::string& service_name, + int message_size, + bool is_celllular) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (!is_celllular) + return; + + UpdateUsagePref(prefs::kUserCellDataUse, message_size); + if (service_name == "UMA") + UpdateUsagePref(prefs::kUmaCellDataUse, message_size); +} + +void DataUseTracker::UpdateUsagePref(const std::string& pref_name, + int message_size) { + DCHECK(thread_checker_.CalledOnValidThread()); + + DictionaryPrefUpdate pref_updater(local_state_, pref_name); + int todays_traffic = 0; + std::string todays_key = GetCurrentMeasurementDateAsString(); + + const base::DictionaryValue* user_pref_dict = + local_state_->GetDictionary(pref_name); + user_pref_dict->GetInteger(todays_key, &todays_traffic); + pref_updater->SetInteger(todays_key, todays_traffic + message_size); +} + +void DataUseTracker::RemoveExpiredEntries() { + DCHECK(thread_checker_.CalledOnValidThread()); + RemoveExpiredEntriesForPref(prefs::kUmaCellDataUse); + RemoveExpiredEntriesForPref(prefs::kUserCellDataUse); +} + +void DataUseTracker::RemoveExpiredEntriesForPref(const std::string& pref_name) { + DCHECK(thread_checker_.CalledOnValidThread()); + + const base::DictionaryValue* user_pref_dict = + local_state_->GetDictionary(pref_name); + const base::Time current_date = GetCurrentMeasurementDate(); + const base::Time week_ago = current_date - base::TimeDelta::FromDays(7); + + base::DictionaryValue user_pref_new_dict; + for (base::DictionaryValue::Iterator it(*user_pref_dict); !it.IsAtEnd(); + it.Advance()) { + base::Time key_date; + base::Time::FromUTCString(it.key().c_str(), &key_date); + if (key_date > week_ago) + user_pref_new_dict.Set(it.key(), it.value().CreateDeepCopy()); + } + local_state_->Set(pref_name, user_pref_new_dict); +} + +// Note: We compute total data use regardless of what is the current date. In +// scenario when user travels back in time zone and current date becomes earlier +// than latest registered date in perf, we still count that in total use as user +// actually used that data. +int DataUseTracker::ComputeTotalDataUse(const std::string& pref_name) { + DCHECK(thread_checker_.CalledOnValidThread()); + + int total_data_use = 0; + const base::DictionaryValue* pref_dict = + local_state_->GetDictionary(pref_name); + for (base::DictionaryValue::Iterator it(*pref_dict); !it.IsAtEnd(); + it.Advance()) { + int value = 0; + it.value().GetAsInteger(&value); + total_data_use += value; + } + return total_data_use; +} + +bool DataUseTracker::GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const { + DCHECK(thread_checker_.CalledOnValidThread()); + + std::string param_value_str = variations::GetVariationParamValue( + "UMA_EnableCellularLogUpload", "Uma_Quota"); + if (param_value_str.empty()) + return false; + + base::StringToInt(param_value_str, uma_weekly_quota_bytes); + return true; +} + +bool DataUseTracker::GetUmaRatio(double* ratio) const { + DCHECK(thread_checker_.CalledOnValidThread()); + + std::string param_value_str = variations::GetVariationParamValue( + "UMA_EnableCellularLogUpload", "Uma_Ratio"); + if (param_value_str.empty()) + return false; + base::StringToDouble(param_value_str, ratio); + return true; +} + +base::Time DataUseTracker::GetCurrentMeasurementDate() const { + return base::Time::Now().LocalMidnight(); +} + +std::string DataUseTracker::GetCurrentMeasurementDateAsString() const { + DCHECK(thread_checker_.CalledOnValidThread()); + + base::Time::Exploded today_exploded; + GetCurrentMeasurementDate().LocalExplode(&today_exploded); + return base::StringPrintf("%04d-%02d-%02d", today_exploded.year, + today_exploded.month, today_exploded.day_of_month); +} + +} // namespace metrics
diff --git a/components/metrics/data_use_tracker.h b/components/metrics/data_use_tracker.h new file mode 100644 index 0000000..5682a0c0 --- /dev/null +++ b/components/metrics/data_use_tracker.h
@@ -0,0 +1,99 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_METRICS_DATA_USE_TRACKER_H_ +#define COMPONENTS_METRICS_DATA_USE_TRACKER_H_ + +#include <string> + +#include "base/callback.h" +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" +#include "base/threading/thread_checker.h" +#include "base/time/time.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" + +namespace metrics { + +typedef base::Callback<void(const std::string&, int, bool)> + UpdateUsagePrefCallbackType; + +// Records the data use of user traffic and UMA traffic in user prefs. Taking +// into account those prefs it can verify whether certain UMA log upload is +// allowed. +class DataUseTracker { + public: + explicit DataUseTracker(PrefService* local_state); + ~DataUseTracker(); + + // Returns an instance of |DataUseTracker| with provided |local_state| if + // users data use should be tracked and null pointer otherwise. + static scoped_ptr<DataUseTracker> Create(PrefService* local_state); + + // Registers data use prefs using provided |registry|. + static void RegisterPrefs(PrefRegistrySimple* registry); + + // Returns a callback to data use pref updating function. Should be called on + // UI thread. + UpdateUsagePrefCallbackType GetDataUseForwardingCallback( + scoped_refptr<base::SequencedTaskRunner> ui_task_runner); + + // Returns whether a log with provided |log_bytes| can be uploaded according + // to data use ratio and UMA quota provided by variations. + bool ShouldUploadLogOnCellular(int log_bytes); + + private: + FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckUpdateUsagePref); + FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckRemoveExpiredEntries); + FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckComputeTotalDataUse); + FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckCanUploadUMALog); + + // Updates data usage prefs on UI thread according to what Prefservice + // expects. + void UpdateMetricsUsagePrefsOnUIThread(const std::string& service_name, + int message_size, + bool is_cellular); + + // Updates provided |pref_name| for a current date with the given message + // size. + void UpdateUsagePref(const std::string& pref_name, int message_size); + + // Removes entries from the all data use prefs. + void RemoveExpiredEntries(); + + // Removes entries from the given |pref_name| if they are more than 7 days + // old. + void RemoveExpiredEntriesForPref(const std::string& pref_name); + + // Computes data usage according to all the entries in the given dictionary + // pref. + int ComputeTotalDataUse(const std::string& pref_name); + + // Returns the weekly allowed quota for UMA data use. + virtual bool GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const; + + // Returns the allowed ratio for UMA data use over overall data use. + virtual bool GetUmaRatio(double* ratio) const; + + // Returns the current date for measurement. + virtual base::Time GetCurrentMeasurementDate() const; + + // Returns the current date as a string with a proper formatting. + virtual std::string GetCurrentMeasurementDateAsString() const; + + PrefService* local_state_; + + base::ThreadChecker thread_checker_; + + base::WeakPtrFactory<DataUseTracker> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(DataUseTracker); +}; + +} // namespace metrics +#endif // COMPONENTS_METRICS_DATA_USE_TRACKER_H_
diff --git a/components/metrics/data_use_tracker_unittest.cc b/components/metrics/data_use_tracker_unittest.cc new file mode 100644 index 0000000..ed32a4a --- /dev/null +++ b/components/metrics/data_use_tracker_unittest.cc
@@ -0,0 +1,206 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/metrics/data_use_tracker.h" + +#include "base/strings/stringprintf.h" +#include "components/metrics/metrics_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace metrics { + +namespace { + +const char kTodayStr[] = "2016-03-16"; +const char kYesterdayStr[] = "2016-03-15"; +const char kExpiredDateStr1[] = "2016-03-09"; +const char kExpiredDateStr2[] = "2016-03-01"; + +class TestDataUsePrefService : public TestingPrefServiceSimple { + public: + TestDataUsePrefService() { + registry()->RegisterDictionaryPref(metrics::prefs::kUserCellDataUse); + registry()->RegisterDictionaryPref(metrics::prefs::kUmaCellDataUse); + } + + void ClearDataUsePrefs() { + ClearPref(metrics::prefs::kUserCellDataUse); + ClearPref(metrics::prefs::kUmaCellDataUse); + } + + private: + DISALLOW_COPY_AND_ASSIGN(TestDataUsePrefService); +}; + +class FakeDataUseTracker : public DataUseTracker { + public: + FakeDataUseTracker(PrefService* local_state) : DataUseTracker(local_state) {} + + bool GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const override { + *uma_weekly_quota_bytes = 200; + return true; + } + + bool GetUmaRatio(double* ratio) const override { + *ratio = 0.05; + return true; + } + + base::Time GetCurrentMeasurementDate() const override { + base::Time today_for_test; + base::Time::FromUTCString(kTodayStr, &today_for_test); + return today_for_test; + } + + std::string GetCurrentMeasurementDateAsString() const override { + return kTodayStr; + } + + private: + DISALLOW_COPY_AND_ASSIGN(FakeDataUseTracker); +}; + +// Sets up data usage prefs with mock values so that UMA traffic is above the +// allowed ratio. +void SetPrefTestValuesOverRatio(PrefService* local_state) { + base::DictionaryValue user_pref_dict; + user_pref_dict.SetInteger(kTodayStr, 2 * 100); + user_pref_dict.SetInteger(kYesterdayStr, 2 * 100); + user_pref_dict.SetInteger(kExpiredDateStr1, 2 * 100); + user_pref_dict.SetInteger(kExpiredDateStr2, 2 * 100); + local_state->Set(prefs::kUserCellDataUse, user_pref_dict); + + base::DictionaryValue uma_pref_dict; + uma_pref_dict.SetInteger(kTodayStr, 50); + uma_pref_dict.SetInteger(kYesterdayStr, 50); + uma_pref_dict.SetInteger(kExpiredDateStr1, 50); + uma_pref_dict.SetInteger(kExpiredDateStr2, 50); + local_state->Set(prefs::kUmaCellDataUse, uma_pref_dict); +} + +// Sets up data usage prefs with mock values which can be valid. +void SetPrefTestValuesValidRatio(PrefService* local_state) { + base::DictionaryValue user_pref_dict; + user_pref_dict.SetInteger(kTodayStr, 100 * 100); + user_pref_dict.SetInteger(kYesterdayStr, 100 * 100); + user_pref_dict.SetInteger(kExpiredDateStr1, 100 * 100); + user_pref_dict.SetInteger(kExpiredDateStr2, 100 * 100); + local_state->Set(prefs::kUserCellDataUse, user_pref_dict); + + // Should be 4% of user traffic + base::DictionaryValue uma_pref_dict; + uma_pref_dict.SetInteger(kTodayStr, 4 * 100); + uma_pref_dict.SetInteger(kYesterdayStr, 4 * 100); + uma_pref_dict.SetInteger(kExpiredDateStr1, 4 * 100); + uma_pref_dict.SetInteger(kExpiredDateStr2, 4 * 100); + local_state->Set(prefs::kUmaCellDataUse, uma_pref_dict); +} + +} // namespace + +TEST(DataUseTrackerTest, CheckUpdateUsagePref) { + TestDataUsePrefService local_state; + FakeDataUseTracker data_use_tracker(&local_state); + local_state.ClearDataUsePrefs(); + + int user_pref_value = 0; + int uma_pref_value = 0; + + data_use_tracker.UpdateMetricsUsagePrefsOnUIThread("", 2 * 100, true); + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kTodayStr, &user_pref_value); + EXPECT_EQ(2 * 100, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kTodayStr, &uma_pref_value); + EXPECT_EQ(0, uma_pref_value); + + data_use_tracker.UpdateMetricsUsagePrefsOnUIThread("UMA", 100, true); + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kTodayStr, &user_pref_value); + EXPECT_EQ(3 * 100, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kTodayStr, &uma_pref_value); + EXPECT_EQ(100, uma_pref_value); +} + +TEST(DataUseTrackerTest, CheckRemoveExpiredEntries) { + TestDataUsePrefService local_state; + FakeDataUseTracker data_use_tracker(&local_state); + local_state.ClearDataUsePrefs(); + SetPrefTestValuesOverRatio(&local_state); + data_use_tracker.RemoveExpiredEntries(); + + int user_pref_value = 0; + int uma_pref_value = 0; + + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kExpiredDateStr1, &user_pref_value); + EXPECT_EQ(0, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kExpiredDateStr1, &uma_pref_value); + EXPECT_EQ(0, uma_pref_value); + + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kExpiredDateStr2, &user_pref_value); + EXPECT_EQ(0, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kExpiredDateStr2, &uma_pref_value); + EXPECT_EQ(0, uma_pref_value); + + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kTodayStr, &user_pref_value); + EXPECT_EQ(2 * 100, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kTodayStr, &uma_pref_value); + EXPECT_EQ(50, uma_pref_value); + + local_state.GetDictionary(prefs::kUserCellDataUse) + ->GetInteger(kYesterdayStr, &user_pref_value); + EXPECT_EQ(2 * 100, user_pref_value); + local_state.GetDictionary(prefs::kUmaCellDataUse) + ->GetInteger(kYesterdayStr, &uma_pref_value); + EXPECT_EQ(50, uma_pref_value); +} + +TEST(DataUseTrackerTest, CheckComputeTotalDataUse) { + TestDataUsePrefService local_state; + FakeDataUseTracker data_use_tracker(&local_state); + local_state.ClearDataUsePrefs(); + SetPrefTestValuesOverRatio(&local_state); + + int user_data_use = + data_use_tracker.ComputeTotalDataUse(prefs::kUserCellDataUse); + EXPECT_EQ(8 * 100, user_data_use); + int uma_data_use = + data_use_tracker.ComputeTotalDataUse(prefs::kUmaCellDataUse); + EXPECT_EQ(4 * 50, uma_data_use); +} + +TEST(DataUseTrackerTest, CheckShouldUploadLogOnCellular) { + TestDataUsePrefService local_state; + FakeDataUseTracker data_use_tracker(&local_state); + local_state.ClearDataUsePrefs(); + SetPrefTestValuesOverRatio(&local_state); + + bool can_upload = data_use_tracker.ShouldUploadLogOnCellular(50); + EXPECT_TRUE(can_upload); + can_upload = data_use_tracker.ShouldUploadLogOnCellular(100); + EXPECT_TRUE(can_upload); + can_upload = data_use_tracker.ShouldUploadLogOnCellular(150); + EXPECT_FALSE(can_upload); + + local_state.ClearDataUsePrefs(); + SetPrefTestValuesValidRatio(&local_state); + can_upload = data_use_tracker.ShouldUploadLogOnCellular(100); + EXPECT_TRUE(can_upload); + // this is about 0.49% + can_upload = data_use_tracker.ShouldUploadLogOnCellular(200); + EXPECT_TRUE(can_upload); + can_upload = data_use_tracker.ShouldUploadLogOnCellular(300); + EXPECT_FALSE(can_upload); +} + +} // namespace metrics
diff --git a/components/metrics/metrics_pref_names.cc b/components/metrics/metrics_pref_names.cc index 6eb58fa8..3872061 100644 --- a/components/metrics/metrics_pref_names.cc +++ b/components/metrics/metrics_pref_names.cc
@@ -169,5 +169,13 @@ "uninstall_metrics.page_load_count"; const char kUninstallMetricsUptimeSec[] = "uninstall_metrics.uptime_sec"; +// Dictionary for measuring cellular data used by UMA service during last 7 +// days. +const char kUmaCellDataUse[] = "user_experience_metrics.uma_cell_datause"; + +// Dictionary for measuring cellular data used by user including chrome services +// per day. +const char kUserCellDataUse[] = "user_experience_metrics.user_call_datause"; + } // namespace prefs } // namespace metrics
diff --git a/components/metrics/metrics_pref_names.h b/components/metrics/metrics_pref_names.h index 15f5aca..52733611 100644 --- a/components/metrics/metrics_pref_names.h +++ b/components/metrics/metrics_pref_names.h
@@ -53,6 +53,11 @@ extern const char kUninstallLaunchCount[]; extern const char kUninstallMetricsPageLoadCount[]; extern const char kUninstallMetricsUptimeSec[]; + +// For measuring data use for throttling UMA log uploads on cellular. +extern const char kUmaCellDataUse[]; +extern const char kUserCellDataUse[]; + } // namespace prefs } // namespace metrics
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index b44b4eb..315229b 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -149,6 +149,7 @@ #include "base/tracked_objects.h" #include "base/values.h" #include "build/build_config.h" +#include "components/metrics/data_use_tracker.h" #include "components/metrics/metrics_log.h" #include "components/metrics/metrics_log_manager.h" #include "components/metrics/metrics_log_uploader.h" @@ -258,6 +259,7 @@ DCHECK(IsSingleThreaded()); MetricsStateManager::RegisterPrefs(registry); MetricsLog::RegisterPrefs(registry); + DataUseTracker::RegisterPrefs(registry); registry->RegisterInt64Pref(prefs::kInstallDate, 0); @@ -294,6 +296,7 @@ log_upload_in_progress_(false), idle_since_last_transmission_(false), session_id_(-1), + data_use_tracker_(DataUseTracker::Create(local_state_)), self_ptr_factory_(this), state_saver_factory_(this) { DCHECK(IsSingleThreaded()); @@ -545,6 +548,16 @@ log_manager_.StoreLog(log, MetricsLog::ONGOING_LOG); } +UpdateUsagePrefCallbackType MetricsService::GetDataUseForwardingCallback() { + DCHECK(IsSingleThreaded()); + + if (data_use_tracker_) { + return data_use_tracker_->GetDataUseForwardingCallback( + base::ThreadTaskRunnerHandle::Get()); + } + return UpdateUsagePrefCallbackType(); +} + //------------------------------------------------------------------------------ // private methods //------------------------------------------------------------------------------ @@ -866,7 +879,16 @@ } if (!log_manager_.has_staged_log()) log_manager_.StageNextLogForUpload(); - SendStagedLog(); + + // Proceed to stage the log for upload if log size satisfies cellular log + // upload constrains. + if (client_->IsUMACellularUploadLogicEnabled() && + !data_use_tracker_->ShouldUploadLogOnCellular( + log_manager_.staged_log_hash().size())) { + scheduler_->UploadCancelled(); + } else { + SendStagedLog(); + } } bool MetricsService::ProvidersHaveInitialStabilityMetrics() {
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h index ce4102b8..f02df4b 100644 --- a/components/metrics/metrics_service.h +++ b/components/metrics/metrics_service.h
@@ -27,6 +27,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "components/metrics/clean_exit_beacon.h" +#include "components/metrics/data_use_tracker.h" #include "components/metrics/metrics_log.h" #include "components/metrics/metrics_log_manager.h" #include "components/metrics/metrics_provider.h" @@ -214,6 +215,10 @@ // Pushes a log that has been generated by an external component. void PushExternalLog(const std::string& log); + // Returns a callback to data use pref updating function which can be called + // from any thread, but this function should be called on UI thread. + UpdateUsagePrefCallbackType GetDataUseForwardingCallback(); + protected: // Exposed for testing. MetricsLogManager* log_manager() { return &log_manager_; } @@ -468,7 +473,7 @@ // Execution phase the browser is in. static ExecutionPhase execution_phase_; - // Reduntant marker to check that we completed our shutdown, and set the + // Redundant marker to check that we completed our shutdown, and set the // exited-cleanly bit in the prefs. static ShutdownCleanliness clean_shutdown_status_; @@ -477,6 +482,9 @@ PermutedEntropyCacheClearedWhenLowEntropyReset); FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, RegisterSyntheticTrial); + // Pointer used for obtaining data use pref updater callback on above layers. + scoped_ptr<DataUseTracker> data_use_tracker_; + // Weak pointers factory used to post task on different threads. All weak // pointers managed by this factory have the same lifetime as MetricsService. base::WeakPtrFactory<MetricsService> self_ptr_factory_;
diff --git a/components/metrics/metrics_service_client.cc b/components/metrics/metrics_service_client.cc index 2a1635b..cd5b53c 100644 --- a/components/metrics/metrics_service_client.cc +++ b/components/metrics/metrics_service_client.cc
@@ -19,4 +19,8 @@ return DEFAULT_UNKNOWN; } +bool MetricsServiceClient::IsUMACellularUploadLogicEnabled() { + return false; +} + } // namespace metrics
diff --git a/components/metrics/metrics_service_client.h b/components/metrics/metrics_service_client.h index cde60e2c..43c5d136c 100644 --- a/components/metrics/metrics_service_client.h +++ b/components/metrics/metrics_service_client.h
@@ -117,6 +117,9 @@ // Gets information about the default value for the enable metrics reporting // checkbox shown during first-run. virtual EnableMetricsDefault GetDefaultOptIn(); + + // Returns whether cellular logic is enabled for metrics reporting. + virtual bool IsUMACellularUploadLogicEnabled(); }; } // namespace metrics
diff --git a/components/mus/DEPS b/components/mus/DEPS index 9ccd854..da5c6f43 100644 --- a/components/mus/DEPS +++ b/components/mus/DEPS
@@ -6,7 +6,6 @@ "+mojo/common", "+mojo/converters", "+mojo/public", - "+mojo/services/network/public", "+mojo/services/tracing/public", "+mojo/shell", "+third_party/skia/include",
diff --git a/components/mus/public/cpp/BUILD.gn b/components/mus/public/cpp/BUILD.gn index b4c7ed9..90a1e7b 100644 --- a/components/mus/public/cpp/BUILD.gn +++ b/components/mus/public/cpp/BUILD.gn
@@ -41,7 +41,6 @@ public_deps = [ "../interfaces", - "//mojo/services/network/public/interfaces", ] deps = [
diff --git a/components/mus/public/cpp/window_tree_delegate.h b/components/mus/public/cpp/window_tree_delegate.h index bd42b27..7717a39 100644 --- a/components/mus/public/cpp/window_tree_delegate.h +++ b/components/mus/public/cpp/window_tree_delegate.h
@@ -8,7 +8,6 @@ #include <string> #include "components/mus/public/interfaces/window_tree.mojom.h" -#include "mojo/services/network/public/interfaces/url_loader.mojom.h" #include "mojo/shell/public/interfaces/interface_provider.mojom.h" namespace mus {
diff --git a/components/mus/ws/display.cc b/components/mus/ws/display.cc index f8582f6..b607786 100644 --- a/components/mus/ws/display.cc +++ b/components/mus/ws/display.cc
@@ -21,6 +21,7 @@ #include "mojo/common/common_type_converters.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "mojo/shell/public/interfaces/connector.mojom.h" +#include "ui/base/cursor/cursor.h" namespace mus { namespace ws { @@ -30,7 +31,7 @@ : id_(window_server->display_manager()->GetAndAdvanceNextDisplayId()), window_server_(window_server), platform_display_(PlatformDisplay::Create(platform_display_init_params)), - last_cursor_(0) { + last_cursor_(ui::kCursorNone) { platform_display_->Init(this); window_server_->window_manager_factory_registry()->AddObserver(this); @@ -157,12 +158,12 @@ window_server_->user_id_tracker()->active_id()); } -void Display::SetFocusedWindow(ServerWindow* new_focused_window) { +bool Display::SetFocusedWindow(ServerWindow* new_focused_window) { ServerWindow* old_focused_window = focus_controller_->GetFocusedWindow(); if (old_focused_window == new_focused_window) - return; + return true; DCHECK(!new_focused_window || root_window()->Contains(new_focused_window)); - focus_controller_->SetFocusedWindow(new_focused_window); + return focus_controller_->SetFocusedWindow(new_focused_window); } ServerWindow* Display::GetFocusedWindow() {
diff --git a/components/mus/ws/display.h b/components/mus/ws/display.h index b83c11d91..ba7cebf5 100644 --- a/components/mus/ws/display.h +++ b/components/mus/ws/display.h
@@ -115,7 +115,9 @@ // TODO(sky): this should only be called by WindowServer, move to interface // used by WindowServer. - void SetFocusedWindow(ServerWindow* window); + // See description of WindowServer::SetFocusedWindow() for details on return + // value. + bool SetFocusedWindow(ServerWindow* window); // NOTE: this returns the focused window only if the focused window is in this // display. If this returns null focus may be in another display. ServerWindow* GetFocusedWindow();
diff --git a/components/mus/ws/display_unittest.cc b/components/mus/ws/display_unittest.cc index 5d54baa..ca573c98 100644 --- a/components/mus/ws/display_unittest.cc +++ b/components/mus/ws/display_unittest.cc
@@ -259,20 +259,26 @@ Display* display = *display_manager->displays().begin(); WindowManagerState* wms_for_id2 = display->GetWindowManagerStateForUser(kTestId2); + wms_for_id2->tree()->AddActivationParent( + ClientWindowIdForFirstRoot(wms_for_id2->tree())); ASSERT_TRUE(wms_for_id2); EXPECT_FALSE(wms_for_id2->IsActive()); + ClientWindowId child2_id; + NewWindowInTree(wms_for_id2->tree(), &child2_id); // Focus should fail for windows in inactive window managers. - EXPECT_FALSE(wms_for_id2->tree()->SetFocus( - ClientWindowIdForFirstRoot(wms_for_id2->tree()))); + EXPECT_FALSE(wms_for_id2->tree()->SetFocus(child2_id)); // Focus should succeed for the active window manager. WindowManagerState* wms_for_id1 = display->GetWindowManagerStateForUser(kTestId1); ASSERT_TRUE(wms_for_id1); + wms_for_id1->tree()->AddActivationParent( + ClientWindowIdForFirstRoot(wms_for_id1->tree())); + ClientWindowId child1_id; + NewWindowInTree(wms_for_id1->tree(), &child1_id); EXPECT_TRUE(wms_for_id1->IsActive()); - EXPECT_TRUE(wms_for_id1->tree()->SetFocus( - ClientWindowIdForFirstRoot(wms_for_id1->tree()))); + EXPECT_TRUE(wms_for_id1->tree()->SetFocus(child1_id)); } // Verifies clients are notified of focus changes in different displays.
diff --git a/components/mus/ws/focus_controller.cc b/components/mus/ws/focus_controller.cc index 6985893b..5728acbe1 100644 --- a/components/mus/ws/focus_controller.cc +++ b/components/mus/ws/focus_controller.cc
@@ -71,11 +71,11 @@ FocusController::~FocusController() { } -void FocusController::SetFocusedWindow(ServerWindow* window) { +bool FocusController::SetFocusedWindow(ServerWindow* window) { if (GetFocusedWindow() == window) - return; + return true; - SetFocusedWindowImpl(FocusControllerChangeSource::EXPLICIT, window); + return SetFocusedWindowImpl(FocusControllerChangeSource::EXPLICIT, window); } ServerWindow* FocusController::GetFocusedWindow() { @@ -207,11 +207,12 @@ return nullptr; } -void FocusController::SetFocusedWindowImpl( +bool FocusController::SetFocusedWindowImpl( FocusControllerChangeSource change_source, ServerWindow* window) { if (window && !CanBeFocused(window)) - return; + return false; + ServerWindow* old_focused = GetFocusedWindow(); DCHECK(!window || window->IsDrawn()); @@ -238,6 +239,7 @@ drawn_tracker_.reset(new ServerWindowDrawnTracker(track_window, this)); else drawn_tracker_.reset(); + return true; } void FocusController::OnDrawnStateWillChange(ServerWindow* ancestor,
diff --git a/components/mus/ws/focus_controller.h b/components/mus/ws/focus_controller.h index 113a1cba..1dea308a 100644 --- a/components/mus/ws/focus_controller.h +++ b/components/mus/ws/focus_controller.h
@@ -35,8 +35,9 @@ ~FocusController() override; // Sets the focused window. Does nothing if |window| is currently focused. - // This does not notify the delegate. - void SetFocusedWindow(ServerWindow* window); + // This does not notify the delegate. See ServerWindow::SetFocusedWindow() + // for details on return value. + bool SetFocusedWindow(ServerWindow* window); ServerWindow* GetFocusedWindow(); // Moves activation to the next activatable window. @@ -63,7 +64,7 @@ ServerWindow* GetActivatableAncestorOf(ServerWindow* window) const; // Implementation of SetFocusedWindow(). - void SetFocusedWindowImpl(FocusControllerChangeSource change_source, + bool SetFocusedWindowImpl(FocusControllerChangeSource change_source, ServerWindow* window); // ServerWindowDrawnTrackerObserver:
diff --git a/components/mus/ws/window_server.cc b/components/mus/ws/window_server.cc index 14e2c9af..c5195aa3 100644 --- a/components/mus/ws/window_server.cc +++ b/components/mus/ws/window_server.cc
@@ -237,7 +237,7 @@ delegate_->CreateDefaultDisplays(); } -void WindowServer::SetFocusedWindow(ServerWindow* window) { +bool WindowServer::SetFocusedWindow(ServerWindow* window) { // TODO(sky): this should fail if there is modal dialog active and |window| // is outside that. ServerWindow* currently_focused = GetFocusedWindow(); @@ -245,21 +245,21 @@ currently_focused ? display_manager_->GetDisplayContaining(currently_focused) : nullptr; - if (!window) { - if (focused_display) - focused_display->SetFocusedWindow(nullptr); - return; - } + if (!window) + return focused_display ? focused_display->SetFocusedWindow(nullptr) : true; + Display* display = display_manager_->GetDisplayContaining(window); DCHECK(display); // It's assumed callers do validation before calling this. - display->SetFocusedWindow(window); + const bool result = display->SetFocusedWindow(window); // If the focus actually changed, and focus was in another display, then we // need to notify the previously focused display so that it cleans up state // and notifies appropriately. - if (window && display->GetFocusedWindow() && display != focused_display && + if (result && display->GetFocusedWindow() && display != focused_display && focused_display) { - focused_display->SetFocusedWindow(nullptr); + const bool cleared_focus = focused_display->SetFocusedWindow(nullptr); + DCHECK(cleared_focus); } + return result; } ServerWindow* WindowServer::GetFocusedWindow() {
diff --git a/components/mus/ws/window_server.h b/components/mus/ws/window_server.h index b05efb8e..cf945a0d 100644 --- a/components/mus/ws/window_server.h +++ b/components/mus/ws/window_server.h
@@ -134,7 +134,10 @@ return &window_manager_factory_registry_; } - void SetFocusedWindow(ServerWindow* window); + // Sets focus to |window|. Returns true if |window| already has focus, or + // focus was successfully changed. Returns |false| if |window| is not a valid + // window to receive focus. + bool SetFocusedWindow(ServerWindow* window); ServerWindow* GetFocusedWindow(); // Returns a change id for the window manager that is associated with
diff --git a/components/mus/ws/window_tree.cc b/components/mus/ws/window_tree.cc index 61a37d0..b4624fb 100644 --- a/components/mus/ws/window_tree.cc +++ b/components/mus/ws/window_tree.cc
@@ -283,8 +283,7 @@ return false; Operation op(this, window_server_, OperationType::SET_FOCUS); - window_server_->SetFocusedWindow(window); - return true; + return window_server_->SetFocusedWindow(window); } bool WindowTree::Embed(const ClientWindowId& window_id, @@ -347,6 +346,15 @@ drawn); } +void WindowTree::AddActivationParent(const ClientWindowId& window_id) { + Display* host = GetDisplayForWindowManager(); + if (!host) + return; + ServerWindow* window = GetWindowByClientId(window_id); + if (window) + host->AddActivationParent(window); +} + void WindowTree::OnChangeCompleted(uint32_t change_id, bool success) { client()->OnChangeCompleted(change_id, success); } @@ -1282,13 +1290,7 @@ } void WindowTree::AddActivationParent(Id transport_window_id) { - Display* host = GetDisplayForWindowManager(); - if (!host) - return; - ServerWindow* window = - GetWindowByClientId(ClientWindowId(transport_window_id)); - if (window) - host->AddActivationParent(window); + AddActivationParent(ClientWindowId(transport_window_id)); } void WindowTree::RemoveActivationParent(Id transport_window_id) {
diff --git a/components/mus/ws/window_tree.h b/components/mus/ws/window_tree.h index a47c6c4d..c52a8fa8 100644 --- a/components/mus/ws/window_tree.h +++ b/components/mus/ws/window_tree.h
@@ -147,6 +147,7 @@ void OnWindowManagerCreatedTopLevelWindow(uint32_t wm_change_id, uint32_t client_change_id, const ServerWindow* window); + void AddActivationParent(const ClientWindowId& window_id); // Calls through to the client. void OnChangeCompleted(uint32_t change_id, bool success);
diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc index 509d659..88c3dbf 100644 --- a/components/mus/ws/window_tree_unittest.cc +++ b/components/mus/ws/window_tree_unittest.cc
@@ -30,7 +30,6 @@ #include "components/mus/ws/window_tree.h" #include "components/mus/ws/window_tree_binding.h" #include "mojo/converters/geometry/geometry_type_converters.h" -#include "mojo/services/network/public/interfaces/url_loader.mojom.h" #include "mojo/shell/public/interfaces/connector.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/event.h"
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index 50f0715..7b411cc1 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -118,6 +118,16 @@ } } + if (timing.parse_blocked_on_script_load_from_document_write_duration > + timing.parse_blocked_on_script_load_duration) { + NOTREACHED() + << "Invalid parse_blocked_on_script_load_from_document_write_duration " + << timing.parse_blocked_on_script_load_from_document_write_duration + << " for parse_blocked_on_script_load_duration " + << timing.parse_blocked_on_script_load_duration; + return false; + } + if (!EventsInOrder(timing.dom_loading, timing.dom_content_loaded_event_start)) { NOTREACHED() << "Invalid dom_loading " << timing.dom_loading
diff --git a/components/page_load_metrics/common/page_load_metrics_messages.h b/components/page_load_metrics/common/page_load_metrics_messages.h index 71e8c70b..687af97 100644 --- a/components/page_load_metrics/common/page_load_metrics_messages.h +++ b/components/page_load_metrics/common/page_load_metrics_messages.h
@@ -26,6 +26,8 @@ IPC_STRUCT_TRAITS_MEMBER(parse_start) IPC_STRUCT_TRAITS_MEMBER(parse_stop) IPC_STRUCT_TRAITS_MEMBER(parse_blocked_on_script_load_duration) + IPC_STRUCT_TRAITS_MEMBER( + parse_blocked_on_script_load_from_document_write_duration) IPC_STRUCT_TRAITS_END() // Sent from renderer to browser process when the PageLoadTiming for the
diff --git a/components/page_load_metrics/common/page_load_timing.cc b/components/page_load_metrics/common/page_load_timing.cc index bc9d0b827..7c36820 100644 --- a/components/page_load_metrics/common/page_load_timing.cc +++ b/components/page_load_metrics/common/page_load_timing.cc
@@ -25,7 +25,9 @@ first_image_paint == other.first_image_paint && parse_start == other.parse_start && parse_stop == other.parse_stop && parse_blocked_on_script_load_duration == - other.parse_blocked_on_script_load_duration; + other.parse_blocked_on_script_load_duration && + parse_blocked_on_script_load_from_document_write_duration == + other.parse_blocked_on_script_load_from_document_write_duration; } bool PageLoadTiming::IsEmpty() const { @@ -35,7 +37,8 @@ first_paint.is_zero() && first_text_paint.is_zero() && first_image_paint.is_zero() && parse_start.is_zero() && parse_stop.is_zero() && - parse_blocked_on_script_load_duration.is_zero(); + parse_blocked_on_script_load_duration.is_zero() && + parse_blocked_on_script_load_from_document_write_duration.is_zero(); } } // namespace page_load_metrics
diff --git a/components/page_load_metrics/common/page_load_timing.h b/components/page_load_metrics/common/page_load_timing.h index 3b1df5e..da1ce89 100644 --- a/components/page_load_metrics/common/page_load_timing.h +++ b/components/page_load_metrics/common/page_load_timing.h
@@ -62,6 +62,13 @@ // must be less than or equal to parser_stop - parser_start. base::TimeDelta parse_blocked_on_script_load_duration; + // Sum of times when the parser is blocked waiting on the load of a script + // that was inserted from document.write. This duration must be less than or + // equal to parse_blocked_on_script_load_duration. Note that some uncommon + // cases where scripts are loaded via document.write are not currently covered + // by this field. See crbug/600711 for details. + base::TimeDelta parse_blocked_on_script_load_from_document_write_duration; + // If you add additional members, also be sure to update operator==, // page_load_metrics_messages.h, and IsEmpty(). };
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc index e9bdf6ec..237c99c 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -124,6 +124,9 @@ timing.parse_stop = ClampDelta(perf.parseStop(), start); timing.parse_blocked_on_script_load_duration = base::TimeDelta::FromSecondsD(perf.parseBlockedOnScriptLoadDuration()); + timing.parse_blocked_on_script_load_from_document_write_duration = + base::TimeDelta::FromSecondsD( + perf.parseBlockedOnScriptLoadFromDocumentWriteDuration()); return timing; }
diff --git a/components/plugins/renderer/loadable_plugin_placeholder.cc b/components/plugins/renderer/loadable_plugin_placeholder.cc index 11495d8..77c8ef4 100644 --- a/components/plugins/renderer/loadable_plugin_placeholder.cc +++ b/components/plugins/renderer/loadable_plugin_placeholder.cc
@@ -101,8 +101,6 @@ return; } - CHECK(container->plugin() == plugin()); - // Set the new plugin on the container before initializing it. container->setPlugin(new_plugin); // Save the element in case the plugin is removed from the page during // initialization. @@ -110,10 +108,12 @@ bool plugin_needs_initialization = !premade_throttler_ || new_plugin != premade_throttler_->GetWebPlugin(); if (plugin_needs_initialization && !new_plugin->initialize(container)) { - // Since the we couldn't initialize the new plugin, we must destroy it and - // restore the old one. - container->setPlugin(plugin()); - new_plugin->destroy(); + if (new_plugin->container()) { + // Since the we couldn't initialize the new plugin, but the container + // still exists, restore the placeholder and destroy the new plugin. + container->setPlugin(plugin()); + new_plugin->destroy(); + } return; }
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc index 5075df3..e2a0b25c 100644 --- a/components/plugins/renderer/webview_plugin.cc +++ b/components/plugins/renderer/webview_plugin.cc
@@ -126,24 +126,26 @@ WebPluginContainer* WebViewPlugin::container() const { return container_; } bool WebViewPlugin::initialize(WebPluginContainer* container) { + DCHECK(container); + DCHECK_EQ(this, container->plugin()); container_ = container; - if (container_) { - // We must call layout again here to ensure that the container is laid - // out before we next try to paint it, which is a requirement of the - // document life cycle in Blink. In most cases, needsLayout is set by - // scheduleAnimation, but due to timers controlling widget update, - // scheduleAnimation may be invoked before this initialize call (which - // comes through the widget update process). It doesn't hurt to mark - // for animation again, and it does help us in the race-condition situation. - container_->scheduleAnimation(); - old_title_ = container_->element().getAttribute("title"); + // We must call layout again here to ensure that the container is laid + // out before we next try to paint it, which is a requirement of the + // document life cycle in Blink. In most cases, needsLayout is set by + // scheduleAnimation, but due to timers controlling widget update, + // scheduleAnimation may be invoked before this initialize call (which + // comes through the widget update process). It doesn't hurt to mark + // for animation again, and it does help us in the race-condition situation. + container_->scheduleAnimation(); - // Propagate device scale and zoom level to inner webview. - web_view_->setDeviceScaleFactor(container_->deviceScaleFactor()); - web_view_->setZoomLevel( - blink::WebView::zoomFactorToZoomLevel(container_->pageZoomFactor())); - } + old_title_ = container_->element().getAttribute("title"); + + // Propagate device scale and zoom level to inner webview. + web_view_->setDeviceScaleFactor(container_->deviceScaleFactor()); + web_view_->setZoomLevel( + blink::WebView::zoomFactorToZoomLevel(container_->pageZoomFactor())); + return true; }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index d417471..48cf1b8 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -5674,15 +5674,11 @@ If enabled or not configured (default), the user will be prompted for video capture access except for URLs configured in the VideoCaptureAllowedUrls list which will be granted access without prompting. - ARC-apps will be able to access the camera if they have been given - permission. When this policy is disabled, the user will never be prompted and video capture only be available to URLs configured in VideoCaptureAllowedUrls. - ARC-apps will not be able to access the camera. - Outside of ARC-apps, this policy affects all types of video inputs and - not only the built-in camera.''', + This policy affects all types of video inputs and not only the built-in camera.''', }, { 'name': 'VideoCaptureAllowedUrls',
diff --git a/components/safe_browsing_db/database_manager.h b/components/safe_browsing_db/database_manager.h index 5fa427f..12d893d 100644 --- a/components/safe_browsing_db/database_manager.h +++ b/components/safe_browsing_db/database_manager.h
@@ -83,7 +83,7 @@ virtual bool CanCheckUrl(const GURL& url) const = 0; // Returns whether download protection is enabled. - virtual bool download_protection_enabled() const = 0; + virtual bool IsDownloadProtectionEnabled() const = 0; // Called on the IO thread to check if the given url is safe or not. If we // can synchronously determine that the url is safe, CheckUrl returns true.
diff --git a/components/safe_browsing_db/remote_database_manager.cc b/components/safe_browsing_db/remote_database_manager.cc index 47d80627..a67e72d 100644 --- a/components/safe_browsing_db/remote_database_manager.cc +++ b/components/safe_browsing_db/remote_database_manager.cc
@@ -165,7 +165,7 @@ url.SchemeIs(url::kFtpScheme); } -bool RemoteSafeBrowsingDatabaseManager::download_protection_enabled() const { +bool RemoteSafeBrowsingDatabaseManager::IsDownloadProtectionEnabled() const { return false; }
diff --git a/components/safe_browsing_db/remote_database_manager.h b/components/safe_browsing_db/remote_database_manager.h index ebf1f0cd..ffe2dbc8 100644 --- a/components/safe_browsing_db/remote_database_manager.h +++ b/components/safe_browsing_db/remote_database_manager.h
@@ -43,7 +43,7 @@ bool ChecksAreAlwaysAsync() const override; bool CanCheckResourceType(content::ResourceType resource_type) const override; bool CanCheckUrl(const GURL& url) const override; - bool download_protection_enabled() const override; + bool IsDownloadProtectionEnabled() const override; bool CheckBrowseUrl(const GURL& url, Client* client) override; void CancelCheck(Client* client) override; void StartOnIOThread(
diff --git a/components/safe_browsing_db/test_database_manager.cc b/components/safe_browsing_db/test_database_manager.cc index dbccf5e9..478e064 100644 --- a/components/safe_browsing_db/test_database_manager.cc +++ b/components/safe_browsing_db/test_database_manager.cc
@@ -40,7 +40,7 @@ return false; } -bool TestSafeBrowsingDatabaseManager::download_protection_enabled() const { +bool TestSafeBrowsingDatabaseManager::IsDownloadProtectionEnabled() const { NOTIMPLEMENTED(); return false; }
diff --git a/components/safe_browsing_db/test_database_manager.h b/components/safe_browsing_db/test_database_manager.h index c56e683..eb7fcfd 100644 --- a/components/safe_browsing_db/test_database_manager.h +++ b/components/safe_browsing_db/test_database_manager.h
@@ -31,7 +31,7 @@ bool ChecksAreAlwaysAsync() const override; bool CanCheckResourceType(content::ResourceType resource_type) const override; bool CanCheckUrl(const GURL& url) const override; - bool download_protection_enabled() const override; + bool IsDownloadProtectionEnabled() const override; bool CheckBrowseUrl(const GURL& url, Client* client) override; bool CheckDownloadUrl(const std::vector<GURL>& url_chain, Client* client) override;
diff --git a/components/sync_driver/glue/sync_backend_host_core.cc b/components/sync_driver/glue/sync_backend_host_core.cc index 8e6c1f7..98e90e3 100644 --- a/components/sync_driver/glue/sync_backend_host_core.cc +++ b/components/sync_driver/glue/sync_backend_host_core.cc
@@ -4,7 +4,10 @@ #include "components/sync_driver/glue/sync_backend_host_core.h" +#include <map> +#include <string> #include <utility> +#include <vector> #include "base/bind.h" #include "base/files/file_util.h" @@ -24,7 +27,6 @@ #include "sync/internal_api/public/sessions/status_counters.h" #include "sync/internal_api/public/sessions/sync_session_snapshot.h" #include "sync/internal_api/public/sessions/update_counters.h" -#include "sync/internal_api/public/sync_context_proxy.h" #include "sync/internal_api/public/sync_manager.h" #include "sync/internal_api/public/sync_manager_factory.h" #include "url/gurl.h" @@ -548,9 +550,8 @@ host_.Call(FROM_HERE, &SyncBackendHostImpl::HandleInitializationSuccessOnFrontendLoop, - js_backend_, - debug_info_listener_, - sync_manager_->GetSyncContextProxy(), + js_backend_, debug_info_listener_, + base::Passed(sync_manager_->GetSyncContextProxy()), sync_manager_->cache_guid()); js_backend_.Reset();
diff --git a/components/sync_driver/glue/sync_backend_host_impl.cc b/components/sync_driver/glue/sync_backend_host_impl.cc index b1927f1..0b7dfa2 100644 --- a/components/sync_driver/glue/sync_backend_host_impl.cc +++ b/components/sync_driver/glue/sync_backend_host_impl.cc
@@ -240,7 +240,7 @@ frontend_ = NULL; // Stop non-blocking sync types from sending any more requests to the syncer. - sync_context_proxy_.reset(); + sync_context_.reset(); DCHECK(registrar_->sync_thread()->IsRunning()); @@ -442,12 +442,12 @@ syncer::ModelType type, scoped_ptr<syncer_v2::ActivationContext> activation_context) { registrar_->RegisterNonBlockingType(type); - sync_context_proxy_->ConnectTypeToSync(type, std::move(activation_context)); + sync_context_->ConnectType(type, std::move(activation_context)); } void SyncBackendHostImpl::DeactivateNonBlockingDataType( syncer::ModelType type) { - sync_context_proxy_->Disconnect(type); + sync_context_->DisconnectType(type); } syncer::UserShare* SyncBackendHostImpl::GetUserShare() const { @@ -600,12 +600,11 @@ const syncer::WeakHandle<syncer::JsBackend> js_backend, const syncer::WeakHandle<syncer::DataTypeDebugInfoListener> debug_info_listener, - syncer_v2::SyncContextProxy* sync_context_proxy, + scoped_ptr<syncer_v2::SyncContext> sync_context, const std::string& cache_guid) { DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); - if (sync_context_proxy) - sync_context_proxy_ = sync_context_proxy->Clone(); + sync_context_ = std::move(sync_context); if (!frontend_) return;
diff --git a/components/sync_driver/glue/sync_backend_host_impl.h b/components/sync_driver/glue/sync_backend_host_impl.h index c173a495..54618c2 100644 --- a/components/sync_driver/glue/sync_backend_host_impl.h +++ b/components/sync_driver/glue/sync_backend_host_impl.h
@@ -7,7 +7,9 @@ #include <stdint.h> +#include <map> #include <string> +#include <vector> #include "base/callback.h" #include "base/compiler_specific.h" @@ -184,14 +186,13 @@ // Reports backend initialization success. Includes some objects from sync // manager initialization to be passed back to the UI thread. // - // |sync_context_proxy| points to an object owned by the SyncManager. - // Ownership is not transferred, but we can obtain our own copy of the object - // using its Clone() method. + // |sync_context| is our SyncContext, which is owned because in + // production it is a proxy object to the real SyncContext. virtual void HandleInitializationSuccessOnFrontendLoop( const syncer::WeakHandle<syncer::JsBackend> js_backend, const syncer::WeakHandle<syncer::DataTypeDebugInfoListener> debug_info_listener, - syncer_v2::SyncContextProxy* sync_context_proxy, + scoped_ptr<syncer_v2::SyncContext> sync_context, const std::string& cache_guid); // Forwards a ProtocolEvent to the frontend. Will not be called unless a @@ -333,8 +334,9 @@ // sync loop. scoped_refptr<SyncBackendHostCore> core_; - // A handle referencing the main interface for non-blocking sync types. - scoped_ptr<syncer_v2::SyncContextProxy> sync_context_proxy_; + // A handle referencing the main interface for non-blocking sync types. This + // object is owned because in production code it is a proxy object. + scoped_ptr<syncer_v2::SyncContext> sync_context_; bool initialized_;
diff --git a/components/test_runner/test_plugin.cc b/components/test_runner/test_plugin.cc index 2ac4634d..ba1e561 100644 --- a/components/test_runner/test_plugin.cc +++ b/components/test_runner/test_plugin.cc
@@ -174,6 +174,11 @@ } bool TestPlugin::initialize(blink::WebPluginContainer* container) { + DCHECK(container); + DCHECK_EQ(this, container->plugin()); + + container_ = container; + blink::Platform::ContextAttributes attrs; DCHECK(!container->element().isNull()); DCHECK(!container->element().document().isNull()); @@ -190,7 +195,6 @@ layer_ = cc::TextureLayer::CreateForMailbox(this); web_layer_ = make_scoped_ptr(new cc_blink::WebLayerImpl(layer_)); - container_ = container; container_->setWebLayer(web_layer_.get()); if (re_request_touch_events_) { container_->requestTouchEventType( @@ -223,6 +227,10 @@ new DeferredDeleteTask(make_scoped_ptr(this))); } +blink::WebPluginContainer* TestPlugin::container() const { + return container_; +} + bool TestPlugin::canProcessDrag() const { return can_process_drag_; }
diff --git a/components/test_runner/test_plugin.h b/components/test_runner/test_plugin.h index 8dba678b..cc9fed6 100644 --- a/components/test_runner/test_plugin.h +++ b/components/test_runner/test_plugin.h
@@ -70,6 +70,7 @@ // WebPlugin methods: bool initialize(blink::WebPluginContainer* container) override; void destroy() override; + blink::WebPluginContainer* container() const override; bool canProcessDrag() const override; bool supportsKeyboardFocus() const override; void updateAllLifecyclePhases() override {}
diff --git a/components/test_runner/test_runner.cc b/components/test_runner/test_runner.cc index 96941df..e6f6a391 100644 --- a/components/test_runner/test_runner.cc +++ b/components/test_runner/test_runner.cc
@@ -152,7 +152,6 @@ void DumpPermissionClientCallbacks(); void DumpPingLoaderCallbacks(); void DumpResourceLoadCallbacks(); - void DumpResourceRequestCallbacks(); void DumpResourceRequestPriorities(); void DumpResourceResponseMIMETypes(); void DumpSelectionRect(); @@ -179,7 +178,6 @@ void QueueBackNavigation(int how_far_back); void QueueForwardNavigation(int how_far_forward); void QueueLoad(gin::Arguments* args); - void QueueLoadHTMLString(gin::Arguments* args); void QueueLoadingScript(const std::string& script); void QueueNonLoadingScript(const std::string& script); void QueueReload(); @@ -288,8 +286,6 @@ std::string SelectionAsMarkup(); std::string TooltipText(); - bool WasMockSpeechRecognitionAborted(); - int WebHistoryItemCount(); int WindowCount(); @@ -347,17 +343,11 @@ &TestRunnerBindings::AddOriginAccessWhitelistEntry) .SetMethod("addWebPageOverlay", &TestRunnerBindings::AddWebPageOverlay) .SetMethod("animationScheduled", &TestRunnerBindings::AnimationScheduled) - .SetMethod("applicationCacheDiskUsageForOrigin", - &TestRunnerBindings::NotImplemented) .SetMethod("callShouldCloseOnWebView", &TestRunnerBindings::CallShouldCloseOnWebView) .SetMethod("capturePixelsAsyncThen", &TestRunnerBindings::CapturePixelsAsyncThen) - .SetMethod("clearAllApplicationCaches", - &TestRunnerBindings::NotImplemented) .SetMethod("clearAllDatabases", &TestRunnerBindings::ClearAllDatabases) - .SetMethod("clearApplicationCacheForOrigin", - &TestRunnerBindings::NotImplemented) .SetMethod("clearBackForwardList", &TestRunnerBindings::NotImplemented) .SetMethod("clearGeofencingMockProvider", &TestRunnerBindings::ClearGeofencingMockProvider) @@ -365,9 +355,6 @@ .SetMethod("closeWebInspector", &TestRunnerBindings::CloseWebInspector) .SetMethod("copyImageAtAndCapturePixelsAsyncThen", &TestRunnerBindings::CopyImageAtAndCapturePixelsAsyncThen) - .SetMethod("deleteAllLocalStorage", &TestRunnerBindings::NotImplemented) - .SetMethod("deleteLocalStorageForOrigin", - &TestRunnerBindings::NotImplemented) .SetMethod("didAcquirePointerLock", &TestRunnerBindings::DidAcquirePointerLock) .SetMethod("didLosePointerLock", &TestRunnerBindings::DidLosePointerLock) @@ -409,8 +396,6 @@ &TestRunnerBindings::DumpPingLoaderCallbacks) .SetMethod("dumpResourceLoadCallbacks", &TestRunnerBindings::DumpResourceLoadCallbacks) - .SetMethod("dumpResourceRequestCallbacks", - &TestRunnerBindings::DumpResourceRequestCallbacks) .SetMethod("dumpResourceRequestPriorities", &TestRunnerBindings::DumpResourceRequestPriorities) .SetMethod("dumpResourceResponseMIMETypes", @@ -425,8 +410,6 @@ .SetMethod("dumpTitleChanges", &TestRunnerBindings::DumpTitleChanges) .SetMethod("dumpUserGestureInFrameLoadCallbacks", &TestRunnerBindings::DumpUserGestureInFrameLoadCallbacks) - .SetMethod("dumpWindowStatusChanges", - &TestRunnerBindings::DumpWindowStatusChanges) .SetMethod("enableAutoResizeMode", &TestRunnerBindings::EnableAutoResizeMode) .SetMethod("enableUseZoomForDSF", @@ -467,13 +450,8 @@ &TestRunnerBindings::LayoutAndPaintAsync) .SetMethod("layoutAndPaintAsyncThen", &TestRunnerBindings::LayoutAndPaintAsyncThen) - .SetMethod("localStorageDiskUsageForOrigin", - &TestRunnerBindings::NotImplemented) .SetMethod("logToStderr", &TestRunnerBindings::LogToStderr) .SetMethod("notifyDone", &TestRunnerBindings::NotifyDone) - .SetMethod("observeStorageTrackerNotifications", - &TestRunnerBindings::NotImplemented) - .SetMethod("originsWithLocalStorage", &TestRunnerBindings::NotImplemented) .SetMethod("overridePreference", &TestRunnerBindings::OverridePreference) .SetMethod("pathToLocalResource", &TestRunnerBindings::PathToLocalResource) @@ -483,8 +461,6 @@ .SetMethod("queueForwardNavigation", &TestRunnerBindings::QueueForwardNavigation) .SetMethod("queueLoad", &TestRunnerBindings::QueueLoad) - .SetMethod("queueLoadHTMLString", - &TestRunnerBindings::QueueLoadHTMLString) .SetMethod("queueLoadingScript", &TestRunnerBindings::QueueLoadingScript) .SetMethod("queueNonLoadingScript", &TestRunnerBindings::QueueNonLoadingScript) @@ -515,8 +491,6 @@ &TestRunnerBindings::SetAllowUniversalAccessFromFileURLs) .SetMethod("setAlwaysAcceptCookies", &TestRunnerBindings::SetAlwaysAcceptCookies) - .SetMethod("setApplicationCacheOriginQuota", - &TestRunnerBindings::NotImplemented) .SetMethod("setAudioData", &TestRunnerBindings::SetAudioData) .SetMethod("setBackingScaleFactor", &TestRunnerBindings::SetBackingScaleFactor) @@ -602,7 +576,6 @@ &TestRunnerBindings::SimulateWebNotificationClick) .SetMethod("simulateWebNotificationClose", &TestRunnerBindings::SimulateWebNotificationClose) - .SetMethod("syncLocalStorage", &TestRunnerBindings::NotImplemented) .SetProperty("tooltipText", &TestRunnerBindings::TooltipText) .SetMethod("useUnfortunateSynchronousResizeMode", &TestRunnerBindings::UseUnfortunateSynchronousResizeMode) @@ -611,8 +584,6 @@ .SetMethod("waitUntilDone", &TestRunnerBindings::WaitUntilDone) .SetMethod("waitUntilExternalURLLoad", &TestRunnerBindings::WaitUntilExternalURLLoad) - .SetMethod("wasMockSpeechRecognitionAborted", - &TestRunnerBindings::WasMockSpeechRecognitionAborted) // webHistoryItemCount is used by tests in LayoutTests\http\tests\history .SetProperty("webHistoryItemCount", @@ -669,11 +640,6 @@ } } -void TestRunnerBindings::QueueLoadHTMLString(gin::Arguments* args) { - if (runner_) - runner_->QueueLoadHTMLString(args); -} - void TestRunnerBindings::SetCustomPolicyDelegate(gin::Arguments* args) { if (runner_) runner_->SetCustomPolicyDelegate(args); @@ -1124,11 +1090,6 @@ runner_->DumpResourceLoadCallbacks(); } -void TestRunnerBindings::DumpResourceRequestCallbacks() { - if (runner_) - runner_->DumpResourceRequestCallbacks(); -} - void TestRunnerBindings::DumpResourceResponseMIMETypes() { if (runner_) runner_->DumpResourceResponseMIMETypes(); @@ -1386,12 +1347,6 @@ runner_->SetMockSpeechRecognitionError(error, message); } -bool TestRunnerBindings::WasMockSpeechRecognitionAborted() { - if (runner_) - return runner_->WasMockSpeechRecognitionAborted(); - return false; -} - void TestRunnerBindings::AddMockCredentialManagerResponse( const std::string& id, const std::string& name, @@ -1691,7 +1646,6 @@ dump_create_view_ = false; can_open_windows_ = false; dump_resource_load_callbacks_ = false; - dump_resource_request_callbacks_ = false; dump_resource_response_mime_types_ = false; dump_window_status_changes_ = false; dump_spell_check_callbacks_ = false; @@ -2184,47 +2138,6 @@ work_queue_.AddWork(new WorkItemLoad(full_url, target)); } -class WorkItemLoadHTMLString : public TestRunner::WorkItem { - public: - WorkItemLoadHTMLString(const std::string& html, const WebURL& base_url) - : html_(html), base_url_(base_url) {} - - WorkItemLoadHTMLString(const std::string& html, const WebURL& base_url, - const WebURL& unreachable_url) - : html_(html), base_url_(base_url), unreachable_url_(unreachable_url) {} - - bool Run(WebTestDelegate*, WebView* web_view) override { - web_view->mainFrame()->loadHTMLString( - WebData(html_.data(), html_.length()), - base_url_, unreachable_url_); - return true; - } - - private: - std::string html_; - WebURL base_url_; - WebURL unreachable_url_; -}; - -void TestRunner::QueueLoadHTMLString(gin::Arguments* args) { - std::string html; - args->GetNext(&html); - - std::string base_url_str; - args->GetNext(&base_url_str); - WebURL base_url = WebURL(GURL(base_url_str)); - - if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) { - std::string unreachable_url_str; - args->GetNext(&unreachable_url_str); - WebURL unreachable_url = WebURL(GURL(unreachable_url_str)); - work_queue_.AddWork(new WorkItemLoadHTMLString(html, base_url, - unreachable_url)); - } else { - work_queue_.AddWork(new WorkItemLoadHTMLString(html, base_url)); - } -} - void TestRunner::SetCustomPolicyDelegate(gin::Arguments* args) { bool value; args->GetNext(&value); @@ -2807,10 +2720,6 @@ dump_resource_load_callbacks_ = true; } -void TestRunner::DumpResourceRequestCallbacks() { - dump_resource_request_callbacks_ = true; -} - void TestRunner::DumpResourceResponseMIMETypes() { dump_resource_response_mime_types_ = true; } @@ -3073,10 +2982,6 @@ WebString::fromUTF8(message)); } -bool TestRunner::WasMockSpeechRecognitionAborted() { - return getMockWebSpeechRecognizer()->WasAborted(); -} - void TestRunner::AddMockCredentialManagerResponse(const std::string& id, const std::string& name, const std::string& avatar,
diff --git a/components/test_runner/test_runner.h b/components/test_runner/test_runner.h index 2a4f87fd..46f6507 100644 --- a/components/test_runner/test_runner.h +++ b/components/test_runner/test_runner.h
@@ -208,7 +208,6 @@ void QueueLoadingScript(const std::string& script); void QueueNonLoadingScript(const std::string& script); void QueueLoad(const std::string& url, const std::string& target); - void QueueLoadHTMLString(gin::Arguments* args); // Causes navigation actions just printout the intended navigation instead // of taking you to the page. This is used for cases like mailto, where you @@ -429,11 +428,6 @@ // any that may be present. void DumpResourceLoadCallbacks(); - // This function sets a flag that tells the test_shell to print a line of - // descriptive text for each element that requested a resource. It takes no - // arguments, and ignores any that may be present. - void DumpResourceRequestCallbacks(); - // This function sets a flag that tells the test_shell to dump the MIME type // for each resource that was loaded. It takes no arguments, and ignores any // that may be present. @@ -612,7 +606,6 @@ double confidence); void SetMockSpeechRecognitionError(const std::string& error, const std::string& message); - bool WasMockSpeechRecognitionAborted(); // Credential Manager mock functions // TODO(mkwst): Support FederatedCredential. @@ -746,10 +739,6 @@ // load callback. bool dump_resource_load_callbacks_; - // If true, the test_shell will output a descriptive line for each resource - // request callback. - bool dump_resource_request_callbacks_; - // If true, the test_shell will output the MIME type for each resource that // was loaded. bool dump_resource_response_mime_types_;
diff --git a/components/user_manager/user.h b/components/user_manager/user.h index 67b62fe..61ce0b4 100644 --- a/components/user_manager/user.h +++ b/components/user_manager/user.h
@@ -67,8 +67,10 @@ // Hence, // (a) existing enumerated constants should never be deleted or reordered, // (b) new constants should only be appended at the end of the enumeration. + // TODO(xdai): Add THIRDPARTY enum to keep track of third party wallpapers. + // See http://crbug.com/563627. enum WallpaperType { - /* DAILY = 0 */ // Removed. + DAILY = 0, // Surprise wallpaper. Changes once a day if enabled. CUSTOMIZED = 1, // Selected by user. DEFAULT = 2, // Default. /* UNKNOWN = 3 */ // Removed.
diff --git a/content/BUILD.gn b/content/BUILD.gn index d2d450a6..56941b8f 100644 --- a/content/BUILD.gn +++ b/content/BUILD.gn
@@ -110,6 +110,15 @@ "grit/content_resources.h", "content_resources.pak", ] + grit_flags = [ + "-E", + "root_out_dir=" + rebase_path(root_out_dir, root_build_dir), + ] + deps = [ + "//content/public/app:browser_manifest", + "//content/public/app:renderer_manifest", + "//mojo/services/catalog:manifest", + ] } # This target exists to "hold" the content_export header so we can do proper
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 2ada88c..69f627a7 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -6,7 +6,6 @@ import("//build/config/ui.gni") import("//content/browser/browser.gni") import("//media/media_options.gni") -import("//mojo/public/mojo_application_manifest.gni") source_set("browser") { # Only the public target should depend on this. All other targets (even @@ -68,7 +67,6 @@ "//mojo/common", "//mojo/common:url_type_converters", "//mojo/converters/geometry", - "//mojo/converters/network", "//mojo/public/cpp/bindings", "//mojo/public/js", "//mojo/shell", @@ -121,11 +119,6 @@ "//ui/touch_selection", ] - data_deps = [ - ":chrome_manifest", - ":chrome_renderer_manifest", - ] - sources = rebase_path(content_browser_gypi_values.private_browser_sources, ".", "//content") @@ -537,15 +530,3 @@ ] } } - -mojo_application_manifest("chrome_manifest") { - type = "exe" - application_name = "chrome" - source = "mojo/chrome_manifest.json" -} - -mojo_application_manifest("chrome_renderer_manifest") { - type = "exe" - application_name = "chrome_renderer" - source = "mojo/chrome_renderer_manifest.json" -}
diff --git a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc index 19469246..4e5f3f1 100644 --- a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc +++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc
@@ -53,8 +53,8 @@ bool is_offscreen = true; scoped_ptr<gpu::GLInProcessContext> context(gpu::GLInProcessContext::Create( service, nullptr /* surface */, is_offscreen, gfx::kNullAcceleratedWidget, - gfx::Size(1, 1), nullptr /* share_context */, false /* share_resources */, - attributes, gfx::PreferDiscreteGpu, mem_limits, + gfx::Size(1, 1), nullptr /* share_context */, attributes, + gfx::PreferDiscreteGpu, mem_limits, BrowserGpuMemoryBufferManager::current(), nullptr)); gpu::GLInProcessContext* context_ptr = context.get();
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc index aa0a23b..f182989 100644 --- a/content/browser/android/in_process/synchronous_compositor_impl.cc +++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -241,6 +241,14 @@ root_offset); } +void SynchronousCompositorImpl::SynchronouslyZoomBy(float zoom_delta, + const gfx::Point& anchor) { + DCHECK(CalledOnValidThread()); + if (!synchronous_input_handler_proxy_) + return; + synchronous_input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); +} + void SynchronousCompositorImpl::SetIsActive(bool is_active) { TRACE_EVENT1("cc", "SynchronousCompositorImpl::SetIsActive", "is_active", is_active); @@ -253,10 +261,6 @@ begin_frame_source_->SetBeginFrameSourcePaused(!is_active_); } -void SynchronousCompositorImpl::SynchronizeWithRenderer() { - // Intentional no-op. Nothing to synchronize. -} - void SynchronousCompositorImpl::OnComputeScroll( base::TimeTicks animation_time) { if (need_animate_input_) {
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.h b/content/browser/android/in_process/synchronous_compositor_impl.h index fdb2700..29f48d2 100644 --- a/content/browser/android/in_process/synchronous_compositor_impl.h +++ b/content/browser/android/in_process/synchronous_compositor_impl.h
@@ -74,8 +74,8 @@ void SetMemoryPolicy(size_t bytes_limit) override; void DidChangeRootLayerScrollOffset( const gfx::ScrollOffset& root_offset) override; + void SynchronouslyZoomBy(float zoom_delta, const gfx::Point& anchor) override; void SetIsActive(bool is_active) override; - void SynchronizeWithRenderer() override; void OnComputeScroll(base::TimeTicks animation_time) override; // SynchronousCompositorBase overrides.
diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc index 127124b..7f6cdfc5 100644 --- a/content/browser/android/synchronous_compositor_host.cc +++ b/content/browser/android/synchronous_compositor_host.cc
@@ -329,6 +329,19 @@ DCHECK(!weak_ptr_factory_.HasWeakPtrs()); } +void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, + const gfx::Point& anchor) { + SyncCompositorCommonBrowserParams common_browser_params; + PopulateCommonParams(&common_browser_params); + SyncCompositorCommonRendererParams common_renderer_params; + if (!sender_->Send(new SyncCompositorMsg_ZoomBy( + routing_id_, common_browser_params, zoom_delta, anchor, + &common_renderer_params))) { + return; + } + ProcessCommonParams(common_renderer_params); +} + void SynchronousCompositorHost::SetIsActive(bool is_active) { if (is_active_ == is_active) return; @@ -337,17 +350,6 @@ SendAsyncCompositorStateIfNeeded(); } -void SynchronousCompositorHost::SynchronizeWithRenderer() { - SyncCompositorCommonBrowserParams common_browser_params; - PopulateCommonParams(&common_browser_params); - SyncCompositorCommonRendererParams common_renderer_params; - if (!sender_->Send(new SyncCompositorMsg_SynchronousUpdateState( - routing_id_, common_browser_params, &common_renderer_params))) { - return; - } - ProcessCommonParams(common_renderer_params); -} - void SynchronousCompositorHost::OnComputeScroll( base::TimeTicks animation_time) { if (!need_animate_scroll_)
diff --git a/content/browser/android/synchronous_compositor_host.h b/content/browser/android/synchronous_compositor_host.h index e3a49ef..b9b15986 100644 --- a/content/browser/android/synchronous_compositor_host.h +++ b/content/browser/android/synchronous_compositor_host.h
@@ -46,8 +46,8 @@ void SetMemoryPolicy(size_t bytes_limit) override; void DidChangeRootLayerScrollOffset( const gfx::ScrollOffset& root_offset) override; + void SynchronouslyZoomBy(float zoom_delta, const gfx::Point& anchor) override; void SetIsActive(bool is_active) override; - void SynchronizeWithRenderer() override; void OnComputeScroll(base::TimeTicks animation_time) override; // SynchronousCompositorBase overrides.
diff --git a/content/browser/compositor/gl_helper_benchmark.cc b/content/browser/compositor/gl_helper_benchmark.cc index 0cf27a38..845d82a4 100644 --- a/content/browser/compositor/gl_helper_benchmark.cc +++ b/content/browser/compositor/gl_helper_benchmark.cc
@@ -67,7 +67,6 @@ gfx::kNullAcceleratedWidget, /* window */ gfx::Size(1, 1), /* size */ nullptr, /* share_context */ - true, /* use_global_share_group */ attributes, gfx::PreferDiscreteGpu, ::gpu::GLInProcessContextSharedMemoryLimits(), nullptr, /* gpu_memory_buffer_manager */
diff --git a/content/browser/compositor/gl_helper_unittest.cc b/content/browser/compositor/gl_helper_unittest.cc index 9ba79b7..697c68b 100644 --- a/content/browser/compositor/gl_helper_unittest.cc +++ b/content/browser/compositor/gl_helper_unittest.cc
@@ -73,7 +73,6 @@ gfx::kNullAcceleratedWidget, /* window */ gfx::Size(1, 1), /* size */ nullptr, /* share_context */ - true, /* use_global_share_group */ attributes, gfx::PreferDiscreteGpu, ::gpu::GLInProcessContextSharedMemoryLimits(), nullptr, /* gpu_memory_buffer_manager */
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index 08e8bcf..9a4ad65 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -35,7 +35,6 @@ #include "content/browser/compositor/software_output_device_mus.h" #include "content/browser/gpu/browser_gpu_channel_host_factory.h" #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" -#include "content/browser/gpu/compositor_util.h" #include "content/browser/gpu/gpu_data_manager_impl.h" #include "content/browser/gpu/gpu_surface_tracker.h" #include "content/browser/renderer_host/render_widget_host_impl.h"
diff --git a/content/browser/compositor/test/no_transport_image_transport_factory.cc b/content/browser/compositor/test/no_transport_image_transport_factory.cc index 74245a2d..f58d11fb 100644 --- a/content/browser/compositor/test/no_transport_image_transport_factory.cc +++ b/content/browser/compositor/test/no_transport_image_transport_factory.cc
@@ -10,7 +10,6 @@ #include "cc/output/context_provider.h" #include "cc/surfaces/surface_manager.h" #include "content/browser/compositor/gl_helper.h" -#include "content/browser/gpu/compositor_util.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "ui/compositor/compositor.h" #include "ui/compositor/test/in_process_context_factory.h"
diff --git a/content/browser/devtools/protocol/inspector_handler.cc b/content/browser/devtools/protocol/inspector_handler.cc index 31e9d1b..8e018a84 100644 --- a/content/browser/devtools/protocol/inspector_handler.cc +++ b/content/browser/devtools/protocol/inspector_handler.cc
@@ -38,9 +38,12 @@ Response InspectorHandler::Enable() { if (host_ && !host_->IsRenderFrameLive()) client_->TargetCrashed(TargetCrashedParams::Create()); - return Response::FallThrough(); + return Response::OK(); } +Response InspectorHandler::Disable() { + return Response::OK(); +} } // namespace inspector } // namespace devtools
diff --git a/content/browser/devtools/protocol/inspector_handler.h b/content/browser/devtools/protocol/inspector_handler.h index 08c1e5e..52325c4 100644 --- a/content/browser/devtools/protocol/inspector_handler.h +++ b/content/browser/devtools/protocol/inspector_handler.h
@@ -29,6 +29,7 @@ void TargetDetached(const std::string& reason); Response Enable(); + Response Disable(); private: scoped_ptr<Client> client_;
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index b47b446..c72a1d0 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -433,6 +433,23 @@ MOCK_METHOD0(GetPermissionManager, PermissionManager*()); MOCK_METHOD0(GetBackgroundSyncController, BackgroundSyncController*()); + // Define these two methods to avoid a + // cannot access private member declared in class 'ScopedVector<net::URLRequestInterceptor>' + // build error if they're put in MOCK_METHOD. + net::URLRequestContextGetter* CreateRequestContext( + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) override { + return nullptr; + } + + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) override { + return nullptr; + } + scoped_ptr<ZoomLevelDelegate> CreateZoomLevelDelegate( const base::FilePath& path) override { return scoped_ptr<ZoomLevelDelegate>(CreateZoomLevelDelegateMock(path));
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index da162c8..617fc26 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -79,8 +79,6 @@ headers.AddHeadersFromString(entry.extra_headers()); headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent, GetContentClient()->GetUserAgent()); - // TODO(clamy): match what blink is doing with accept headers. - headers.SetHeaderIfMissing("Accept", "*/*"); // Fill POST data from the browser in the request body. scoped_refptr<ResourceRequestBody> request_body;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index fdc7e33..a5cf74d7 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1895,8 +1895,13 @@ GetServiceRegistry()->AddService(base::Bind( &PresentationServiceImpl::CreateMojoService, base::Unretained(this))); - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableWebBluetooth)) { + bool enable_web_bluetooth = base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableWebBluetooth); +#if defined(OS_CHROMEOS) || defined(OS_ANDROID) + enable_web_bluetooth = true; +#endif + + if (enable_web_bluetooth) { GetServiceRegistry()->AddService( base::Bind(&RenderFrameHostImpl::CreateWebBluetoothService, base::Unretained(this)));
diff --git a/content/browser/loader/mime_type_resource_handler.cc b/content/browser/loader/mime_type_resource_handler.cc index 3dc8dce..9451182 100644 --- a/content/browser/loader/mime_type_resource_handler.cc +++ b/content/browser/loader/mime_type_resource_handler.cc
@@ -35,11 +35,20 @@ #include "net/base/net_errors.h" #include "net/http/http_content_disposition.h" #include "net/http/http_response_headers.h" +#include "net/url_request/url_request.h" namespace content { namespace { +const char kAcceptHeader[] = "Accept"; +const char kFrameAcceptHeader[] = + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp," + "*/*;q=0.8"; +const char kStylesheetAcceptHeader[] = "text/css,*/*;q=0.1"; +const char kImageAcceptHeader[] = "image/webp,image/*,*/*;q=0.8"; +const char kDefaultAcceptHeader[] = "*/*"; + // Used to write into an existing IOBuffer at a given offset. class DependentIOBuffer : public net::WrappedIOBuffer { public: @@ -116,6 +125,46 @@ return ProcessResponse(defer); } +bool MimeTypeResourceHandler::OnWillStart(const GURL& url, bool* defer) { + const char* accept_value = nullptr; + switch (GetRequestInfo()->GetResourceType()) { + case RESOURCE_TYPE_MAIN_FRAME: + case RESOURCE_TYPE_SUB_FRAME: + accept_value = kFrameAcceptHeader; + break; + case RESOURCE_TYPE_STYLESHEET: + accept_value = kStylesheetAcceptHeader; + break; + case RESOURCE_TYPE_IMAGE: + accept_value = kImageAcceptHeader; + break; + case RESOURCE_TYPE_SCRIPT: + case RESOURCE_TYPE_FONT_RESOURCE: + case RESOURCE_TYPE_SUB_RESOURCE: + case RESOURCE_TYPE_OBJECT: + case RESOURCE_TYPE_MEDIA: + case RESOURCE_TYPE_WORKER: + case RESOURCE_TYPE_SHARED_WORKER: + case RESOURCE_TYPE_PREFETCH: + case RESOURCE_TYPE_FAVICON: + case RESOURCE_TYPE_XHR: + case RESOURCE_TYPE_PING: + case RESOURCE_TYPE_SERVICE_WORKER: + case RESOURCE_TYPE_CSP_REPORT: + case RESOURCE_TYPE_PLUGIN_RESOURCE: + accept_value = kDefaultAcceptHeader; + break; + case RESOURCE_TYPE_LAST_TYPE: + NOTREACHED(); + break; + } + + // The false parameter prevents overwriting an existing accept header value, + // which is needed because JS can manually set an accept header on an XHR. + request()->SetExtraRequestHeaderByName(kAcceptHeader, accept_value, false); + return next_handler_->OnWillStart(url, defer); +} + bool MimeTypeResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, int* buf_size, int min_size) {
diff --git a/content/browser/loader/mime_type_resource_handler.h b/content/browser/loader/mime_type_resource_handler.h index 9217683..411ffd1 100644 --- a/content/browser/loader/mime_type_resource_handler.h +++ b/content/browser/loader/mime_type_resource_handler.h
@@ -34,6 +34,10 @@ // subsequent reads until it's done buffering. As a result, the buffer // returned by the next ResourceHandler must have a capacity of at least // net::kMaxBytesToSniff * 2. +// +// Before a request is sent, this ResourceHandler will also set an appropriate +// Accept header on the request based on its ResourceType, if one isn't already +// present. class CONTENT_EXPORT MimeTypeResourceHandler : public LayeredResourceHandler, public ResourceController { @@ -49,6 +53,7 @@ // ResourceHandler implementation: void SetController(ResourceController* controller) override; bool OnResponseStarted(ResourceResponse* response, bool* defer) override; + bool OnWillStart(const GURL&, bool* defer) override; bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, int* buf_size, int min_size) override;
diff --git a/content/browser/loader/mime_type_resource_handler_unittest.cc b/content/browser/loader/mime_type_resource_handler_unittest.cc index 13d98cb..360e035 100644 --- a/content/browser/loader/mime_type_resource_handler_unittest.cc +++ b/content/browser/loader/mime_type_resource_handler_unittest.cc
@@ -45,7 +45,6 @@ } bool OnWillStart(const GURL& url, bool* defer) override { - NOTREACHED(); return false; } @@ -220,6 +219,11 @@ bool must_download, ResourceType request_resource_type); + std::string TestAcceptHeaderSetting(ResourceType request_resource_type); + std::string TestAcceptHeaderSettingWithURLRequest( + ResourceType request_resource_type, + net::URLRequest* request); + private: // Whether the URL request should be intercepted as a stream. bool stream_has_handler_; @@ -273,6 +277,88 @@ return host.intercepted_as_stream(); } +std::string MimeTypeResourceHandlerTest::TestAcceptHeaderSetting( + ResourceType request_resource_type) { + net::URLRequestContext context; + scoped_ptr<net::URLRequest> request(context.CreateRequest( + GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); + return TestAcceptHeaderSettingWithURLRequest( + request_resource_type, request.get()); +} + +std::string MimeTypeResourceHandlerTest::TestAcceptHeaderSettingWithURLRequest( + ResourceType request_resource_type, + net::URLRequest* request) { + bool is_main_frame = request_resource_type == RESOURCE_TYPE_MAIN_FRAME; + ResourceRequestInfo::AllocateForTesting( + request, + request_resource_type, + nullptr, // context + 0, // render_process_id + 0, // render_view_id + 0, // render_frame_id + is_main_frame, // is_main_frame + false, // parent_is_main_frame + false, // allow_download + true, // is_async + false); // is_using_lofi + + TestResourceDispatcherHost host(stream_has_handler_); + TestResourceDispatcherHostDelegate host_delegate(false); + host.SetDelegate(&host_delegate); + + scoped_ptr<ResourceHandler> mime_sniffing_handler(new MimeTypeResourceHandler( + scoped_ptr<ResourceHandler>(new TestResourceHandler()), &host, + nullptr, request)); + + bool defer = false; + mime_sniffing_handler->OnWillStart(request->url(), &defer); + content::RunAllPendingInMessageLoop(); + + std::string accept_header; + request->extra_request_headers().GetHeader("Accept", &accept_header); + return accept_header; +} + +// Test that the proper Accept: header is set based on the ResourceType +TEST_F(MimeTypeResourceHandlerTest, AcceptHeaders) { + EXPECT_EQ( + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp," + "*/*;q=0.8", + TestAcceptHeaderSetting(RESOURCE_TYPE_MAIN_FRAME)); + EXPECT_EQ( + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp," + "*/*;q=0.8", + TestAcceptHeaderSetting(RESOURCE_TYPE_SUB_FRAME)); + EXPECT_EQ("text/css,*/*;q=0.1", + TestAcceptHeaderSetting(RESOURCE_TYPE_STYLESHEET)); + EXPECT_EQ("*/*", + TestAcceptHeaderSetting(RESOURCE_TYPE_SCRIPT)); + EXPECT_EQ("image/webp,image/*,*/*;q=0.8", + TestAcceptHeaderSetting(RESOURCE_TYPE_IMAGE)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_FONT_RESOURCE)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_SUB_RESOURCE)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_OBJECT)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_MEDIA)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_WORKER)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_SHARED_WORKER)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_PREFETCH)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_FAVICON)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_XHR)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_PING)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_SERVICE_WORKER)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_CSP_REPORT)); + EXPECT_EQ("*/*", TestAcceptHeaderSetting(RESOURCE_TYPE_PLUGIN_RESOURCE)); + + // Ensure that if an Accept header is already set, it is not overwritten. + net::URLRequestContext context; + scoped_ptr<net::URLRequest> request(context.CreateRequest( + GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); + request->SetExtraRequestHeaderByName("Accept", "*", true); + EXPECT_EQ("*", + TestAcceptHeaderSettingWithURLRequest(RESOURCE_TYPE_XHR, request.get())); +} + // Test that stream requests are correctly intercepted under the right // circumstances. Test is not relevent when plugins are disabled. #if defined(ENABLE_PLUGINS)
diff --git a/content/browser/media/capture/aura_window_capture_machine.cc b/content/browser/media/capture/aura_window_capture_machine.cc index a56208f3..26e33cf 100644 --- a/content/browser/media/capture/aura_window_capture_machine.cc +++ b/content/browser/media/capture/aura_window_capture_machine.cc
@@ -124,8 +124,13 @@ } void AuraWindowCaptureMachine::MaybeCaptureForRefresh() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - Capture(false); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&AuraWindowCaptureMachine::Capture, + // Use of Unretained() is safe here since this task must run + // before InternalStop(). + base::Unretained(this), + false)); } void AuraWindowCaptureMachine::SetWindow(aura::Window* window) {
diff --git a/content/browser/media/media_canplaytype_browsertest.cc b/content/browser/media/media_canplaytype_browsertest.cc index e3e1bb6..7dba85b 100644 --- a/content/browser/media/media_canplaytype_browsertest.cc +++ b/content/browser/media/media_canplaytype_browsertest.cc
@@ -75,7 +75,7 @@ #if !defined(MEDIA_DISABLE_FFMPEG) && !defined(OS_ANDROID) const char* kHi10pProbably = kPropProbably; #else -const char* kHi10pProbably = kMaybe; +const char* kHi10pProbably = kPropMaybe; #endif namespace content { @@ -891,16 +891,7 @@ TestMPEGUnacceptableCombinations("audio/x-m4a"); } -// When modifying this test, also change CodecSupportTest_Avc3Variants. -#if defined(OS_ANDROID) -// Failing on Android, https://crbug.com/601418. -#define MAYBE_CodecSupportTest_Avc1Variants \ - DISABLED_CodecSupportTest_Avc1Variants -#else -#define MAYBE_CodecSupportTest_Avc1Variants CodecSupportTest_Avc1Variants -#endif -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, - MAYBE_CodecSupportTest_Avc1Variants) { +IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc1Variants) { // avc1 without extensions results in "maybe" for compatibility. EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1\"'")); @@ -1004,16 +995,7 @@ EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.58201E\"'")); } -// When modifying this test, also change CodecSupportTest_Avc1Variants. -#if defined(OS_ANDROID) -// Failing on Android, https://crbug.com/601418. -#define MAYBE_CodecSupportTest_Avc3Variants \ - DISABLED_CodecSupportTest_Avc3Variants -#else -#define MAYBE_CodecSupportTest_Avc3Variants CodecSupportTest_Avc3Variants -#endif -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, - MAYBE_CodecSupportTest_Avc3Variants) { +IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc3Variants) { // avc3 without extensions results in "maybe" for compatibility. EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3\"'"));
diff --git a/content/browser/mojo/chrome_renderer_manifest.json b/content/browser/mojo/chrome_renderer_manifest.json deleted file mode 100644 index 463be6d2..0000000 --- a/content/browser/mojo/chrome_renderer_manifest.json +++ /dev/null
@@ -1,5 +0,0 @@ -{ - "name": "exe:chrome_renderer", - "display_name": "Chrome Renderer", - "capabilities": { "mojo:mus": [ "mus::mojom::Gpu" ] } -}
diff --git a/content/browser/mojo/constants.cc b/content/browser/mojo/constants.cc new file mode 100644 index 0000000..cbb7937 --- /dev/null +++ b/content/browser/mojo/constants.cc
@@ -0,0 +1,19 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/mojo/constants.h" + +namespace content { + +// The default application name the browser identifies as when connecting to +// the shell. This must match the name in +// src/content/public/app/mojo/content_browser_manifest.json. +const char kBrowserMojoApplicationName[] = "exe:content_browser"; + +// The default application name used to identify render processes when +// connecting them to the shell. This must match the name in +// src/content/public/app/mojo/content_renderer_manifest.json. +const char kRendererMojoApplicationName[] = "exe:content_renderer"; + +} // namespace content
diff --git a/content/browser/mojo/constants.h b/content/browser/mojo/constants.h new file mode 100644 index 0000000..ed6120a5 --- /dev/null +++ b/content/browser/mojo/constants.h
@@ -0,0 +1,15 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_MOJO_CONSTANTS_H_ +#define CONTENT_BROWSER_MOJO_CONSTANTS_H_ + +namespace content { + +extern const char kBrowserMojoApplicationName[]; +extern const char kRendererMojoApplicationName[]; + +} // namespace content + +#endif // CONTENT_BROWSER_MOJO_CONSTANTS_H_
diff --git a/content/browser/mojo/mojo_child_connection.cc b/content/browser/mojo/mojo_child_connection.cc index b123240..164ba0b 100644 --- a/content/browser/mojo/mojo_child_connection.cc +++ b/content/browser/mojo/mojo_child_connection.cc
@@ -11,12 +11,12 @@ #include "base/strings/stringprintf.h" #include "base/thread_task_runner_handle.h" #include "build/build_config.h" +#include "content/browser/mojo/constants.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/common/mojo_shell_connection.h" #include "ipc/ipc_sender.h" -#include "mojo/converters/network/network_type_converters.h" #include "mojo/edk/embedder/embedder.h" #include "mojo/public/cpp/system/message_pipe.h" #include "mojo/shell/public/cpp/connector.h" @@ -110,8 +110,7 @@ // PIDSender manages its own lifetime. new PIDSender(render_process_host, std::move(pid_receiver)); - - mojo::Identity target("exe:chrome_renderer", + mojo::Identity target(kRendererMojoApplicationName, mojo::shell::mojom::kInheritUserID, base::StringPrintf("%d_%d", child_process_id, instance_id));
diff --git a/content/browser/mojo/mojo_shell_context.cc b/content/browser/mojo/mojo_shell_context.cc index 5ca1470..55ef2985 100644 --- a/content/browser/mojo/mojo_shell_context.cc +++ b/content/browser/mojo/mojo_shell_context.cc
@@ -15,11 +15,13 @@ #include "base/thread_task_runner_handle.h" #include "components/profile_service/profile_app.h" #include "content/browser/gpu/gpu_process_host.h" +#include "content/browser/mojo/constants.h" #include "content/common/gpu_process_launch_causes.h" #include "content/common/mojo/current_thread_loader.h" #include "content/common/mojo/mojo_shell_connection_impl.h" #include "content/common/mojo/static_loader.h" #include "content/common/process_control.mojom.h" +#include "content/grit/content_resources.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/utility_process_host.h" @@ -30,6 +32,7 @@ #include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/string.h" #include "mojo/services/catalog/factory.h" +#include "mojo/services/catalog/manifest_provider.h" #include "mojo/services/catalog/store.h" #include "mojo/shell/connect_params.h" #include "mojo/shell/loader.h" @@ -43,8 +46,6 @@ namespace { -const char kBrowserAppName[] = "exe:chrome"; - // An extra set of apps to register on initialization, if set by a test. const MojoShellContext::StaticApplicationMap* g_applications_for_test; @@ -155,8 +156,43 @@ DISALLOW_COPY_AND_ASSIGN(GpuProcessLoader); }; +std::string GetStringResource(int id) { + return GetContentClient()->GetDataResource( + id, ui::ScaleFactor::SCALE_FACTOR_NONE).as_string(); +} + } // namespace +// A ManifestProvider which resolves application names to builtin manifest +// resources for the catalog service to consume. +class MojoShellContext::BuiltinManifestProvider + : public catalog::ManifestProvider { + public: + BuiltinManifestProvider() {} + ~BuiltinManifestProvider() override {} + + private: + // catalog::ManifestProvider: + bool GetApplicationManifest(const base::StringPiece& name, + std::string* manifest_contents) override { + if (name == "mojo:catalog") { + *manifest_contents = GetStringResource(IDR_MOJO_CATALOG_MANIFEST); + return true; + } else if (name == kBrowserMojoApplicationName) { + *manifest_contents = GetStringResource(IDR_MOJO_CONTENT_BROWSER_MANIFEST); + return true; + } else if (name == kRendererMojoApplicationName) { + *manifest_contents = + GetStringResource(IDR_MOJO_CONTENT_RENDERER_MANIFEST); + return true; + } + + return false; + } + + DISALLOW_COPY_AND_ASSIGN(BuiltinManifestProvider); +}; + // Thread-safe proxy providing access to the shell context from any thread. class MojoShellContext::Proxy { public: @@ -217,10 +253,11 @@ scoped_ptr<mojo::shell::NativeRunnerFactory> native_runner_factory( new mojo::shell::InProcessNativeRunnerFactory( BrowserThread::GetBlockingPool())); - catalog_.reset(new catalog::Factory(file_task_runner.get(), nullptr)); + manifest_provider_.reset(new BuiltinManifestProvider); + catalog_.reset(new catalog::Factory(file_task_runner.get(), nullptr, + manifest_provider_.get())); shell_.reset(new mojo::shell::Shell(std::move(native_runner_factory), catalog_->TakeShellClient())); - shell_->set_default_loader( scoped_ptr<mojo::shell::Loader>(new DefaultLoader)); @@ -273,9 +310,9 @@ } if (!IsRunningInMojoShell()) { - const bool is_external = false; MojoShellConnection::Create( - shell_->InitInstanceForEmbedder(kBrowserAppName), is_external); + shell_->InitInstanceForEmbedder(kBrowserMojoApplicationName), + false /* is_external */); } }
diff --git a/content/browser/mojo/mojo_shell_context.h b/content/browser/mojo/mojo_shell_context.h index fd8da40..959fd93 100644 --- a/content/browser/mojo/mojo_shell_context.h +++ b/content/browser/mojo/mojo_shell_context.h
@@ -53,6 +53,7 @@ static void SetApplicationsForTest(const StaticApplicationMap* apps); private: + class BuiltinManifestProvider; class Proxy; friend class Proxy; @@ -66,6 +67,7 @@ static base::LazyInstance<scoped_ptr<Proxy>> proxy_; + scoped_ptr<BuiltinManifestProvider> manifest_provider_; scoped_ptr<catalog::Factory> catalog_; scoped_ptr<mojo::shell::Shell> shell_;
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc index f99cb38..3412b33c 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/memory/scoped_ptr.h" +#include "base/win/win_util.h" #include "base/win/windows_version.h" #include "content/browser/accessibility/browser_accessibility_manager_win.h" #include "content/browser/accessibility/browser_accessibility_win.h" @@ -96,6 +97,10 @@ host_->OnLegacyWindowDestroyed(); host_ = NULL; } + + // Re-enable flicks for just a moment + base::win::EnableFlicks(hwnd); + delete this; } @@ -136,6 +141,9 @@ if (direct_manipulation_helper_) direct_manipulation_helper_->Initialize(hwnd()); + // Disable pen flicks (http://crbug.com/506977) + base::win::DisableFlicks(hwnd()); + return !!SUCCEEDED(hr); }
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 734aee25..522378ea 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1053,8 +1053,7 @@ bool enable_web_bluetooth = browser_command_line.HasSwitch(switches::kEnableWebBluetooth); #if defined(OS_CHROMEOS) || defined(OS_ANDROID) -// TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. -// enable_web_bluetooth = true; + enable_web_bluetooth = true; #endif if (enable_web_bluetooth) {
diff --git a/content/browser/storage_partition_impl_map.cc b/content/browser/storage_partition_impl_map.cc index 56bf93d..83360f39 100644 --- a/content/browser/storage_partition_impl_map.cc +++ b/content/browser/storage_partition_impl_map.cc
@@ -459,14 +459,13 @@ // These calls must happen after StoragePartitionImpl::Create(). if (partition_domain.empty()) { partition->SetURLRequestContext( - GetContentClient()->browser()->CreateRequestContext( - browser_context_, &protocol_handlers, - std::move(request_interceptors))); + browser_context_->CreateRequestContext( + &protocol_handlers, std::move(request_interceptors))); } else { partition->SetURLRequestContext( - GetContentClient()->browser()->CreateRequestContextForStoragePartition( - browser_context_, partition->GetPath(), in_memory, - &protocol_handlers, std::move(request_interceptors))); + browser_context_->CreateRequestContextForStoragePartition( + partition->GetPath(), in_memory, &protocol_handlers, + std::move(request_interceptors))); } partition->SetMediaURLRequestContext( partition_domain.empty() ?
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc index e62e7ad..ef96953 100644 --- a/content/browser/web_contents/web_contents_impl_unittest.cc +++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -229,14 +229,6 @@ ~WebContentsImplTestBrowserClient() override {} - net::URLRequestContextGetter* CreateRequestContext( - BrowserContext* browser_context, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) override { - return static_cast<TestBrowserContext*>(browser_context)-> - GetRequestContext(); - } - bool ShouldAssignSiteForURL(const GURL& url) override { return assign_site_for_url_; }
diff --git a/content/child/web_url_request_util.cc b/content/child/web_url_request_util.cc index 230d3d0..bae840b 100644 --- a/content/child/web_url_request_util.cc +++ b/content/child/web_url_request_util.cc
@@ -34,7 +34,7 @@ class HeaderFlattener : public blink::WebHTTPHeaderVisitor { public: - HeaderFlattener() : has_accept_header_(false) {} + HeaderFlattener() {} void visitHeader(const WebString& name, const WebString& value) override { // Headers are latin1. @@ -46,29 +46,17 @@ if (base::LowerCaseEqualsASCII(name_latin1, "referer")) return; - if (base::LowerCaseEqualsASCII(name_latin1, "accept")) - has_accept_header_ = true; - if (!buffer_.empty()) buffer_.append("\r\n"); buffer_.append(name_latin1 + ": " + value_latin1); } const std::string& GetBuffer() { - // In some cases, WebKit doesn't add an Accept header, but not having the - // header confuses some web servers. See bug 808613. - if (!has_accept_header_) { - if (!buffer_.empty()) - buffer_.append("\r\n"); - buffer_.append("Accept: */*"); - has_accept_header_ = true; - } return buffer_; } private: std::string buffer_; - bool has_accept_header_; }; } // namespace
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index b0fee26f..98c5168 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -182,7 +182,6 @@ "//media/gpu/ipc/common", "//media/midi", "//mojo/common:common_base", - "//mojo/converters/network", "//mojo/edk/system", "//mojo/shell", "//mojo/shell/public/cpp",
diff --git a/content/common/android/sync_compositor_messages.h b/content/common/android/sync_compositor_messages.h index d4556da..0ec4bf4 100644 --- a/content/common/android/sync_compositor_messages.h +++ b/content/common/android/sync_compositor_messages.h
@@ -14,6 +14,7 @@ #include "content/common/input/input_event_ack_state.h" #include "ipc/ipc_message_macros.h" #include "third_party/WebKit/public/web/WebInputEvent.h" +#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/scroll_offset.h" #ifndef CONTENT_COMMON_ANDROID_SYNC_COMPOSITOR_MESSAGES_H_ @@ -182,11 +183,10 @@ IPC_MESSAGE_ROUTED1(SyncCompositorMsg_UpdateState, content::SyncCompositorCommonBrowserParams) -// The synchronous version is used to synchronize state from an earlier -// asynchronous call only. This should be needed rarely so should prefer the -// asynchronous version above in general. -IPC_SYNC_MESSAGE_ROUTED1_1(SyncCompositorMsg_SynchronousUpdateState, +IPC_SYNC_MESSAGE_ROUTED3_1(SyncCompositorMsg_ZoomBy, content::SyncCompositorCommonBrowserParams, + float /* delta */, + gfx::Point /* anchor */, content::SyncCompositorCommonRendererParams) // -----------------------------------------------------------------------------
diff --git a/content/common/gpu/client/DEPS b/content/common/gpu/client/DEPS index fcba607..409909c 100644 --- a/content/common/gpu/client/DEPS +++ b/content/common/gpu/client/DEPS
@@ -1,14 +1,3 @@ include_rules = [ "+cc/blink", - "+media/gpu/ipc/common", - "+media/video/jpeg_decode_accelerator.h", - "+media/video/video_decode_accelerator.h", - "+media/video/video_encode_accelerator.h", ] - -specific_include_rules = { - # Tests can make use of content/browser/ infrastructure. - ".*browsertest\.cc": [ - "+content/browser" - ] -}
diff --git a/content/common/gpu/client/gpu_in_process_context_tests.cc b/content/common/gpu/client/gpu_in_process_context_tests.cc index 365f096..c8f0d3f2 100644 --- a/content/common/gpu/client/gpu_in_process_context_tests.cc +++ b/content/common/gpu/client/gpu_in_process_context_tests.cc
@@ -35,7 +35,6 @@ gfx::kNullAcceleratedWidget, /* window */ gfx::Size(1, 1), /* size */ nullptr, /* share_context */ - true, /* use_global_share_group */ attributes, gfx::PreferDiscreteGpu, ::gpu::GLInProcessContextSharedMemoryLimits(), nullptr, /* gpu_memory_buffer_manager */
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc index efa1b84d..1419419 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/content/common/gpu/media/android_video_decode_accelerator.cc
@@ -352,11 +352,15 @@ // Only use MediaCodec for VP8/9 if it's likely backed by hardware // or if the stream is encrypted. - if (codec_config_->codec_ == media::kCodecVP8 || - codec_config_->codec_ == media::kCodecVP9) { - DCHECK(is_encrypted_ || - !media::VideoCodecBridge::IsKnownUnaccelerated( - codec_config_->codec_, media::MEDIA_CODEC_DECODER)); + if ((codec_config_->codec_ == media::kCodecVP8 || + codec_config_->codec_ == media::kCodecVP9) && + !is_encrypted_ && + media::VideoCodecBridge::IsKnownUnaccelerated( + codec_config_->codec_, media::MEDIA_CODEC_DECODER)) { + DVLOG(1) << "Initialization failed: " + << (codec_config_->codec_ == media::kCodecVP8 ? "vp8" : "vp9") + << " is not hardware accelerated"; + return false; } auto gles_decoder = get_gles2_decoder_cb_.Run(); @@ -1277,7 +1281,7 @@ profiles.push_back(profile); } - if (media::PlatformHasVp9Support()) { + if (media::MediaCodecUtil::IsVp9DecoderAvailable()) { profile.min_resolution.SetSize(0, 0); profile.max_resolution.SetSize(1920, 1088); // If we know MediaCodec will just create a software codec, prefer our
diff --git a/content/common/mojo/mojo_shell_connection_impl.cc b/content/common/mojo/mojo_shell_connection_impl.cc index 3f3a693..5214096 100644 --- a/content/common/mojo/mojo_shell_connection_impl.cc +++ b/content/common/mojo/mojo_shell_connection_impl.cc
@@ -12,7 +12,6 @@ #include "base/stl_util.h" #include "base/threading/thread_local.h" #include "content/public/common/content_switches.h" -#include "mojo/converters/network/network_type_converters.h" #include "mojo/edk/embedder/embedder.h" #include "mojo/edk/embedder/platform_channel_pair.h" #include "mojo/shell/public/cpp/shell_client.h"
diff --git a/content/content.gyp b/content/content.gyp index 9a70c9b..2221d03 100644 --- a/content/content.gyp +++ b/content/content.gyp
@@ -58,31 +58,32 @@ ], }, { - # GN version: //content/browser:chrome_manifest - 'target_name': 'chrome_manifest', + # GN version: //content/public/app:browser_manifest + 'target_name': 'content_app_browser_manifest', 'type': 'none', 'variables': { 'application_type': 'exe', - 'application_name': 'chrome', - 'source_manifest': '<(DEPTH)/content/browser/mojo/chrome_manifest.json', + 'application_name': 'content_browser', + 'source_manifest': '<(DEPTH)/content/public/app/mojo/content_browser_manifest.json', }, 'includes': [ '../mojo/public/mojo_application_manifest.gypi', ], + 'hard_dependency': 1, }, { - # GN version: //content/browser:chrome_renderer_manifest - 'target_name': 'chrome_renderer_manifest', + # GN version: //content/public/app:renderer_manifest + 'target_name': 'content_app_renderer_manifest', 'type': 'none', 'variables': { 'application_type': 'exe', - 'application_name': 'chrome_renderer', - 'source_manifest': - '<(DEPTH)/content/browser/mojo/chrome_renderer_manifest.json', + 'application_name': 'content_renderer', + 'source_manifest': '<(DEPTH)/content/public/app/mojo/content_renderer_manifest.json', }, 'includes': [ '../mojo/public/mojo_application_manifest.gypi', ], + 'hard_dependency': 1, }, ], 'includes': [ @@ -208,8 +209,6 @@ '../build/android/disable_gcc_lto.gypi', ], 'dependencies': [ - 'chrome_manifest', - 'chrome_renderer_manifest', 'content_common', 'content_gpu', 'content_resources', @@ -395,8 +394,6 @@ 'target_name': 'content_common', 'type': 'none', 'dependencies': [ - 'chrome_manifest', - 'chrome_renderer_manifest', 'content', 'content_resources' ],
diff --git a/content/content_browser.gypi b/content/content_browser.gypi index bd50f0a..57bc508 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi
@@ -31,7 +31,6 @@ '../mojo/mojo_base.gyp:tracing_service_lib', '../mojo/mojo_public.gyp:mojo_cpp_bindings', '../mojo/mojo_public.gyp:mojo_js_bindings', - '../mojo/mojo_services.gyp:network_service_bindings_lib', '../mojo/mojo_shell.gyp:mojo_runner_common_lib', '../mojo/mojo_shell.gyp:mojo_runner_host_lib', '../mojo/mojo_shell.gyp:mojo_shell_lib', @@ -1120,6 +1119,8 @@ 'browser/message_port_service.h', 'browser/mime_registry_message_filter.cc', 'browser/mime_registry_message_filter.h', + 'browser/mojo/constants.cc', + 'browser/mojo/constants.h', 'browser/mojo/mojo_app_connection_impl.cc', 'browser/mojo/mojo_app_connection_impl.h', 'browser/mojo/mojo_application_host.cc',
diff --git a/content/content_resources.grd b/content/content_resources.grd index 99e1fa7..76fc7498 100644 --- a/content/content_resources.grd +++ b/content/content_resources.grd
@@ -27,6 +27,9 @@ <include name="IDR_INDEXED_DB_INTERNALS_CSS" file="browser/resources/indexed_db/indexeddb_internals.css" flattenhtml="true" type="BINDATA" /> <include name="IDR_MEDIA_INTERNALS_HTML" file="browser/resources/media/media_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_MEDIA_INTERNALS_JS" file="browser/resources/media/media_internals.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MOJO_CATALOG_MANIFEST" file="../mojo/services/catalog/manifest.json" type="BINDATA" /> + <include name="IDR_MOJO_CONTENT_BROWSER_MANIFEST" file="${root_out_dir}/content_browser_manifest.json" use_base_dir="false" type="BINDATA" /> + <include name="IDR_MOJO_CONTENT_RENDERER_MANIFEST" file="${root_out_dir}/content_renderer_manifest.json" use_base_dir="false" type="BINDATA" /> <include name="IDR_NETWORK_ERROR_LISTING_HTML" file="browser/resources/net/network_errors_listing.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_NETWORK_ERROR_LISTING_JS" file="browser/resources/net/network_errors_listing.js" flattenhtml="true" type="BINDATA" /> <include name="IDR_NETWORK_ERROR_LISTING_CSS" file="browser/resources/net/network_errors_listing.css" flattenhtml="true" type="BINDATA" />
diff --git a/content/content_resources.gypi b/content/content_resources.gypi index d61642f..01d3d03 100644 --- a/content/content_resources.gypi +++ b/content/content_resources.gypi
@@ -16,6 +16,9 @@ 'action_name': 'generate_content_resources', 'variables': { 'grit_grd_file': 'content_resources.grd', + 'grit_additional_defines': [ + '-E', 'root_out_dir=<(PRODUCT_DIR)', + ], }, 'includes': [ '../build/grit_action.gypi' ], }, @@ -28,6 +31,11 @@ ], }, ], + 'dependencies': [ + '<(DEPTH)/mojo/mojo_shell.gyp:mojo_catalog_manifest', + 'content_app_browser_manifest', + 'content_app_renderer_manifest', + ], }, ], }
diff --git a/content/public/app/BUILD.gn b/content/public/app/BUILD.gn index c6280d3..5fe6249 100644 --- a/content/public/app/BUILD.gn +++ b/content/public/app/BUILD.gn
@@ -21,6 +21,7 @@ # //content/public/app:both_sources (source set) import("//build/config/chrome_build.gni") +import("//mojo/public/mojo_application_manifest.gni") public_app_shared_sources = [ "content_jni_onload.h", @@ -140,3 +141,15 @@ } } } + +mojo_application_manifest("browser_manifest") { + type = "exe" + application_name = "content_browser" + source = "mojo/content_browser_manifest.json" +} + +mojo_application_manifest("renderer_manifest") { + type = "exe" + application_name = "content_renderer" + source = "mojo/content_renderer_manifest.json" +}
diff --git a/content/browser/mojo/chrome_manifest.json b/content/public/app/mojo/content_browser_manifest.json similarity index 76% rename from content/browser/mojo/chrome_manifest.json rename to content/public/app/mojo/content_browser_manifest.json index ef5e6de..96ff473 100644 --- a/content/browser/mojo/chrome_manifest.json +++ b/content/public/app/mojo/content_browser_manifest.json
@@ -1,7 +1,7 @@ { "manifest_version": 1, - "name": "exe:chrome", - "display_name": "Chrome", + "name": "exe:content_browser", + "display_name": "Content Browser", "capabilities": { "required": { "*": { "interfaces": [ "*" ] },
diff --git a/content/public/app/mojo/content_renderer_manifest.json b/content/public/app/mojo/content_renderer_manifest.json new file mode 100644 index 0000000..053edd0 --- /dev/null +++ b/content/public/app/mojo/content_renderer_manifest.json
@@ -0,0 +1,5 @@ +{ + "name": "exe:content_renderer", + "display_name": "Content Renderer", + "capabilities": { "mojo:mus": [ "mus::mojom::Gpu" ] } +}
diff --git a/content/public/browser/android/synchronous_compositor.h b/content/public/browser/android/synchronous_compositor.h index 57fdb13..560f7428 100644 --- a/content/public/browser/android/synchronous_compositor.h +++ b/content/public/browser/android/synchronous_compositor.h
@@ -21,6 +21,7 @@ } namespace gfx { +class Point; class ScrollOffset; class Transform; }; @@ -89,14 +90,16 @@ virtual void DidChangeRootLayerScrollOffset( const gfx::ScrollOffset& root_offset) = 0; + // Allows embedder to synchronously update the zoom level, ie page scale + // factor, around the anchor point. + virtual void SynchronouslyZoomBy(float zoom_delta, + const gfx::Point& anchor) = 0; + // Called by the embedder to notify that the compositor is active. The // compositor won't ask for vsyncs when it's inactive. NOTE: The compositor // starts off as inactive and needs a SetActive(true) call to begin. virtual void SetIsActive(bool is_active) = 0; - // Synchronize all renderer state to UI thread. This blocks the UI thread. - virtual void SynchronizeWithRenderer() = 0; - // Called by the embedder to notify that the OnComputeScroll step is happening // and if any input animation is active, it should tick now. virtual void OnComputeScroll(base::TimeTicks animation_time) = 0;
diff --git a/content/public/browser/browser_context.h b/content/public/browser/browser_context.h index 76ff944..369e5bd 100644 --- a/content/public/browser/browser_context.h +++ b/content/public/browser/browser_context.h
@@ -8,14 +8,20 @@ #include <stddef.h> #include <stdint.h> +#include <map> + #include "base/callback_forward.h" #include "base/containers/hash_tables.h" +#include "base/memory/linked_ptr.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" #include "base/supports_user_data.h" #include "content/common/content_export.h" #include "content/public/browser/zoom_level_delegate.h" #include "content/public/common/push_event_payload.h" #include "content/public/common/push_messaging_status.h" +#include "net/url_request/url_request_interceptor.h" +#include "net/url_request/url_request_job_factory.h" class GURL; @@ -51,6 +57,16 @@ class StoragePartition; class SSLHostStateDelegate; +// A mapping from the scheme name to the protocol handler that services its +// content. +typedef std::map< + std::string, linked_ptr<net::URLRequestJobFactory::ProtocolHandler> > + ProtocolHandlerMap; + +// A scoped vector of protocol interceptors. +typedef ScopedVector<net::URLRequestInterceptor> + URLRequestInterceptorScopedVector; + // This class holds the context needed for a browsing session. // It lives on the UI thread. All these methods must only be called on the UI // thread. @@ -200,6 +216,19 @@ // Returns the BackgroundSyncController associated with that context if any, // nullptr otherwise. virtual BackgroundSyncController* GetBackgroundSyncController() = 0; + + // Creates the main net::URLRequestContextGetter. It's called only once. + virtual net::URLRequestContextGetter* CreateRequestContext( + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) = 0; + + // Creates the net::URLRequestContextGetter for a StoragePartition. It's + // called only once per partition_path. + virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) = 0; }; } // namespace content
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 97579e6..23fd868 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -61,23 +61,6 @@ return false; } -net::URLRequestContextGetter* ContentBrowserClient::CreateRequestContext( - BrowserContext* browser_context, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) { - return nullptr; -} - -net::URLRequestContextGetter* -ContentBrowserClient::CreateRequestContextForStoragePartition( - BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) { - return nullptr; -} - bool ContentBrowserClient::IsHandledURL(const GURL& url) { return false; }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 13bebea..8b111979 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -13,7 +13,6 @@ #include <vector> #include "base/callback_forward.h" -#include "base/memory/linked_ptr.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/values.h" @@ -27,8 +26,6 @@ #include "content/public/common/window_container_type.h" #include "net/base/mime_util.h" #include "net/cookies/canonical_cookie.h" -#include "net/url_request/url_request_interceptor.h" -#include "net/url_request/url_request_job_factory.h" #include "storage/browser/fileapi/file_system_context.h" #include "third_party/WebKit/public/platform/WebPageVisibilityState.h" #include "ui/base/window_open_disposition.h" @@ -128,16 +125,6 @@ struct Referrer; struct WebPreferences; -// A mapping from the scheme name to the protocol handler that services its -// content. -typedef std::map< - std::string, linked_ptr<net::URLRequestJobFactory::ProtocolHandler> > - ProtocolHandlerMap; - -// A scoped vector of protocol interceptors. -typedef ScopedVector<net::URLRequestInterceptor> - URLRequestInterceptorScopedVector; - // Embedder API (or SPI) for participating in browser logic, to be implemented // by the client of the content browser. See ChromeContentBrowserClient for the // principal implementation. The methods are assumed to be called on the UI @@ -235,24 +222,6 @@ // chrome://) URLs are logged. Returns whether the URL was actually logged. virtual bool LogWebUIUrl(const GURL& web_ui_url) const; - // Creates the main net::URLRequestContextGetter. Should only be called once - // per ContentBrowserClient object. - // TODO(ajwong): Remove once http://crbug.com/159193 is resolved. - virtual net::URLRequestContextGetter* CreateRequestContext( - BrowserContext* browser_context, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors); - - // Creates the net::URLRequestContextGetter for a StoragePartition. Should - // only be called once per partition_path per ContentBrowserClient object. - // TODO(ajwong): Remove once http://crbug.com/159193 is resolved. - virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors); - // Returns whether a specified URL is handled by the embedder's internal // protocol handlers. virtual bool IsHandledURL(const GURL& url);
diff --git a/content/public/test/test_browser_context.cc b/content/public/test/test_browser_context.cc index 40fc32ce..4e37e8b 100644 --- a/content/public/test/test_browser_context.cc +++ b/content/public/test/test_browser_context.cc
@@ -143,4 +143,19 @@ return background_sync_controller_.get(); } +net::URLRequestContextGetter* TestBrowserContext::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return GetRequestContext(); +} + +net::URLRequestContextGetter* +TestBrowserContext::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + } // namespace content
diff --git a/content/public/test/test_browser_context.h b/content/public/test/test_browser_context.h index a1d7ff7..5e97047 100644 --- a/content/public/test/test_browser_context.h +++ b/content/public/test/test_browser_context.h
@@ -51,6 +51,14 @@ SSLHostStateDelegate* GetSSLHostStateDelegate() override; PermissionManager* GetPermissionManager() override; BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + ProtocolHandlerMap* protocol_handlers, + URLRequestInterceptorScopedVector request_interceptors) override; private: base::ScopedTempDir browser_context_dir_;
diff --git a/content/public/test/test_synchronous_compositor_android.h b/content/public/test/test_synchronous_compositor_android.h index baa395d4..183a1a6 100644 --- a/content/public/test/test_synchronous_compositor_android.h +++ b/content/public/test/test_synchronous_compositor_android.h
@@ -38,8 +38,9 @@ void SetMemoryPolicy(size_t bytes_limit) override {} void DidChangeRootLayerScrollOffset( const gfx::ScrollOffset& root_offset) override {} + void SynchronouslyZoomBy(float zoom_delta, + const gfx::Point& anchor) override {} void SetIsActive(bool is_active) override {} - void SynchronizeWithRenderer() override {} void OnComputeScroll(base::TimeTicks animate_time) override {} void SetHardwareFrame(uint32_t output_surface_id,
diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc index 0cdb1b0..dc9c00a 100644 --- a/content/renderer/android/synchronous_compositor_proxy.cc +++ b/content/renderer/android/synchronous_compositor_proxy.cc
@@ -171,8 +171,7 @@ IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) - IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronousUpdateState, - SynchronousUpdateState) + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) IPC_END_MESSAGE_MAP() } @@ -398,12 +397,15 @@ } } -void SynchronousCompositorProxy::SynchronousUpdateState( +void SynchronousCompositorProxy::SynchronouslyZoomBy( const SyncCompositorCommonBrowserParams& common_params, + float zoom_delta, + const gfx::Point& anchor, SyncCompositorCommonRendererParams* common_renderer_params) { DCHECK(!inside_receive_); base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); ProcessCommonParams(common_params); + input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); PopulateCommonParams(common_renderer_params); }
diff --git a/content/renderer/android/synchronous_compositor_proxy.h b/content/renderer/android/synchronous_compositor_proxy.h index 8b15859..8d89833 100644 --- a/content/renderer/android/synchronous_compositor_proxy.h +++ b/content/renderer/android/synchronous_compositor_proxy.h
@@ -109,8 +109,10 @@ void DemandDrawSw(const SyncCompositorCommonBrowserParams& common_params, const SyncCompositorDemandDrawSwParams& params, IPC::Message* reply_message); - void SynchronousUpdateState( + void SynchronouslyZoomBy( const SyncCompositorCommonBrowserParams& common_params, + float zoom_delta, + const gfx::Point& anchor, SyncCompositorCommonRendererParams* common_renderer_params); void SwapBuffersHw(uint32_t output_surface_id, cc::CompositorFrame* frame);
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 09f54d63d..75e0482 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -273,8 +273,8 @@ } bool BrowserPlugin::initialize(WebPluginContainer* container) { - if (!container) - return false; + DCHECK(container); + DCHECK_EQ(this, container->plugin()); container_ = container; container_->setWantsWheelEvents(true);
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc index e95a9f0d..028bdee 100644 --- a/content/renderer/gpu/gpu_benchmarking_extension.cc +++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -496,6 +496,9 @@ .SetMethod("swipe", &GpuBenchmarking::Swipe) .SetMethod("scrollBounce", &GpuBenchmarking::ScrollBounce) .SetMethod("pinchBy", &GpuBenchmarking::PinchBy) + .SetMethod("pageScaleFactor", &GpuBenchmarking::PageScaleFactor) + .SetMethod("visualViewportX", &GpuBenchmarking::VisualViewportX) + .SetMethod("visualViewportY", &GpuBenchmarking::VisualViewportY) .SetMethod("visualViewportHeight", &GpuBenchmarking::VisualViewportHeight) .SetMethod("visualViewportWidth", &GpuBenchmarking::VisualViewportWidth) .SetMethod("tap", &GpuBenchmarking::Tap) @@ -765,6 +768,7 @@ scoped_ptr<SyntheticPinchGestureParams> gesture_params( new SyntheticPinchGestureParams); + // TODO(bokan): Remove page scale here when change land in Catapult. // Convert coordinates from CSS pixels to density independent pixels (DIPs). float page_scale_factor = context.web_view()->pageScaleFactor(); @@ -791,6 +795,27 @@ return true; } +float GpuBenchmarking::PageScaleFactor() { + GpuBenchmarkingContext context; + if (!context.Init(false)) + return 0.0; + return context.web_view()->pageScaleFactor(); +} + +float GpuBenchmarking::VisualViewportY() { + GpuBenchmarkingContext context; + if (!context.Init(false)) + return 0.0; + return context.web_view()->visualViewportOffset().y; +} + +float GpuBenchmarking::VisualViewportX() { + GpuBenchmarkingContext context; + if (!context.Init(false)) + return 0.0; + return context.web_view()->visualViewportOffset().x; +} + float GpuBenchmarking::VisualViewportHeight() { GpuBenchmarkingContext context; if (!context.Init(false))
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.h b/content/renderer/gpu/gpu_benchmarking_extension.h index b77aa5a..19fcbcb9 100644 --- a/content/renderer/gpu/gpu_benchmarking_extension.h +++ b/content/renderer/gpu/gpu_benchmarking_extension.h
@@ -48,8 +48,11 @@ bool Swipe(gin::Arguments* args); bool ScrollBounce(gin::Arguments* args); bool PinchBy(gin::Arguments* args); + float VisualViewportX(); + float VisualViewportY(); float VisualViewportHeight(); float VisualViewportWidth(); + float PageScaleFactor(); bool Tap(gin::Arguments* args); void ClearImageCache(); int RunMicroBenchmark(gin::Arguments* args);
diff --git a/content/renderer/media/rtc_video_encoder_factory.cc b/content/renderer/media/rtc_video_encoder_factory.cc index 194a236f..7e99b7c 100644 --- a/content/renderer/media/rtc_video_encoder_factory.cc +++ b/content/renderer/media/rtc_video_encoder_factory.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "content/public/common/content_switches.h" +#include "content/public/common/feature_h264_with_openh264_ffmpeg.h" #include "content/renderer/media/rtc_video_encoder.h" #include "media/gpu/ipc/client/gpu_video_encode_accelerator_host.h" #include "media/renderers/gpu_video_accelerator_factories.h" @@ -32,7 +33,13 @@ webrtc::kVideoCodecVP8, "VP8", width, height, fps)); } else if (profile.profile >= media::H264PROFILE_MIN && profile.profile <= media::H264PROFILE_MAX) { - if (cmd_line->HasSwitch(switches::kEnableWebRtcHWH264Encoding)) { + bool webrtc_h264_enabled = false; +#if BUILDFLAG(RTC_USE_H264) && defined(OS_MACOSX) + webrtc_h264_enabled = + base::FeatureList::IsEnabled(kWebRtcH264WithOpenH264FFmpeg); +#endif // BUILDFLAG(RTC_USE_H264) && defined(OS_MACOSX) + if (cmd_line->HasSwitch(switches::kEnableWebRtcHWH264Encoding) || + webrtc_h264_enabled) { codecs->push_back(cricket::WebRtcVideoEncoderFactory::VideoCodec( webrtc::kVideoCodecH264, "H264", width, height, fps)); }
diff --git a/content/renderer/pepper/pepper_webplugin_impl.cc b/content/renderer/pepper/pepper_webplugin_impl.cc index af5a4d2..130cde2 100644 --- a/content/renderer/pepper/pepper_webplugin_impl.cc +++ b/content/renderer/pepper/pepper_webplugin_impl.cc
@@ -65,9 +65,8 @@ full_frame_(params.loadManually), throttler_(std::move(throttler)), instance_object_(PP_MakeUndefined()), - container_(NULL), - destroyed_(false), - weak_factory_(this) { + container_(nullptr), + destroyed_(false) { DCHECK(plugin_module); init_data_->module = plugin_module; init_data_->render_frame = render_frame; @@ -91,34 +90,32 @@ } bool PepperWebPluginImpl::initialize(WebPluginContainer* container) { + DCHECK(container); + DCHECK_EQ(this, container->plugin()); + + container_ = container; + // The plugin delegate may have gone away. instance_ = init_data_->module->CreateInstance( init_data_->render_frame, container, init_data_->url); - if (!instance_.get()) + if (!instance_) return false; - auto weak_this = weak_factory_.GetWeakPtr(); - bool success = - instance_->Initialize(init_data_->arg_names, init_data_->arg_values, - full_frame_, std::move(throttler_)); - // The above call to Initialize can result in re-entrancy and destruction of - // the plugin instance. In this case it's quite unclear whether this object - // could also have been destroyed. We could return false here, but it would be - // better if this object was guaranteed to outlast the recursive call. - // Otherwise, the caller of this function would also have to take care that, - // in the case of the object being deleted, we never access it again, and we - // would just keep passing that responsibility further up the call stack. - // Classes tend not to be written with this possibility in mind so it's best - // to make this assumption as far down the call stack (as close to the - // re-entrant call) as possible. Also take care not to access the plugin - // instance again in that case. crbug.com/487146. - CHECK(weak_this); + if (!instance_->Initialize(init_data_->arg_names, init_data_->arg_values, + full_frame_, std::move(throttler_))) { + // If |container_| is nullptr, this object has already been synchronously + // destroy()-ed during |instance_|'s Initialize call. In that case, we early + // exit. We neither create a replacement plugin nor destroy() ourselves. + if (!container_) + return false; - if (!success) { - if (instance_) { - instance_->Delete(); - instance_ = NULL; - } + DCHECK(!destroyed_); + + DCHECK(instance_); + ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(instance_object_); + instance_object_ = PP_MakeUndefined(); + instance_->Delete(); + instance_ = nullptr; blink::WebPlugin* replacement_plugin = GetContentClient()->renderer()->CreatePluginReplacement( @@ -141,8 +138,6 @@ } init_data_.reset(); - CHECK(container->plugin() == this); - container_ = container; return true; } @@ -151,11 +146,13 @@ CHECK(!destroyed_); destroyed_ = true; - if (instance_.get()) { + container_ = nullptr; + + if (instance_) { ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(instance_object_); instance_object_ = PP_MakeUndefined(); instance_->Delete(); - instance_ = NULL; + instance_ = nullptr; } base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); @@ -165,22 +162,22 @@ v8::Isolate* isolate) { // Re-entrancy may cause JS to try to execute script on the plugin before it // is fully initialized. See e.g. crbug.com/503401. - if (!instance_.get()) + if (!instance_) return v8::Local<v8::Object>(); // Call through the plugin to get its instance object. The plugin should pass // us a reference which we release in destroy(). if (instance_object_.type == PP_VARTYPE_UNDEFINED) instance_object_ = instance_->GetInstanceObject(isolate); // GetInstanceObject talked to the plugin which may have removed the instance - // from the DOM, in which case instance_ would be NULL now. - if (!instance_.get()) + // from the DOM, in which case instance_ would be nullptr now. + if (!instance_) return v8::Local<v8::Object>(); scoped_refptr<V8ObjectVar> object_var( V8ObjectVar::FromPPVar(instance_object_)); // If there's an InstanceObject, tell the Instance's MessageChannel to pass // any non-postMessage calls to it. - if (object_var.get()) { + if (object_var) { MessageChannel* message_channel = instance_->message_channel(); if (message_channel) message_channel->SetPassthroughObject(object_var->GetHandle()); @@ -238,20 +235,20 @@ void PepperWebPluginImpl::didReceiveData(const char* data, int data_length) { blink::WebURLLoaderClient* document_loader = instance_->document_loader(); if (document_loader) - document_loader->didReceiveData(NULL, data, data_length, 0); + document_loader->didReceiveData(nullptr, data, data_length, 0); } void PepperWebPluginImpl::didFinishLoading() { blink::WebURLLoaderClient* document_loader = instance_->document_loader(); if (document_loader) document_loader->didFinishLoading( - NULL, 0.0, blink::WebURLLoaderClient::kUnknownEncodedDataLength); + nullptr, 0.0, blink::WebURLLoaderClient::kUnknownEncodedDataLength); } void PepperWebPluginImpl::didFailLoading(const blink::WebURLError& error) { blink::WebURLLoaderClient* document_loader = instance_->document_loader(); if (document_loader) - document_loader->didFail(NULL, error); + document_loader->didFail(nullptr, error); } bool PepperWebPluginImpl::hasSelection() const {
diff --git a/content/renderer/pepper/pepper_webplugin_impl.h b/content/renderer/pepper/pepper_webplugin_impl.h index db4c5ae..7b4423c 100644 --- a/content/renderer/pepper/pepper_webplugin_impl.h +++ b/content/renderer/pepper/pepper_webplugin_impl.h
@@ -103,8 +103,6 @@ // TODO(tommycli): Remove once we fix https://crbug.com/588624. bool destroyed_; - base::WeakPtrFactory<PepperWebPluginImpl> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(PepperWebPluginImpl); };
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index f4a1764..e24d104 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -302,11 +302,6 @@ namespace { -const char kDefaultAcceptHeader[] = - "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/" - "*;q=0.8"; -const char kAcceptHeader[] = "Accept"; - const size_t kExtraCharsBeforeAndAfterSelection = 100; typedef std::map<int, RenderFrameImpl*> RoutingIDFrameMap; @@ -3758,15 +3753,6 @@ stream_override = old_extra_data->TakeStreamOverrideOwnership(); } - // Add the default accept header for frame request if it has not been set - // already. - if ((request.getFrameType() == blink::WebURLRequest::FrameTypeTopLevel || - request.getFrameType() == blink::WebURLRequest::FrameTypeNested) && - request.httpHeaderField(WebString::fromUTF8(kAcceptHeader)).isEmpty()) { - request.setHTTPHeaderField(WebString::fromUTF8(kAcceptHeader), - WebString::fromUTF8(kDefaultAcceptHeader)); - } - // Add an empty HTTP origin header for non GET methods if none is currently // present. request.addHTTPOriginIfNeeded(WebString());
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index bb7b4e7..30047189 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -813,9 +813,13 @@ DCHECK(parsed_num_raster_threads) << string_value; DCHECK_GT(num_raster_threads, 0); - // TODO(vmpstr): If the flag sticks, we should clean it up and always have - // image decode tasks. +#if defined(OS_ANDROID) + // Note: Currently, enabling image decode tasks only provides a benefit if + // we use high quality interpolation filters, which are disabled on android. + are_image_decode_tasks_enabled_ = false; +#else are_image_decode_tasks_enabled_ = true; +#endif raster_worker_pool_->Start(num_raster_threads);
diff --git a/content/shell/browser/shell_browser_context.h b/content/shell/browser/shell_browser_context.h index 1b3c0c48..b848ca36 100644 --- a/content/shell/browser/shell_browser_context.h +++ b/content/shell/browser/shell_browser_context.h
@@ -58,15 +58,14 @@ SSLHostStateDelegate* GetSSLHostStateDelegate() override; PermissionManager* GetPermissionManager() override; BackgroundSyncController* GetBackgroundSyncController() override; - net::URLRequestContextGetter* CreateRequestContext( ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors); + URLRequestInterceptorScopedVector request_interceptors) override; net::URLRequestContextGetter* CreateRequestContextForStoragePartition( const base::FilePath& partition_path, bool in_memory, ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors); + URLRequestInterceptorScopedVector request_interceptors) override; protected: // Contains URLRequestContextGetter required for resource loading.
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc index 73d258f..904133c2 100644 --- a/content/shell/browser/shell_content_browser_client.cc +++ b/content/shell/browser/shell_content_browser_client.cc
@@ -157,30 +157,6 @@ return base::MatchPattern(origin, pattern); } -net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext( - BrowserContext* content_browser_context, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) { - ShellBrowserContext* shell_browser_context = - ShellBrowserContextForBrowserContext(content_browser_context); - return shell_browser_context->CreateRequestContext( - protocol_handlers, std::move(request_interceptors)); -} - -net::URLRequestContextGetter* -ShellContentBrowserClient::CreateRequestContextForStoragePartition( - BrowserContext* content_browser_context, - const base::FilePath& partition_path, - bool in_memory, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) { - ShellBrowserContext* shell_browser_context = - ShellBrowserContextForBrowserContext(content_browser_context); - return shell_browser_context->CreateRequestContextForStoragePartition( - partition_path, in_memory, protocol_handlers, - std::move(request_interceptors)); -} - bool ShellContentBrowserClient::IsHandledURL(const GURL& url) { if (!url.is_valid()) return false; @@ -380,13 +356,4 @@ return new ShellAccessTokenStore(browser_context()); } -ShellBrowserContext* -ShellContentBrowserClient::ShellBrowserContextForBrowserContext( - BrowserContext* content_browser_context) { - if (content_browser_context == browser_context()) - return browser_context(); - DCHECK_EQ(content_browser_context, off_the_record_browser_context()); - return off_the_record_browser_context(); -} - } // namespace content
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h index 74cc249..cd8106f 100644 --- a/content/shell/browser/shell_content_browser_client.h +++ b/content/shell/browser/shell_content_browser_client.h
@@ -35,16 +35,6 @@ const MainFunctionParams& parameters) override; bool DoesSiteRequireDedicatedProcess(BrowserContext* browser_context, const GURL& effective_url) override; - net::URLRequestContextGetter* CreateRequestContext( - BrowserContext* browser_context, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) override; - net::URLRequestContextGetter* CreateRequestContextForStoragePartition( - BrowserContext* browser_context, - const base::FilePath& partition_path, - bool in_memory, - ProtocolHandlerMap* protocol_handlers, - URLRequestInterceptorScopedVector request_interceptors) override; bool IsHandledURL(const GURL& url) override; void RegisterInProcessMojoApplications( StaticMojoApplicationMap* apps) override; @@ -117,8 +107,6 @@ } private: - ShellBrowserContext* ShellBrowserContextForBrowserContext( - BrowserContext* content_browser_context); scoped_ptr<ShellResourceDispatcherHostDelegate> resource_dispatcher_host_delegate_;
diff --git a/content/shell/browser/shell_url_request_context_getter.h b/content/shell/browser/shell_url_request_context_getter.h index a7fa233b..3c2a7cdd 100644 --- a/content/shell/browser/shell_url_request_context_getter.h +++ b/content/shell/browser/shell_url_request_context_getter.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include "content/public/browser/content_browser_client.h" +#include "content/public/browser/browser_context.h" #include "net/proxy/proxy_config_service.h" #include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_job_factory.h"
diff --git a/content/test/data/web_ui_mojo_shell_test.js b/content/test/data/web_ui_mojo_shell_test.js index 219f47dd..dbe4c14 100644 --- a/content/test/data/web_ui_mojo_shell_test.js +++ b/content/test/data/web_ui_mojo_shell_test.js
@@ -13,12 +13,10 @@ define('main', [ 'mojo/public/js/core', 'mojo/public/js/router', - 'mojo/services/network/public/interfaces/url_loader.mojom', 'mojo/shell/public/interfaces/connector.mojom', 'content/public/renderer/frame_service_registry', 'content/public/test/test_mojo_service.mojom', -], function (core, router, urlMojom, connectorMojom, serviceRegistry, - testMojom) { +], function (core, router, connectorMojom, serviceRegistry, testMojom) { var connectToService = function(serviceProvider, iface) { var pipe = core.createMessagePipe();
diff --git a/content/test/gpu/PRESUBMIT.py b/content/test/gpu/PRESUBMIT.py index 769587c0..da0d24f 100644 --- a/content/test/gpu/PRESUBMIT.py +++ b/content/test/gpu/PRESUBMIT.py
@@ -80,8 +80,9 @@ return [] bots = [ - 'tryserver.chromium.win:win_optional_gpu_tests_rel', + 'tryserver.chromium.linux:linux_optional_gpu_tests_rel', 'tryserver.chromium.mac:mac_optional_gpu_tests_rel', + 'tryserver.chromium.win:win_optional_gpu_tests_rel', ] results = []
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py index a96fa20f..e4875a48 100644 --- a/content/test/gpu/gpu_tests/pixel_expectations.py +++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -23,9 +23,3 @@ # TODO(ccameron): Remove suppression after rebaseline. self.Fail('Pixel.CSS3DBlueBox', ['mac'], bug=533690) self.Fail('Pixel.CSS3DBlueBoxES3', ['mac'], bug=533690) - - # TODO(erikchen): Remove suppression after generating reference images. - self.Fail('Pixel.IOSurface2DCanvasWebGL', ['mac'], bug=595063) - - # TODO(erikchen): Remove suppression after generating reference images. - self.Fail('Pixel.2DCanvasWebGL', bug=595063)
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py index ed8c5e6..2dc49bf 100644 --- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py +++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -11,13 +11,6 @@ def SetExpectations(self): # All platforms. - self.Skip('deqp/data/gles3/shaders/functions.html', bug=483282) - self.Skip('deqp/data/gles3/shaders/linkage.html', bug=483282) - self.Skip('deqp/data/gles3/shaders/preprocessor.html', bug=483282) - - self.Skip('deqp/framework/opengl/simplereference/referencecontext.html', - bug=483282) - self.Skip('deqp/functional/gles3/attriblocation.html', bug=483282) self.Skip('deqp/functional/gles3/builtinprecision*.html', bug=483282) self.Skip('deqp/functional/gles3/draw.html', bug=483282) @@ -60,6 +53,9 @@ self.Skip('deqp/functional/gles3/uniformbuffers.html', bug=483282) self.Skip('deqp/functional/gles3/vertexarrays.html', bug=483282) + self.Fail('deqp/data/gles3/shaders/linkage.html', bug=483282) + self.Fail('deqp/data/gles3/shaders/preprocessor.html', bug=483282) + self.Fail('conformance2/glsl3/forbidden-operators.html', bug=483282) self.Fail('conformance2/misc/expando-loss-2.html', bug=483282) @@ -377,14 +373,12 @@ ['mac', 'intel'], bug=483282) # Linux only. - self.Fail('deqp/functional/gles3/fbostatequery.html', + self.Fail('deqp/data/gles3/shaders/functions.html', ['linux'], bug=483282) self.Skip('deqp/functional/gles3/shaderswitch.html', ['linux'], bug=483282) self.Fail('conformance2/glsl3/vector-dynamic-indexing.html', ['linux'], bug=483282) - self.Fail('conformance2/reading/read-pixels-from-fbo-test.html', - ['linux'], bug=483282) self.Fail('conformance2/rendering/draw-buffers.html', ['linux'], bug=483282) self.Fail('conformance2/textures/misc/tex-unpack-params.html', @@ -395,6 +389,12 @@ self.Flaky('deqp/functional/gles3/negativeshaderapi.html', ['linux', 'amd', 'nvidia'], bug=483282) + # Linux NVIDIA only. + self.Fail('deqp/functional/gles3/fbostatequery.html', + ['linux', 'nvidia'], bug=483282) + self.Fail('conformance2/reading/read-pixels-from-fbo-test.html', + ['linux', 'nvidia'], bug=483282) + # Linux AMD only. # It looks like AMD shader compiler rejects many valid ES3 semantics. self.Skip('deqp/data/gles3/shaders/arrays.html', @@ -403,14 +403,8 @@ ['linux', 'amd'], bug=483282) self.Skip('deqp/functional/gles3/texturestatequery.html', ['linux', 'amd'], bug=483282) - self.Fail('conformance2/buffers/buffer-type-restrictions.html', - ['linux', 'amd'], bug=483282) - self.Fail('conformance2/buffers/buffer-overflow-test.html', - ['linux', 'amd'], bug=483282) self.Fail('conformance2/renderbuffers/framebuffer-texture-layer.html', ['linux', 'amd'], bug=295792) - self.Fail('conformance2/textures/misc/tex-storage-compressed-formats.html', - ['linux', 'amd'], bug=295792) self.Fail('deqp/data/gles3/shaders/conversions.html', ['linux', 'amd'], bug=483282) @@ -420,6 +414,8 @@ ['linux', 'amd'], bug=483282) self.Fail('deqp/functional/gles3/samplerobject.html', ['linux', 'amd'], bug=483282) + self.Fail('deqp/functional/gles3/shaderprecision.html', + ['linux', 'amd'], bug=483282) self.Fail('conformance2/misc/uninitialized-test-2.html', ['linux', 'amd'], bug=483282) self.Fail('conformance2/reading/read-pixels-pack-parameters.html',
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc index 30220b1..4a134bf 100644 --- a/device/usb/usb_device_impl.cc +++ b/device/usb/usb_device_impl.cc
@@ -203,7 +203,6 @@ void UsbDeviceImpl::HandleClosed(scoped_refptr<UsbDeviceHandle> handle) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(ContainsValue(handles_, handle.get())); handles_.remove(handle.get()); } @@ -214,7 +213,10 @@ void UsbDeviceImpl::OnDisconnect() { DCHECK(thread_checker_.CalledOnValidThread()); - for (UsbDeviceHandle* handle : handles_) + // Swap out the handle list as HandleClosed() will try to modify it. + std::list<UsbDeviceHandle*> handles; + handles.swap(handles_); + for (UsbDeviceHandle* handle : handles) handle->Close(); }
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc index 0b8d4af..e33962d 100644 --- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc +++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
@@ -258,6 +258,10 @@ return RunAsyncSafe(guest); } +WebViewInternalCaptureVisibleRegionFunction:: + WebViewInternalCaptureVisibleRegionFunction() + : is_guest_transparent_(false) {} + bool WebViewInternalCaptureVisibleRegionFunction::RunAsyncSafe( WebViewGuest* guest) { using api::extension_types::ImageDetails; @@ -273,6 +277,7 @@ image_details = ImageDetails::FromValue(*spec); } + is_guest_transparent_ = guest->allow_transparency(); return CaptureAsync(guest->web_contents(), image_details.get(), base::Bind(&WebViewInternalCaptureVisibleRegionFunction:: CopyFromBackingStoreComplete, @@ -283,6 +288,10 @@ return true; } +bool WebViewInternalCaptureVisibleRegionFunction::ClientAllowsTransparency() { + return is_guest_transparent_; +} + void WebViewInternalCaptureVisibleRegionFunction::OnCaptureSuccess( const SkBitmap& bitmap) { std::string base64_result;
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.h b/extensions/browser/api/guest_view/web_view/web_view_internal_api.h index 388491ea..9f646e6 100644 --- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.h +++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.h
@@ -43,7 +43,7 @@ public: DECLARE_EXTENSION_FUNCTION("webViewInternal.captureVisibleRegion", WEBVIEWINTERNAL_CAPTUREVISIBLEREGION); - WebViewInternalCaptureVisibleRegionFunction() {} + WebViewInternalCaptureVisibleRegionFunction(); protected: ~WebViewInternalCaptureVisibleRegionFunction() override {} @@ -54,9 +54,12 @@ // extensions::WebContentsCaptureClient: bool IsScreenshotEnabled() override; + bool ClientAllowsTransparency() override; void OnCaptureSuccess(const SkBitmap& bitmap) override; void OnCaptureFailure(FailureReason reason) override; + bool is_guest_transparent_; + DISALLOW_COPY_AND_ASSIGN(WebViewInternalCaptureVisibleRegionFunction); };
diff --git a/extensions/browser/api/web_contents_capture_client.cc b/extensions/browser/api/web_contents_capture_client.cc index 78c3760..6dff09e 100644 --- a/extensions/browser/api/web_contents_capture_client.cc +++ b/extensions/browser/api/web_contents_capture_client.cc
@@ -107,6 +107,7 @@ DCHECK(base64_result); std::vector<unsigned char> data; SkAutoLockPixels screen_capture_lock(bitmap); + const bool should_discard_alpha = !ClientAllowsTransparency(); bool encoded = false; std::string mime_type; switch (image_format_) { @@ -118,10 +119,8 @@ mime_type = kMimeTypeJpeg; break; case api::extension_types::IMAGE_FORMAT_PNG: - encoded = - gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, - true, // Discard transparency. - &data); + encoded = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, should_discard_alpha, + &data); mime_type = kMimeTypePng; break; default:
diff --git a/extensions/browser/api/web_contents_capture_client.h b/extensions/browser/api/web_contents_capture_client.h index 4107ee4e..6535354 100644 --- a/extensions/browser/api/web_contents_capture_client.h +++ b/extensions/browser/api/web_contents_capture_client.h
@@ -28,6 +28,7 @@ virtual ~WebContentsCaptureClient() {} virtual bool IsScreenshotEnabled() = 0; + virtual bool ClientAllowsTransparency() = 0; enum FailureReason { FAILURE_REASON_UNKNOWN,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 4bfb028d..a36b774 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1172,6 +1172,7 @@ INPUT_IME_SHOWWINDOW, INPUT_IME_HIDEWINDOW, INPUTMETHODPRIVATE_SHOWINPUTVIEW, + WALLPAPERPRIVATE_RECORDWALLPAPERUMA, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/shell/browser/shell_browser_context.cc b/extensions/shell/browser/shell_browser_context.cc index fb1d5134..4fd5a33 100644 --- a/extensions/shell/browser/shell_browser_context.cc +++ b/extensions/shell/browser/shell_browser_context.cc
@@ -10,6 +10,10 @@ #include "components/guest_view/browser/guest_view_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/content_switches.h" +#include "extensions/browser/extension_protocols.h" +#include "extensions/common/constants.h" +#include "extensions/shell/browser/shell_browser_main_parts.h" +#include "extensions/shell/browser/shell_extension_system.h" #include "extensions/shell/browser/shell_network_delegate.h" #include "extensions/shell/browser/shell_special_storage_policy.h" #include "extensions/shell/browser/shell_url_request_context_getter.h" @@ -27,10 +31,12 @@ // Create a normal recording browser context. If we used an incognito context // then app_shell would also have to create a normal context and manage both. -ShellBrowserContext::ShellBrowserContext() +ShellBrowserContext::ShellBrowserContext( + ShellBrowserMainParts* browser_main_parts) : content::ShellBrowserContext(false /* off_the_record */, nullptr /* net_log */), - storage_policy_(new ShellSpecialStoragePolicy) { + storage_policy_(new ShellSpecialStoragePolicy), + browser_main_parts_(browser_main_parts) { } ShellBrowserContext::~ShellBrowserContext() { @@ -46,9 +52,19 @@ net::URLRequestContextGetter* ShellBrowserContext::CreateRequestContext( content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors, - InfoMap* extension_info_map) { + content::URLRequestInterceptorScopedVector request_interceptors) { DCHECK(!url_request_context_getter()); + // Handle only chrome-extension:// requests. app_shell does not support + // chrome-extension-resource:// requests (it does not store shared extension + // data in its installation directory). + InfoMap* extension_info_map = + browser_main_parts_->extension_system()->info_map(); + (*protocol_handlers)[kExtensionScheme] = + linked_ptr<net::URLRequestJobFactory::ProtocolHandler>( + CreateExtensionProtocolHandler(false /* is_incognito */, + extension_info_map) + .release()); + set_url_request_context_getter(new ShellURLRequestContextGetter( this, IgnoreCertificateErrors(), GetPath(), content::BrowserThread::GetMessageLoopProxyForThread(
diff --git a/extensions/shell/browser/shell_browser_context.h b/extensions/shell/browser/shell_browser_context.h index 8d2a215..a98ef1e 100644 --- a/extensions/shell/browser/shell_browser_context.h +++ b/extensions/shell/browser/shell_browser_context.h
@@ -13,28 +13,28 @@ namespace extensions { class InfoMap; +class ShellBrowserMainParts; class ShellSpecialStoragePolicy; // The BrowserContext used by the content, apps and extensions systems in // app_shell. class ShellBrowserContext : public content::ShellBrowserContext { public: - ShellBrowserContext(); + explicit ShellBrowserContext(ShellBrowserMainParts* browser_main_parts); ~ShellBrowserContext() override; // content::BrowserContext implementation. content::BrowserPluginGuestManager* GetGuestManager() override; storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; - net::URLRequestContextGetter* CreateRequestContext( content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors, - InfoMap* extension_info_map); + content::URLRequestInterceptorScopedVector request_interceptors) override; private: void InitURLRequestContextOnIOThread(); scoped_refptr<storage::SpecialStoragePolicy> storage_policy_; + ShellBrowserMainParts* browser_main_parts_; DISALLOW_COPY_AND_ASSIGN(ShellBrowserContext); };
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc index 6ab35b5..e636fa0b9 100644 --- a/extensions/shell/browser/shell_browser_main_parts.cc +++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -142,7 +142,7 @@ void ShellBrowserMainParts::PreMainMessageLoopRun() { // Initialize our "profile" equivalent. - browser_context_.reset(new ShellBrowserContext); + browser_context_.reset(new ShellBrowserContext(this)); // app_shell only supports a single user, so all preferences live in the user // data directory, including the device-wide local state.
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc index 8a2b45d..26298c70 100644 --- a/extensions/shell/browser/shell_content_browser_client.cc +++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -117,28 +117,11 @@ return true; } -net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext( - content::BrowserContext* content_browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - // Handle only chrome-extension:// requests. app_shell does not support - // chrome-extension-resource:// requests (it does not store shared extension - // data in its installation directory). - InfoMap* extension_info_map = - browser_main_parts_->extension_system()->info_map(); - (*protocol_handlers)[kExtensionScheme] = - linked_ptr<net::URLRequestJobFactory::ProtocolHandler>( - CreateExtensionProtocolHandler(false /* is_incognito */, - extension_info_map) - .release()); - return browser_main_parts_->browser_context()->CreateRequestContext( - protocol_handlers, std::move(request_interceptors), extension_info_map); -} - bool ShellContentBrowserClient::IsHandledURL(const GURL& url) { if (!url.is_valid()) return false; - // Keep in sync with ProtocolHandlers added in CreateRequestContext() and in + // Keep in sync with ProtocolHandlers added in + // ShellBrowserContext::CreateRequestContext() and in // content::ShellURLRequestContextGetter::GetURLRequestContext(). static const char* const kProtocolList[] = { url::kBlobScheme,
diff --git a/extensions/shell/browser/shell_content_browser_client.h b/extensions/shell/browser/shell_content_browser_client.h index 8abdc1e..a87d36e 100644 --- a/extensions/shell/browser/shell_content_browser_client.h +++ b/extensions/shell/browser/shell_content_browser_client.h
@@ -43,10 +43,6 @@ void RenderProcessWillLaunch(content::RenderProcessHost* host) override; bool ShouldUseProcessPerSite(content::BrowserContext* browser_context, const GURL& effective_url) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; // TODO(jamescook): Quota management? bool IsHandledURL(const GURL& url) override; void SiteInstanceGotProcess(content::SiteInstance* site_instance) override;
diff --git a/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc index f8680781..9a2a596 100644 --- a/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc +++ b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc
@@ -34,12 +34,11 @@ // static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( - const gpu::gles2::ContextCreationAttribHelper& attributes, - bool share_resources) { + const gpu::gles2::ContextCreationAttribHelper& attributes) { bool is_offscreen = true; return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( - scoped_ptr<::gpu::GLInProcessContext>(), attributes, share_resources, - is_offscreen, gfx::kNullAcceleratedWidget)); + scoped_ptr<::gpu::GLInProcessContext>(), attributes, is_offscreen, + gfx::kNullAcceleratedWidget)); } scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> @@ -47,21 +46,18 @@ scoped_ptr<::gpu::GLInProcessContext> context, const gpu::gles2::ContextCreationAttribHelper& attributes) { bool is_offscreen = true; // Not used. - bool share_resources = false; // Not used. gfx::AcceleratedWidget window = gfx::kNullAcceleratedWidget; // Not used. return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( - std::move(context), attributes, share_resources, is_offscreen, window)); + std::move(context), attributes, is_offscreen, window)); } WebGraphicsContext3DInProcessCommandBufferImpl:: WebGraphicsContext3DInProcessCommandBufferImpl( scoped_ptr<::gpu::GLInProcessContext> context, const gpu::gles2::ContextCreationAttribHelper& attributes, - bool share_resources, bool is_offscreen, gfx::AcceleratedWidget window) : attributes_(attributes), - share_resources_(share_resources), is_offscreen_(is_offscreen), window_(window), context_(std::move(context)) {} @@ -92,16 +88,11 @@ NULL, /* service */ NULL, /* surface */ is_offscreen_, window_, gfx::Size(1, 1), NULL, /* share_context */ - share_resources_, attributes_, gpu_preference, + attributes_, gpu_preference, ::gpu::GLInProcessContextSharedMemoryLimits(), nullptr, nullptr)); } - if (context_) { - base::Closure context_lost_callback = base::Bind( - &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, - base::Unretained(this)); - context_->SetContextLostCallback(context_lost_callback); - } else { + if (!context_) { initialize_failed_ = true; return false; } @@ -134,10 +125,4 @@ return real_gl_; } -void WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost() { - if (context_lost_callback_) { - context_lost_callback_->onContextLost(); - } -} - } // namespace gpu_blink
diff --git a/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h index b52673f..2dd275d 100644 --- a/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h +++ b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h
@@ -40,8 +40,7 @@ static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> CreateOffscreenContext( - const gpu::gles2::ContextCreationAttribHelper& attributes, - bool share_resources); + const gpu::gles2::ContextCreationAttribHelper& attributes); static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> WrapContext( scoped_ptr<::gpu::GLInProcessContext> context, @@ -64,7 +63,6 @@ WebGraphicsContext3DInProcessCommandBufferImpl( scoped_ptr<::gpu::GLInProcessContext> context, const gpu::gles2::ContextCreationAttribHelper& attributes, - bool share_resources, bool is_offscreen, gfx::AcceleratedWidget window); @@ -77,7 +75,6 @@ void ClearContext(); ::gpu::gles2::ContextCreationAttribHelper attributes_; - bool share_resources_; bool is_offscreen_; // Only used when not offscreen.
diff --git a/gpu/command_buffer/client/gl_in_process_context.cc b/gpu/command_buffer/client/gl_in_process_context.cc index 99e4b786a..c11e01a 100644 --- a/gpu/command_buffer/client/gl_in_process_context.cc +++ b/gpu/command_buffer/client/gl_in_process_context.cc
@@ -57,7 +57,6 @@ bool Initialize(scoped_refptr<gfx::GLSurface> surface, bool is_offscreen, - bool use_global_share_group, GLInProcessContext* share_context, gfx::AcceleratedWidget window, const gfx::Size& size, @@ -90,28 +89,16 @@ scoped_ptr<InProcessCommandBuffer> command_buffer_; const GLInProcessContextSharedMemoryLimits mem_limits_; - bool context_lost_; base::Closure context_lost_callback_; - base::Lock* lock_; DISALLOW_COPY_AND_ASSIGN(GLInProcessContextImpl); }; -base::LazyInstance<base::Lock> g_all_shared_contexts_lock = - LAZY_INSTANCE_INITIALIZER; -base::LazyInstance<std::set<GLInProcessContextImpl*> > g_all_shared_contexts = - LAZY_INSTANCE_INITIALIZER; - GLInProcessContextImpl::GLInProcessContextImpl( const GLInProcessContextSharedMemoryLimits& mem_limits) - : mem_limits_(mem_limits), context_lost_(false), lock_(nullptr) { -} + : mem_limits_(mem_limits) {} GLInProcessContextImpl::~GLInProcessContextImpl() { - { - base::AutoLock lock(g_all_shared_contexts_lock.Get()); - g_all_shared_contexts.Get().erase(this); - } Destroy(); } @@ -124,8 +111,7 @@ } void GLInProcessContextImpl::SetLock(base::Lock* lock) { - command_buffer_->SetLock(lock); - lock_ = lock; + NOTREACHED(); } void GLInProcessContextImpl::SetContextLostCallback( @@ -134,19 +120,13 @@ } void GLInProcessContextImpl::OnContextLost() { - scoped_ptr<base::AutoLock> lock; - if (lock_) - lock.reset(new base::AutoLock(*lock_)); - context_lost_ = true; - if (!context_lost_callback_.is_null()) { + if (!context_lost_callback_.is_null()) context_lost_callback_.Run(); - } } bool GLInProcessContextImpl::Initialize( scoped_refptr<gfx::GLSurface> surface, bool is_offscreen, - bool use_global_share_group, GLInProcessContext* share_context, gfx::AcceleratedWidget window, const gfx::Size& size, @@ -155,7 +135,6 @@ const scoped_refptr<InProcessCommandBuffer::Service>& service, GpuMemoryBufferManager* gpu_memory_buffer_manager, ImageFactory* image_factory) { - DCHECK(!use_global_share_group || !share_context); DCHECK(size.width() >= 0 && size.height() >= 0); std::vector<int32_t> attrib_vector; @@ -165,31 +144,14 @@ base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); command_buffer_.reset(new InProcessCommandBuffer(service)); - scoped_ptr<base::AutoLock> scoped_shared_context_lock; scoped_refptr<gles2::ShareGroup> share_group; - InProcessCommandBuffer* share_command_buffer = NULL; - if (use_global_share_group) { - scoped_shared_context_lock.reset( - new base::AutoLock(g_all_shared_contexts_lock.Get())); - for (std::set<GLInProcessContextImpl*>::const_iterator it = - g_all_shared_contexts.Get().begin(); - it != g_all_shared_contexts.Get().end(); - it++) { - const GLInProcessContextImpl* context = *it; - if (!context->context_lost_) { - share_group = context->gles2_implementation_->share_group(); - share_command_buffer = context->command_buffer_.get(); - DCHECK(share_group.get()); - DCHECK(share_command_buffer); - break; - } - } - } else if (share_context) { + InProcessCommandBuffer* share_command_buffer = nullptr; + if (share_context) { GLInProcessContextImpl* impl = static_cast<GLInProcessContextImpl*>(share_context); share_group = impl->gles2_implementation_->share_group(); share_command_buffer = impl->command_buffer_.get(); - DCHECK(share_group.get()); + DCHECK(share_group); DCHECK(share_command_buffer); } @@ -203,7 +165,7 @@ share_command_buffer, gpu_memory_buffer_manager, image_factory)) { - LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; + DLOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; return false; } @@ -233,11 +195,6 @@ support_client_side_arrays, command_buffer_.get())); - if (use_global_share_group) { - g_all_shared_contexts.Get().insert(this); - scoped_shared_context_lock.reset(); - } - if (!gles2_implementation_->Initialize( mem_limits_.start_transfer_buffer_size, mem_limits_.min_transfer_buffer_size, @@ -295,13 +252,11 @@ gfx::AcceleratedWidget window, const gfx::Size& size, GLInProcessContext* share_context, - bool use_global_share_group, const ::gpu::gles2::ContextCreationAttribHelper& attribs, gfx::GpuPreference gpu_preference, const GLInProcessContextSharedMemoryLimits& memory_limits, GpuMemoryBufferManager* gpu_memory_buffer_manager, ImageFactory* image_factory) { - DCHECK(!use_global_share_group || !share_context); if (surface.get()) { DCHECK_EQ(surface->IsOffscreen(), is_offscreen); DCHECK(surface->GetSize() == size); @@ -312,7 +267,6 @@ new GLInProcessContextImpl(memory_limits)); if (!context->Initialize(surface, is_offscreen, - use_global_share_group, share_context, window, size,
diff --git a/gpu/command_buffer/client/gl_in_process_context.h b/gpu/command_buffer/client/gl_in_process_context.h index 36484cef..a338f829 100644 --- a/gpu/command_buffer/client/gl_in_process_context.h +++ b/gpu/command_buffer/client/gl_in_process_context.h
@@ -55,8 +55,6 @@ // service must run on the same thread as this client because GLSurface is // not thread safe. If |surface| is NULL, then the other parameters are used // to correctly create a surface. - // Only one of |share_context| and |use_global_share_group| can be used at - // the same time. static GLInProcessContext* Create( scoped_refptr<gpu::InProcessCommandBuffer::Service> service, scoped_refptr<gfx::GLSurface> surface, @@ -64,7 +62,6 @@ gfx::AcceleratedWidget window, const gfx::Size& size, GLInProcessContext* share_context, - bool use_global_share_group, const gpu::gles2::ContextCreationAttribHelper& attribs, gfx::GpuPreference gpu_preference, const GLInProcessContextSharedMemoryLimits& memory_limits,
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc index 9483bf1..27824398 100644 --- a/gpu/command_buffer/service/in_process_command_buffer.cc +++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -210,7 +210,6 @@ const scoped_refptr<Service>& service) : command_buffer_id_( CommandBufferId::FromUnsafeValue(g_next_command_buffer_id.GetNext())), - context_lost_(false), delayed_work_pending_(false), image_factory_(nullptr), last_put_offset_(-1), @@ -233,12 +232,17 @@ CheckSequencedThread(); command_buffer_lock_.AssertAcquired(); - if (!context_lost_ && decoder_->MakeCurrent()) - return true; - DLOG(ERROR) << "Context lost because MakeCurrent failed."; - command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); - command_buffer_->SetParseError(gpu::error::kLostContext); - return false; + if (error::IsError(command_buffer_->GetLastState().error)) { + DLOG(ERROR) << "MakeCurrent failed because context lost."; + return false; + } + if (!decoder_->MakeCurrent()) { + DLOG(ERROR) << "Context lost because MakeCurrent failed."; + command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); + command_buffer_->SetParseError(gpu::error::kLostContext); + return false; + } + return true; } void InProcessCommandBuffer::PumpCommands() { @@ -497,8 +501,6 @@ context_lost_callback_.Run(); context_lost_callback_.Reset(); } - - context_lost_ = true; } CommandBuffer::State InProcessCommandBuffer::GetStateFast() { @@ -535,14 +537,13 @@ base::AutoLock lock(state_after_last_flush_lock_); state_after_last_flush_ = command_buffer_->GetLastState(); } - DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || - (error::IsError(state_after_last_flush_.error) && context_lost_)); // Currently the in process command buffer does not support being // descheduled, if it does we would need to back off on calling the finish // processing number function until the message is rescheduled and finished // processing. This DCHECK is to enforce this. - DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset); + DCHECK(error::IsError(state_after_last_flush_.error) || + put_offset == state_after_last_flush_.get_offset); } // If we've processed all pending commands but still have pending queries, @@ -917,6 +918,8 @@ } void InProcessCommandBuffer::SetLock(base::Lock*) { + // No support for using on multiple threads. + NOTREACHED(); } bool InProcessCommandBuffer::IsGpuChannelLost() {
diff --git a/gpu/command_buffer/service/in_process_command_buffer.h b/gpu/command_buffer/service/in_process_command_buffer.h index af3956a..731c486 100644 --- a/gpu/command_buffer/service/in_process_command_buffer.h +++ b/gpu/command_buffer/service/in_process_command_buffer.h
@@ -83,7 +83,7 @@ explicit InProcessCommandBuffer(const scoped_refptr<Service>& service); ~InProcessCommandBuffer() override; - // If |surface| is not NULL, use it directly; in this case, the command + // If |surface| is not null, use it directly; in this case, the command // buffer gpu thread must be the same as the client thread. Otherwise create // a new GLSurface. bool Initialize(scoped_refptr<gfx::GLSurface> surface,
diff --git a/headless/lib/browser/headless_browser_context.cc b/headless/lib/browser/headless_browser_context.cc index 13ffced4..b48f090 100644 --- a/headless/lib/browser/headless_browser_context.cc +++ b/headless/lib/browser/headless_browser_context.cc
@@ -152,14 +152,34 @@ return nullptr; } +net::URLRequestContextGetter* HeadlessBrowserContext::CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + scoped_refptr<HeadlessURLRequestContextGetter> url_request_context_getter( + new HeadlessURLRequestContextGetter( + false /* ignore_certificate_errors */, GetPath(), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::IO), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::FILE), + protocol_handlers, std::move(request_interceptors), + nullptr /* net_log */, options())); + resource_context_->set_url_request_context_getter(url_request_context_getter); + return url_request_context_getter.get(); +} + +net::URLRequestContextGetter* +HeadlessBrowserContext::CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + return nullptr; +} + void HeadlessBrowserContext::SetOptionsForTesting( const HeadlessBrowser::Options& options) { options_ = options; } -void HeadlessBrowserContext::SetURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { - resource_context_->set_url_request_context_getter(url_request_context_getter); -} - } // namespace headless
diff --git a/headless/lib/browser/headless_browser_context.h b/headless/lib/browser/headless_browser_context.h index d7c7f19..6fd6676 100644 --- a/headless/lib/browser/headless_browser_context.h +++ b/headless/lib/browser/headless_browser_context.h
@@ -42,15 +42,18 @@ content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; content::PermissionManager* GetPermissionManager() override; content::BackgroundSyncController* GetBackgroundSyncController() override; + net::URLRequestContextGetter* CreateRequestContext( + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + net::URLRequestContextGetter* CreateRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; const HeadlessBrowser::Options& options() const { return options_; } void SetOptionsForTesting(const HeadlessBrowser::Options& options); - // Configure the URL request context getter to be used for serving URL - // requests in this browser instance. - void SetURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); - private: // Performs initialization of the HeadlessBrowserContext while IO is still // allowed on the current thread.
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc index 0fa3681..a56a1fe 100644 --- a/headless/lib/browser/headless_content_browser_client.cc +++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -8,7 +8,6 @@ #include "base/memory/ptr_util.h" #include "content/public/browser/browser_thread.h" -#include "headless/lib/browser/headless_browser_context.h" #include "headless/lib/browser/headless_browser_impl.h" #include "headless/lib/browser/headless_browser_main_parts.h" @@ -28,27 +27,4 @@ return browser_main_parts.release(); } -net::URLRequestContextGetter* -HeadlessContentBrowserClient::CreateRequestContext( - content::BrowserContext* content_browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - CHECK(content_browser_context == browser_context()); - scoped_refptr<HeadlessURLRequestContextGetter> url_request_context_getter( - new HeadlessURLRequestContextGetter( - false /* ignore_certificate_errors */, browser_context()->GetPath(), - content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::IO), - content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::FILE), - protocol_handlers, std::move(request_interceptors), - nullptr /* net_log */, browser_context()->options())); - browser_context()->SetURLRequestContextGetter(url_request_context_getter); - return url_request_context_getter.get(); -} - -HeadlessBrowserContext* HeadlessContentBrowserClient::browser_context() const { - return browser_->browser_context(); -} - } // namespace headless
diff --git a/headless/lib/browser/headless_content_browser_client.h b/headless/lib/browser/headless_content_browser_client.h index cf124e1..16d9ef3 100644 --- a/headless/lib/browser/headless_content_browser_client.h +++ b/headless/lib/browser/headless_content_browser_client.h
@@ -11,7 +11,6 @@ class HeadlessBrowserImpl; class HeadlessBrowserMainParts; -class HeadlessBrowserContext; class HeadlessContentBrowserClient : public content::ContentBrowserClient { public: @@ -21,12 +20,6 @@ // content::ContentBrowserClient implementation: content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams&) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; - - HeadlessBrowserContext* browser_context() const; private: HeadlessBrowserImpl* browser_; // Not owned.
diff --git a/headless/lib/browser/headless_url_request_context_getter.h b/headless/lib/browser/headless_url_request_context_getter.h index 0e5912f..99340a6c 100644 --- a/headless/lib/browser/headless_url_request_context_getter.h +++ b/headless/lib/browser/headless_url_request_context_getter.h
@@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "headless/public/headless_browser.h" #include "net/proxy/proxy_config_service.h"
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg index 2cd7c29..7eceb77 100644 --- a/infra/config/cq.cfg +++ b/infra/config/cq.cfg
@@ -44,7 +44,6 @@ builders { name: "chromeos_daisy_chromium_compile_only_ng" } builders { name: "chromeos_x86-generic_chromium_compile_only_ng" } builders { name: "chromium_presubmit" } - builders { name: "linux_blink_oilpan_rel" } builders { name: "linux_chromium_asan_rel_ng" } builders { name: "linux_chromium_chromeos_compile_dbg_ng" } builders { name: "linux_chromium_chromeos_ozone_rel_ng" }
diff --git a/ios/build/bots/chromium.fyi/Chromium_iOS_Device.json b/ios/build/bots/chromium.fyi/Chromium_iOS_Device.json index 283a859..350f9d7 100644 --- a/ios/build/bots/chromium.fyi/Chromium_iOS_Device.json +++ b/ios/build/bots/chromium.fyi/Chromium_iOS_Device.json
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "arm32" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Release", "sdk": "iphoneos9.0", "tests": [
diff --git "a/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" "b/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" index d12ff59..54bc4cbf 100644 --- "a/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json" +++ "b/ios/build/bots/chromium.fyi/Chromium_iOS_Simulator_\050dbg\051.json"
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "both" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Debug", "sdk": "iphonesimulator9.0", "tests": [
diff --git a/ios/build/bots/chromium.mac/iOS_Device.json b/ios/build/bots/chromium.mac/iOS_Device.json index 283a859..350f9d7 100644 --- a/ios/build/bots/chromium.mac/iOS_Device.json +++ b/ios/build/bots/chromium.mac/iOS_Device.json
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "arm32" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Release", "sdk": "iphoneos9.0", "tests": [
diff --git "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" "b/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" index d12ff59..54bc4cbf 100644 --- "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" +++ "b/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json"
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "both" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Debug", "sdk": "iphonesimulator9.0", "tests": [
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json index d12ff59..54bc4cbf 100644 --- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json +++ b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "both" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Debug", "sdk": "iphonesimulator9.0", "tests": [
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json b/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json index 283a859..350f9d7 100644 --- a/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json +++ b/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json
@@ -10,7 +10,7 @@ "chromium_ios_signing": "0", "target_subarch": "arm32" }, - "compiler": "xcodebuild", + "compiler": "ninja", "configuration": "Release", "sdk": "iphoneos9.0", "tests": [
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 9a5ff10..28d20a0 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -218,71 +218,7 @@ </message> <!-- Safe Browsing --> - <!-- - harmful download interstitials --> - <message name="IDS_IOS_HARMFUL_V3_EXPLANATION_PARAGRAPH" desc="The explanation of why Safe Browsing has blocked the page."> - Google Safe Browsing recently <ph name="BEGIN_LINK"><a href="#" id="help-link"></ph>found harmful programs<ph name="END_LINK"></a></ph> on <ph name="SITE">$1<ex>example.com</ex></ph>. - </message> - <message name="IDS_IOS_HARMFUL_V3_HEADING" desc="The large heading at the top of the social engineering interstitial."> - The site ahead contains harmful programs - </message> - <message name="IDS_IOS_HARMFUL_V3_PRIMARY_PARAGRAPH" desc="Mobile: The primary explanatory paragraph for the social engineering interstitial."> - Attackers on <ph name="BEGIN_BOLD"><strong></ph><ph name="SITE">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> might attempt to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites you visit). - </message> - <message name="IDS_IOS_HARMFUL_V3_PROCEED_PARAGRAPH" desc="The paragraph that lets the user skip the warning."> - If you understand the risks to your security, you may <ph name="BEGIN_LINK"><a href="#" id="proceed-link"></ph>visit this site<ph name="END_LINK"></a></ph> before the harmful programs have been removed. - </message> - <!-- - malware interstitials --> - <message name="IDS_IOS_MALWARE_V3_EXPLANATION_PARAGRAPH" desc="The explanation of why Safe Browsing has blocked the page."> - Google Safe Browsing recently <ph name="BEGIN_LINK"><a href="#" id="help-link"></ph>detected malware<ph name="END_LINK"></a></ph> on <ph name="SITE">$1<ex>example.com</ex></ph>. Websites that are normally safe are sometimes infected with malware. - </message> - <message name="IDS_IOS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE" desc="The explanation of why Safe Browsing has blocked the page."> - Google Safe Browsing recently <ph name="BEGIN_LINK"><a href="#" id="help-link"></ph>detected malware<ph name="END_LINK"></a></ph> on <ph name="SITE">$1<ex>example.com</ex></ph>. Websites that are normally safe are sometimes infected with malware. The malicious content comes from <ph name="SUBRESOURCE_HOST">$2<ex>evil.com</ex></ph>, a known malware distributor. - </message> - <message name="IDS_IOS_MALWARE_V3_HEADING" desc="The large heading at the top of the malware interstitial."> - The site ahead contains malware - </message> - <message name="IDS_IOS_MALWARE_V3_PRIMARY_PARAGRAPH" desc="Mobile: The primary explanatory paragraph for the malware interstitial."> - Attackers currently on <ph name="BEGIN_BOLD"><strong></ph><ph name="SITE">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> might attempt to install dangerous apps on your device that steal or delete your information (for example, photos, passwords, messages, and credit cards). - </message> - <message name="IDS_IOS_MALWARE_V3_PROCEED_PARAGRAPH" desc="The paragraph that lets the user skip the warning."> - If you understand the risks to your security, you may <ph name="BEGIN_LINK"><a href="#" id="proceed-link"></ph>visit this unsafe site<ph name="END_LINK"></a></ph> before the dangerous programs have been removed. - </message> - <!-- - phishing interstitials --> - <message name="IDS_IOS_PHISHING_V3_EXPLANATION_PARAGRAPH" desc="The explanation of why Safe Browsing has blocked the page."> - Google Safe Browsing recently detected phishing on <ph name="SITE">$1<ex>example.com</ex></ph>. <ph name="BEGIN_LINK"><a href="#" id="help-link"></ph>Phishing sites<ph name="END_LINK"></a></ph> pretend to be other websites to trick you. - </message> - <message name="IDS_IOS_PHISHING_V3_HEADING" desc="The large heading at the top of the phishing interstitial."> - Phishing attack ahead - </message> - <message name="IDS_IOS_PHISHING_V3_PRIMARY_PARAGRAPH" desc="The primary explanatory paragraph for the malware interstitial."> - Attackers on <ph name="BEGIN_BOLD"><strong></ph><ph name="SITE">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> might try to trick you to steal your information (for example, passwords, messages, or credit cards). - </message> - <message name="IDS_IOS_PHISHING_V3_PROCEED_PARAGRAPH" desc="The paragraph that lets the user skip the warning."> - If you understand the risks to your security, you may <ph name="BEGIN_LINK"><a href="#" id="proceed-link"></ph>visit this unsafe site<ph name="END_LINK"></a></ph>. - </message> - <message name="IDS_IOS_PHISHING_V4_HEADING" desc="The large heading at the top of the phishing interstitial."> - Deceptive site ahead - </message> - <message name="IDS_IOS_PHISHING_V4_PRIMARY_PARAGRAPH" desc="The primary explanatory paragraph for the malware interstitial."> - Attackers on <ph name="BEGIN_BOLD"><strong></ph><ph name="SITE">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> may trick you into doing something dangerous like installing software or revealing your personal information (for example, passwords, phone numbers, or credit cards). - </message> - <message name="IDS_IOS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH" desc="The paragraph that lets the user skip the warning."> - You can <ph name="BEGIN_ERROR_LINK"><a href="#" id="report-error-link"></ph>report a detection problem<ph name="END_ERROR_LINK"></a></ph> or, if you understand the risks to your security, <ph name="BEGIN_LINK"><a href="#" id="proceed-link"></ph>visit this unsafe site<ph name="END_LINK"></a></ph>. - </message> <!-- - shared strings --> - <message name="IDS_IOS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON" desc="The text for the button that takes the user back to the previous page."> - Back to safety - </message> - <message name="IDS_IOS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON" desc="The text for the button that hides the details."> - Hide details - </message> - <message name="IDS_IOS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON" desc="The text for the button that expands the details."> - Details - </message> - <message name="IDS_IOS_SAFEBROWSING_V3_TITLE" desc="The tab title for the Safe Browsing interstitials."> - Security error - </message> - <message name="IDS_IOS_INTERSTITIAL_HEADING_SPOOFING_ATTEMPT_ERROR" desc="Header error message to tell user that the requested URI might be misleading [Length: 20em]"> Warning: Something's Not Right Here! </message>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 96b0664..d2b26998 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -19,12 +19,6 @@ google_test_sync_url = "" } -proto_library("metadata_proto") { - sources = [ - "safe_browsing/metadata.proto", - ] -} - source_set("browser") { sources = [ "app_startup_parameters.h", @@ -323,20 +317,6 @@ "reading_list/reading_list_model_storage.h", "reading_list/reading_list_model_storage_defaults.h", "reading_list/reading_list_model_storage_defaults.mm", - "safe_browsing/hit_report.cc", - "safe_browsing/hit_report.h", - "safe_browsing/ping_manager.cc", - "safe_browsing/ping_manager.h", - "safe_browsing/protocol_manager_helper.cc", - "safe_browsing/protocol_manager_helper.h", - "safe_browsing/safe_browsing_blocking_page.h", - "safe_browsing/safe_browsing_blocking_page.mm", - "safe_browsing/safe_browsing_service.cc", - "safe_browsing/safe_browsing_service.h", - "safe_browsing/ui_manager.h", - "safe_browsing/ui_manager.mm", - "safe_browsing/util.cc", - "safe_browsing/util.h", "search/search_util.h", "search/search_util.mm", "search_engines/search_engines_util.cc", @@ -553,7 +533,6 @@ deps = [ ":about_flags", ":injected_js", - ":metadata_proto", "//base", "//breakpad:client", "//components/about_handler", @@ -742,7 +721,6 @@ "geolocation/test_location_manager.mm", "net/mock_image_fetcher.h", "net/mock_image_fetcher.mm", - "safe_browsing/util_unittest.cc", "signin/fake_oauth2_token_service_builder.h", "signin/fake_oauth2_token_service_builder.mm", "signin/fake_signin_manager_builder.cc",
diff --git a/ios/chrome/browser/application_context.h b/ios/chrome/browser/application_context.h index 17279f1..1c5154b4 100644 --- a/ios/chrome/browser/application_context.h +++ b/ios/chrome/browser/application_context.h
@@ -131,9 +131,6 @@ // Gets the CRLSetFetcher. virtual CRLSetFetcher* GetCRLSetFetcher() = 0; - // Gets the SafeBrowsingService. - virtual safe_browsing::SafeBrowsingService* GetSafeBrowsingService() = 0; - protected: // Sets the global ApplicationContext instance. static void SetApplicationContext(ApplicationContext* context);
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc index 82d75af..424f5e1e 100644 --- a/ios/chrome/browser/application_context_impl.cc +++ b/ios/chrome/browser/application_context_impl.cc
@@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/path_service.h" #include "base/time/default_clock.h" #include "base/time/default_tick_clock.h" @@ -45,7 +46,6 @@ #include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/prefs/browser_prefs.h" #include "ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h" -#include "ios/chrome/browser/safe_browsing/safe_browsing_service.h" #include "ios/chrome/browser/update_client/ios_chrome_update_query_params_delegate.h" #include "ios/chrome/browser/web_resource/web_resource_util.h" #include "ios/chrome/common/channel_info.h" @@ -104,13 +104,10 @@ void ApplicationContextImpl::StartTearDown() { DCHECK(thread_checker_.CalledOnValidThread()); - // We need to destroy the MetricsServicesManager and - // SafeBrowsing before the IO thread gets destroyed, since their destructors - // can call the URLFetcher destructor, which does a PostDelayedTask operation - // on the IO thread. (The IO thread will handle that URLFetcher operation - // before going away.) - if (safe_browsing_service_) - safe_browsing_service_->ShutDown(); + // We need to destroy the MetricsServicesManager before the IO thread gets + // destroyed, since the destructor can call the URLFetcher destructor, which + // does a PostDelayedTask operation on the IO thread. (The IO thread will + // handle that URLFetcher operation before going away.) metrics_services_manager_.reset(); @@ -224,7 +221,7 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (!metrics_services_manager_) { metrics_services_manager_.reset( - new metrics_services_manager::MetricsServicesManager(make_scoped_ptr( + new metrics_services_manager::MetricsServicesManager(base::WrapUnique( new IOSChromeMetricsServicesManagerClient(GetLocalState())))); } return metrics_services_manager_.get(); @@ -255,8 +252,8 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (!network_time_tracker_) { network_time_tracker_.reset(new network_time::NetworkTimeTracker( - make_scoped_ptr(new base::DefaultClock), - make_scoped_ptr(new base::DefaultTickClock), GetLocalState())); + base::WrapUnique(new base::DefaultClock), + base::WrapUnique(new base::DefaultTickClock), GetLocalState())); } return network_time_tracker_.get(); } @@ -303,17 +300,6 @@ return crl_set_fetcher_.get(); } -safe_browsing::SafeBrowsingService* -ApplicationContextImpl::GetSafeBrowsingService() { - DCHECK(thread_checker_.CalledOnValidThread()); - if (!safe_browsing_service_) { - safe_browsing_service_ = - safe_browsing::SafeBrowsingService::CreateSafeBrowsingService(); - safe_browsing_service_->Initialize(); - } - return safe_browsing_service_.get(); -} - void ApplicationContextImpl::SetApplicationLocale(const std::string& locale) { DCHECK(thread_checker_.CalledOnValidThread()); application_locale_ = locale; @@ -362,7 +348,7 @@ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); gcm_driver_ = gcm::CreateGCMDriverDesktop( - make_scoped_ptr(new gcm::GCMClientFactory), GetLocalState(), store_path, + base::WrapUnique(new gcm::GCMClientFactory), GetLocalState(), store_path, GetSystemURLRequestContext(), ::GetChannel(), web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), web::WebThread::GetTaskRunnerForThread(web::WebThread::IO),
diff --git a/ios/chrome/browser/application_context_impl.h b/ios/chrome/browser/application_context_impl.h index 02bd11c5..b9ffd7e 100644 --- a/ios/chrome/browser/application_context_impl.h +++ b/ios/chrome/browser/application_context_impl.h
@@ -5,11 +5,11 @@ #ifndef IOS_CHROME_BROWSER_APPLICATION_CONTEXT_IMPL_H_ #define IOS_CHROME_BROWSER_APPLICATION_CONTEXT_IMPL_H_ +#include <memory> #include <string> #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "ios/chrome/browser/application_context.h" @@ -65,7 +65,6 @@ component_updater::ComponentUpdateService* GetComponentUpdateService() override; CRLSetFetcher* GetCRLSetFetcher() override; - safe_browsing::SafeBrowsingService* GetSafeBrowsingService() override; private: // Sets the locale used by the application. @@ -78,17 +77,16 @@ void CreateGCMDriver(); base::ThreadChecker thread_checker_; - scoped_ptr<PrefService> local_state_; - scoped_ptr<net_log::ChromeNetLog> net_log_; - scoped_ptr<network_time::NetworkTimeTracker> network_time_tracker_; - scoped_ptr<IOSChromeIOThread> ios_chrome_io_thread_; - scoped_ptr<metrics_services_manager::MetricsServicesManager> + std::unique_ptr<PrefService> local_state_; + std::unique_ptr<net_log::ChromeNetLog> net_log_; + std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_; + std::unique_ptr<IOSChromeIOThread> ios_chrome_io_thread_; + std::unique_ptr<metrics_services_manager::MetricsServicesManager> metrics_services_manager_; - scoped_ptr<gcm::GCMDriver> gcm_driver_; - scoped_ptr<component_updater::ComponentUpdateService> component_updater_; + std::unique_ptr<gcm::GCMDriver> gcm_driver_; + std::unique_ptr<component_updater::ComponentUpdateService> component_updater_; scoped_refptr<CRLSetFetcher> crl_set_fetcher_; - scoped_refptr<safe_browsing::SafeBrowsingService> safe_browsing_service_; - scoped_ptr<ios::ChromeBrowserStateManager> chrome_browser_state_manager_; + std::unique_ptr<ios::ChromeBrowserStateManager> chrome_browser_state_manager_; std::string application_locale_; // Sequenced task runner for local state related I/O tasks.
diff --git a/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.cc b/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.cc index 22dc1e3..e1c429b 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.cc +++ b/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/autocomplete/autocomplete_classifier_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/omnibox/browser/autocomplete_classifier.h" @@ -19,15 +20,15 @@ namespace ios { namespace { -scoped_ptr<KeyedService> BuildAutocompleteClassifier( +std::unique_ptr<KeyedService> BuildAutocompleteClassifier( web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new AutocompleteClassifier( - make_scoped_ptr(new AutocompleteController( - make_scoped_ptr(new AutocompleteProviderClientImpl(browser_state)), + return base::WrapUnique(new AutocompleteClassifier( + base::WrapUnique(new AutocompleteController( + base::WrapUnique(new AutocompleteProviderClientImpl(browser_state)), nullptr, AutocompleteClassifier::kDefaultOmniboxProviders)), - make_scoped_ptr(new AutocompleteSchemeClassifierImpl))); + base::WrapUnique(new AutocompleteSchemeClassifierImpl))); } } // namespace @@ -61,7 +62,8 @@ AutocompleteClassifierFactory::~AutocompleteClassifierFactory() {} -scoped_ptr<KeyedService> AutocompleteClassifierFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AutocompleteClassifierFactory::BuildServiceInstanceFor( web::BrowserState* context) const { return BuildAutocompleteClassifier(context); }
diff --git a/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.h b/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.h index 89acfc5..9ccf98b 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.h +++ b/ios/chrome/browser/autocomplete/autocomplete_classifier_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_CLASSIFIER_FACTORY_H_ #define IOS_CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_CLASSIFIER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -40,7 +41,7 @@ ~AutocompleteClassifierFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc index 328fd6a..ba5a6c16 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.cc
@@ -97,7 +97,7 @@ browser_state_); } -scoped_ptr<KeywordExtensionsDelegate> +std::unique_ptr<KeywordExtensionsDelegate> AutocompleteProviderClientImpl::GetKeywordExtensionsDelegate( KeywordProvider* keyword_provider) { return nullptr;
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h index 901494b..600272d 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.h
@@ -37,7 +37,7 @@ const SearchTermsData& GetSearchTermsData() const override; scoped_refptr<ShortcutsBackend> GetShortcutsBackend() override; scoped_refptr<ShortcutsBackend> GetShortcutsBackendIfExists() override; - scoped_ptr<KeywordExtensionsDelegate> GetKeywordExtensionsDelegate( + std::unique_ptr<KeywordExtensionsDelegate> GetKeywordExtensionsDelegate( KeywordProvider* keyword_provider) override; std::string GetAcceptLanguages() const override; std::string GetEmbedderRepresentationOfAboutScheme() override;
diff --git a/ios/chrome/browser/autocomplete/in_memory_url_index_factory.cc b/ios/chrome/browser/autocomplete/in_memory_url_index_factory.cc index 867ae8a..ed876b2 100644 --- a/ios/chrome/browser/autocomplete/in_memory_url_index_factory.cc +++ b/ios/chrome/browser/autocomplete/in_memory_url_index_factory.cc
@@ -22,7 +22,8 @@ namespace { -scoped_ptr<KeyedService> BuildInMemoryURLIndex(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildInMemoryURLIndex( + web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); @@ -30,7 +31,7 @@ schemes_to_whilelist.insert(kChromeUIScheme); // Do not force creation of the HistoryService if saving history is disabled. - scoped_ptr<InMemoryURLIndex> in_memory_url_index(new InMemoryURLIndex( + std::unique_ptr<InMemoryURLIndex> in_memory_url_index(new InMemoryURLIndex( ios::BookmarkModelFactory::GetForBrowserState(browser_state), ios::HistoryServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::IMPLICIT_ACCESS), @@ -72,7 +73,7 @@ return &BuildInMemoryURLIndex; } -scoped_ptr<KeyedService> InMemoryURLIndexFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> InMemoryURLIndexFactory::BuildServiceInstanceFor( web::BrowserState* context) const { return BuildInMemoryURLIndex(context); }
diff --git a/ios/chrome/browser/autocomplete/in_memory_url_index_factory.h b/ios/chrome/browser/autocomplete/in_memory_url_index_factory.h index 7e7cded..75d4054 100644 --- a/ios/chrome/browser/autocomplete/in_memory_url_index_factory.h +++ b/ios/chrome/browser/autocomplete/in_memory_url_index_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_AUTOCOMPLETE_IN_MEMORY_URL_INDEX_FACTORY_H_ #define IOS_CHROME_BROWSER_AUTOCOMPLETE_IN_MEMORY_URL_INDEX_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -40,7 +41,7 @@ ~InMemoryURLIndexFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/autocomplete/shortcuts_backend_factory.mm b/ios/chrome/browser/autocomplete/shortcuts_backend_factory.mm index 8d33e86e..2d1c763 100644 --- a/ios/chrome/browser/autocomplete/shortcuts_backend_factory.mm +++ b/ios/chrome/browser/autocomplete/shortcuts_backend_factory.mm
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/autocomplete/shortcuts_backend_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -26,7 +27,7 @@ bool suppress_db) { scoped_refptr<ShortcutsBackend> shortcuts_backend(new ShortcutsBackend( ios::TemplateURLServiceFactory::GetForBrowserState(browser_state), - make_scoped_ptr(new ios::UIThreadSearchTermsData(browser_state)), + base::WrapUnique(new ios::UIThreadSearchTermsData(browser_state)), ios::HistoryServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::EXPLICIT_ACCESS), web::WebThread::GetTaskRunnerForThread(web::WebThread::DB),
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm index 4e819f4..9185c63 100644 --- a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm +++ b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
@@ -4,12 +4,13 @@ #import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h" +#include <memory> + #include "base/ios/block_types.h" #include "base/ios/ios_util.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_block.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #import "components/autofill/core/browser/keyboard_accessory_metrics_logger.h" #import "components/autofill/ios/browser/js_suggestion_manager.h" #import "ios/chrome/browser/autofill/form_input_accessory_view.h" @@ -198,7 +199,7 @@ @implementation FormInputAccessoryViewController { // Bridge to observe the web state from Objective-C. - scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; // Last registered keyboard rectangle. CGRect _keyboardFrame; @@ -224,7 +225,7 @@ base::WeakNSProtocol<id<FormInputAccessoryViewProvider>> _currentProvider; // Logs UMA metrics for the keyboard accessory. - scoped_ptr<autofill::KeyboardAccessoryMetricsLogger> + std::unique_ptr<autofill::KeyboardAccessoryMetricsLogger> _keyboardAccessoryMetricsLogger; }
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.mm b/ios/chrome/browser/autofill/form_suggestion_controller.mm index 9eba0a4d..71a5d78 100644 --- a/ios/chrome/browser/autofill/form_suggestion_controller.mm +++ b/ios/chrome/browser/autofill/form_suggestion_controller.mm
@@ -4,12 +4,13 @@ #import "ios/chrome/browser/autofill/form_suggestion_controller.h" +#include <memory> + #include "base/ios/ios_util.h" #include "base/ios/weak_nsobject.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_block.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "components/autofill/core/browser/autofill_field_trial_ios.h" @@ -59,7 +60,7 @@ accessoryViewUpdateBlock_; // Autofill suggestion state. - scoped_ptr<AutofillSuggestionState> _suggestionState; + std::unique_ptr<AutofillSuggestionState> _suggestionState; // Providers for suggestions, sorted according to the order in which // they should be asked for suggestions, with highest priority in front. @@ -85,7 +86,7 @@ @implementation FormSuggestionController { // Bridge to observe the web state from Objective-C. - scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; // Manager for FormSuggestion JavaScripts. base::scoped_nsobject<JsSuggestionManager> _jsSuggestionManager;
diff --git a/ios/chrome/browser/autofill/personal_data_manager_factory.cc b/ios/chrome/browser/autofill/personal_data_manager_factory.cc index 18f6424..e217913 100644 --- a/ios/chrome/browser/autofill/personal_data_manager_factory.cc +++ b/ios/chrome/browser/autofill/personal_data_manager_factory.cc
@@ -42,11 +42,12 @@ PersonalDataManagerFactory::~PersonalDataManagerFactory() {} -scoped_ptr<KeyedService> PersonalDataManagerFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +PersonalDataManagerFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<autofill::PersonalDataManager> service( + std::unique_ptr<autofill::PersonalDataManager> service( new autofill::PersonalDataManager( GetApplicationContext()->GetApplicationLocale())); service->Init(
diff --git a/ios/chrome/browser/autofill/personal_data_manager_factory.h b/ios/chrome/browser/autofill/personal_data_manager_factory.h index 49b4b89..2ff07be 100644 --- a/ios/chrome/browser/autofill/personal_data_manager_factory.h +++ b/ios/chrome/browser/autofill/personal_data_manager_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_AUTOFILL_PERSONAL_DATA_MANAGER_FACTORY_H_ #define IOS_CHROME_BROWSER_AUTOFILL_PERSONAL_DATA_MANAGER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -37,7 +38,7 @@ ~PersonalDataManagerFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerFactory);
diff --git a/ios/chrome/browser/bookmarks/bookmark_model_factory.cc b/ios/chrome/browser/bookmarks/bookmark_model_factory.cc index 4305013..16ae64d 100644 --- a/ios/chrome/browser/bookmarks/bookmark_model_factory.cc +++ b/ios/chrome/browser/bookmarks/bookmark_model_factory.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_utils.h" @@ -57,13 +58,13 @@ bookmarks::RegisterProfilePrefs(registry); } -scoped_ptr<KeyedService> BookmarkModelFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> BookmarkModelFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<bookmarks::BookmarkModel> bookmark_model( + std::unique_ptr<bookmarks::BookmarkModel> bookmark_model( new bookmarks::BookmarkModel( - make_scoped_ptr(new BookmarkClientImpl(browser_state)))); + base::WrapUnique(new BookmarkClientImpl(browser_state)))); bookmark_model->Load( browser_state->GetPrefs(), browser_state->GetStatePath(),
diff --git a/ios/chrome/browser/bookmarks/bookmark_model_factory.h b/ios/chrome/browser/bookmarks/bookmark_model_factory.h index fceae98..a1e21ec 100644 --- a/ios/chrome/browser/bookmarks/bookmark_model_factory.h +++ b/ios/chrome/browser/bookmarks/bookmark_model_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_FACTORY_H_ #define IOS_CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -41,7 +42,7 @@ // BrowserStateKeyedServiceFactory implementation. void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.cc b/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.cc index 0d4c2e5395..21ffdeb 100644 --- a/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.cc +++ b/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/sequenced_task_runner.h" #include "components/bookmarks/browser/startup_task_runner_service.h" @@ -35,12 +36,12 @@ StartupTaskRunnerServiceFactory::~StartupTaskRunnerServiceFactory() { } -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> StartupTaskRunnerServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new bookmarks::StartupTaskRunnerService( + return base::WrapUnique(new bookmarks::StartupTaskRunnerService( browser_state->GetIOTaskRunner())); }
diff --git a/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h b/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h index a6e21db0..c50a8724 100644 --- a/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h +++ b/ios/chrome/browser/bookmarks/startup_task_runner_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_BOOKMARKS_STARTUP_TASK_RUNNER_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_BOOKMARKS_STARTUP_TASK_RUNNER_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -37,7 +38,7 @@ ~StartupTaskRunnerServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(StartupTaskRunnerServiceFactory);
diff --git a/ios/chrome/browser/browser_state/browser_state_info_cache.cc b/ios/chrome/browser/browser_state/browser_state_info_cache.cc index 95130f06..074eb31b 100644 --- a/ios/chrome/browser/browser_state/browser_state_info_cache.cc +++ b/ios/chrome/browser/browser_state/browser_state_info_cache.cc
@@ -7,10 +7,10 @@ #include <stddef.h> #include <algorithm> +#include <memory> #include "base/i18n/case_conversion.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/values.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/scoped_user_pref_update.h" @@ -48,7 +48,7 @@ DictionaryPrefUpdate update(prefs_, prefs::kBrowserStateInfoCache); base::DictionaryValue* cache = update.Get(); - scoped_ptr<base::DictionaryValue> info(new base::DictionaryValue); + std::unique_ptr<base::DictionaryValue> info(new base::DictionaryValue); info->SetString(kGAIAIdKey, gaia_id); info->SetString(kUserNameKey, user_name); cache->SetWithoutPathExpansion(key, info.release()); @@ -147,7 +147,7 @@ return; } - scoped_ptr<base::DictionaryValue> info( + std::unique_ptr<base::DictionaryValue> info( GetInfoForBrowserStateAtIndex(index)->DeepCopy()); info->SetString(kGAIAIdKey, gaia_id); @@ -162,7 +162,7 @@ if (value == BrowserStateIsAuthErrorAtIndex(index)) return; - scoped_ptr<base::DictionaryValue> info( + std::unique_ptr<base::DictionaryValue> info( GetInfoForBrowserStateAtIndex(index)->DeepCopy()); info->SetBoolean(kIsAuthErrorKey, value); // This takes ownership of |info|.
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl.cc b/ios/chrome/browser/browser_state/chrome_browser_state_impl.cc index 97378fc..015658e 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl.cc +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl.cc
@@ -199,7 +199,7 @@ } void ChromeBrowserStateImpl::SetOffTheRecordChromeBrowserState( - scoped_ptr<ios::ChromeBrowserState> otr_state) { + std::unique_ptr<ios::ChromeBrowserState> otr_state) { DCHECK(!otr_state_); otr_state_ = std::move(otr_state); }
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl.h b/ios/chrome/browser/browser_state/chrome_browser_state_impl.h index b79e34b..990fcb3 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_BROWSER_STATE_CHROME_BROWSER_STATE_IMPL_ #define IOS_CHROME_BROWSER_BROWSER_STATE_CHROME_BROWSER_STATE_IMPL_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h" @@ -59,7 +60,7 @@ // Sets the OffTheRecordChromeBrowserState. void SetOffTheRecordChromeBrowserState( - scoped_ptr<ios::ChromeBrowserState> otr_state); + std::unique_ptr<ios::ChromeBrowserState> otr_state); base::FilePath state_path_; @@ -67,7 +68,7 @@ // ChromeBrowserState instance. NULL if |GetOffTheRecordChromeBrowserState()| // has never been called or has not been called since // |DestroyOffTheRecordChromeBrowserState()|. - scoped_ptr<ios::ChromeBrowserState> otr_state_; + std::unique_ptr<ios::ChromeBrowserState> otr_state_; base::FilePath otr_state_path_; // !!! BIG HONKING WARNING !!! @@ -79,12 +80,13 @@ // Keep |prefs_| on top for destruction order because |io_data_| and others // store pointers to |prefs_| and shall be destructed first. scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry_; - scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs_; - scoped_ptr<syncable_prefs::PrefServiceSyncable> otr_prefs_; - scoped_ptr<ChromeBrowserStateImplIOData::Handle> io_data_; + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs_; + std::unique_ptr<syncable_prefs::PrefServiceSyncable> otr_prefs_; + std::unique_ptr<ChromeBrowserStateImplIOData::Handle> io_data_; - scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; - scoped_ptr<ssl_config::SSLConfigServiceManager> ssl_config_service_manager_; + std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; + std::unique_ptr<ssl_config::SSLConfigServiceManager> + ssl_config_service_manager_; // STOP!!!! DO NOT ADD ANY MORE ITEMS HERE!!!! //
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h index 8da2ba4..7c5376b 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h
@@ -79,7 +79,8 @@ // Collect references to context getters in reverse order, i.e. last item // will be main request getter. This list is passed to |io_data_| // for invalidation on IO thread. - scoped_ptr<IOSChromeURLRequestContextGetterVector> GetAllContextGetters(); + std::unique_ptr<IOSChromeURLRequestContextGetterVector> + GetAllContextGetters(); // The getters will be invalidated on the IO thread before // ChromeBrowserStateIOData instance is deleted. @@ -113,7 +114,7 @@ ~ChromeBrowserStateImplIOData() override; void InitializeInternal( - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, ProfileParams* profile_params, ProtocolHandlerMap* protocol_handlers) const override; AppRequestContext* InitializeAppRequestContext( @@ -128,26 +129,26 @@ void ClearNetworkingHistorySinceOnIOThread(base::Time time, const base::Closure& completion); - mutable scoped_ptr<IOSChromeNetworkDelegate> network_delegate_; + mutable std::unique_ptr<IOSChromeNetworkDelegate> network_delegate_; // Lazy initialization params. - mutable scoped_ptr<LazyParams> lazy_params_; + mutable std::unique_ptr<LazyParams> lazy_params_; mutable scoped_refptr<JsonPrefStore> network_json_store_; - mutable scoped_ptr<net::HttpNetworkSession> http_network_session_; - mutable scoped_ptr<net::HttpTransactionFactory> main_http_factory_; + mutable std::unique_ptr<net::HttpNetworkSession> http_network_session_; + mutable std::unique_ptr<net::HttpTransactionFactory> main_http_factory_; // Same as |ChromeBrowserState::http_server_properties_|, owned there to // maintain destruction ordering. mutable net::HttpServerPropertiesManager* http_server_properties_manager_; - mutable scoped_ptr<net::CookieStore> main_cookie_store_; + mutable std::unique_ptr<net::CookieStore> main_cookie_store_; - mutable scoped_ptr<net::URLRequestJobFactory> main_job_factory_; + mutable std::unique_ptr<net::URLRequestJobFactory> main_job_factory_; - mutable scoped_ptr<net::SdchManager> sdch_manager_; - mutable scoped_ptr<net::SdchOwner> sdch_policy_; + mutable std::unique_ptr<net::SdchManager> sdch_manager_; + mutable std::unique_ptr<net::SdchOwner> sdch_policy_; // Parameters needed for isolated apps. base::FilePath profile_path_;
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm index ede5e23..26b0cf9 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm
@@ -4,13 +4,14 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.h" +#include <memory> #include <set> #include <utility> #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/sequenced_task_runner.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/worker_pool.h" @@ -103,7 +104,7 @@ return result_value->GetAsDictionary(result); } - void SetValue(scoped_ptr<base::DictionaryValue> value) override { + void SetValue(std::unique_ptr<base::DictionaryValue> value) override { storage_->SetValue(storage_key_, std::move(value), WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); } @@ -260,19 +261,16 @@ PrefService* pref_service = browser_state_->GetPrefs(); io_data_->http_server_properties_manager_ = HttpServerPropertiesManagerFactory::CreateManager(pref_service); - io_data_->set_http_server_properties(scoped_ptr<net::HttpServerProperties>( - io_data_->http_server_properties_manager_)); - io_data_->safe_browsing_enabled()->Init(prefs::kSafeBrowsingEnabled, - pref_service); - io_data_->safe_browsing_enabled()->MoveToThread( - web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)); + io_data_->set_http_server_properties( + base::WrapUnique(io_data_->http_server_properties_manager_)); io_data_->InitializeOnUIThread(browser_state_); } -scoped_ptr<ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> +std::unique_ptr< + ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> ChromeBrowserStateImplIOData::Handle::GetAllContextGetters() { IOSChromeURLRequestContextGetterMap::iterator iter; - scoped_ptr<IOSChromeURLRequestContextGetterVector> context_getters( + std::unique_ptr<IOSChromeURLRequestContextGetterVector> context_getters( new IOSChromeURLRequestContextGetterVector()); iter = app_request_context_getter_map_.begin(); @@ -298,7 +296,7 @@ ChromeBrowserStateImplIOData::~ChromeBrowserStateImplIOData() {} void ChromeBrowserStateImplIOData::InitializeInternal( - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, ProfileParams* profile_params, ProtocolHandlerMap* protocol_handlers) const { // Set up a persistent store for use by the network stack on the IO thread. @@ -308,7 +306,7 @@ network_json_store_filepath, JsonPrefStore::GetTaskRunnerForFile(network_json_store_filepath, web::WebThread::GetBlockingPool()), - scoped_ptr<PrefFilter>()); + std::unique_ptr<PrefFilter>()); network_json_store_->ReadPrefsAsync(nullptr); net::URLRequestContext* main_context = main_request_context(); @@ -377,7 +375,7 @@ main_context->set_channel_id_service(channel_id_service); main_cookie_store_->SetChannelIDServiceID(channel_id_service->GetUniqueID()); - scoped_ptr<net::HttpCache::BackendFactory> main_backend( + std::unique_ptr<net::HttpCache::BackendFactory> main_backend( new net::HttpCache::DefaultBackend( net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE, lazy_params_->cache_path, lazy_params_->cache_max_size, @@ -387,7 +385,7 @@ std::move(main_backend)); main_context->set_http_transaction_factory(main_http_factory_.get()); - scoped_ptr<net::URLRequestJobFactoryImpl> main_job_factory( + std::unique_ptr<net::URLRequestJobFactoryImpl> main_job_factory( new net::URLRequestJobFactoryImpl()); InstallProtocolHandlers(main_job_factory.get(), protocol_handlers); @@ -406,7 +404,7 @@ sdch_policy_.reset(new net::SdchOwner(sdch_manager_.get(), main_context)); main_context->set_sdch_manager(sdch_manager_.get()); sdch_policy_->EnablePersistentStorage( - make_scoped_ptr(new SdchOwnerPrefStorage(network_json_store_.get()))); + base::WrapUnique(new SdchOwnerPrefStorage(network_json_store_.get()))); lazy_params_.reset(); } @@ -419,30 +417,31 @@ context->CopyFrom(main_context); // Use a separate HTTP disk cache for isolated apps. - scoped_ptr<net::HttpCache::BackendFactory> app_backend = + std::unique_ptr<net::HttpCache::BackendFactory> app_backend = net::HttpCache::DefaultBackend::InMemory(0); - scoped_ptr<net::HttpCache> app_http_cache = + std::unique_ptr<net::HttpCache> app_http_cache = CreateHttpFactory(http_network_session_.get(), std::move(app_backend)); cookie_util::CookieStoreConfig ios_cookie_config( base::FilePath(), cookie_util::CookieStoreConfig::EPHEMERAL_SESSION_COOKIES, cookie_util::CookieStoreConfig::COOKIE_STORE_IOS, nullptr); - scoped_ptr<net::CookieStore> cookie_store = + std::unique_ptr<net::CookieStore> cookie_store = cookie_util::CreateCookieStore(ios_cookie_config); // Transfer ownership of the cookies and cache to AppRequestContext. context->SetCookieStore(std::move(cookie_store)); context->SetHttpTransactionFactory(std::move(app_http_cache)); - scoped_ptr<net::URLRequestJobFactoryImpl> job_factory( + std::unique_ptr<net::URLRequestJobFactoryImpl> job_factory( new net::URLRequestJobFactoryImpl()); // TODO(crbug.com/592012): Delete request_interceptor and its handling if // it's not needed in the future. URLRequestInterceptorScopedVector request_interceptors; - scoped_ptr<net::URLRequestJobFactory> top_job_factory(SetUpJobFactoryDefaults( - std::move(job_factory), std::move(request_interceptors), - main_context->network_delegate())); + std::unique_ptr<net::URLRequestJobFactory> top_job_factory( + SetUpJobFactoryDefaults(std::move(job_factory), + std::move(request_interceptors), + main_context->network_delegate())); context->SetJobFactory(std::move(top_job_factory)); return context;
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.cc b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.cc index d5819c1..a81fc522 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.cc +++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.cc
@@ -17,6 +17,7 @@ #include "base/debug/alias.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/path_service.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" @@ -71,7 +72,8 @@ // For safe shutdown, must be called before the ChromeBrowserStateIOData is // destroyed. void NotifyContextGettersOfShutdownOnIO( - scoped_ptr<ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> + std::unique_ptr< + ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> getters) { DCHECK_CURRENTLY_ON(web::WebThread::IO); ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector::iterator @@ -86,7 +88,7 @@ ios::ChromeBrowserState* browser_state) { DCHECK_CURRENTLY_ON(web::WebThread::UI); PrefService* pref_service = browser_state->GetPrefs(); - scoped_ptr<ProfileParams> params(new ProfileParams); + std::unique_ptr<ProfileParams> params(new ProfileParams); params->path = browser_state->GetOriginalChromeBrowserState()->GetStatePath(); params->io_thread = GetApplicationContext()->GetIOSChromeIOThread(); @@ -133,19 +135,19 @@ ChromeBrowserStateIOData::AppRequestContext::AppRequestContext() {} void ChromeBrowserStateIOData::AppRequestContext::SetCookieStore( - scoped_ptr<net::CookieStore> cookie_store) { + std::unique_ptr<net::CookieStore> cookie_store) { cookie_store_ = std::move(cookie_store); set_cookie_store(cookie_store_.get()); } void ChromeBrowserStateIOData::AppRequestContext::SetHttpTransactionFactory( - scoped_ptr<net::HttpTransactionFactory> http_factory) { + std::unique_ptr<net::HttpTransactionFactory> http_factory) { http_factory_ = std::move(http_factory); set_http_transaction_factory(http_factory_.get()); } void ChromeBrowserStateIOData::AppRequestContext::SetJobFactory( - scoped_ptr<net::URLRequestJobFactory> job_factory) { + std::unique_ptr<net::URLRequestJobFactory> job_factory) { job_factory_ = std::move(job_factory); set_job_factory(job_factory_.get()); } @@ -241,7 +243,7 @@ for (ProtocolHandlerMap::iterator it = protocol_handlers->begin(); it != protocol_handlers->end(); ++it) { bool set_protocol = job_factory->SetProtocolHandler( - it->first, make_scoped_ptr(it->second.release())); + it->first, base::WrapUnique(it->second.release())); DCHECK(set_protocol); } protocol_handlers->clear(); @@ -269,7 +271,7 @@ } void ChromeBrowserStateIOData::SetCookieStoreForPartitionPath( - scoped_ptr<net::CookieStore> cookie_store, + std::unique_ptr<net::CookieStore> cookie_store, const base::FilePath& partition_path) { DCHECK(ContainsKey(app_request_context_map_, partition_path)); app_request_context_map_[partition_path]->SetCookieStore( @@ -314,7 +316,7 @@ } void ChromeBrowserStateIOData::set_http_server_properties( - scoped_ptr<net::HttpServerProperties> http_server_properties) const { + std::unique_ptr<net::HttpServerProperties> http_server_properties) const { http_server_properties_ = std::move(http_server_properties); } @@ -338,7 +340,7 @@ // Create the common request contexts. main_request_context_.reset(new net::URLRequestContext()); - scoped_ptr<IOSChromeNetworkDelegate> network_delegate( + std::unique_ptr<IOSChromeNetworkDelegate> network_delegate( new IOSChromeNetworkDelegate()); network_delegate->set_cookie_settings(profile_params_->cookie_settings.get()); @@ -384,50 +386,49 @@ context->set_ssl_config_service(profile_params_->ssl_config_service.get()); } -scoped_ptr<net::URLRequestJobFactory> +std::unique_ptr<net::URLRequestJobFactory> ChromeBrowserStateIOData::SetUpJobFactoryDefaults( - scoped_ptr<net::URLRequestJobFactoryImpl> job_factory, + std::unique_ptr<net::URLRequestJobFactoryImpl> job_factory, URLRequestInterceptorScopedVector request_interceptors, net::NetworkDelegate* network_delegate) const { // NOTE(willchan): Keep these protocol handlers in sync with // ChromeBrowserStateIOData::IsHandledProtocol(). bool set_protocol = job_factory->SetProtocolHandler( url::kFileScheme, - make_scoped_ptr(new net::FileProtocolHandler( + base::WrapUnique(new net::FileProtocolHandler( web::WebThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)))); DCHECK(set_protocol); set_protocol = job_factory->SetProtocolHandler( - url::kDataScheme, make_scoped_ptr(new net::DataProtocolHandler())); + url::kDataScheme, base::WrapUnique(new net::DataProtocolHandler())); DCHECK(set_protocol); job_factory->SetProtocolHandler( url::kAboutScheme, - make_scoped_ptr(new about_handler::AboutProtocolHandler())); + base::WrapUnique(new about_handler::AboutProtocolHandler())); // Set up interceptors in the reverse order. - scoped_ptr<net::URLRequestJobFactory> top_job_factory = + std::unique_ptr<net::URLRequestJobFactory> top_job_factory = std::move(job_factory); for (URLRequestInterceptorScopedVector::reverse_iterator i = request_interceptors.rbegin(); i != request_interceptors.rend(); ++i) { top_job_factory.reset(new net::URLRequestInterceptingJobFactory( - std::move(top_job_factory), make_scoped_ptr(*i))); + std::move(top_job_factory), base::WrapUnique(*i))); } request_interceptors.weak_clear(); return top_job_factory; } void ChromeBrowserStateIOData::ShutdownOnUIThread( - scoped_ptr<IOSChromeURLRequestContextGetterVector> context_getters) { + std::unique_ptr<IOSChromeURLRequestContextGetterVector> context_getters) { DCHECK_CURRENTLY_ON(web::WebThread::UI); google_services_user_account_id_.Destroy(); enable_referrers_.Destroy(); enable_do_not_track_.Destroy(); enable_metrics_.Destroy(); - safe_browsing_enabled_.Destroy(); sync_disabled_.Destroy(); signin_allowed_.Destroy(); if (chrome_http_user_agent_settings_) @@ -451,7 +452,7 @@ channel_id_service_.reset(channel_id_service); } -scoped_ptr<net::HttpNetworkSession> +std::unique_ptr<net::HttpNetworkSession> ChromeBrowserStateIOData::CreateHttpNetworkSession( const ProfileParams& profile_params) const { net::HttpNetworkSession::Params params; @@ -462,25 +463,26 @@ io_thread->InitializeNetworkSessionParams(¶ms); net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(context, ¶ms); - if (!IsOffTheRecord()) { + if (!IsOffTheRecord() && io_thread->globals()->network_quality_estimator) { params.socket_performance_watcher_factory = - io_thread->globals()->network_quality_estimator.get(); + io_thread->globals() + ->network_quality_estimator->GetSocketPerformanceWatcherFactory(); } - return scoped_ptr<net::HttpNetworkSession>( + return std::unique_ptr<net::HttpNetworkSession>( new net::HttpNetworkSession(params)); } -scoped_ptr<net::HttpCache> ChromeBrowserStateIOData::CreateMainHttpFactory( +std::unique_ptr<net::HttpCache> ChromeBrowserStateIOData::CreateMainHttpFactory( net::HttpNetworkSession* session, - scoped_ptr<net::HttpCache::BackendFactory> main_backend) const { - return scoped_ptr<net::HttpCache>( + std::unique_ptr<net::HttpCache::BackendFactory> main_backend) const { + return std::unique_ptr<net::HttpCache>( new net::HttpCache(session, std::move(main_backend), true)); } -scoped_ptr<net::HttpCache> ChromeBrowserStateIOData::CreateHttpFactory( +std::unique_ptr<net::HttpCache> ChromeBrowserStateIOData::CreateHttpFactory( net::HttpNetworkSession* shared_session, - scoped_ptr<net::HttpCache::BackendFactory> backend) const { - return scoped_ptr<net::HttpCache>( + std::unique_ptr<net::HttpCache::BackendFactory> backend) const { + return std::unique_ptr<net::HttpCache>( new net::HttpCache(shared_session, std::move(backend), true)); }
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h index 7e806d07..dfa3dd1e 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_BROWSER_STATE_CHROME_BROWSER_STATE_IO_DATA_H_ #include <map> +#include <memory> #include <string> #include <vector> @@ -13,7 +14,6 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "components/content_settings/core/common/content_settings_types.h" #include "components/prefs/pref_member.h" @@ -93,8 +93,9 @@ // Sets the cookie store associated with a partition path. // The path must exist. If there is already a cookie store, it is deleted. - void SetCookieStoreForPartitionPath(scoped_ptr<net::CookieStore> cookie_store, - const base::FilePath& partition_path); + void SetCookieStoreForPartitionPath( + std::unique_ptr<net::CookieStore> cookie_store, + const base::FilePath& partition_path); // These are useful when the Chrome layer is called from the content layer // with a content::ResourceContext, and they want access to Chrome data for @@ -106,10 +107,6 @@ return &google_services_user_account_id_; } - BooleanPrefMember* safe_browsing_enabled() const { - return &safe_browsing_enabled_; - } - net::TransportSecurityState* transport_security_state() const { return transport_security_state_.get(); } @@ -136,17 +133,17 @@ public: AppRequestContext(); - void SetCookieStore(scoped_ptr<net::CookieStore> cookie_store); + void SetCookieStore(std::unique_ptr<net::CookieStore> cookie_store); void SetHttpTransactionFactory( - scoped_ptr<net::HttpTransactionFactory> http_factory); - void SetJobFactory(scoped_ptr<net::URLRequestJobFactory> job_factory); + std::unique_ptr<net::HttpTransactionFactory> http_factory); + void SetJobFactory(std::unique_ptr<net::URLRequestJobFactory> job_factory); ~AppRequestContext() override; private: - scoped_ptr<net::CookieStore> cookie_store_; - scoped_ptr<net::HttpTransactionFactory> http_factory_; - scoped_ptr<net::URLRequestJobFactory> job_factory_; + std::unique_ptr<net::CookieStore> cookie_store_; + std::unique_ptr<net::HttpTransactionFactory> http_factory_; + std::unique_ptr<net::URLRequestJobFactory> job_factory_; }; // Created on the UI thread, read on the IO thread during @@ -165,7 +162,7 @@ // We need to initialize the ProxyConfigService from the UI thread // because on linux it relies on initializing things through gconf, // and needs to be on the main thread. - scoped_ptr<net::ProxyConfigService> proxy_config_service; + std::unique_ptr<net::ProxyConfigService> proxy_config_service; // The browser state this struct was populated from. It's passed as a void* // to ensure it's not accidently used on the IO thread. @@ -178,8 +175,8 @@ void InitializeOnUIThread(ios::ChromeBrowserState* browser_state); void ApplyProfileParamsToContext(net::URLRequestContext* context) const; - scoped_ptr<net::URLRequestJobFactory> SetUpJobFactoryDefaults( - scoped_ptr<net::URLRequestJobFactoryImpl> job_factory, + std::unique_ptr<net::URLRequestJobFactory> SetUpJobFactoryDefaults( + std::unique_ptr<net::URLRequestJobFactoryImpl> job_factory, URLRequestInterceptorScopedVector request_interceptors, net::NetworkDelegate* network_delegate) const; @@ -191,7 +188,7 @@ // TODO(mmenke): Passing all those URLRequestContextGetters around like this // is really silly. Can we do something cleaner? void ShutdownOnUIThread( - scoped_ptr<IOSChromeURLRequestContextGetterVector> context_getters); + std::unique_ptr<IOSChromeURLRequestContextGetterVector> context_getters); // A ChannelIDService object is created by a derived class of // ChromeBrowserStateIOData, and the derived class calls this method to set @@ -203,7 +200,7 @@ base::WeakPtr<net::HttpServerProperties> http_server_properties() const; void set_http_server_properties( - scoped_ptr<net::HttpServerProperties> http_server_properties) const; + std::unique_ptr<net::HttpServerProperties> http_server_properties) const; net::URLRequestContext* main_request_context() const { return main_request_context_.get(); @@ -211,18 +208,18 @@ bool initialized() const { return initialized_; } - scoped_ptr<net::HttpNetworkSession> CreateHttpNetworkSession( + std::unique_ptr<net::HttpNetworkSession> CreateHttpNetworkSession( const ProfileParams& profile_params) const; // Creates main network transaction factory. - scoped_ptr<net::HttpCache> CreateMainHttpFactory( + std::unique_ptr<net::HttpCache> CreateMainHttpFactory( net::HttpNetworkSession* session, - scoped_ptr<net::HttpCache::BackendFactory> main_backend) const; + std::unique_ptr<net::HttpCache::BackendFactory> main_backend) const; // Creates network transaction factory. - scoped_ptr<net::HttpCache> CreateHttpFactory( + std::unique_ptr<net::HttpCache> CreateHttpFactory( net::HttpNetworkSession* shared_session, - scoped_ptr<net::HttpCache::BackendFactory> backend) const; + std::unique_ptr<net::HttpCache::BackendFactory> backend) const; private: typedef std::map<base::FilePath, AppRequestContext*> URLRequestContextMap; @@ -234,7 +231,7 @@ // Does the actual initialization of the ChromeBrowserStateIOData subtype. // Subtypes should use the static helper functions above to implement this. virtual void InitializeInternal( - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, ProfileParams* profile_params, ProtocolHandlerMap* protocol_handlers) const = 0; @@ -266,33 +263,34 @@ // Data from the UI thread from the ChromeBrowserState, used to initialize // ChromeBrowserStateIOData. Deleted after lazy initialization. - mutable scoped_ptr<ProfileParams> profile_params_; + mutable std::unique_ptr<ProfileParams> profile_params_; mutable StringPrefMember google_services_user_account_id_; // Member variables which are pointed to by the various context objects. mutable BooleanPrefMember enable_referrers_; mutable BooleanPrefMember enable_do_not_track_; - mutable BooleanPrefMember safe_browsing_enabled_; mutable BooleanPrefMember sync_disabled_; mutable BooleanPrefMember signin_allowed_; BooleanPrefMember enable_metrics_; // Pointed to by URLRequestContext. - mutable scoped_ptr<net::ChannelIDService> channel_id_service_; + mutable std::unique_ptr<net::ChannelIDService> channel_id_service_; - mutable scoped_ptr<net::ProxyService> proxy_service_; - mutable scoped_ptr<net::TransportSecurityState> transport_security_state_; - mutable scoped_ptr<net::CTVerifier> cert_transparency_verifier_; - mutable scoped_ptr<net::HttpServerProperties> http_server_properties_; - mutable scoped_ptr<net::TransportSecurityPersister> + mutable std::unique_ptr<net::ProxyService> proxy_service_; + mutable std::unique_ptr<net::TransportSecurityState> + transport_security_state_; + mutable std::unique_ptr<net::CTVerifier> cert_transparency_verifier_; + mutable std::unique_ptr<net::HttpServerProperties> http_server_properties_; + mutable std::unique_ptr<net::TransportSecurityPersister> transport_security_persister_; - mutable scoped_ptr<net::CertificateReportSender> certificate_report_sender_; + mutable std::unique_ptr<net::CertificateReportSender> + certificate_report_sender_; // These are only valid in between LazyInitialize() and their accessor being // called. - mutable scoped_ptr<net::URLRequestContext> main_request_context_; + mutable std::unique_ptr<net::URLRequestContext> main_request_context_; // One URLRequestContext per isolated app for main and media requests. mutable URLRequestContextMap app_request_context_map_; @@ -300,7 +298,7 @@ mutable scoped_refptr<HostContentSettingsMap> host_content_settings_map_; - mutable scoped_ptr<IOSChromeHttpUserAgentSettings> + mutable std::unique_ptr<IOSChromeHttpUserAgentSettings> chrome_http_user_agent_settings_; // TODO(jhawkins): Remove once crbug.com/102004 is fixed.
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc index 443935e..dbba9fb6 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc +++ b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc
@@ -141,7 +141,7 @@ return iter->second.get(); } - scoped_ptr<ChromeBrowserStateImpl> browser_state_impl( + std::unique_ptr<ChromeBrowserStateImpl> browser_state_impl( new ChromeBrowserStateImpl(path)); DCHECK(!browser_state_impl->IsOffTheRecord());
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.h b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.h index 1b53e68..34bed61 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.h
@@ -6,10 +6,10 @@ #define IOS_CHROME_BROWSER_BROWSER_STATE_CHROME_BROWSER_STATE_MANAGER_IMPL_H_ #include <map> +#include <memory> #include "base/files/file_path.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/chrome/browser/browser_state/browser_state_info_cache.h" #include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h" @@ -29,7 +29,7 @@ private: using ChromeBrowserStateImplPathMap = - std::map<base::FilePath, scoped_ptr<ChromeBrowserStateImpl>>; + std::map<base::FilePath, std::unique_ptr<ChromeBrowserStateImpl>>; // Get the path of the last used browser state, or if that's undefined, the // default browser state. @@ -46,7 +46,7 @@ // Holds the ChromeBrowserStateImpl instances that this instance has created. ChromeBrowserStateImplPathMap browser_states_; - scoped_ptr<BrowserStateInfoCache> browser_state_info_cache_; + std::unique_ptr<BrowserStateInfoCache> browser_state_info_cache_; DISALLOW_COPY_AND_ASSIGN(ChromeBrowserStateManagerImpl); };
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h index 6f0e8ce..75aecfe68 100644 --- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h +++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h
@@ -57,8 +57,8 @@ // Weak pointer owned by |original_chrome_browser_state_|. syncable_prefs::PrefServiceSyncable* prefs_; - scoped_ptr<OffTheRecordChromeBrowserStateIOData::Handle> io_data_; - scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; + std::unique_ptr<OffTheRecordChromeBrowserStateIOData::Handle> io_data_; + std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; DISALLOW_COPY_AND_ASSIGN(OffTheRecordChromeBrowserStateImpl); };
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.h b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.h index 4848d55..a9c7f5b 100644 --- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.h +++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.h
@@ -5,12 +5,13 @@ #ifndef IOS_CHROME_BROWSER_BROWSER_STATE_OFF_THE_RECORD_CHROME_BROWSER_STATE_IO_DATA_H_ #define IOS_CHROME_BROWSER_BROWSER_STATE_OFF_THE_RECORD_CHROME_BROWSER_STATE_IO_DATA_H_ +#include <memory> + #include "base/callback.h" #include "base/containers/hash_tables.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "ios/chrome/browser/browser_state/chrome_browser_state_io_data.h" #include "ios/chrome/browser/net/net_types.h" @@ -70,7 +71,8 @@ // Collect references to context getters in reverse order, i.e. last item // will be main request getter. This list is passed to |io_data_| // for invalidation on IO thread. - scoped_ptr<IOSChromeURLRequestContextGetterVector> GetAllContextGetters(); + std::unique_ptr<IOSChromeURLRequestContextGetterVector> + GetAllContextGetters(); // The getters will be invalidated on the IO thread before // ProfileIOData instance is deleted. @@ -92,7 +94,7 @@ ~OffTheRecordChromeBrowserStateIOData() override; void InitializeInternal( - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, ProfileParams* profile_params, ProtocolHandlerMap* protocol_handlers) const override; AppRequestContext* InitializeAppRequestContext( @@ -100,21 +102,21 @@ AppRequestContext* AcquireIsolatedAppRequestContext( net::URLRequestContext* main_context) const override; - mutable scoped_ptr<IOSChromeNetworkDelegate> network_delegate_; + mutable std::unique_ptr<IOSChromeNetworkDelegate> network_delegate_; - mutable scoped_ptr<net::HttpNetworkSession> http_network_session_; - mutable scoped_ptr<net::HttpTransactionFactory> main_http_factory_; + mutable std::unique_ptr<net::HttpNetworkSession> http_network_session_; + mutable std::unique_ptr<net::HttpTransactionFactory> main_http_factory_; - mutable scoped_ptr<net::CookieStore> main_cookie_store_; + mutable std::unique_ptr<net::CookieStore> main_cookie_store_; - mutable scoped_ptr<net::URLRequestJobFactory> main_job_factory_; + mutable std::unique_ptr<net::URLRequestJobFactory> main_job_factory_; // Server bound certificates and cookies are persisted to the disk on iOS. base::FilePath cookie_path_; base::FilePath channel_id_path_; - mutable scoped_ptr<net::SdchManager> sdch_manager_; - mutable scoped_ptr<net::SdchOwner> sdch_policy_; + mutable std::unique_ptr<net::SdchManager> sdch_manager_; + mutable std::unique_ptr<net::SdchOwner> sdch_policy_; DISALLOW_COPY_AND_ASSIGN(OffTheRecordChromeBrowserStateIOData); };
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm index 4a5da6f..3a87bce 100644 --- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm +++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm
@@ -118,10 +118,6 @@ // Set initialized_ to true at the beginning in case any of the objects // below try to get the ResourceContext pointer. initialized_ = true; - io_data_->safe_browsing_enabled()->Init(prefs::kSafeBrowsingEnabled, - browser_state_->GetPrefs()); - io_data_->safe_browsing_enabled()->MoveToThread( - web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)); io_data_->InitializeOnUIThread(browser_state_); // Once initialized, listen to memory warnings. @@ -132,9 +128,10 @@ nullptr, CFNotificationSuspensionBehaviorCoalesce); } -scoped_ptr<ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> +std::unique_ptr< + ChromeBrowserStateIOData::IOSChromeURLRequestContextGetterVector> OffTheRecordChromeBrowserStateIOData::Handle::GetAllContextGetters() { - scoped_ptr<IOSChromeURLRequestContextGetterVector> context_getters( + std::unique_ptr<IOSChromeURLRequestContextGetterVector> context_getters( new IOSChromeURLRequestContextGetterVector()); if (main_request_context_getter_.get()) context_getters->push_back(main_request_context_getter_); @@ -149,7 +146,7 @@ OffTheRecordChromeBrowserStateIOData::~OffTheRecordChromeBrowserStateIOData() {} void OffTheRecordChromeBrowserStateIOData::InitializeInternal( - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate, ProfileParams* profile_params, ProtocolHandlerMap* protocol_handlers) const { net::URLRequestContext* main_context = main_request_context(); @@ -178,7 +175,7 @@ io_thread_globals->url_request_backoff_manager.get()); // For incognito, we use the default non-persistent HttpServerPropertiesImpl. - set_http_server_properties(scoped_ptr<net::HttpServerProperties>( + set_http_server_properties(std::unique_ptr<net::HttpServerProperties>( new net::HttpServerPropertiesImpl())); main_context->set_http_server_properties(http_server_properties()); @@ -211,7 +208,7 @@ main_context->set_http_transaction_factory(main_http_factory_.get()); - scoped_ptr<net::URLRequestJobFactoryImpl> main_job_factory( + std::unique_ptr<net::URLRequestJobFactoryImpl> main_job_factory( new net::URLRequestJobFactoryImpl()); InstallProtocolHandlers(main_job_factory.get(), protocol_handlers);
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.h b/ios/chrome/browser/browser_state/test_chrome_browser_state.h index 93a4ad20..fb40e754 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state.h +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.h
@@ -5,10 +5,11 @@ #ifndef IOS_CHROME_BROWSER_BROWSER_STATE_TEST_CHROME_BROWSER_STATE_H_ #define IOS_CHROME_BROWSER_BROWSER_STATE_TEST_CHROME_BROWSER_STATE_H_ +#include <memory> + #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" #include "components/keyed_service/ios/refcounted_browser_state_keyed_service_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -109,10 +110,11 @@ void SetPath(const base::FilePath& path); // Sets the PrefService to be used by the ChromeBrowserState. - void SetPrefService(scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs); + void SetPrefService( + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs); // Creates the TestChromeBrowserState using previously-set settings. - scoped_ptr<TestChromeBrowserState> Build(); + std::unique_ptr<TestChromeBrowserState> Build(); private: // If true, Build() has been called. @@ -120,7 +122,7 @@ // Various staging variables where values are held until Build() is invoked. base::FilePath state_path_; - scoped_ptr<syncable_prefs::PrefServiceSyncable> pref_service_; + std::unique_ptr<syncable_prefs::PrefServiceSyncable> pref_service_; TestingFactories testing_factories_; RefcountedTestingFactories refcounted_testing_factories_; @@ -132,7 +134,7 @@ // Used to create the principal TestChromeBrowserState. TestChromeBrowserState( const base::FilePath& path, - scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs, + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs, const TestingFactories& testing_factories, const RefcountedTestingFactories& refcounted_testing_factories); @@ -158,12 +160,12 @@ // If non-null, |testing_prefs_| points to |prefs_|. It is there to avoid // casting as |prefs_| may not be a TestingPrefServiceSyncable. - scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs_; + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs_; syncable_prefs::TestingPrefServiceSyncable* testing_prefs_; // The incognito ChromeBrowserState instance that is associated with this // non-incognito ChromeBrowserState instance. - scoped_ptr<TestChromeBrowserState> otr_browser_state_; + std::unique_ptr<TestChromeBrowserState> otr_browser_state_; TestChromeBrowserState* original_browser_state_; DISALLOW_COPY_AND_ASSIGN(TestChromeBrowserState);
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm index 50d2f5f..c99f899f 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
@@ -10,6 +10,7 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/run_loop.h" @@ -46,21 +47,21 @@ #include "net/url_request/url_request_test_util.h" namespace { -scoped_ptr<KeyedService> BuildHistoryService(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildHistoryService(web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new history::HistoryService( - make_scoped_ptr(new HistoryClientImpl( + return base::WrapUnique(new history::HistoryService( + base::WrapUnique(new HistoryClientImpl( ios::BookmarkModelFactory::GetForBrowserState(browser_state))), nullptr)); } -scoped_ptr<KeyedService> BuildBookmarkModel(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildBookmarkModel(web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<bookmarks::BookmarkModel> bookmark_model( + std::unique_ptr<bookmarks::BookmarkModel> bookmark_model( new bookmarks::BookmarkModel( - make_scoped_ptr(new BookmarkClientImpl(browser_state)))); + base::WrapUnique(new BookmarkClientImpl(browser_state)))); bookmark_model->Load( browser_state->GetPrefs(), browser_state->GetStatePath(), browser_state->GetIOTaskRunner(), @@ -73,9 +74,9 @@ NOTREACHED(); } -scoped_ptr<KeyedService> BuildWebDataService(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildWebDataService(web::BrowserState* context) { const base::FilePath& browser_state_path = context->GetStatePath(); - return make_scoped_ptr(new WebDataServiceWrapper( + return base::WrapUnique(new WebDataServiceWrapper( browser_state_path, GetApplicationContext()->GetApplicationLocale(), web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), web::WebThread::GetTaskRunnerForThread(web::WebThread::DB), @@ -125,7 +126,7 @@ TestChromeBrowserState::TestChromeBrowserState( const base::FilePath& path, - scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs, + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs, const TestingFactories& testing_factories, const RefcountedTestingFactories& refcounted_testing_factories) : state_path_(path), @@ -410,14 +411,15 @@ } void TestChromeBrowserState::Builder::SetPrefService( - scoped_ptr<syncable_prefs::PrefServiceSyncable> prefs) { + std::unique_ptr<syncable_prefs::PrefServiceSyncable> prefs) { DCHECK(!build_called_); pref_service_ = std::move(prefs); } -scoped_ptr<TestChromeBrowserState> TestChromeBrowserState::Builder::Build() { +std::unique_ptr<TestChromeBrowserState> +TestChromeBrowserState::Builder::Build() { DCHECK(!build_called_); - return make_scoped_ptr(new TestChromeBrowserState( + return base::WrapUnique(new TestChromeBrowserState( state_path_, std::move(pref_service_), testing_factories_, refcounted_testing_factories_)); }
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.h b/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.h index 6978910..f000de5 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.h +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_BROWSER_STATE_TEST_CHROME_BROWSER_STATE_ISOLATED_CONTEXT_H_ #define IOS_CHROME_BROWSER_BROWSER_STATE_TEST_CHROME_BROWSER_STATE_ISOLATED_CONTEXT_H_ +#include <memory> + #include "base/macros.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/public/provider/chrome/browser/ui/default_ios_web_view_factory.h" @@ -19,7 +21,7 @@ bool MainContextCalled() const; IOSWebViewFactoryExternalService SharingService(); - static scoped_ptr<TestChromeBrowserStateWithIsolatedContext> Build(); + static std::unique_ptr<TestChromeBrowserStateWithIsolatedContext> Build(); // ChromeBrowserState: net::URLRequestContextGetter* GetRequestContext() override;
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.mm index 0f23ae5..100c7b1 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.mm +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state_isolated_context.mm
@@ -11,10 +11,11 @@ TestChromeBrowserStateWithIsolatedContext:: TestChromeBrowserStateWithIsolatedContext() - : TestChromeBrowserState(base::FilePath(), - scoped_ptr<syncable_prefs::PrefServiceSyncable>(), - TestingFactories(), - RefcountedTestingFactories()), + : TestChromeBrowserState( + base::FilePath(), + std::unique_ptr<syncable_prefs::PrefServiceSyncable>(), + TestingFactories(), + RefcountedTestingFactories()), main_context_called_(false), request_context_(new net::TestURLRequestContextGetter( web::WebThread::GetTaskRunnerForThread(web::WebThread::IO))) {}
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc index 3df5741..0a8bc06 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc
@@ -42,7 +42,7 @@ DCHECK(current_remover_); auto pending_removals_iter = pending_removals_.find(browser_state); if (pending_removals_iter == pending_removals_.end()) { - scoped_ptr<BrowsingDataRemovalInfo> removal_info( + std::unique_ptr<BrowsingDataRemovalInfo> removal_info( new BrowsingDataRemovalInfo(remove_mask, callback)); pending_removals_[browser_state] = std::move(removal_info); } else { @@ -50,7 +50,7 @@ pending_removals_iter->second->callbacks.push_back(callback); } } else { - scoped_ptr<BrowsingDataRemovalInfo> removal_info( + std::unique_ptr<BrowsingDataRemovalInfo> removal_info( new BrowsingDataRemovalInfo(remove_mask, callback)); DoRemove(browser_state, std::move(removal_info)); } @@ -74,7 +74,7 @@ ios::ChromeBrowserState* next_browser_state = pending_removals_.begin()->first; - scoped_ptr<BrowsingDataRemovalInfo> removal_info = + std::unique_ptr<BrowsingDataRemovalInfo> removal_info = std::move(pending_removals_[next_browser_state]); pending_removals_.erase(next_browser_state); DoRemove(next_browser_state, std::move(removal_info)); @@ -82,7 +82,7 @@ void BrowsingDataRemoverHelper::DoRemove( ios::ChromeBrowserState* browser_state, - scoped_ptr<BrowsingDataRemovalInfo> removal_info) { + std::unique_ptr<BrowsingDataRemovalInfo> removal_info) { DCHECK(!current_remover_ && !IOSChromeBrowsingDataRemover::is_removing()); current_removal_info_ = std::move(removal_info);
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h index 9ae632a..a5b73e9 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h
@@ -6,10 +6,10 @@ #define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_ #include <map> +#include <memory> #include <vector> #include "base/callback.h" -#include "base/memory/scoped_ptr.h" #include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" namespace ios { @@ -56,14 +56,14 @@ // IOSChromeBrowsingDataRemover // must not be running. void DoRemove(ios::ChromeBrowserState* browser_state, - scoped_ptr<BrowsingDataRemovalInfo> removal_info); + std::unique_ptr<BrowsingDataRemovalInfo> removal_info); // A map that contains the all the ChromeBrowserStates that have a removal // operation pending along with their associated BrowsingDataRemovalInfo. - std::map<ios::ChromeBrowserState*, scoped_ptr<BrowsingDataRemovalInfo>> + std::map<ios::ChromeBrowserState*, std::unique_ptr<BrowsingDataRemovalInfo>> pending_removals_; // The BrowsingDataRemovalInfo of the currently enqueued removal operation. - scoped_ptr<BrowsingDataRemovalInfo> current_removal_info_; + std::unique_ptr<BrowsingDataRemovalInfo> current_removal_info_; // The actual object that perfoms the removal of browsing data. IOSChromeBrowsingDataRemover* current_remover_; };
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h index 0d5d9a3d..e20be6c 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h +++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ #define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ +#include <memory> #include <set> #include "base/gtest_prod_util.h" @@ -109,7 +110,7 @@ }; using Callback = base::Callback<void(const NotificationDetails&)>; - using CallbackSubscription = scoped_ptr< + using CallbackSubscription = std::unique_ptr< base::CallbackList<void(const NotificationDetails&)>::Subscription>; // Creates a IOSChromeBrowsingDataRemover bound to a specific period of time @@ -263,7 +264,7 @@ // Used if we need to clear history. base::CancelableTaskTracker history_task_tracker_; - scoped_ptr<TemplateURLService::Subscription> template_url_sub_; + std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; DISALLOW_COPY_AND_ASSIGN(IOSChromeBrowsingDataRemover); };
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm index c7f6990..7e8472b 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm +++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -236,23 +236,6 @@ if (remove_mask & REMOVE_COOKIES) { web::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies")); - // Clear the safebrowsing cookies only if time period is for "all time". It - // doesn't make sense to apply the time period of deleting in the last X - // hours/days to the safebrowsing cookies since they aren't the result of - // any user action. - if (delete_begin_ == base::Time()) { - scoped_refptr<net::URLRequestContextGetter> safe_browsing_context = - make_scoped_refptr(ios::GetChromeBrowserProvider() - ->GetSafeBrowsingURLRequestContext()); - if (safe_browsing_context) { - ++waiting_for_clear_cookies_count_; - WebThread::PostTask( - WebThread::IO, FROM_HERE, - base::Bind(&IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread, - base::Unretained(this), safe_browsing_context, GURL())); - } - } - ++waiting_for_clear_cookies_count_; WebThread::PostTask( WebThread::IO, FROM_HERE,
diff --git a/ios/chrome/browser/chrome_switches.cc b/ios/chrome/browser/chrome_switches.cc index c9223b47..1f78eac 100644 --- a/ios/chrome/browser/chrome_switches.cc +++ b/ios/chrome/browser/chrome_switches.cc
@@ -117,11 +117,6 @@ const char kIOSTestingFixedHttpPort[] = "testing-fixed-http-port"; const char kIOSTestingFixedHttpsPort[] = "testing-fixed-https-port"; -// Disable several subsystems which run network requests in the background. -// This is for use when doing network performance testing to avoid noise in the -// measurements. -const char kDisableBackgroundNetworking[] = "disable-background-networking"; - // Enables grouping websites by domain and filtering them by period. const char kHistoryEnableGroupByDomain[] = "enable-grouped-history"; @@ -130,9 +125,4 @@ const char kMarkNonSecureAsNeutral[] = "neutral"; const char kMarkNonSecureAsNonSecure[] = "non-secure"; -// If present, safebrowsing only performs update when -// SafeBrowsingProtocolManager::ForceScheduleNextUpdate() is explicitly called. -// This is used for testing only. -const char kSbDisableAutoUpdate[] = "safebrowsing-disable-auto-update"; - } // namespace switches
diff --git a/ios/chrome/browser/chrome_switches.h b/ios/chrome/browser/chrome_switches.h index 627574a..302e56f 100644 --- a/ios/chrome/browser/chrome_switches.h +++ b/ios/chrome/browser/chrome_switches.h
@@ -47,12 +47,10 @@ // TODO(crbug.com/567136): those switches are duplicated between desktop // and iOS. Once the corresponding code has been componentized or is no longer // used by iOS, remove the duplicate definition. -extern const char kDisableBackgroundNetworking[]; extern const char kHistoryEnableGroupByDomain[]; extern const char kMarkNonSecureAs[]; extern const char kMarkNonSecureAsNeutral[]; extern const char kMarkNonSecureAsNonSecure[]; -extern const char kSbDisableAutoUpdate[]; } // namespace switches
diff --git a/ios/chrome/browser/crash_report/crash_report_multi_parameter.mm b/ios/chrome/browser/crash_report/crash_report_multi_parameter.mm index 052fa78..8fded8fb 100644 --- a/ios/chrome/browser/crash_report/crash_report_multi_parameter.mm +++ b/ios/chrome/browser/crash_report/crash_report_multi_parameter.mm
@@ -4,10 +4,11 @@ #import "ios/chrome/browser/crash_report/crash_report_multi_parameter.h" +#include <memory> + #include "base/json/json_writer.h" #include "base/logging.h" #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "base/values.h" #import "ios/chrome/browser/crash_report/breakpad_helper.h" @@ -21,7 +22,7 @@ @implementation CrashReportMultiParameter { base::scoped_nsobject<NSString> crashReportKey_; - scoped_ptr<base::DictionaryValue> dictionary_; + std::unique_ptr<base::DictionaryValue> dictionary_; } - (instancetype)init {
diff --git a/ios/chrome/browser/dom_distiller/distiller_viewer.cc b/ios/chrome/browser/dom_distiller/distiller_viewer.cc index 68ae648..8820e44 100644 --- a/ios/chrome/browser/dom_distiller/distiller_viewer.cc +++ b/ios/chrome/browser/dom_distiller/distiller_viewer.cc
@@ -32,7 +32,7 @@ dom_distiller::DomDistillerServiceFactory::GetForBrowserState( browser_state); - scoped_ptr<ViewerHandle> viewer_handle = distillerService->ViewUrl( + std::unique_ptr<ViewerHandle> viewer_handle = distillerService->ViewUrl( this, distillerService->CreateDefaultDistillerPage(gfx::Size()), url); TakeViewerHandle(std::move(viewer_handle));
diff --git a/ios/chrome/browser/dom_distiller/distiller_viewer.h b/ios/chrome/browser/dom_distiller/distiller_viewer.h index 58904625..936b789 100644 --- a/ios/chrome/browser/dom_distiller/distiller_viewer.h +++ b/ios/chrome/browser/dom_distiller/distiller_viewer.h
@@ -5,10 +5,10 @@ #ifndef IOS_CHROME_BROWSER_DOM_DISTILLER_DISTILLER_VIEWER_H_ #define IOS_CHROME_BROWSER_DOM_DISTILLER_DISTILLER_VIEWER_H_ +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/dom_distiller/core/dom_distiller_request_view_base.h" #include "components/dom_distiller/core/task_tracker.h"
diff --git a/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.cc b/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.cc index 1a7eb1e..e101c6a 100644 --- a/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.cc +++ b/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
@@ -8,6 +8,7 @@ #include "base/files/file_path.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/threading/sequenced_worker_pool.h" #include "components/dom_distiller/core/article_entry.h" @@ -32,10 +33,11 @@ public dom_distiller::DomDistillerService { public: DomDistillerKeyedService( - scoped_ptr<dom_distiller::DomDistillerStoreInterface> store, - scoped_ptr<dom_distiller::DistillerFactory> distiller_factory, - scoped_ptr<dom_distiller::DistillerPageFactory> distiller_page_factory, - scoped_ptr<dom_distiller::DistilledPagePrefs> distilled_page_prefs) + std::unique_ptr<dom_distiller::DomDistillerStoreInterface> store, + std::unique_ptr<dom_distiller::DistillerFactory> distiller_factory, + std::unique_ptr<dom_distiller::DistillerPageFactory> + distiller_page_factory, + std::unique_ptr<dom_distiller::DistilledPagePrefs> distilled_page_prefs) : DomDistillerService(std::move(store), std::move(distiller_factory), std::move(distiller_page_factory), @@ -71,34 +73,36 @@ DomDistillerServiceFactory::~DomDistillerServiceFactory() { } -scoped_ptr<KeyedService> DomDistillerServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +DomDistillerServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { scoped_refptr<base::SequencedTaskRunner> background_task_runner = web::WebThread::GetBlockingPool()->GetSequencedTaskRunner( web::WebThread::GetBlockingPool()->GetSequenceToken()); - scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ArticleEntry>> db( + std::unique_ptr<leveldb_proto::ProtoDatabaseImpl<ArticleEntry>> db( new leveldb_proto::ProtoDatabaseImpl<ArticleEntry>( background_task_runner)); base::FilePath database_dir( context->GetStatePath().Append(FILE_PATH_LITERAL("Articles"))); - scoped_ptr<DomDistillerStore> dom_distiller_store( + std::unique_ptr<DomDistillerStore> dom_distiller_store( new DomDistillerStore(std::move(db), database_dir)); - scoped_ptr<DistillerPageFactory> distiller_page_factory( + std::unique_ptr<DistillerPageFactory> distiller_page_factory( new DistillerPageFactoryIOS(context)); - scoped_ptr<DistillerURLFetcherFactory> distiller_url_fetcher_factory( + std::unique_ptr<DistillerURLFetcherFactory> distiller_url_fetcher_factory( new DistillerURLFetcherFactory(context->GetRequestContext())); dom_distiller::proto::DomDistillerOptions options; - scoped_ptr<DistillerFactory> distiller_factory(new DistillerFactoryImpl( + std::unique_ptr<DistillerFactory> distiller_factory(new DistillerFactoryImpl( std::move(distiller_url_fetcher_factory), options)); - scoped_ptr<DistilledPagePrefs> distilled_page_prefs(new DistilledPagePrefs( - ios::ChromeBrowserState::FromBrowserState(context)->GetPrefs())); + std::unique_ptr<DistilledPagePrefs> distilled_page_prefs( + new DistilledPagePrefs( + ios::ChromeBrowserState::FromBrowserState(context)->GetPrefs())); - return make_scoped_ptr(new DomDistillerKeyedService( + return base::WrapUnique(new DomDistillerKeyedService( std::move(dom_distiller_store), std::move(distiller_factory), std::move(distiller_page_factory), std::move(distilled_page_prefs))); }
diff --git a/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h b/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h index 80e2294e..6abaa13 100644 --- a/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h +++ b/ios/chrome/browser/dom_distiller/dom_distiller_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_DOM_DISTILLER_DOM_DISTILLER_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_DOM_DISTILLER_DOM_DISTILLER_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -37,7 +38,7 @@ ~DomDistillerServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/favicon/favicon_loader.h b/ios/chrome/browser/favicon/favicon_loader.h index b1ad40bae..60f8ccc 100644 --- a/ios/chrome/browser/favicon/favicon_loader.h +++ b/ios/chrome/browser/favicon/favicon_loader.h
@@ -5,11 +5,11 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_FAVICON_LOADER_H_ #define IOS_CHROME_BROWSER_FAVICON_FAVICON_LOADER_H_ +#include <memory> #include <vector> #import "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "base/threading/thread_checker.h" #include "components/favicon_base/favicon_types.h" @@ -53,7 +53,7 @@ // Called when the favicon load request completes. Saves image into the // cache. Desktop code assumes this image is in PNG format. void OnFaviconAvailable( - scoped_ptr<RequestData> request_data, + std::unique_ptr<RequestData> request_data, const std::vector<favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results);
diff --git a/ios/chrome/browser/favicon/favicon_loader.mm b/ios/chrome/browser/favicon/favicon_loader.mm index 5f22de0..eb947b1 100644 --- a/ios/chrome/browser/favicon/favicon_loader.mm +++ b/ios/chrome/browser/favicon/favicon_loader.mm
@@ -53,7 +53,7 @@ if (favicon_service_) { int size = gfx::kFaviconSize * [UIScreen mainScreen].scale; - scoped_ptr<RequestData> request_data(new RequestData(key, block)); + std::unique_ptr<RequestData> request_data(new RequestData(key, block)); favicon_base::FaviconResultsCallback callback = base::Bind(&FaviconLoader::OnFaviconAvailable, base::Unretained(this), base::Passed(&request_data)); @@ -72,7 +72,7 @@ } void FaviconLoader::OnFaviconAvailable( - scoped_ptr<RequestData> request_data, + std::unique_ptr<RequestData> request_data, const std::vector<favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) { DCHECK(request_data);
diff --git a/ios/chrome/browser/favicon/favicon_service_factory.cc b/ios/chrome/browser/favicon/favicon_service_factory.cc index 824baca4..8a9381b 100644 --- a/ios/chrome/browser/favicon/favicon_service_factory.cc +++ b/ios/chrome/browser/favicon/favicon_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/favicon/favicon_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/favicon/core/favicon_service.h" #include "components/keyed_service/core/service_access_type.h" @@ -47,12 +48,12 @@ FaviconServiceFactory::~FaviconServiceFactory() { } -scoped_ptr<KeyedService> FaviconServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> FaviconServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new favicon::FaviconService( - make_scoped_ptr(new FaviconClientImpl(browser_state)), + return base::WrapUnique(new favicon::FaviconService( + base::WrapUnique(new FaviconClientImpl(browser_state)), ios::HistoryServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::EXPLICIT_ACCESS))); }
diff --git a/ios/chrome/browser/favicon/favicon_service_factory.h b/ios/chrome/browser/favicon/favicon_service_factory.h index 3e40d91..8d81f8c 100644 --- a/ios/chrome/browser/favicon/favicon_service_factory.h +++ b/ios/chrome/browser/favicon/favicon_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_FAVICON_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_FAVICON_FAVICON_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -40,7 +41,7 @@ ~FaviconServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(FaviconServiceFactory);
diff --git a/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h b/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h index 2843bbd..ca2bbcd 100644 --- a/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h +++ b/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_FAVICON_LOADER_FACTORY_H_ #define IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_FAVICON_LOADER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" class FaviconLoader; @@ -37,7 +38,7 @@ ~IOSChromeFaviconLoaderFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.mm b/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.mm index 253820b..dc54bf3 100644 --- a/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.mm +++ b/ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.mm
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -37,11 +38,12 @@ IOSChromeFaviconLoaderFactory::~IOSChromeFaviconLoaderFactory() {} -scoped_ptr<KeyedService> IOSChromeFaviconLoaderFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +IOSChromeFaviconLoaderFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr( + return base::WrapUnique( new FaviconLoader(ios::FaviconServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::IMPLICIT_ACCESS))); }
diff --git a/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.cc b/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.cc index 6b2627a..13b191c 100644 --- a/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.cc +++ b/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" @@ -29,10 +30,10 @@ IOSChromeLargeIconCacheFactory::~IOSChromeLargeIconCacheFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeLargeIconCacheFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - return make_scoped_ptr(new LargeIconCache); + return base::WrapUnique(new LargeIconCache); } web::BrowserState* IOSChromeLargeIconCacheFactory::GetBrowserStateToUse(
diff --git a/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h b/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h index 6a20527..e676da6 100644 --- a/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h +++ b/ios/chrome/browser/favicon/ios_chrome_large_icon_cache_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_LARGE_ICON_CACHE_FACTORY_H_ #define IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_LARGE_ICON_CACHE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" class KeyedService; @@ -37,7 +38,7 @@ ~IOSChromeLargeIconCacheFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.cc b/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.cc index 47c84b76..ee54834 100644 --- a/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.cc +++ b/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/thread_task_runner_handle.h" #include "components/favicon/core/large_icon_service.h" @@ -34,13 +35,13 @@ IOSChromeLargeIconServiceFactory::~IOSChromeLargeIconServiceFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeLargeIconServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new favicon::LargeIconService( + return base::WrapUnique(new favicon::LargeIconService( ios::FaviconServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::EXPLICIT_ACCESS), web::WebThread::GetBlockingPool()));
diff --git a/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h b/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h index d6611c3..d6883a7 100644 --- a/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h +++ b/ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_LARGE_ICON_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_FAVICON_IOS_CHROME_LARGE_ICON_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" class KeyedService; @@ -41,7 +42,7 @@ ~IOSChromeLargeIconServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/favicon/large_icon_cache.cc b/ios/chrome/browser/favicon/large_icon_cache.cc index b05b79b9..a63cb48 100644 --- a/ios/chrome/browser/favicon/large_icon_cache.cc +++ b/ios/chrome/browser/favicon/large_icon_cache.cc
@@ -18,7 +18,7 @@ LargeIconCacheEntry() {} ~LargeIconCacheEntry() {} - scoped_ptr<favicon_base::LargeIconResult> result; + std::unique_ptr<favicon_base::LargeIconResult> result; }; LargeIconCache::LargeIconCache() : cache_(kMaxCacheSize) {} @@ -28,12 +28,12 @@ void LargeIconCache::SetCachedResult( const GURL& url, const favicon_base::LargeIconResult& result) { - scoped_ptr<LargeIconCacheEntry> entry(new LargeIconCacheEntry); + std::unique_ptr<LargeIconCacheEntry> entry(new LargeIconCacheEntry); entry->result = CloneLargeIconResult(result); cache_.Put(url, std::move(entry)); } -scoped_ptr<favicon_base::LargeIconResult> LargeIconCache::GetCachedResult( +std::unique_ptr<favicon_base::LargeIconResult> LargeIconCache::GetCachedResult( const GURL& url) { auto iter = cache_.Get(url); if (iter != cache_.end()) { @@ -41,12 +41,13 @@ return CloneLargeIconResult(*iter->second->result.get()); } - return scoped_ptr<favicon_base::LargeIconResult>(); + return std::unique_ptr<favicon_base::LargeIconResult>(); } -scoped_ptr<favicon_base::LargeIconResult> LargeIconCache::CloneLargeIconResult( +std::unique_ptr<favicon_base::LargeIconResult> +LargeIconCache::CloneLargeIconResult( const favicon_base::LargeIconResult& large_icon_result) { - scoped_ptr<favicon_base::LargeIconResult> clone; + std::unique_ptr<favicon_base::LargeIconResult> clone; if (large_icon_result.bitmap.is_valid()) { clone.reset(new favicon_base::LargeIconResult(large_icon_result.bitmap)); } else {
diff --git a/ios/chrome/browser/favicon/large_icon_cache.h b/ios/chrome/browser/favicon/large_icon_cache.h index 5d7d4472..1845c7c 100644 --- a/ios/chrome/browser/favicon/large_icon_cache.h +++ b/ios/chrome/browser/favicon/large_icon_cache.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_LARGE_ICON_CACHE_H_ #define IOS_CHROME_BROWSER_FAVICON_LARGE_ICON_CACHE_H_ +#include <memory> + #include "base/containers/mru_cache.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/core/keyed_service.h" class GURL; @@ -26,7 +27,7 @@ // Example usage: // LargeIconCache* large_icon_cache = // IOSChromeLargeIconServiceFactory::GetForBrowserState(browser_state); -// scoped_ptr<favicon_base::LargeIconResult> icon = +// std::unique_ptr<favicon_base::LargeIconResult> icon = // large_icon_cache->GetCachedResult(...); // class LargeIconCache : public KeyedService { @@ -40,14 +41,15 @@ void SetCachedResult(const GURL& url, const favicon_base::LargeIconResult&); // Returns a cached LargeIconResult. - scoped_ptr<favicon_base::LargeIconResult> GetCachedResult(const GURL& url); + std::unique_ptr<favicon_base::LargeIconResult> GetCachedResult( + const GURL& url); private: // Clones a LargeIconResult. - scoped_ptr<favicon_base::LargeIconResult> CloneLargeIconResult( + std::unique_ptr<favicon_base::LargeIconResult> CloneLargeIconResult( const favicon_base::LargeIconResult& large_icon_result); - base::MRUCache<GURL, scoped_ptr<LargeIconCacheEntry>> cache_; + base::MRUCache<GURL, std::unique_ptr<LargeIconCacheEntry>> cache_; DISALLOW_COPY_AND_ASSIGN(LargeIconCache); };
diff --git a/ios/chrome/browser/favicon/large_icon_cache_unittest.cc b/ios/chrome/browser/favicon/large_icon_cache_unittest.cc index 29d2be3..020c442 100644 --- a/ios/chrome/browser/favicon/large_icon_cache_unittest.cc +++ b/ios/chrome/browser/favicon/large_icon_cache_unittest.cc
@@ -50,9 +50,10 @@ ~LargeIconCacheTest() override {} protected: - scoped_ptr<LargeIconCache> large_icon_cache_; + std::unique_ptr<LargeIconCache> large_icon_cache_; favicon_base::FaviconRawBitmapResult expected_bitmap_; - scoped_ptr<favicon_base::FallbackIconStyle> expected_fallback_icon_style_; + std::unique_ptr<favicon_base::FallbackIconStyle> + expected_fallback_icon_style_; bool is_callback_invoked_; @@ -61,13 +62,13 @@ }; TEST_F(LargeIconCacheTest, EmptyCache) { - scoped_ptr<LargeIconCache> large_icon_cache(new LargeIconCache); + std::unique_ptr<LargeIconCache> large_icon_cache(new LargeIconCache); EXPECT_EQ(nullptr, large_icon_cache->GetCachedResult(GURL(kDummyUrl))); } TEST_F(LargeIconCacheTest, RetreiveItem) { - scoped_ptr<favicon_base::LargeIconResult> expected_result1; - scoped_ptr<favicon_base::LargeIconResult> expected_result2; + std::unique_ptr<favicon_base::LargeIconResult> expected_result1; + std::unique_ptr<favicon_base::LargeIconResult> expected_result2; expected_result1.reset(new favicon_base::LargeIconResult(expected_bitmap_)); expected_result2.reset(new favicon_base::LargeIconResult( new favicon_base::FallbackIconStyle(*expected_fallback_icon_style_))); @@ -75,12 +76,12 @@ large_icon_cache_->SetCachedResult(GURL(kDummyUrl), *expected_result1); large_icon_cache_->SetCachedResult(GURL(kDummyUrl2), *expected_result2); - scoped_ptr<favicon_base::LargeIconResult> result1 = + std::unique_ptr<favicon_base::LargeIconResult> result1 = large_icon_cache_->GetCachedResult(GURL(kDummyUrl)); EXPECT_EQ(true, result1->bitmap.is_valid()); EXPECT_EQ(expected_result1->bitmap.pixel_size, result1->bitmap.pixel_size); - scoped_ptr<favicon_base::LargeIconResult> result2 = + std::unique_ptr<favicon_base::LargeIconResult> result2 = large_icon_cache_->GetCachedResult(GURL(kDummyUrl2)); EXPECT_EQ(false, result2->bitmap.is_valid()); EXPECT_EQ(expected_result2->fallback_icon_style->background_color, @@ -88,7 +89,7 @@ // Test overwriting kDummyUrl. large_icon_cache_->SetCachedResult(GURL(kDummyUrl), *expected_result2); - scoped_ptr<favicon_base::LargeIconResult> result3 = + std::unique_ptr<favicon_base::LargeIconResult> result3 = large_icon_cache_->GetCachedResult(GURL(kDummyUrl2)); EXPECT_EQ(false, result3->bitmap.is_valid()); EXPECT_EQ(expected_result2->fallback_icon_style->background_color,
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm index 5a7b6cf8..1f167a0 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
@@ -5,13 +5,14 @@ #import "ios/chrome/browser/find_in_page/find_in_page_controller.h" #import <UIKit/UIKit.h> + #import <cmath> +#include <memory> #include "base/ios/ios_util.h" #include "base/logging.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #import "ios/chrome/browser/find_in_page/find_in_page_model.h" #import "ios/chrome/browser/find_in_page/js_findinpage_manager.h" #import "ios/chrome/browser/web/dom_altering_lock.h" @@ -81,7 +82,7 @@ BOOL _findStringStarted; // Bridge to observe the web state from Objective-C. - scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; } @synthesize delegate = _delegate;
diff --git a/ios/chrome/browser/find_in_page/js_findinpage_manager.mm b/ios/chrome/browser/find_in_page/js_findinpage_manager.mm index 9f411e28..5302ec3 100644 --- a/ios/chrome/browser/find_in_page/js_findinpage_manager.mm +++ b/ios/chrome/browser/find_in_page/js_findinpage_manager.mm
@@ -4,13 +4,13 @@ #import "ios/chrome/browser/find_in_page/js_findinpage_manager.h" +#include <memory> #include <string> #import "base/ios/weak_nsobject.h" #include "base/json/json_reader.h" #include "base/json/string_escape.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "base/values.h" #import "ios/chrome/browser/find_in_page/find_in_page_model.h" @@ -173,7 +173,7 @@ // Parse JSONs. std::string json([result UTF8String]); - scoped_ptr<base::Value> root(base::JSONReader::Read(json, false)); + std::unique_ptr<base::Value> root(base::JSONReader::Read(json, false)); if (!root.get()) return YES; if (!root->IsType(base::Value::TYPE_LIST)) @@ -221,7 +221,7 @@ - (FindInPageEntry)findInPageEntryForJson:(NSString*)jsonStr { std::string json([jsonStr UTF8String]); - scoped_ptr<base::Value> root(base::JSONReader::Read(json, false)); + std::unique_ptr<base::Value> root(base::JSONReader::Read(json, false)); if (!root.get()) return kFindInPageEntryZero;
diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_local_state_unittest.mm b/ios/chrome/browser/geolocation/omnibox_geolocation_local_state_unittest.mm index 215d9ac..80d6644 100644 --- a/ios/chrome/browser/geolocation/omnibox_geolocation_local_state_unittest.mm +++ b/ios/chrome/browser/geolocation/omnibox_geolocation_local_state_unittest.mm
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ios/chrome/browser/geolocation/omnibox_geolocation_local_state.h" + +#include <memory> #include <string> #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "components/prefs/testing_pref_service.h" #include "ios/chrome/browser/geolocation/location_manager.h" -#include "ios/chrome/browser/geolocation/omnibox_geolocation_local_state.h" #include "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #include "ios/chrome/test/testing_application_context.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/chrome/browser/google/google_url_tracker_factory.cc b/ios/chrome/browser/google/google_url_tracker_factory.cc index bdee6bd..434c9209 100644 --- a/ios/chrome/browser/google/google_url_tracker_factory.cc +++ b/ios/chrome/browser/google/google_url_tracker_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/google/google_url_tracker_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/google/core/browser/google_pref_names.h" #include "components/google/core/browser/google_url_tracker.h" @@ -36,7 +37,7 @@ GoogleURLTrackerFactory::~GoogleURLTrackerFactory() { } -scoped_ptr<KeyedService> GoogleURLTrackerFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> GoogleURLTrackerFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); @@ -46,8 +47,8 @@ browser_state->GetOriginalChromeBrowserState()->GetPrefs()->ClearPref( prefs::kLastPromptedGoogleURL); - return make_scoped_ptr(new GoogleURLTracker( - make_scoped_ptr(new GoogleURLTrackerClientImpl(browser_state)), + return base::WrapUnique(new GoogleURLTracker( + base::WrapUnique(new GoogleURLTrackerClientImpl(browser_state)), GoogleURLTracker::NORMAL_MODE)); }
diff --git a/ios/chrome/browser/google/google_url_tracker_factory.h b/ios/chrome/browser/google/google_url_tracker_factory.h index 5fed645..2ee6d020 100644 --- a/ios/chrome/browser/google/google_url_tracker_factory.h +++ b/ios/chrome/browser/google/google_url_tracker_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_FACTORY_H_ #define IOS_CHROME_BROWSER_GOOGLE_GOOGLE_URL_TRACKER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -35,7 +36,7 @@ ~GoogleURLTrackerFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/history/history_client_impl.cc b/ios/chrome/browser/history/history_client_impl.cc index 780a59d..35860d1 100644 --- a/ios/chrome/browser/history/history_client_impl.cc +++ b/ios/chrome/browser/history/history_client_impl.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/history/core/browser/history_service.h" #include "ios/chrome/browser/history/history_backend_client_impl.h" @@ -62,9 +63,9 @@ void HistoryClientImpl::NotifyProfileError(sql::InitStatus init_status) { } -scoped_ptr<history::HistoryBackendClient> +std::unique_ptr<history::HistoryBackendClient> HistoryClientImpl::CreateBackendClient() { - return make_scoped_ptr(new HistoryBackendClientImpl(bookmark_model_)); + return base::WrapUnique(new HistoryBackendClientImpl(bookmark_model_)); } void HistoryClientImpl::BookmarkModelChanged() {
diff --git a/ios/chrome/browser/history/history_client_impl.h b/ios/chrome/browser/history/history_client_impl.h index abcfff3..bae4809d 100644 --- a/ios/chrome/browser/history/history_client_impl.h +++ b/ios/chrome/browser/history/history_client_impl.h
@@ -5,12 +5,12 @@ #ifndef IOS_CHROME_BROWSER_HISTORY_HISTORY_CLIENT_IMPL_H_ #define IOS_CHROME_BROWSER_HISTORY_HISTORY_CLIENT_IMPL_H_ +#include <memory> #include <set> #include "base/callback_forward.h" #include "base/callback_list.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/history/core/browser/history_client.h" @@ -34,7 +34,7 @@ void Shutdown() override; bool CanAddURL(const GURL& url) override; void NotifyProfileError(sql::InitStatus init_status) override; - scoped_ptr<history::HistoryBackendClient> CreateBackendClient() override; + std::unique_ptr<history::HistoryBackendClient> CreateBackendClient() override; // bookmarks::BaseBookmarkModelObserver implementation. void BookmarkModelChanged() override; @@ -57,8 +57,8 @@ base::Callback<void(const std::set<GURL>&)> on_bookmarks_removed_; // Subscription for notifications of changes to favicons. - scoped_ptr<base::CallbackList<void(const std::set<GURL>&, - const GURL&)>::Subscription> + std::unique_ptr<base::CallbackList<void(const std::set<GURL>&, + const GURL&)>::Subscription> favicons_changed_subscription_; DISALLOW_COPY_AND_ASSIGN(HistoryClientImpl);
diff --git a/ios/chrome/browser/history/history_service_factory.cc b/ios/chrome/browser/history/history_service_factory.cc index 8748271..965c10a9 100644 --- a/ios/chrome/browser/history/history_service_factory.cc +++ b/ios/chrome/browser/history/history_service_factory.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/history/core/browser/history_database_params.h" #include "components/history/core/browser/history_service.h" @@ -67,13 +68,13 @@ HistoryServiceFactory::~HistoryServiceFactory() { } -scoped_ptr<KeyedService> HistoryServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> HistoryServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<history::HistoryService> history_service( + std::unique_ptr<history::HistoryService> history_service( new history::HistoryService( - make_scoped_ptr(new HistoryClientImpl( + base::WrapUnique(new HistoryClientImpl( ios::BookmarkModelFactory::GetForBrowserState(browser_state))), nullptr)); if (!history_service->Init(history::HistoryDatabaseParamsForPath(
diff --git a/ios/chrome/browser/history/history_service_factory.h b/ios/chrome/browser/history/history_service_factory.h index 6f3523a0..c6f2e47 100644 --- a/ios/chrome/browser/history/history_service_factory.h +++ b/ios/chrome/browser/history/history_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_HISTORY_HISTORY_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_HISTORY_HISTORY_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -43,7 +44,7 @@ ~HistoryServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/history/web_history_service_factory.cc b/ios/chrome/browser/history/web_history_service_factory.cc index 9211fc6..9436a2cb 100644 --- a/ios/chrome/browser/history/web_history_service_factory.cc +++ b/ios/chrome/browser/history/web_history_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/history/web_history_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/browser_sync/browser/profile_sync_service.h" #include "components/history/core/browser/web_history_service.h" @@ -62,11 +63,11 @@ WebHistoryServiceFactory::~WebHistoryServiceFactory() { } -scoped_ptr<KeyedService> WebHistoryServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> WebHistoryServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new history::WebHistoryService( + return base::WrapUnique(new history::WebHistoryService( OAuth2TokenServiceFactory::GetForBrowserState(browser_state), ios::SigninManagerFactory::GetForBrowserState(browser_state), browser_state->GetRequestContext()));
diff --git a/ios/chrome/browser/history/web_history_service_factory.h b/ios/chrome/browser/history/web_history_service_factory.h index c2a067a0..7207ab6 100644 --- a/ios/chrome/browser/history/web_history_service_factory.h +++ b/ios/chrome/browser/history/web_history_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_HISTORY_WEB_HISTORY_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_HISTORY_WEB_HISTORY_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -37,7 +38,7 @@ ~WebHistoryServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(WebHistoryServiceFactory);
diff --git a/ios/chrome/browser/infobars/infobar.h b/ios/chrome/browser/infobars/infobar.h index faad0a7..a6cf4b11 100644 --- a/ios/chrome/browser/infobars/infobar.h +++ b/ios/chrome/browser/infobars/infobar.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_H_ #define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_H_ +#include <memory> + #include "base/mac/scoped_nsobject.h" #include "base/macros.h" #include "components/infobars/core/infobar.h" @@ -19,7 +21,7 @@ // InfoBar for iOS acts as a UIViewController for InfoBarView. class InfoBarIOS : public infobars::InfoBar, public InfoBarViewDelegate { public: - explicit InfoBarIOS(scoped_ptr<infobars::InfoBarDelegate> delegate); + explicit InfoBarIOS(std::unique_ptr<infobars::InfoBarDelegate> delegate); ~InfoBarIOS() override; // Layouts the infobar using data from delegate and prepare it for adding to
diff --git a/ios/chrome/browser/infobars/infobar.mm b/ios/chrome/browser/infobars/infobar.mm index 00ae46b..6851a77a 100644 --- a/ios/chrome/browser/infobars/infobar.mm +++ b/ios/chrome/browser/infobars/infobar.mm
@@ -16,7 +16,7 @@ using infobars::InfoBar; using infobars::InfoBarDelegate; -InfoBarIOS::InfoBarIOS(scoped_ptr<InfoBarDelegate> delegate) +InfoBarIOS::InfoBarIOS(std::unique_ptr<InfoBarDelegate> delegate) : InfoBar(std::move(delegate)) {} InfoBarIOS::~InfoBarIOS() {
diff --git a/ios/chrome/browser/infobars/infobar_controller.mm b/ios/chrome/browser/infobars/infobar_controller.mm index c2c4875..e55cbe7 100644 --- a/ios/chrome/browser/infobars/infobar_controller.mm +++ b/ios/chrome/browser/infobars/infobar_controller.mm
@@ -4,8 +4,9 @@ #include "ios/chrome/browser/infobars/infobar_controller.h" +#include <memory> + #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #import "ios/public/provider/chrome/browser/ui/infobar_view_protocol.h" @interface InfoBarController () {
diff --git a/ios/chrome/browser/infobars/infobar_manager_impl.h b/ios/chrome/browser/infobars/infobar_manager_impl.h index d1a934f..648b8cb7 100644 --- a/ios/chrome/browser/infobars/infobar_manager_impl.h +++ b/ios/chrome/browser/infobars/infobar_manager_impl.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_MANAGER_IMPL_H_ #define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_MANAGER_IMPL_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/infobars/core/infobar_manager.h" #include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_user_data.h" @@ -39,8 +40,8 @@ // InfoBarManager implementation. int GetActiveEntryID() override; - scoped_ptr<infobars::InfoBar> CreateConfirmInfoBar( - scoped_ptr<ConfirmInfoBarDelegate> delegate) override; + std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate> delegate) override; // web::WebStateObserver implementation. void NavigationItemCommitted(
diff --git a/ios/chrome/browser/infobars/infobar_manager_impl.mm b/ios/chrome/browser/infobars/infobar_manager_impl.mm index 57b95db..d417fef3 100644 --- a/ios/chrome/browser/infobars/infobar_manager_impl.mm +++ b/ios/chrome/browser/infobars/infobar_manager_impl.mm
@@ -62,8 +62,8 @@ return visible_item ? visible_item->GetUniqueID() : 0; } -scoped_ptr<infobars::InfoBar> InfoBarManagerImpl::CreateConfirmInfoBar( - scoped_ptr<ConfirmInfoBarDelegate> delegate) { +std::unique_ptr<infobars::InfoBar> InfoBarManagerImpl::CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate> delegate) { return ::CreateConfirmInfoBar(std::move(delegate)); }
diff --git a/ios/chrome/browser/infobars/infobar_utils.h b/ios/chrome/browser/infobars/infobar_utils.h index e731751e..109c1f2 100644 --- a/ios/chrome/browser/infobars/infobar_utils.h +++ b/ios/chrome/browser/infobars/infobar_utils.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_UTILS_H_ #define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_UTILS_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> class ConfirmInfoBarDelegate; @@ -15,7 +15,7 @@ // Returns a confirm infobar that owns |delegate|. // Visible for testing. -scoped_ptr<infobars::InfoBar> CreateConfirmInfoBar( - scoped_ptr<ConfirmInfoBarDelegate> delegate); +std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate> delegate); #endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_UTILS_H_
diff --git a/ios/chrome/browser/infobars/infobar_utils.mm b/ios/chrome/browser/infobars/infobar_utils.mm index f3e9a0b..37ad255a 100644 --- a/ios/chrome/browser/infobars/infobar_utils.mm +++ b/ios/chrome/browser/infobars/infobar_utils.mm
@@ -4,17 +4,17 @@ #include "ios/chrome/browser/infobars/infobar_utils.h" +#include <memory> #include <utility> #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "ios/chrome/browser/infobars/confirm_infobar_controller.h" #include "ios/chrome/browser/infobars/infobar.h" -scoped_ptr<infobars::InfoBar> CreateConfirmInfoBar( - scoped_ptr<ConfirmInfoBarDelegate> delegate) { - scoped_ptr<InfoBarIOS> infobar(new InfoBarIOS(std::move(delegate))); +std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar( + std::unique_ptr<ConfirmInfoBarDelegate> delegate) { + std::unique_ptr<InfoBarIOS> infobar(new InfoBarIOS(std::move(delegate))); base::scoped_nsobject<ConfirmInfoBarController> controller( [[ConfirmInfoBarController alloc] initWithDelegate:infobar.get()]); infobar->SetController(controller);
diff --git a/ios/chrome/browser/installation_notifier.mm b/ios/chrome/browser/installation_notifier.mm index 8cc6f9ad..1ea3e3ee 100644 --- a/ios/chrome/browser/installation_notifier.mm +++ b/ios/chrome/browser/installation_notifier.mm
@@ -4,13 +4,14 @@ #import "ios/chrome/browser/installation_notifier.h" -#include <stdint.h> #import <UIKit/UIKit.h> +#include <stdint.h> + +#include <memory> #include "base/ios/weak_nsobject.h" #include "base/logging.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "ios/web/public/web_thread.h" #include "net/base/backoff_entry.h" @@ -62,7 +63,7 @@ @end @implementation InstallationNotifier { - scoped_ptr<net::BackoffEntry> _backoffEntry; + std::unique_ptr<net::BackoffEntry> _backoffEntry; base::scoped_nsprotocol<id<DispatcherProtocol>> _dispatcher; // Dictionary mapping URL schemes to mutable sets of observers. base::scoped_nsobject<NSMutableDictionary> _installedAppObservers;
diff --git a/ios/chrome/browser/installation_notifier_unittest.mm b/ios/chrome/browser/installation_notifier_unittest.mm index 1910a2d..dbca44d2 100644 --- a/ios/chrome/browser/installation_notifier_unittest.mm +++ b/ios/chrome/browser/installation_notifier_unittest.mm
@@ -151,7 +151,7 @@ base::scoped_nsobject<MockNotificationReceiver> notificationReceiver1_; base::scoped_nsobject<MockNotificationReceiver> notificationReceiver2_; base::scoped_nsobject<MockUIApplication> sharedApplication_; - scoped_ptr<base::HistogramTester> histogramTester_; + std::unique_ptr<base::HistogramTester> histogramTester_; }; TEST_F(InstallationNotifierTest, RegisterWithAppAlreadyInstalled) {
diff --git a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm index 9579649..19b5ac8 100644 --- a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm +++ b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
@@ -60,5 +60,5 @@ } const std::string IOSChromeControllerClient::GetExtendedReportingPrefName() { - return prefs::kSafeBrowsingExtendedReportingEnabled; + return std::string(); }
diff --git a/ios/chrome/browser/interstitials/ios_security_interstitial_page.mm b/ios/chrome/browser/interstitials/ios_security_interstitial_page.mm index 79d79be..dc9158a 100644 --- a/ios/chrome/browser/interstitials/ios_security_interstitial_page.mm +++ b/ios/chrome/browser/interstitials/ios_security_interstitial_page.mm
@@ -35,7 +35,7 @@ DCHECK(!web_interstitial_); web_interstitial_ = web::WebInterstitial::CreateHtmlInterstitial( web_state_, ShouldCreateNewNavigation(), request_url_, - scoped_ptr<web::HtmlWebInterstitialDelegate>(this)); + std::unique_ptr<web::HtmlWebInterstitialDelegate>(this)); web_interstitial_->Show(); AfterShow(); }
diff --git a/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h b/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h index 5fc2bf3..8c2aa6a 100644 --- a/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h +++ b/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_INVALIDATION_IOS_CHROME_PROFILE_INVALIDATION_PROVIDER_FACTORY_H_ #define IOS_CHROME_BROWSER_INVALIDATION_IOS_CHROME_PROFILE_INVALIDATION_PROVIDER_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -45,7 +47,7 @@ ~IOSChromeProfileInvalidationProviderFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override;
diff --git a/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.mm b/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.mm index 3baae19..b4c9c73 100644 --- a/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.mm +++ b/ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.mm
@@ -4,10 +4,11 @@ #include "ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h" +#include <memory> #include <utility> #include "base/callback.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/invalidation/impl/invalidator_storage.h" @@ -57,29 +58,30 @@ IOSChromeProfileInvalidationProviderFactory:: ~IOSChromeProfileInvalidationProviderFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeProfileInvalidationProviderFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<IdentityProvider> identity_provider(new ProfileIdentityProvider( - ios::SigninManagerFactory::GetForBrowserState(browser_state), - OAuth2TokenServiceFactory::GetForBrowserState(browser_state), - // LoginUIServiceFactory is not built on iOS. - base::Closure())); + std::unique_ptr<IdentityProvider> identity_provider( + new ProfileIdentityProvider( + ios::SigninManagerFactory::GetForBrowserState(browser_state), + OAuth2TokenServiceFactory::GetForBrowserState(browser_state), + // LoginUIServiceFactory is not built on iOS. + base::Closure())); - scoped_ptr<TiclInvalidationService> service(new TiclInvalidationService( + std::unique_ptr<TiclInvalidationService> service(new TiclInvalidationService( web::GetWebClient()->GetUserAgent(false), std::move(identity_provider), - make_scoped_ptr(new invalidation::TiclProfileSettingsProvider( + base::WrapUnique(new invalidation::TiclProfileSettingsProvider( browser_state->GetPrefs())), IOSChromeGCMProfileServiceFactory::GetForBrowserState(browser_state) ->driver(), browser_state->GetRequestContext())); service->Init( - make_scoped_ptr(new InvalidatorStorage(browser_state->GetPrefs()))); + base::WrapUnique(new InvalidatorStorage(browser_state->GetPrefs()))); - return make_scoped_ptr(new ProfileInvalidationProvider(std::move(service))); + return base::WrapUnique(new ProfileInvalidationProvider(std::move(service))); } void IOSChromeProfileInvalidationProviderFactory::RegisterBrowserStatePrefs(
diff --git a/ios/chrome/browser/ios_chrome_io_thread.h b/ios/chrome/browser/ios_chrome_io_thread.h index 34d4507..7827dcca 100644 --- a/ios/chrome/browser/ios_chrome_io_thread.h +++ b/ios/chrome/browser/ios_chrome_io_thread.h
@@ -9,6 +9,7 @@ #include <stdint.h> #include <map> +#include <memory> #include <set> #include <string> #include <vector> @@ -16,7 +17,6 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" #include "base/time/time.h" @@ -105,31 +105,32 @@ // The "system" NetworkDelegate, used for BrowserState-agnostic network // events. - scoped_ptr<net::NetworkDelegate> system_network_delegate; - scoped_ptr<net::HostResolver> host_resolver; - scoped_ptr<net::CertVerifier> cert_verifier; + std::unique_ptr<net::NetworkDelegate> system_network_delegate; + std::unique_ptr<net::HostResolver> host_resolver; + std::unique_ptr<net::CertVerifier> cert_verifier; // The ChannelIDService must outlive the HttpTransactionFactory. - scoped_ptr<net::ChannelIDService> system_channel_id_service; + std::unique_ptr<net::ChannelIDService> system_channel_id_service; // This TransportSecurityState doesn't load or save any state. It's only // used to enforce pinning for system requests and will only use built-in // pins. - scoped_ptr<net::TransportSecurityState> transport_security_state; - scoped_ptr<net::CTVerifier> cert_transparency_verifier; - scoped_ptr<net::CTPolicyEnforcer> ct_policy_enforcer; + std::unique_ptr<net::TransportSecurityState> transport_security_state; + std::unique_ptr<net::CTVerifier> cert_transparency_verifier; + std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer; scoped_refptr<net::SSLConfigService> ssl_config_service; - scoped_ptr<net::HttpAuthPreferences> http_auth_preferences; - scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory; - scoped_ptr<net::HttpServerProperties> http_server_properties; - scoped_ptr<net::URLRequestBackoffManager> url_request_backoff_manager; - scoped_ptr<net::ProxyService> system_proxy_service; - scoped_ptr<net::HttpNetworkSession> system_http_network_session; - scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory; - scoped_ptr<net::URLRequestJobFactory> system_url_request_job_factory; - scoped_ptr<net::URLRequestContext> system_request_context; + std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences; + std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory; + std::unique_ptr<net::HttpServerProperties> http_server_properties; + std::unique_ptr<net::URLRequestBackoffManager> url_request_backoff_manager; + std::unique_ptr<net::ProxyService> system_proxy_service; + std::unique_ptr<net::HttpNetworkSession> system_http_network_session; + std::unique_ptr<net::HttpTransactionFactory> + system_http_transaction_factory; + std::unique_ptr<net::URLRequestJobFactory> system_url_request_job_factory; + std::unique_ptr<net::URLRequestContext> system_request_context; SystemRequestContextLeakChecker system_request_context_leak_checker; - scoped_ptr<net::CookieStore> system_cookie_store; - scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings; - scoped_ptr<net::NetworkQualityEstimator> network_quality_estimator; + std::unique_ptr<net::CookieStore> system_cookie_store; + std::unique_ptr<net::HttpUserAgentSettings> http_user_agent_settings; + std::unique_ptr<net::NetworkQualityEstimator> network_quality_estimator; uint16_t testing_fixed_http_port; uint16_t testing_fixed_https_port; Optional<bool> enable_tcp_fast_open_for_ssl; @@ -375,17 +376,18 @@ // Observer that logs network changes to the ChromeNetLog. class LoggingNetworkChangeObserver; - scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_; + std::unique_ptr<LoggingNetworkChangeObserver> network_change_observer_; // This is an instance of the default SSLConfigServiceManager for the current // platform and it gets SSL preferences from local_state object. - scoped_ptr<ssl_config::SSLConfigServiceManager> ssl_config_service_manager_; + std::unique_ptr<ssl_config::SSLConfigServiceManager> + ssl_config_service_manager_; // These member variables are initialized by a task posted to the IO thread, // which gets posted by calling certain member functions of IOSChromeIOThread. - scoped_ptr<net::ProxyConfigService> system_proxy_config_service_; + std::unique_ptr<net::ProxyConfigService> system_proxy_config_service_; - scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; + std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; scoped_refptr<net::URLRequestContextGetter> system_url_request_context_getter_;
diff --git a/ios/chrome/browser/ios_chrome_io_thread.mm b/ios/chrome/browser/ios_chrome_io_thread.mm index 46f014e..862fc42 100644 --- a/ios/chrome/browser/ios_chrome_io_thread.mm +++ b/ios/chrome/browser/ios_chrome_io_thread.mm
@@ -17,6 +17,7 @@ #include "base/environment.h" #include "base/logging.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/metrics/field_trial.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" @@ -160,12 +161,13 @@ } }; -scoped_ptr<net::HostResolver> CreateGlobalHostResolver(net::NetLog* net_log) { +std::unique_ptr<net::HostResolver> CreateGlobalHostResolver( + net::NetLog* net_log) { TRACE_EVENT0("startup", "IOSChromeIOThread::CreateGlobalHostResolver"); const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); - scoped_ptr<net::HostResolver> global_host_resolver = + std::unique_ptr<net::HostResolver> global_host_resolver = net::HostResolver::CreateSystemResolver(net::HostResolver::Options(), net_log); @@ -175,7 +177,7 @@ if (!command_line.HasSwitch(switches::kIOSHostResolverRules)) return global_host_resolver; - scoped_ptr<net::MappedHostResolver> remapped_resolver( + std::unique_ptr<net::MappedHostResolver> remapped_resolver( new net::MappedHostResolver(std::move(global_host_resolver))); remapped_resolver->SetRulesFromString( command_line.GetSwitchValueASCII(switches::kIOSHostResolverRules)); @@ -406,7 +408,7 @@ // Setup the HistogramWatcher to run on the IO thread. net::NetworkChangeNotifier::InitHistogramWatcher(); - scoped_ptr<IOSChromeNetworkDelegate> chrome_network_delegate( + std::unique_ptr<IOSChromeNetworkDelegate> chrome_network_delegate( new IOSChromeNetworkDelegate()); globals_->system_network_delegate = std::move(chrome_network_delegate); @@ -416,7 +418,7 @@ variations::GetVariationParams(kNetworkQualityEstimatorFieldTrialName, &network_quality_estimator_params); - scoped_ptr<net::ExternalEstimateProvider> external_estimate_provider; + std::unique_ptr<net::ExternalEstimateProvider> external_estimate_provider; // Pass ownership. globals_->network_quality_estimator.reset(new net::NetworkQualityEstimator( std::move(external_estimate_provider), network_quality_estimator_params)); @@ -1021,7 +1023,7 @@ // Data URLs are always loaded through the system request context on iOS // (due to UIWebView limitations). bool set_protocol = system_job_factory->SetProtocolHandler( - url::kDataScheme, make_scoped_ptr(new net::DataProtocolHandler())); + url::kDataScheme, base::WrapUnique(new net::DataProtocolHandler())); DCHECK(set_protocol); globals->system_url_request_job_factory.reset(system_job_factory); context->set_job_factory(globals->system_url_request_job_factory.get());
diff --git a/ios/chrome/browser/ios_chrome_main_parts.h b/ios/chrome/browser/ios_chrome_main_parts.h index 4ddc094..8a372d93 100644 --- a/ios/chrome/browser/ios_chrome_main_parts.h +++ b/ios/chrome/browser/ios_chrome_main_parts.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_IOS_CHROME_MAIN_PARTS_H_ #define IOS_CHROME_BROWSER_IOS_CHROME_MAIN_PARTS_H_ +#include <memory> + #include "base/command_line.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/metrics/field_trial.h" #include "ios/web/public/app/web_main_parts.h" @@ -46,17 +47,17 @@ const base::CommandLine& parsed_command_line_; - scoped_ptr<ApplicationContextImpl> application_context_; + std::unique_ptr<ApplicationContextImpl> application_context_; scoped_refptr<metrics::TrackingSynchronizer> tracking_synchronizer_; // Statistical testing infrastructure for the entire browser. NULL until // SetUpMetricsAndFieldTrials is called. - scoped_ptr<base::FieldTrialList> field_trial_list_; + std::unique_ptr<base::FieldTrialList> field_trial_list_; PrefService* local_state_; // Initialized in SetupMetricsAndFieldTrials. - scoped_ptr<ios::FieldTrialSynchronizer> field_trial_synchronizer_; + std::unique_ptr<ios::FieldTrialSynchronizer> field_trial_synchronizer_; DISALLOW_COPY_AND_ASSIGN(IOSChromeMainParts); };
diff --git a/ios/chrome/browser/ios_chrome_main_parts.mm b/ios/chrome/browser/ios_chrome_main_parts.mm index c75c83487..fab26e1 100644 --- a/ios/chrome/browser/ios_chrome_main_parts.mm +++ b/ios/chrome/browser/ios_chrome_main_parts.mm
@@ -8,6 +8,7 @@ #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/path_service.h" #include "base/time/default_tick_clock.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -105,7 +106,7 @@ // Initialize tracking synchronizer system. tracking_synchronizer_ = new metrics::TrackingSynchronizer( - make_scoped_ptr(new base::DefaultTickClock()), + base::WrapUnique(new base::DefaultTickClock()), base::Bind(&metrics::IOSTrackingSynchronizerDelegate::Create)); // Now the command line has been mutated based on about:flags, we can setup @@ -149,7 +150,7 @@ FirstRun::GetPingDelayPrefName()); // Negative ping delay means to send ping immediately after a first search is // recorded. - rlz::RLZTracker::SetRlzDelegate(make_scoped_ptr(new RLZTrackerDelegateImpl)); + rlz::RLZTracker::SetRlzDelegate(base::WrapUnique(new RLZTrackerDelegateImpl)); rlz::RLZTracker::InitRlzDelayed( FirstRun::IsChromeFirstRun(), ping_delay < 0, base::TimeDelta::FromMilliseconds(abs(ping_delay)), @@ -221,7 +222,7 @@ CHECK(result) << "Invalid --" << switches::kIOSForceVariationIds << " list specified."; } - scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); + std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); feature_list->InitializeFromCommandLine( command_line->GetSwitchValueASCII(switches::kEnableIOSFeatures), command_line->GetSwitchValueASCII(switches::kDisableIOSFeatures));
diff --git a/ios/chrome/browser/memory/memory_debugger.mm b/ios/chrome/browser/memory/memory_debugger.mm index b37625a..7762fbe 100644 --- a/ios/chrome/browser/memory/memory_debugger.mm +++ b/ios/chrome/browser/memory/memory_debugger.mm
@@ -42,7 +42,7 @@ base::scoped_nsobject<UITextField> _continuousMemoryWarningField; // A place to store the artifical memory bloat. - scoped_ptr<uint8_t> _bloat; + std::unique_ptr<uint8_t> _bloat; // Distance the view was pushed up to accomodate the keyboard. CGFloat _keyboardOffset;
diff --git a/ios/chrome/browser/memory/memory_metrics.cc b/ios/chrome/browser/memory/memory_metrics.cc index 1de2e2a..43bf6874 100644 --- a/ios/chrome/browser/memory/memory_metrics.cc +++ b/ios/chrome/browser/memory/memory_metrics.cc
@@ -8,9 +8,10 @@ #include <stddef.h> #include <stdint.h> +#include <memory> + #include "base/logging.h" #include "base/mac/scoped_mach_port.h" -#include "base/memory/scoped_ptr.h" #include "base/process/process_handle.h" #include "base/process/process_metrics.h" #include "build/build_config.h" @@ -47,7 +48,7 @@ uint64_t GetRealMemoryUsedInBytes() { base::ProcessHandle process_handle = base::GetCurrentProcessHandle(); - scoped_ptr<base::ProcessMetrics> process_metrics( + std::unique_ptr<base::ProcessMetrics> process_metrics( base::ProcessMetrics::CreateProcessMetrics(process_handle)); return static_cast<uint64_t>(process_metrics->GetWorkingSetSize()); }
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.cc b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.cc index cb480c27..7223da6 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.cc +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.cc
@@ -14,6 +14,7 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/process/process_metrics.h" #include "base/rand_util.h" @@ -91,12 +92,13 @@ } // static -scoped_ptr<IOSChromeMetricsServiceClient> IOSChromeMetricsServiceClient::Create( +std::unique_ptr<IOSChromeMetricsServiceClient> +IOSChromeMetricsServiceClient::Create( metrics::MetricsStateManager* state_manager, PrefService* local_state) { // Perform two-phase initialization so that |client->metrics_service_| only // receives pointers to fully constructed objects. - scoped_ptr<IOSChromeMetricsServiceClient> client( + std::unique_ptr<IOSChromeMetricsServiceClient> client( new IOSChromeMetricsServiceClient(state_manager)); client->Initialize(); @@ -174,10 +176,10 @@ } } -scoped_ptr<metrics::MetricsLogUploader> +std::unique_ptr<metrics::MetricsLogUploader> IOSChromeMetricsServiceClient::CreateUploader( const base::Callback<void(int)>& on_upload_complete) { - return scoped_ptr<metrics::MetricsLogUploader>( + return std::unique_ptr<metrics::MetricsLogUploader>( new metrics::NetMetricsLogUploader( GetApplicationContext()->GetSystemURLRequestContext(), metrics::kDefaultMetricsServerUrl, metrics::kDefaultMetricsMimeType, @@ -214,51 +216,52 @@ // Register metrics providers. metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider( - web::WebThread::GetBlockingPool()))); + std::unique_ptr<metrics::MetricsProvider>( + new metrics::NetworkMetricsProvider( + web::WebThread::GetBlockingPool()))); // Currently, we configure OmniboxMetricsProvider to not log events to UMA // if there is a single incognito session visible. In the future, it may // be worth revisiting this to still log events from non-incognito sessions. metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( + std::unique_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( base::Bind(&::IsOffTheRecordSessionActive)))); stability_metrics_provider_ = new IOSChromeStabilityMetricsProvider( GetApplicationContext()->GetLocalState()); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>(stability_metrics_provider_)); + std::unique_ptr<metrics::MetricsProvider>(stability_metrics_provider_)); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>( + std::unique_ptr<metrics::MetricsProvider>( new metrics::ScreenInfoMetricsProvider)); drive_metrics_provider_ = new metrics::DriveMetricsProvider( web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE), ios::FILE_LOCAL_STATE); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); + std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider(base::Bind(&IsCellularLogicEnabled)); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); + std::unique_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>( + std::unique_ptr<metrics::MetricsProvider>( new metrics::CallStackProfileMetricsProvider)); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>( - SigninStatusMetricsProvider::CreateInstance(make_scoped_ptr( + std::unique_ptr<metrics::MetricsProvider>( + SigninStatusMetricsProvider::CreateInstance(base::WrapUnique( new IOSChromeSigninStatusMetricsProviderDelegate)))); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>( + std::unique_ptr<metrics::MetricsProvider>( new MobileSessionShutdownMetricsProvider(metrics_service_.get()))); metrics_service_->RegisterMetricsProvider( - scoped_ptr<metrics::MetricsProvider>( + std::unique_ptr<metrics::MetricsProvider>( new sync_driver::DeviceCountMetricsProvider( base::Bind(&IOSChromeSyncClient::GetDeviceInfoTrackers)))); } @@ -308,7 +311,7 @@ // shared between the iOS port's usage and // ChromeMetricsServiceClient::CollectFinalHistograms()'s usage of // MetricsMemoryDetails. - scoped_ptr<base::ProcessMetrics> process_metrics( + std::unique_ptr<base::ProcessMetrics> process_metrics( base::ProcessMetrics::CreateProcessMetrics( base::GetCurrentProcessHandle())); UMA_HISTOGRAM_MEMORY_KB("Memory.Browser",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h index f2a9f8d3..f0014a37 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.h
@@ -7,11 +7,11 @@ #include <stdint.h> +#include <memory> #include <string> #include "base/callback.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "components/metrics/metrics_service_client.h" @@ -44,7 +44,7 @@ ~IOSChromeMetricsServiceClient() override; // Factory function. - static scoped_ptr<IOSChromeMetricsServiceClient> Create( + static std::unique_ptr<IOSChromeMetricsServiceClient> Create( metrics::MetricsStateManager* state_manager, PrefService* local_state); @@ -65,7 +65,7 @@ void InitializeSystemProfileMetrics( const base::Closure& done_callback) override; void CollectFinalMetricsForLog(const base::Closure& done_callback) override; - scoped_ptr<metrics::MetricsLogUploader> CreateUploader( + std::unique_ptr<metrics::MetricsLogUploader> CreateUploader( const base::Callback<void(int)>& on_upload_complete) override; base::TimeDelta GetStandardUploadInterval() override; base::string16 GetRegistryBackupKey() override; @@ -120,7 +120,7 @@ metrics::MetricsStateManager* metrics_state_manager_; // The MetricsService that |this| is a client of. - scoped_ptr<metrics::MetricsService> metrics_service_; + std::unique_ptr<metrics::MetricsService> metrics_service_; // The IOSChromeStabilityMetricsProvider instance that was registered with // MetricsService. Has the same lifetime as |metrics_service_|. @@ -144,12 +144,12 @@ const base::TimeTicks start_time_; // Subscription for receiving callbacks that a tab was parented. - scoped_ptr<base::CallbackList<void(web::WebState*)>::Subscription> + std::unique_ptr<base::CallbackList<void(web::WebState*)>::Subscription> tab_parented_subscription_; // Subscription for receiving callbacks that a URL was opened from the // omnibox. - scoped_ptr<base::CallbackList<void(OmniboxLog*)>::Subscription> + std::unique_ptr<base::CallbackList<void(OmniboxLog*)>::Subscription> omnibox_url_opened_subscription_; // Whether this client has already uploaded profiler data during this session.
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h index 314c00b..38d939f 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_METRICS_IOS_CHROME_METRICS_SERVICES_MANAGER_CLIENT_H_ #define IOS_CHROME_BROWSER_METRICS_IOS_CHROME_METRICS_SERVICES_MANAGER_CLIENT_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "components/metrics_services_manager/metrics_services_manager_client.h" @@ -26,9 +27,10 @@ private: // metrics_services_manager::MetricsServicesManagerClient: - scoped_ptr<rappor::RapporService> CreateRapporService() override; - scoped_ptr<variations::VariationsService> CreateVariationsService() override; - scoped_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient() + std::unique_ptr<rappor::RapporService> CreateRapporService() override; + std::unique_ptr<variations::VariationsService> CreateVariationsService() + override; + std::unique_ptr<metrics::MetricsServiceClient> CreateMetricsServiceClient() override; net::URLRequestContextGetter* GetURLRequestContext() override; bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback) override; @@ -40,7 +42,7 @@ metrics::MetricsStateManager* GetMetricsStateManager(); // MetricsStateManager which is passed as a parameter to service constructors. - scoped_ptr<metrics::MetricsStateManager> metrics_state_manager_; + std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager_; // Ensures that all functions are called from the same thread. base::ThreadChecker thread_checker_;
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm index 5c94899..1337ab2 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.mm
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "components/metrics/metrics_state_manager.h" #include "components/prefs/pref_service.h" #include "components/rappor/rappor_service.h" @@ -23,8 +24,8 @@ void PostStoreMetricsClientInfo(const metrics::ClientInfo& client_info) {} -scoped_ptr<metrics::ClientInfo> LoadMetricsClientInfo() { - return scoped_ptr<metrics::ClientInfo>(); +std::unique_ptr<metrics::ClientInfo> LoadMetricsClientInfo() { + return std::unique_ptr<metrics::ClientInfo>(); } } // namespace @@ -36,18 +37,16 @@ } IOSChromeMetricsServicesManagerClient:: - ~IOSChromeMetricsServicesManagerClient() { - ios::GetChromeBrowserProvider()->OnMetricsServicesManagerClientDestroyed(); -} + ~IOSChromeMetricsServicesManagerClient() = default; -scoped_ptr<rappor::RapporService> +std::unique_ptr<rappor::RapporService> IOSChromeMetricsServicesManagerClient::CreateRapporService() { DCHECK(thread_checker_.CalledOnValidThread()); - return make_scoped_ptr(new rappor::RapporService( + return base::WrapUnique(new rappor::RapporService( local_state_, base::Bind(&::IsOffTheRecordSessionActive))); } -scoped_ptr<variations::VariationsService> +std::unique_ptr<variations::VariationsService> IOSChromeMetricsServicesManagerClient::CreateVariationsService() { DCHECK(thread_checker_.CalledOnValidThread()); @@ -55,12 +54,12 @@ // a dummy value for the name of the switch that disables background // networking. return variations::VariationsService::Create( - make_scoped_ptr(new IOSChromeVariationsServiceClient), local_state_, + base::WrapUnique(new IOSChromeVariationsServiceClient), local_state_, GetMetricsStateManager(), "dummy-disable-background-switch", ::CreateUIStringOverrider()); } -scoped_ptr<metrics::MetricsServiceClient> +std::unique_ptr<metrics::MetricsServiceClient> IOSChromeMetricsServicesManagerClient::CreateMetricsServiceClient() { DCHECK(thread_checker_.CalledOnValidThread()); return IOSChromeMetricsServiceClient::Create(GetMetricsStateManager(),
diff --git a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.cc b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.cc index 2202f69d..a4399c4 100644 --- a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.cc +++ b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.cc
@@ -23,7 +23,7 @@ TestingPrefServiceSimple* prefs() { return prefs_.get(); } private: - scoped_ptr<TestingPrefServiceSimple> prefs_; + std::unique_ptr<TestingPrefServiceSimple> prefs_; DISALLOW_COPY_AND_ASSIGN(IOSChromeStabilityMetricsProviderTest); };
diff --git a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h index 18c9f4ca..8255216 100644 --- a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h +++ b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MOBILE_SESSION_SHUTDOWN_METRICS_PROVIDER_H_ #define IOS_CHROME_BROWSER_METRICS_MOBILE_SESSION_SHUTDOWN_METRICS_PROVIDER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/metrics/metrics_provider.h" namespace metrics {
diff --git a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm index 09c8d0c..0e3955a 100644 --- a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm +++ b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider_unittest.mm
@@ -4,9 +4,10 @@ #include "ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h" +#include <memory> + #include "base/bind.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/test/histogram_tester.h" #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" @@ -77,9 +78,10 @@ protected: TestingPrefServiceSimple local_state_; metrics::TestMetricsServiceClient metrics_client_; - scoped_ptr<metrics::MetricsStateManager> metrics_state_; - scoped_ptr<metrics::MetricsService> metrics_service_; - scoped_ptr<MobileSessionShutdownMetricsProviderForTesting> metrics_provider_; + std::unique_ptr<metrics::MetricsStateManager> metrics_state_; + std::unique_ptr<metrics::MetricsService> metrics_service_; + std::unique_ptr<MobileSessionShutdownMetricsProviderForTesting> + metrics_provider_; private: DISALLOW_COPY_AND_ASSIGN(MobileSessionShutdownMetricsProviderTest);
diff --git a/ios/chrome/browser/net/cookie_util.h b/ios/chrome/browser/net/cookie_util.h index 1f21f08c..73197e7 100644 --- a/ios/chrome/browser/net/cookie_util.h +++ b/ios/chrome/browser/net/cookie_util.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_NET_COOKIE_UTIL_H_ #define IOS_CHROME_BROWSER_NET_COOKIE_UTIL_H_ +#include <memory> + #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "net/cookies/canonical_cookie.h" @@ -74,7 +76,8 @@ // Creates a cookie store wich is internally either a CookieMonster or a // CookieStoreIOS. -scoped_ptr<net::CookieStore> CreateCookieStore(const CookieStoreConfig& config); +std::unique_ptr<net::CookieStore> CreateCookieStore( + const CookieStoreConfig& config); // Returns true if the cookies should be cleared. // Current implementation returns true if the device has rebooted since the
diff --git a/ios/chrome/browser/net/cookie_util.mm b/ios/chrome/browser/net/cookie_util.mm index 6b2520fd..7ae2920 100644 --- a/ios/chrome/browser/net/cookie_util.mm +++ b/ios/chrome/browser/net/cookie_util.mm
@@ -10,6 +10,7 @@ #include "base/logging.h" #import "base/mac/bind_objc_block.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/net/cookies/cookie_store_ios.h" @@ -44,11 +45,11 @@ } // Creates a CookieMonster configured by |config|. -scoped_ptr<net::CookieMonster> CreateCookieMonster( +std::unique_ptr<net::CookieMonster> CreateCookieMonster( const CookieStoreConfig& config) { if (config.path.empty()) { // Empty path means in-memory store. - return make_scoped_ptr(new net::CookieMonster(nullptr, nullptr)); + return base::WrapUnique(new net::CookieMonster(nullptr, nullptr)); } const bool restore_old_session_cookies = @@ -56,7 +57,7 @@ scoped_refptr<net::SQLitePersistentCookieStore> persistent_store = CreatePersistentCookieStore(config.path, restore_old_session_cookies, config.crypto_delegate); - scoped_ptr<net::CookieMonster> cookie_monster( + std::unique_ptr<net::CookieMonster> cookie_monster( new net::CookieMonster(persistent_store.get(), nullptr)); if (restore_old_session_cookies) cookie_monster->SetPersistSessionCookies(true); @@ -78,7 +79,7 @@ CookieStoreConfig::~CookieStoreConfig() {} -scoped_ptr<net::CookieStore> CreateCookieStore( +std::unique_ptr<net::CookieStore> CreateCookieStore( const CookieStoreConfig& config) { if (config.cookie_store_type == CookieStoreConfig::COOKIE_MONSTER) return CreateCookieMonster(config); @@ -91,7 +92,7 @@ config.path, true /* restore_old_session_cookies */, config.crypto_delegate); } - return make_scoped_ptr(new net::CookieStoreIOS(persistent_store.get())); + return base::WrapUnique(new net::CookieStoreIOS(persistent_store.get())); } bool ShouldClearSessionCookies() {
diff --git a/ios/chrome/browser/net/image_fetcher.mm b/ios/chrome/browser/net/image_fetcher.mm index 245045c..264120b 100644 --- a/ios/chrome/browser/net/image_fetcher.mm +++ b/ios/chrome/browser/net/image_fetcher.mm
@@ -112,7 +112,7 @@ } // Ensures that |fetcher| will be deleted in the event of early return. - scoped_ptr<const net::URLFetcher> fetcher_deleter(fetcher); + std::unique_ptr<const net::URLFetcher> fetcher_deleter(fetcher); // Retrieves the callback and ensures that it will be deleted in the event // of early return.
diff --git a/ios/chrome/browser/net/image_fetcher_unittest.mm b/ios/chrome/browser/net/image_fetcher_unittest.mm index fd91b8f..d315669 100644 --- a/ios/chrome/browser/net/image_fetcher_unittest.mm +++ b/ios/chrome/browser/net/image_fetcher_unittest.mm
@@ -103,7 +103,7 @@ base::mac::ScopedBlock<image_fetcher::ImageFetchedCallback> callback_; net::TestURLFetcherFactory factory_; scoped_refptr<base::SequencedWorkerPool> pool_; - scoped_ptr<image_fetcher::ImageFetcher> image_fetcher_; + std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher_; UIImage* result_; bool called_; };
diff --git a/ios/chrome/browser/net/ios_chrome_network_delegate.h b/ios/chrome/browser/net/ios_chrome_network_delegate.h index 50fe056f0..41efdb79 100644 --- a/ios/chrome/browser/net/ios_chrome_network_delegate.h +++ b/ios/chrome/browser/net/ios_chrome_network_delegate.h
@@ -7,9 +7,10 @@ #include <stdint.h> +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "net/base/network_delegate_impl.h"
diff --git a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc index 0c53bc14..cabb942 100644 --- a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc +++ b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "ios/chrome/browser/browser_state/chrome_browser_state_io_data.h" #include "ios/chrome/browser/ios_chrome_io_thread.h" @@ -83,7 +84,7 @@ // ---------------------------------------------------------------------------- IOSChromeURLRequestContextGetter::IOSChromeURLRequestContextGetter( - scoped_ptr<IOSChromeURLRequestContextFactory> factory) + std::unique_ptr<IOSChromeURLRequestContextFactory> factory) : factory_(std::move(factory)), url_request_context_(nullptr) { DCHECK(factory_); } @@ -126,7 +127,7 @@ const ChromeBrowserStateIOData* io_data, ProtocolHandlerMap* protocol_handlers) { return new IOSChromeURLRequestContextGetter( - make_scoped_ptr(new FactoryForMain(io_data, protocol_handlers))); + base::WrapUnique(new FactoryForMain(io_data, protocol_handlers))); } // static @@ -135,6 +136,6 @@ net::URLRequestContextGetter* main_context, const ChromeBrowserStateIOData* io_data, const base::FilePath& partition_path) { - return new IOSChromeURLRequestContextGetter(make_scoped_ptr( + return new IOSChromeURLRequestContextGetter(base::WrapUnique( new FactoryForIsolatedApp(io_data, partition_path, main_context))); }
diff --git a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.h b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.h index 531490d9..9e8cc8f 100644 --- a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.h +++ b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_NET_IOS_CHROME_URL_REQUEST_CONTEXT_GETTER_H_ #define IOS_CHROME_BROWSER_NET_IOS_CHROME_URL_REQUEST_CONTEXT_GETTER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/chrome/browser/net/net_types.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" @@ -25,7 +26,7 @@ // Constructs a ChromeURLRequestContextGetter that will use |factory| to // create the URLRequestContext. explicit IOSChromeURLRequestContextGetter( - scoped_ptr<IOSChromeURLRequestContextFactory> factory); + std::unique_ptr<IOSChromeURLRequestContextFactory> factory); // Note that GetURLRequestContext() can only be called from the IO // thread (it will assert otherwise). @@ -58,7 +59,7 @@ // Deferred logic for creating a URLRequestContext. // Access only from the IO thread. - scoped_ptr<IOSChromeURLRequestContextFactory> factory_; + std::unique_ptr<IOSChromeURLRequestContextFactory> factory_; // NULL before initialization and after invalidation. // Otherwise, it is the URLRequestContext instance that
diff --git a/ios/chrome/browser/net/proxy_service_factory.cc b/ios/chrome/browser/net/proxy_service_factory.cc index f0180bb..9ca7382d 100644 --- a/ios/chrome/browser/net/proxy_service_factory.cc +++ b/ios/chrome/browser/net/proxy_service_factory.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "components/proxy_config/pref_proxy_config_tracker_impl.h" #include "ios/web/public/web_thread.h" #include "net/proxy/proxy_config_service.h" @@ -14,9 +15,9 @@ namespace ios { // static -scoped_ptr<net::ProxyConfigService> +std::unique_ptr<net::ProxyConfigService> ProxyServiceFactory::CreateProxyConfigService(PrefProxyConfigTracker* tracker) { - scoped_ptr<net::ProxyConfigService> base_service( + std::unique_ptr<net::ProxyConfigService> base_service( net::ProxyService::CreateSystemProxyConfigService( web::WebThread::GetTaskRunnerForThread(web::WebThread::IO), web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE))); @@ -24,33 +25,33 @@ } // static -scoped_ptr<PrefProxyConfigTracker> +std::unique_ptr<PrefProxyConfigTracker> ProxyServiceFactory::CreatePrefProxyConfigTrackerOfProfile( PrefService* browser_state_prefs, PrefService* local_state_prefs) { - return make_scoped_ptr(new PrefProxyConfigTrackerImpl( + return base::WrapUnique(new PrefProxyConfigTrackerImpl( browser_state_prefs, web::WebThread::GetTaskRunnerForThread(web::WebThread::IO))); } // static -scoped_ptr<PrefProxyConfigTracker> +std::unique_ptr<PrefProxyConfigTracker> ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState( PrefService* local_state_prefs) { - return make_scoped_ptr(new PrefProxyConfigTrackerImpl( + return base::WrapUnique(new PrefProxyConfigTrackerImpl( local_state_prefs, web::WebThread::GetTaskRunnerForThread(web::WebThread::IO))); } // static -scoped_ptr<net::ProxyService> ProxyServiceFactory::CreateProxyService( +std::unique_ptr<net::ProxyService> ProxyServiceFactory::CreateProxyService( net::NetLog* net_log, net::URLRequestContext* context, net::NetworkDelegate* network_delegate, - scoped_ptr<net::ProxyConfigService> proxy_config_service, + std::unique_ptr<net::ProxyConfigService> proxy_config_service, bool quick_check_enabled) { DCHECK_CURRENTLY_ON(web::WebThread::IO); - scoped_ptr<net::ProxyService> proxy_service( + std::unique_ptr<net::ProxyService> proxy_service( net::ProxyService::CreateUsingSystemProxyResolver( std::move(proxy_config_service), 0, net_log)); proxy_service->set_quick_check_enabled(quick_check_enabled);
diff --git a/ios/chrome/browser/net/proxy_service_factory.h b/ios/chrome/browser/net/proxy_service_factory.h index 7710680..a7cefa1 100644 --- a/ios/chrome/browser/net/proxy_service_factory.h +++ b/ios/chrome/browser/net/proxy_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_NET_PROXY_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_NET_PROXY_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" class PrefProxyConfigTracker; class PrefService; @@ -24,25 +25,25 @@ class ProxyServiceFactory { public: // Creates a ProxyConfigService that delivers the system preferences. - static scoped_ptr<net::ProxyConfigService> CreateProxyConfigService( + static std::unique_ptr<net::ProxyConfigService> CreateProxyConfigService( PrefProxyConfigTracker* tracker); // Creates a PrefProxyConfigTracker that tracks browser state preferences. - static scoped_ptr<PrefProxyConfigTracker> + static std::unique_ptr<PrefProxyConfigTracker> CreatePrefProxyConfigTrackerOfProfile(PrefService* browser_state_prefs, PrefService* local_state_prefs); // Creates a PrefProxyConfigTracker that tracks local state only. This tracker // should be used for the system request context. - static scoped_ptr<PrefProxyConfigTracker> + static std::unique_ptr<PrefProxyConfigTracker> CreatePrefProxyConfigTrackerOfLocalState(PrefService* local_state_prefs); // Create a proxy service. - static scoped_ptr<net::ProxyService> CreateProxyService( + static std::unique_ptr<net::ProxyService> CreateProxyService( net::NetLog* net_log, net::URLRequestContext* context, net::NetworkDelegate* network_delegate, - scoped_ptr<net::ProxyConfigService> proxy_config_service, + std::unique_ptr<net::ProxyConfigService> proxy_config_service, bool quick_check_enabled); private:
diff --git a/ios/chrome/browser/net/retryable_url_fetcher.mm b/ios/chrome/browser/net/retryable_url_fetcher.mm index 8269ca6..87aca533 100644 --- a/ios/chrome/browser/net/retryable_url_fetcher.mm +++ b/ios/chrome/browser/net/retryable_url_fetcher.mm
@@ -4,8 +4,9 @@ #import "ios/chrome/browser/net/retryable_url_fetcher.h" +#include <memory> + #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "net/http/http_status_code.h" #include "net/url_request/url_fetcher.h" @@ -30,9 +31,9 @@ @implementation RetryableURLFetcher { scoped_refptr<net::URLRequestContextGetter> requestContextGetter_; - scoped_ptr<URLRequestDelegate> fetcherDelegate_; - scoped_ptr<net::URLFetcher> fetcher_; - scoped_ptr<net::BackoffEntry> backoffEntry_; + std::unique_ptr<URLRequestDelegate> fetcherDelegate_; + std::unique_ptr<net::URLFetcher> fetcher_; + std::unique_ptr<net::BackoffEntry> backoffEntry_; int retryCount_; id<RetryableURLFetcherDelegate> delegate_; // Weak. }
diff --git a/ios/chrome/browser/net/retryable_url_fetcher_unittest.mm b/ios/chrome/browser/net/retryable_url_fetcher_unittest.mm index 9c8f48b1..a5934ad 100644 --- a/ios/chrome/browser/net/retryable_url_fetcher_unittest.mm +++ b/ios/chrome/browser/net/retryable_url_fetcher_unittest.mm
@@ -53,7 +53,7 @@ } net::TestURLFetcherFactory factory_; - scoped_ptr<web::TestWebThread> io_thread_; + std::unique_ptr<web::TestWebThread> io_thread_; base::MessageLoop message_loop_; base::scoped_nsobject<TestRetryableURLFetcherDelegate> test_delegate_; };
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc index e142273..c60c19c 100644 --- a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc +++ b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc
@@ -5,6 +5,7 @@ #include "ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.h" #include "base/json/json_reader.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/thread_task_runner_handle.h" #include "base/values.h" @@ -30,7 +31,7 @@ const ntp_snippets::NTPSnippetsService::SuccessCallback& success_callback, const ntp_snippets::NTPSnippetsService::ErrorCallback& error_callback) { base::JSONReader json_reader; - scoped_ptr<base::Value> value = json_reader.ReadToValue(json); + std::unique_ptr<base::Value> value = json_reader.ReadToValue(json); if (value) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(success_callback, base::Passed(&value))); @@ -66,7 +67,7 @@ IOSChromeNTPSnippetsServiceFactory::~IOSChromeNTPSnippetsServiceFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeNTPSnippetsServiceFactory::BuildServiceInstanceFor( web::BrowserState* browser_state) const { ios::ChromeBrowserState* chrome_browser_state = @@ -84,10 +85,10 @@ ->GetSequencedTaskRunnerWithShutdownBehavior( base::SequencedWorkerPool::GetSequenceToken(), base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); - return make_scoped_ptr(new ntp_snippets::NTPSnippetsService( + return base::WrapUnique(new ntp_snippets::NTPSnippetsService( chrome_browser_state->GetPrefs(), suggestions_service, task_runner, GetApplicationContext()->GetApplicationLocale(), scheduler, - make_scoped_ptr(new ntp_snippets::NTPSnippetsFetcher( + base::WrapUnique(new ntp_snippets::NTPSnippetsFetcher( task_runner, request_context, GetChannel() == version_info::Channel::STABLE)), base::Bind(&ParseJson)));
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.h b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.h index 350badd..cd1383e 100644 --- a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.h +++ b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_NTP_SNIPPETS_IOS_CHROME_NTP_SNIPPETS_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_NTP_SNIPPETS_IOS_CHROME_NTP_SNIPPETS_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -39,7 +40,7 @@ ~IOSChromeNTPSnippetsServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(IOSChromeNTPSnippetsServiceFactory);
diff --git a/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h b/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h index cf0fb71..2682772 100644 --- a/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h +++ b/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_OPEN_FROM_CLIPBOARD_CREATE_CLIPBOARD_RECENT_CONTENT_H_ #define IOS_CHROME_BROWSER_OPEN_FROM_CLIPBOARD_CREATE_CLIPBOARD_RECENT_CONTENT_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> class ClipboardRecentContent; @@ -14,6 +14,6 @@ // // This helper function allow the construction of ClipboardRecentContentIOS // from a pure C++ (ClipboardRecentContentIOS is an Objective-C++). -scoped_ptr<ClipboardRecentContent> CreateClipboardRecentContentIOS(); +std::unique_ptr<ClipboardRecentContent> CreateClipboardRecentContentIOS(); #endif // IOS_CHROME_BROWSER_OPEN_FROM_CLIPBOARD_CREATE_CLIPBOARD_RECENT_CONTENT_H_
diff --git a/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.mm b/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.mm index 492dd2b..fce8149 100644 --- a/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.mm +++ b/ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.mm
@@ -4,11 +4,12 @@ #include "ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h" +#include "base/memory/ptr_util.h" #import "components/open_from_clipboard/clipboard_recent_content_ios.h" #include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/common/app_group/app_group_constants.h" -scoped_ptr<ClipboardRecentContent> CreateClipboardRecentContentIOS() { - return make_scoped_ptr(new ClipboardRecentContentIOS( +std::unique_ptr<ClipboardRecentContent> CreateClipboardRecentContentIOS() { + return base::WrapUnique(new ClipboardRecentContentIOS( kChromeUIScheme, app_group::GetGroupUserDefaults())); }
diff --git a/ios/chrome/browser/passwords/credential_manager.h b/ios/chrome/browser/passwords/credential_manager.h index 01c2e83..da6c4d6 100644 --- a/ios/chrome/browser/passwords/credential_manager.h +++ b/ios/chrome/browser/passwords/credential_manager.h
@@ -5,12 +5,12 @@ #ifndef IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_ #define IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_ +#include <memory> #include <string> #include <vector> #import "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "components/password_manager/core/browser/credential_manager_password_form_manager.h" #include "components/password_manager/core/browser/credential_manager_pending_request_task.h" @@ -100,15 +100,16 @@ bool GetUrlWithAbsoluteTrust(GURL* page_url); // The request to retrieve credentials from the PasswordStore. - scoped_ptr<password_manager::CredentialManagerPendingRequestTask> + std::unique_ptr<password_manager::CredentialManagerPendingRequestTask> pending_request_; // The task to notify the password manager that the user was signed out. - scoped_ptr<password_manager::CredentialManagerPendingRequireUserMediationTask> + std::unique_ptr< + password_manager::CredentialManagerPendingRequireUserMediationTask> pending_require_user_mediation_; // Saves credentials to the PasswordStore. - scoped_ptr<password_manager::CredentialManagerPasswordFormManager> + std::unique_ptr<password_manager::CredentialManagerPasswordFormManager> form_manager_; // Injected JavaScript to provide the API to web pages.
diff --git a/ios/chrome/browser/passwords/credential_manager.mm b/ios/chrome/browser/passwords/credential_manager.mm index 7626115..b1e86fd 100644 --- a/ios/chrome/browser/passwords/credential_manager.mm +++ b/ios/chrome/browser/passwords/credential_manager.mm
@@ -194,7 +194,7 @@ // Store the signed-in credential so that the user can save it, if desired. // Prompting the user and saving are handled by the PasswordFormManager. - scoped_ptr<autofill::PasswordForm> form( + std::unique_ptr<autofill::PasswordForm> form( password_manager::CreatePasswordFormFromCredentialInfo( CredentialInfoFromWebCredential(credential), page_url)); form->skip_zero_click = !IsZeroClickAllowed();
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h index 7dd4735c..0b2e4a8 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -22,7 +22,7 @@ // Shows UI to prompt the user to save the password. - (void)showSavePasswordInfoBar: - (scoped_ptr<password_manager::PasswordFormManager>)formToSave; + (std::unique_ptr<password_manager::PasswordFormManager>)formToSave; @property(readonly, nonatomic) ios::ChromeBrowserState* browserState; @@ -42,7 +42,7 @@ // password_manager::PasswordManagerClient implementation. password_manager::PasswordSyncState GetPasswordSyncState() const override; bool PromptUserToSaveOrUpdatePassword( - scoped_ptr<password_manager::PasswordFormManager> form_to_save, + std::unique_ptr<password_manager::PasswordFormManager> form_to_save, password_manager::CredentialSourceType type, bool update_password) override; bool PromptUserToChooseCredentials( @@ -50,15 +50,16 @@ ScopedVector<autofill::PasswordForm> federated_forms, const GURL& origin, const CredentialsCallback& callback) override; - void AutomaticPasswordSave(scoped_ptr<password_manager::PasswordFormManager> - saved_form_manager) override; + void AutomaticPasswordSave( + std::unique_ptr<password_manager::PasswordFormManager> saved_form_manager) + override; bool IsOffTheRecord() const override; PrefService* GetPrefs() override; password_manager::PasswordStore* GetPasswordStore() const override; void NotifyUserAutoSignin(ScopedVector<autofill::PasswordForm> local_forms, const GURL& origin) override; void NotifyUserCouldBeAutoSignedIn( - scoped_ptr<autofill::PasswordForm> form) override; + std::unique_ptr<autofill::PasswordForm> form) override; void NotifySuccessfulLoginWithExistingPassword( const autofill::PasswordForm& form) override; void ForceSavePassword() override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm index 756596f..464b27d 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -4,9 +4,9 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_manager_client.h" +#include <memory> #include <utility> -#include "base/memory/scoped_ptr.h" #include "components/autofill/core/common/password_form.h" #include "components/browser_sync/browser/profile_sync_service.h" #include "components/keyed_service/core/service_access_type.h" @@ -69,7 +69,7 @@ } bool IOSChromePasswordManagerClient::PromptUserToSaveOrUpdatePassword( - scoped_ptr<PasswordFormManager> form_to_save, + std::unique_ptr<PasswordFormManager> form_to_save, password_manager::CredentialSourceType type, bool update_password) { if (form_to_save->IsBlacklisted()) @@ -79,7 +79,7 @@ } void IOSChromePasswordManagerClient::AutomaticPasswordSave( - scoped_ptr<PasswordFormManager> saved_form_manager) { + std::unique_ptr<PasswordFormManager> saved_form_manager) { NOTIMPLEMENTED(); } @@ -102,7 +102,7 @@ const GURL& origin) {} void IOSChromePasswordManagerClient::NotifyUserCouldBeAutoSignedIn( - scoped_ptr<autofill::PasswordForm> form) {} + std::unique_ptr<autofill::PasswordForm> form) {} void IOSChromePasswordManagerClient::NotifySuccessfulLoginWithExistingPassword( const autofill::PasswordForm& form) {}
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc index cb24ecb0..928cb3e 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/password_manager/sync/browser/password_manager_setting_migrator_service.h" @@ -35,12 +36,12 @@ IOSChromePasswordManagerSettingMigratorServiceFactory:: ~IOSChromePasswordManagerSettingMigratorServiceFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromePasswordManagerSettingMigratorServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr( + return base::WrapUnique( new password_manager::PasswordManagerSettingMigratorService( browser_state->GetSyncablePrefs())); }
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h index 5eb4e48..d8f1f66 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_setting_migrator_service_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_PASSWORDS_IOS_PASSWORD_MANAGER_SETTING_MIGRATOR_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_PASSWORDS_IOS_PASSWORD_MANAGER_SETTING_MIGRATOR_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -39,7 +41,7 @@ ~IOSChromePasswordManagerSettingMigratorServiceFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc index ff692d78..e2c3ff68 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc +++ b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#include <memory> #include <utility> #include "base/command_line.h" @@ -73,7 +74,7 @@ scoped_refptr<RefcountedKeyedService> IOSChromePasswordStoreFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - scoped_ptr<password_manager::LoginDatabase> login_db( + std::unique_ptr<password_manager::LoginDatabase> login_db( password_manager::CreateLoginDatabase(context->GetStatePath())); scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner(
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h index cf9117e..b378107 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_SAVE_PASSWORD_INFOBAR_DELEGATE_H_ #define IOS_CHROME_BROWSER_PASSWORDS_IOS_CHROME_SAVE_PASSWORD_INFOBAR_DELEGATE_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" @@ -29,14 +30,14 @@ static void Create( bool is_smart_lock_branding_enabled, infobars::InfoBarManager* infobar_manager, - scoped_ptr<password_manager::PasswordFormManager> form_to_save); + std::unique_ptr<password_manager::PasswordFormManager> form_to_save); ~IOSChromeSavePasswordInfoBarDelegate() override; private: IOSChromeSavePasswordInfoBarDelegate( bool is_smart_lock_branding_enabled, - scoped_ptr<password_manager::PasswordFormManager> form_to_save); + std::unique_ptr<password_manager::PasswordFormManager> form_to_save); // ConfirmInfoBarDelegate implementation. Type GetInfoBarType() const override; @@ -51,7 +52,7 @@ // The password_manager::PasswordFormManager managing the form we're asking // the user about, and should update as per her decision. - scoped_ptr<password_manager::PasswordFormManager> form_to_save_; + std::unique_ptr<password_manager::PasswordFormManager> form_to_save_; // Used to track the results we get from the info bar. password_manager::metrics_util::UIDismissalReason infobar_response_;
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm index 17a2ef2..af12ac09 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -7,6 +7,7 @@ #include <utility> #include "base/mac/scoped_nsobject.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/strings/string16.h" #include "components/infobars/core/infobar.h" @@ -30,9 +31,9 @@ void IOSChromeSavePasswordInfoBarDelegate::Create( bool is_smart_lock_branding_enabled, infobars::InfoBarManager* infobar_manager, - scoped_ptr<PasswordFormManager> form_to_save) { + std::unique_ptr<PasswordFormManager> form_to_save) { DCHECK(infobar_manager); - auto delegate = make_scoped_ptr(new IOSChromeSavePasswordInfoBarDelegate( + auto delegate = base::WrapUnique(new IOSChromeSavePasswordInfoBarDelegate( is_smart_lock_branding_enabled, std::move(form_to_save))); infobar_manager->AddInfoBar( infobar_manager->CreateConfirmInfoBar(std::move(delegate))); @@ -44,7 +45,7 @@ IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate( bool is_smart_lock_branding_enabled, - scoped_ptr<PasswordFormManager> form_to_save) + std::unique_ptr<PasswordFormManager> form_to_save) : form_to_save_(std::move(form_to_save)), infobar_response_(password_manager::metrics_util::NO_DIRECT_INTERACTION), is_smart_lock_branding_enabled_(is_smart_lock_branding_enabled) {}
diff --git a/ios/chrome/browser/passwords/password_controller.h b/ios/chrome/browser/passwords/password_controller.h index f74a8450..e98a09a 100644 --- a/ios/chrome/browser/passwords/password_controller.h +++ b/ios/chrome/browser/passwords/password_controller.h
@@ -6,6 +6,8 @@ #import <Foundation/NSObject.h> +#include <memory> + #import "ios/chrome/browser/autofill/form_suggestion_provider.h" #import "ios/chrome/browser/passwords/ios_chrome_password_manager_client.h" #import "ios/chrome/browser/passwords/ios_chrome_password_manager_driver.h" @@ -54,7 +56,7 @@ - (instancetype) initWithWebState:(web::WebState*)webState passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate - client:(scoped_ptr<password_manager::PasswordManagerClient>) + client:(std::unique_ptr<password_manager::PasswordManagerClient>) passwordManagerClient NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index 7c252ae0..98369d96 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -7,6 +7,7 @@ #include <stddef.h> #include <algorithm> +#include <memory> #include <utility> #include <vector> @@ -15,7 +16,7 @@ #include "base/json/json_writer.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/strings/string16.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -193,14 +194,14 @@ // Input elements in the form. The list does not necessarily contain // all elements from the form, but all elements listed here are required // to identify the right form to fill. - auto fieldList = make_scoped_ptr(new base::ListValue()); + auto fieldList = base::WrapUnique(new base::ListValue()); - auto usernameField = make_scoped_ptr(new base::DictionaryValue()); + auto usernameField = base::WrapUnique(new base::DictionaryValue()); usernameField->SetString("name", formData.username_field.name); usernameField->SetString("value", formData.username_field.value); fieldList->Append(usernameField.release()); - auto passwordField = make_scoped_ptr(new base::DictionaryValue()); + auto passwordField = base::WrapUnique(new base::DictionaryValue()); passwordField->SetString("name", formData.password_field.name); passwordField->SetString("value", formData.password_field.value); fieldList->Append(passwordField.release()); @@ -226,19 +227,19 @@ } // namespace @implementation PasswordController { - scoped_ptr<PasswordManager> passwordManager_; - scoped_ptr<PasswordGenerationManager> passwordGenerationManager_; - scoped_ptr<PasswordManagerClient> passwordManagerClient_; - scoped_ptr<PasswordManagerDriver> passwordManagerDriver_; + std::unique_ptr<PasswordManager> passwordManager_; + std::unique_ptr<PasswordGenerationManager> passwordGenerationManager_; + std::unique_ptr<PasswordManagerClient> passwordManagerClient_; + std::unique_ptr<PasswordManagerDriver> passwordManagerDriver_; base::scoped_nsobject<PasswordGenerationAgent> passwordGenerationAgent_; JsPasswordManager* passwordJsManager_; // weak // The pending form data. - scoped_ptr<autofill::PasswordFormFillData> formData_; + std::unique_ptr<autofill::PasswordFormFillData> formData_; // Bridge to observe WebState from Objective-C. - scoped_ptr<web::WebStateObserverBridge> webStateObserverBridge_; + std::unique_ptr<web::WebStateObserverBridge> webStateObserverBridge_; } - (instancetype)initWithWebState:(web::WebState*)webState @@ -251,7 +252,7 @@ - (instancetype)initWithWebState:(web::WebState*)webState passwordsUiDelegate:(id<PasswordsUiDelegate>)UIDelegate - client:(scoped_ptr<PasswordManagerClient>) + client:(std::unique_ptr<PasswordManagerClient>) passwordManagerClient { DCHECK(webState); self = [super init]; @@ -325,7 +326,7 @@ // Initialize |matches| to satisfy the expectation from // InitPasswordFormFillData() that the preferred match (3rd parameter) // should be one of the |matches|. - auto scoped_form = make_scoped_ptr(new autofill::PasswordForm(form)); + auto scoped_form = base::WrapUnique(new autofill::PasswordForm(form)); matches.insert( std::make_pair(form.username_value, std::move(scoped_form))); autofill::InitPasswordFormFillData(form, matches, &form, false, false, @@ -428,7 +429,7 @@ int errorCode = 0; std::string errorMessage; - scoped_ptr<base::Value> jsonData(base::JSONReader::ReadAndReturnError( + std::unique_ptr<base::Value> jsonData(base::JSONReader::ReadAndReturnError( std::string([jsonString UTF8String]), false, &errorCode, &errorMessage)); if (errorCode || !jsonData || !jsonData->IsType(base::Value::TYPE_LIST)) { VLOG(1) << "JSON parse error " << errorMessage @@ -492,8 +493,9 @@ int errorCode = 0; std::string errorMessage; - scoped_ptr<const base::Value> jsonData(base::JSONReader::ReadAndReturnError( - std::string([jsonString UTF8String]), false, &errorCode, &errorMessage)); + std::unique_ptr<const base::Value> jsonData( + base::JSONReader::ReadAndReturnError(std::string([jsonString UTF8String]), + false, &errorCode, &errorMessage)); // If the the JSON string contains null, there is no identifiable password // form on the page. @@ -740,7 +742,8 @@ return YES; } -- (void)showSavePasswordInfoBar:(scoped_ptr<PasswordFormManager>)formToSave { +- (void)showSavePasswordInfoBar: + (std::unique_ptr<PasswordFormManager>)formToSave { if (!webStateObserverBridge_ || !webStateObserverBridge_->web_state()) return;
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index 2188359..70c19cc3 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -4,10 +4,11 @@ #import "ios/chrome/browser/passwords/password_controller.h" +#include <memory> #include <vector> #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "components/password_manager/core/browser/log_manager.h" #include "components/password_manager/core/browser/password_form_manager.h" #include "components/password_manager/core/browser/stub_password_manager_client.h" @@ -37,9 +38,9 @@ bool update_password)); MOCK_CONST_METHOD0(GetLogManager, password_manager::LogManager*(void)); - // Workaround for scoped_ptr<> lacking a copy constructor. + // Workaround for std::unique_ptr<> lacking a copy constructor. bool PromptUserToSaveOrUpdatePassword( - scoped_ptr<password_manager::PasswordFormManager> manager, + std::unique_ptr<password_manager::PasswordFormManager> manager, password_manager::CredentialSourceType type, bool update_password) override { PromptUserToSaveOrUpdatePasswordPtr(manager.get(), type, update_password); @@ -61,15 +62,15 @@ // Create the PasswordController with a MockPasswordManagerClient. TestChromeBrowserState::Builder builder; auto pref_service = - make_scoped_ptr(new syncable_prefs::TestingPrefServiceSyncable); + base::WrapUnique(new syncable_prefs::TestingPrefServiceSyncable); pref_service->registry()->RegisterBooleanPref( password_manager::prefs::kPasswordManagerSavingEnabled, true); builder.SetPrefService(std::move(pref_service)); - scoped_ptr<TestChromeBrowserState> browser_state(builder.Build()); + std::unique_ptr<TestChromeBrowserState> browser_state(builder.Build()); MockWebState web_state; ON_CALL(web_state, GetBrowserState()) .WillByDefault(testing::Return(browser_state.get())); - auto client = make_scoped_ptr(new MockPasswordManagerClient); + auto client = base::WrapUnique(new MockPasswordManagerClient); MockPasswordManagerClient* weak_client = client.get(); base::scoped_nsobject<PasswordController> passwordController = [[PasswordController alloc] initWithWebState:&web_state
diff --git a/ios/chrome/browser/passwords/password_generation_agent.mm b/ios/chrome/browser/passwords/password_generation_agent.mm index eeb389c..7f5b1ba 100644 --- a/ios/chrome/browser/passwords/password_generation_agent.mm +++ b/ios/chrome/browser/passwords/password_generation_agent.mm
@@ -121,7 +121,7 @@ @implementation PasswordGenerationAgent { // Bridge to observe the web state from Objective-C. - scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; // The origin URLs of forms on the current page that contain account creation // forms as reported by autofill. @@ -132,13 +132,13 @@ std::vector<GURL> _allowedGenerationFormOrigins; // Stores the account creation form we detected on the page. - scoped_ptr<autofill::PasswordForm> _possibleAccountCreationForm; + std::unique_ptr<autofill::PasswordForm> _possibleAccountCreationForm; // Password fields found in |_possibleAccountCreationForm|. std::vector<autofill::FormFieldData> _passwordFields; // The password field that triggers the password generation UI. - scoped_ptr<autofill::FormFieldData> _passwordGenerationField; + std::unique_ptr<autofill::FormFieldData> _passwordGenerationField; // Wrapper for suggestion JavaScript. Used for form navigation. base::scoped_nsobject<JsSuggestionManager> _JSSuggestionManager;
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc index 7fea3ee..59aa019 100644 --- a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc +++ b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc
@@ -7,6 +7,7 @@ #include <vector> #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "components/prefs/json_pref_store.h" #include "components/prefs/persistent_pref_store.h" @@ -35,7 +36,7 @@ const base::FilePath& pref_filename, base::SequencedTaskRunner* pref_io_task_runner) { factory->set_user_prefs(make_scoped_refptr(new JsonPrefStore( - pref_filename, pref_io_task_runner, scoped_ptr<PrefFilter>()))); + pref_filename, pref_io_task_runner, std::unique_ptr<PrefFilter>()))); factory->set_read_error_callback(base::Bind(&HandleReadError)); factory->SetPrefModelAssociatorClient( @@ -44,7 +45,7 @@ } // namespace -scoped_ptr<PrefService> CreateLocalState( +std::unique_ptr<PrefService> CreateLocalState( const base::FilePath& pref_filename, base::SequencedTaskRunner* pref_io_task_runner, const scoped_refptr<PrefRegistry>& pref_registry) { @@ -53,7 +54,7 @@ return factory.Create(pref_registry.get()); } -scoped_ptr<syncable_prefs::PrefServiceSyncable> CreateBrowserStatePrefs( +std::unique_ptr<syncable_prefs::PrefServiceSyncable> CreateBrowserStatePrefs( const base::FilePath& browser_state_path, base::SequencedTaskRunner* pref_io_task_runner, const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry) { @@ -65,13 +66,13 @@ syncable_prefs::PrefServiceSyncableFactory factory; PrepareFactory(&factory, browser_state_path.Append(kPreferencesFilename), pref_io_task_runner); - scoped_ptr<syncable_prefs::PrefServiceSyncable> pref_service = + std::unique_ptr<syncable_prefs::PrefServiceSyncable> pref_service = factory.CreateSyncable(pref_registry.get()); ConfigureDefaultSearchPrefMigrationToDictionaryValue(pref_service.get()); return pref_service; } -scoped_ptr<syncable_prefs::PrefServiceSyncable> +std::unique_ptr<syncable_prefs::PrefServiceSyncable> CreateIncognitoBrowserStatePrefs( syncable_prefs::PrefServiceSyncable* pref_service) { // List of keys that cannot be changed in the user prefs file by the incognito @@ -79,7 +80,7 @@ // history or behaviour of the user should have this property. std::vector<const char*> overlay_pref_names; overlay_pref_names.push_back(proxy_config::prefs::kProxy); - return make_scoped_ptr(pref_service->CreateIncognitoPrefService( + return base::WrapUnique(pref_service->CreateIncognitoPrefService( nullptr, // incognito_extension_pref_store overlay_pref_names)); }
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h index c5a8d36..4195223 100644 --- a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h +++ b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_PREFS_IOS_CHROME_PREF_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_PREFS_IOS_CHROME_PREF_SERVICE_FACTORY_H_ +#include <memory> + #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" class PrefRegistry; class PrefService; @@ -34,19 +35,19 @@ // to the user preference file. This is the usual way to create a new // PrefService. |pref_registry| keeps the list of registered prefs and their // default values. -scoped_ptr<PrefService> CreateLocalState( +std::unique_ptr<PrefService> CreateLocalState( const base::FilePath& pref_filename, base::SequencedTaskRunner* pref_io_task_runner, const scoped_refptr<PrefRegistry>& pref_registry); -scoped_ptr<syncable_prefs::PrefServiceSyncable> CreateBrowserStatePrefs( +std::unique_ptr<syncable_prefs::PrefServiceSyncable> CreateBrowserStatePrefs( const base::FilePath& browser_state_path, base::SequencedTaskRunner* pref_io_task_runner, const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry); // Creates an incognito copy of |pref_service| that shares most prefs but uses // a fresh non-persistent overlay for the user pref store. -scoped_ptr<syncable_prefs::PrefServiceSyncable> +std::unique_ptr<syncable_prefs::PrefServiceSyncable> CreateIncognitoBrowserStatePrefs( syncable_prefs::PrefServiceSyncable* main_pref_store);
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.cc b/ios/chrome/browser/reading_list/reading_list_model_factory.cc index 17052494..a0b21662 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_factory.cc +++ b/ios/chrome/browser/reading_list/reading_list_model_factory.cc
@@ -39,11 +39,11 @@ ReadingListModelFactory::~ReadingListModelFactory() {} -scoped_ptr<KeyedService> ReadingListModelFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> ReadingListModelFactory::BuildServiceInstanceFor( web::BrowserState* context) const { std::unique_ptr<ReadingListModelStorage> storage( new ReadingListModelStorageDefaults()); - scoped_ptr<ReadingListModelMemory> reading_list_model( + std::unique_ptr<ReadingListModelMemory> reading_list_model( new ReadingListModelMemory(std::move(storage))); return std::move(reading_list_model); }
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.h b/ios/chrome/browser/reading_list/reading_list_model_factory.h index 96a6638..e766391 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_factory.h +++ b/ios/chrome/browser/reading_list/reading_list_model_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_FACTORY_H_ #define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_FACTORY_H_ +#include <memory> + #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -35,7 +37,7 @@ ~ReadingListModelFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/reading_list/reading_list_model_memory.h b/ios/chrome/browser/reading_list/reading_list_model_memory.h index 584fba8..f7fbdcf3 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_memory.h +++ b/ios/chrome/browser/reading_list/reading_list_model_memory.h
@@ -5,7 +5,8 @@ #ifndef IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_MEMORY_H_ #define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_MEMORY_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "components/keyed_service/core/keyed_service.h" #include "ios/chrome/browser/reading_list/reading_list_entry.h" #include "ios/chrome/browser/reading_list/reading_list_model.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_model_unittest.cc b/ios/chrome/browser/reading_list/reading_list_model_unittest.cc index 506c5eb3..dd0c466 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_unittest.cc +++ b/ios/chrome/browser/reading_list/reading_list_model_unittest.cc
@@ -91,7 +91,7 @@ int observer_add_read_; int observer_did_apply_; - scoped_ptr<ReadingListModelMemory> model_; + std::unique_ptr<ReadingListModelMemory> model_; }; TEST_F(ReadingListModelTest, EmptyLoaded) {
diff --git a/ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h b/ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h index 8be2a2b..5c2be98 100644 --- a/ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h +++ b/ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h
@@ -5,10 +5,11 @@ #ifndef IOS_CHROME_BROWSER_RLZ_RLZ_TRACKER_DELEGATE_IMPL_H_ #define IOS_CHROME_BROWSER_RLZ_RLZ_TRACKER_DELEGATE_IMPL_H_ +#include <memory> + #include "base/callback.h" #include "base/callback_list.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/rlz/rlz_tracker_delegate.h" struct OmniboxLog; @@ -48,7 +49,7 @@ void OnURLOpenedFromOmnibox(OmniboxLog* log); base::Closure on_omnibox_search_callback_; - scoped_ptr<base::CallbackList<void(OmniboxLog*)>::Subscription> + std::unique_ptr<base::CallbackList<void(OmniboxLog*)>::Subscription> on_omnibox_url_opened_subscription_; DISALLOW_COPY_AND_ASSIGN(RLZTrackerDelegateImpl);
diff --git a/ios/chrome/browser/safe_browsing/BUILD.gn b/ios/chrome/browser/safe_browsing/BUILD.gn deleted file mode 100644 index 6ae55a6..0000000 --- a/ios/chrome/browser/safe_browsing/BUILD.gn +++ /dev/null
@@ -1,11 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/protobuf/proto_library.gni") - -proto_library("proto") { - sources = [ - "metadata.proto", - ] -}
diff --git a/ios/chrome/browser/safe_browsing/hit_report.cc b/ios/chrome/browser/safe_browsing/hit_report.cc deleted file mode 100644 index a536e97..0000000 --- a/ios/chrome/browser/safe_browsing/hit_report.cc +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/hit_report.h" - -#include "components/metrics/metrics_service.h" -#include "ios/chrome/browser/application_context.h" - -namespace safe_browsing { - -HitReport::HitReport() {} - -HitReport::~HitReport() {} - -bool IsMetricsReportingActive() { - const metrics::MetricsService* metrics = - GetApplicationContext()->GetMetricsService(); - return metrics && metrics->reporting_active(); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/hit_report.h b/ios/chrome/browser/safe_browsing/hit_report.h deleted file mode 100644 index 1b11ba3..0000000 --- a/ios/chrome/browser/safe_browsing/hit_report.h +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Datastructures that hold details of a Safe Browsing hit for reporting. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_HIT_REPORT_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_HIT_REPORT_H_ - -#include "ios/chrome/browser/safe_browsing/util.h" -#include "url/gurl.h" - -namespace safe_browsing { - -// What service classified this threat as unsafe. -enum class ThreatSource { - UNKNOWN, - DATA_SAVER, // From the Data Reduction service. - LOCAL_PVER3, // From LocalSafeBrowingDatabaseManager, protocol v3 - LOCAL_PVER4, // From LocalSafeBrowingDatabaseManager, protocol v4 - REMOTE, // From RemoteSafeBrowingDatabaseManager -}; - -// Data to report about the contents of a particular threat (malware, phishing, -// unsafe download URL). If post_data is non-empty, the request will be -// sent as a POST instead of a GET. -struct HitReport { - HitReport(); - ~HitReport(); - - GURL malicious_url; - GURL page_url; - GURL referrer_url; - - bool is_subresource; - SBThreatType threat_type; - ThreatSource threat_source; - bool is_extended_reporting; - bool is_metrics_reporting_active; - - std::string post_data; -}; - -// Return true if the user has opted in to UMA metrics reporting. -// Used when filling out a HitReport. -bool IsMetricsReportingActive(); - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_HIT_REPORT_H_
diff --git a/ios/chrome/browser/safe_browsing/metadata.proto b/ios/chrome/browser/safe_browsing/metadata.proto deleted file mode 100644 index d37c15a..0000000 --- a/ios/chrome/browser/safe_browsing/metadata.proto +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -syntax = "proto2"; - -option optimize_for = LITE_RUNTIME; - -package safe_browsing; - -// Everything below this comment was copied from the page -// <https://developers.google.com/safe-browsing/developers_guide_v3>, -// section "Full Hash Metadata". - -// Metadata for the goog-malware-shavar list. -message MalwarePatternType { - enum PATTERN_TYPE { - LANDING = 1; - DISTRIBUTION = 2; - } - - required PATTERN_TYPE pattern_type = 1; -}
diff --git a/ios/chrome/browser/safe_browsing/ping_manager.cc b/ios/chrome/browser/safe_browsing/ping_manager.cc deleted file mode 100644 index 37e477d..0000000 --- a/ios/chrome/browser/safe_browsing/ping_manager.cc +++ /dev/null
@@ -1,218 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/ping_manager.h" - -#include <utility> - -#include "base/logging.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "components/certificate_reporting/error_reporter.h" -#include "google_apis/google_api_keys.h" -#include "ios/web/public/web_thread.h" -#include "net/base/escape.h" -#include "net/base/load_flags.h" -#include "net/ssl/ssl_info.h" -#include "net/url_request/certificate_report_sender.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_request_context_getter.h" -#include "net/url_request/url_request_status.h" -#include "url/gurl.h" - -namespace { -// URLs to upload invalid certificate chain reports. The HTTP URL is -// preferred since a client seeing an invalid cert might not be able to -// make an HTTPS connection to report it. -const char kExtendedReportingUploadUrlInsecure[] = - "http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" - "chrome-certs"; -const char kExtendedReportingUploadUrlSecure[] = - "https://sb-ssl.google.com/safebrowsing/clientreport/chrome-certs"; -} // namespace - -namespace safe_browsing { - -// SafeBrowsingPingManager implementation ---------------------------------- - -// static -SafeBrowsingPingManager* SafeBrowsingPingManager::Create( - net::URLRequestContextGetter* request_context_getter, - const SafeBrowsingProtocolConfig& config) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - return new SafeBrowsingPingManager(request_context_getter, config); -} - -SafeBrowsingPingManager::SafeBrowsingPingManager( - net::URLRequestContextGetter* request_context_getter, - const SafeBrowsingProtocolConfig& config) - : client_name_(config.client_name), - request_context_getter_(request_context_getter), - url_prefix_(config.url_prefix) { - DCHECK(!url_prefix_.empty()); - - if (request_context_getter) { - // Set the upload URL and whether or not to send cookies with - // certificate reports sent to Safe Browsing servers. - bool use_insecure_certificate_upload_url = - certificate_reporting::ErrorReporter::IsHttpUploadUrlSupported(); - - net::CertificateReportSender::CookiesPreference cookies_preference; - GURL certificate_upload_url; - if (use_insecure_certificate_upload_url) { - cookies_preference = net::CertificateReportSender::DO_NOT_SEND_COOKIES; - certificate_upload_url = GURL(kExtendedReportingUploadUrlInsecure); - } else { - cookies_preference = net::CertificateReportSender::SEND_COOKIES; - certificate_upload_url = GURL(kExtendedReportingUploadUrlSecure); - } - - certificate_error_reporter_.reset(new certificate_reporting::ErrorReporter( - request_context_getter->GetURLRequestContext(), certificate_upload_url, - cookies_preference)); - } - - version_ = SafeBrowsingProtocolManagerHelper::Version(); -} - -SafeBrowsingPingManager::~SafeBrowsingPingManager() { - // Delete in-progress safebrowsing reports (hits and details). - STLDeleteContainerPointers(safebrowsing_reports_.begin(), - safebrowsing_reports_.end()); -} - -// net::URLFetcherDelegate implementation ---------------------------------- - -// All SafeBrowsing request responses are handled here. -void SafeBrowsingPingManager::OnURLFetchComplete( - const net::URLFetcher* source) { - Reports::iterator sit = safebrowsing_reports_.find(source); - DCHECK(sit != safebrowsing_reports_.end()); - delete *sit; - safebrowsing_reports_.erase(sit); -} - -// Sends a SafeBrowsing "hit" report. -void SafeBrowsingPingManager::ReportSafeBrowsingHit( - const safe_browsing::HitReport& hit_report) { - GURL report_url = SafeBrowsingHitUrl(hit_report); - net::URLFetcher* report = - net::URLFetcher::Create(report_url, hit_report.post_data.empty() - ? net::URLFetcher::GET - : net::URLFetcher::POST, - this) - .release(); - report->SetLoadFlags(net::LOAD_DISABLE_CACHE); - report->SetRequestContext(request_context_getter_.get()); - if (!hit_report.post_data.empty()) - report->SetUploadData("text/plain", hit_report.post_data); - safebrowsing_reports_.insert(report); - report->Start(); -} - -// Sends threat details for users who opt-in. -void SafeBrowsingPingManager::ReportThreatDetails(const std::string& report) { - GURL report_url = ThreatDetailsUrl(); - net::URLFetcher* fetcher = - net::URLFetcher::Create(report_url, net::URLFetcher::POST, this) - .release(); - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); - fetcher->SetRequestContext(request_context_getter_.get()); - fetcher->SetUploadData("application/octet-stream", report); - // Don't try too hard to send reports on failures. - fetcher->SetAutomaticallyRetryOn5xx(false); - fetcher->Start(); - safebrowsing_reports_.insert(fetcher); -} - -void SafeBrowsingPingManager::ReportInvalidCertificateChain( - const std::string& serialized_report) { - DCHECK(certificate_error_reporter_); - certificate_error_reporter_->SendExtendedReportingReport(serialized_report); -} - -void SafeBrowsingPingManager::SetCertificateErrorReporterForTesting( - scoped_ptr<certificate_reporting::ErrorReporter> - certificate_error_reporter) { - certificate_error_reporter_ = std::move(certificate_error_reporter); -} - -GURL SafeBrowsingPingManager::SafeBrowsingHitUrl( - const safe_browsing::HitReport& hit_report) const { - DCHECK(hit_report.threat_type == SB_THREAT_TYPE_URL_MALWARE || - hit_report.threat_type == SB_THREAT_TYPE_URL_PHISHING || - hit_report.threat_type == SB_THREAT_TYPE_URL_UNWANTED || - hit_report.threat_type == SB_THREAT_TYPE_BINARY_MALWARE_URL || - hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || - hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL); - std::string url = SafeBrowsingProtocolManagerHelper::ComposeUrl( - url_prefix_, "report", client_name_, version_, std::string(), - hit_report.is_extended_reporting); - - std::string threat_list = "none"; - switch (hit_report.threat_type) { - case SB_THREAT_TYPE_URL_MALWARE: - threat_list = "malblhit"; - break; - case SB_THREAT_TYPE_URL_PHISHING: - threat_list = "phishblhit"; - break; - case SB_THREAT_TYPE_URL_UNWANTED: - threat_list = "uwsblhit"; - break; - case SB_THREAT_TYPE_BINARY_MALWARE_URL: - threat_list = "binurlhit"; - break; - case SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL: - threat_list = "phishcsdhit"; - break; - case SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL: - threat_list = "malcsdhit"; - break; - default: - NOTREACHED(); - } - - std::string threat_source = "none"; - switch (hit_report.threat_source) { - case safe_browsing::ThreatSource::DATA_SAVER: - threat_source = "ds"; - break; - case safe_browsing::ThreatSource::REMOTE: - threat_source = "rem"; - break; - case safe_browsing::ThreatSource::LOCAL_PVER3: - threat_source = "l3"; - break; - case safe_browsing::ThreatSource::LOCAL_PVER4: - threat_source = "l4"; - break; - case safe_browsing::ThreatSource::UNKNOWN: - NOTREACHED(); - } - - return GURL(base::StringPrintf( - "%s&evts=%s&evtd=%s&evtr=%s&evhr=%s&evtb=%d&src=%s&m=%d", url.c_str(), - threat_list.c_str(), - net::EscapeQueryParamValue(hit_report.malicious_url.spec(), true).c_str(), - net::EscapeQueryParamValue(hit_report.page_url.spec(), true).c_str(), - net::EscapeQueryParamValue(hit_report.referrer_url.spec(), true).c_str(), - hit_report.is_subresource, threat_source.c_str(), - hit_report.is_metrics_reporting_active)); -} - -GURL SafeBrowsingPingManager::ThreatDetailsUrl() const { - std::string url = base::StringPrintf( - "%s/clientreport/malware?client=%s&appver=%s&pver=1.0", - url_prefix_.c_str(), client_name_.c_str(), version_.c_str()); - std::string api_key = google_apis::GetAPIKey(); - if (!api_key.empty()) { - base::StringAppendF(&url, "&key=%s", - net::EscapeQueryParamValue(api_key, true).c_str()); - } - return GURL(url); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/ping_manager.h b/ios/chrome/browser/safe_browsing/ping_manager.h deleted file mode 100644 index 5e0a121..0000000 --- a/ios/chrome/browser/safe_browsing/ping_manager.h +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_ - -// A class that reports safebrowsing statistics to Google's SafeBrowsing -// servers. -#include <set> -#include <string> -#include <vector> - -#include "base/gtest_prod_util.h" -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "ios/chrome/browser/safe_browsing/hit_report.h" -#include "ios/chrome/browser/safe_browsing/protocol_manager_helper.h" -#include "ios/chrome/browser/safe_browsing/util.h" -#include "net/url_request/url_fetcher_delegate.h" -#include "url/gurl.h" - -namespace certificate_reporting { -class ErrorReporter; -} - -namespace net { -class SSLInfo; -class URLRequestContextGetter; -} // namespace net - -namespace safe_browsing { - -class SafeBrowsingPingManager : public net::URLFetcherDelegate { - public: - ~SafeBrowsingPingManager() override; - - // Create an instance of the safe browsing ping manager. - static SafeBrowsingPingManager* Create( - net::URLRequestContextGetter* request_context_getter, - const SafeBrowsingProtocolConfig& config); - - // net::URLFetcherDelegate interface. - void OnURLFetchComplete(const net::URLFetcher* source) override; - - // Report to Google when a SafeBrowsing warning is shown to the user. - // |hit_report.threat_type| should be one of the types known by - // SafeBrowsingtHitUrl. - void ReportSafeBrowsingHit(const safe_browsing::HitReport& hit_report); - - // Users can opt-in on the SafeBrowsing interstitial to send detailed - // threat reports. |report| is the serialized report. - void ReportThreatDetails(const std::string& report); - - // Users can opt-in on the SSL interstitial to send reports of invalid - // certificate chains. - void ReportInvalidCertificateChain(const std::string& serialized_report); - - void SetCertificateErrorReporterForTesting( - scoped_ptr<certificate_reporting::ErrorReporter> - certificate_error_reporter); - - private: - FRIEND_TEST_ALL_PREFIXES(SafeBrowsingPingManagerTest, TestSafeBrowsingHitUrl); - FRIEND_TEST_ALL_PREFIXES(SafeBrowsingPingManagerTest, TestThreatDetailsUrl); - - typedef std::set<const net::URLFetcher*> Reports; - - // Constructs a SafeBrowsingPingManager that issues network requests - // using |request_context_getter|. - SafeBrowsingPingManager(net::URLRequestContextGetter* request_context_getter, - const SafeBrowsingProtocolConfig& config); - - // Generates URL for reporting safe browsing hits. - GURL SafeBrowsingHitUrl(const safe_browsing::HitReport& hit_report) const; - - // Generates URL for reporting threat details for users who opt-in. - GURL ThreatDetailsUrl() const; - - // Current product version sent in each request. - std::string version_; - - // The safe browsing client name sent in each request. - std::string client_name_; - - // The context we use to issue network requests. - scoped_refptr<net::URLRequestContextGetter> request_context_getter_; - - // URL prefix where browser reports hits to the safebrowsing list and - // sends detaild threat reports for UMA users. - std::string url_prefix_; - - // Track outstanding SafeBrowsing report fetchers for clean up. - // We add both "hit" and "detail" fetchers in this set. - Reports safebrowsing_reports_; - - // Sends reports of invalid SSL certificate chains. - scoped_ptr<certificate_reporting::ErrorReporter> certificate_error_reporter_; - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingPingManager); -}; - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_
diff --git a/ios/chrome/browser/safe_browsing/protocol_manager_helper.cc b/ios/chrome/browser/safe_browsing/protocol_manager_helper.cc deleted file mode 100644 index 2783727..0000000 --- a/ios/chrome/browser/safe_browsing/protocol_manager_helper.cc +++ /dev/null
@@ -1,74 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/protocol_manager_helper.h" - -#include "base/environment.h" -#include "base/logging.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "components/version_info/version_info.h" -#include "google_apis/google_api_keys.h" -#include "net/base/escape.h" - -namespace safe_browsing { - -SafeBrowsingProtocolConfig::SafeBrowsingProtocolConfig() - : disable_auto_update(false) {} - -SafeBrowsingProtocolConfig::~SafeBrowsingProtocolConfig() {} - -// static -std::string SafeBrowsingProtocolManagerHelper::Version() { - if (version_info::GetVersionNumber().empty()) - return "0.1"; - else - return version_info::GetVersionNumber(); -} - -// static -std::string SafeBrowsingProtocolManagerHelper::ComposeUrl( - const std::string& prefix, - const std::string& method, - const std::string& client_name, - const std::string& version, - const std::string& additional_query) { - DCHECK(!prefix.empty() && !method.empty() && !client_name.empty() && - !version.empty()); - std::string url = - base::StringPrintf("%s/%s?client=%s&appver=%s&pver=3.0", prefix.c_str(), - method.c_str(), client_name.c_str(), version.c_str()); - std::string api_key = google_apis::GetAPIKey(); - if (!api_key.empty()) { - base::StringAppendF(&url, "&key=%s", - net::EscapeQueryParamValue(api_key, true).c_str()); - } - if (!additional_query.empty()) { - DCHECK(url.find("?") != std::string::npos); - url.append("&"); - url.append(additional_query); - } - return url; -} - -// static -std::string SafeBrowsingProtocolManagerHelper::ComposeUrl( - const std::string& prefix, - const std::string& method, - const std::string& client_name, - const std::string& version, - const std::string& additional_query, - bool is_extended_reporting) { - std::string url = - ComposeUrl(prefix, method, client_name, version, additional_query); - if (is_extended_reporting) { - url.append("&ext=1"); - } else { - url.append("&ext=0"); - } - return url; -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/protocol_manager_helper.h b/ios/chrome/browser/safe_browsing/protocol_manager_helper.h deleted file mode 100644 index cc4846a..0000000 --- a/ios/chrome/browser/safe_browsing/protocol_manager_helper.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_HELPER_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_HELPER_H_ - -// A class that provides common functionality for safebrowsing protocol managers -// that communicate with Google servers. - -#include <string> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" - -namespace safe_browsing { - -struct SafeBrowsingProtocolConfig { - SafeBrowsingProtocolConfig(); - ~SafeBrowsingProtocolConfig(); - std::string client_name; - std::string url_prefix; - std::string backup_connect_error_url_prefix; - std::string backup_http_error_url_prefix; - std::string backup_network_error_url_prefix; - std::string version; - bool disable_auto_update; -}; - -class SafeBrowsingProtocolManagerHelper { - public: - // returns version - static std::string Version(); - - // Composes a URL using |prefix|, |method| (e.g.: gethash, download, report). - // |client_name| and |version|. When not empty, |additional_query| is - // appended to the URL with an additional "&" in the front. - static std::string ComposeUrl(const std::string& prefix, - const std::string& method, - const std::string& client_name, - const std::string& version, - const std::string& additional_query); - - // Similar to above function, and appends "&ext=1" at the end of URL if - // |is_extended_reporting| is true, otherwise, appends "&ext=0". - static std::string ComposeUrl(const std::string& prefix, - const std::string& method, - const std::string& client_name, - const std::string& version, - const std::string& additional_query, - bool is_extended_reporting); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(SafeBrowsingProtocolManagerHelper); -}; - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_HELPER_H_
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.h deleted file mode 100644 index c99f4eb3..0000000 --- a/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.h +++ /dev/null
@@ -1,169 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Classes for managing the SafeBrowsing interstitial pages. -// -// When a user is about to visit a page the SafeBrowsing system has deemed to -// be malicious, either as malware or a phishing page, we show an interstitial -// page with some options (go back, continue) to give the user a chance to avoid -// the harmful page. -// -// The SafeBrowsingBlockingPage is created by the SafeBrowsingUIManager on the -// UI thread when we've determined that a page is malicious. The operation of -// the blocking page occurs on the UI thread, where it waits for the user to -// make a decision about what to do: either go back or continue on. -// -// The blocking page forwards the result of the user's choice back to the -// SafeBrowsingUIManager so that we can cancel the request for the new page, -// or allow it to continue. -// -// A web page may contain several resources flagged as malware/phishing. This -// results into more than one interstitial being shown. On the first unsafe -// resource received we show an interstitial. Any subsequent unsafe resource -// notifications while the first interstitial is showing is queued. If the user -// decides to proceed in the first interstitial, we display all queued unsafe -// resources in a new interstitial. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ - -#include <map> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h" -#include "ios/chrome/browser/safe_browsing/ui_manager.h" -#include "url/gurl.h" - -namespace web { -class WebState; -} - -namespace safe_browsing { - -class SafeBrowsingBlockingPageFactory; - -class SafeBrowsingBlockingPage : public IOSSecurityInterstitialPage { - public: - typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource; - typedef std::vector<UnsafeResource> UnsafeResourceList; - typedef std::map<web::WebState*, UnsafeResourceList> UnsafeResourceMap; - - ~SafeBrowsingBlockingPage() override; - - // Creates a blocking page. Use ShowBlockingPage if you don't need to access - // the blocking page directly. - static SafeBrowsingBlockingPage* CreateBlockingPage( - SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const UnsafeResource& unsafe_resource); - - // Shows a blocking page warning the user about phishing/malware for a - // specific resource. - // You can call this method several times, if an interstitial is already - // showing, the new one will be queued and displayed if the user decides - // to proceed on the currently showing interstitial. - static void ShowBlockingPage(web::WebState* web_state, - SafeBrowsingUIManager* ui_manager, - const UnsafeResource& resource); - - // Makes the passed |factory| the factory used to instantiate - // SafeBrowsingBlockingPage objects. Useful for tests. - static void RegisterFactory(SafeBrowsingBlockingPageFactory* factory) { - factory_ = factory; - } - - // InterstitialPageDelegate method: - void OnProceed() override; - void OnDontProceed() override; - void CommandReceived(const std::string& command) override; - - protected: - void UpdateReportingPref(); // Used for the transition from old to new pref. - - // Don't instantiate this class directly, use ShowBlockingPage instead. - SafeBrowsingBlockingPage(SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const UnsafeResourceList& unsafe_resources); - - // IOSSecurityInterstitialPage methods: - bool ShouldCreateNewNavigation() const override; - void PopulateInterstitialStrings( - base::DictionaryValue* load_time_data) const override; - void AfterShow() override; - - // A list of SafeBrowsingUIManager::UnsafeResource for a tab that the user - // should be warned about. They are queued when displaying more than one - // interstitial at a time. - static UnsafeResourceMap* GetUnsafeResourcesMap(); - - // Returns true if the passed |unsafe_resources| is blocking the load of - // the main page. - static bool IsMainPageLoadBlocked(const UnsafeResourceList& unsafe_resources); - - friend class SafeBrowsingBlockingPageFactoryImpl; - - // For reporting back user actions. - SafeBrowsingUIManager* ui_manager_; - - // True if the interstitial is blocking the main page because it is on one - // of our lists. False if a subresource is being blocked, or in the case of - // client-side detection where the interstitial is shown after page load - // finishes. - bool is_main_frame_load_blocked_; - - // The index of a navigation entry that should be removed when DontProceed() - // is invoked, -1 if not entry should be removed. - int navigation_entry_index_to_remove_; - - // The list of unsafe resources this page is warning about. - UnsafeResourceList unsafe_resources_; - - bool proceeded_; - - // Which type of Safe Browsing interstitial this is. - enum SBInterstitialReason { - SB_REASON_MALWARE, - SB_REASON_HARMFUL, - SB_REASON_PHISHING, - } interstitial_reason_; - - // The factory used to instantiate SafeBrowsingBlockingPage objects. - // Useful for tests, so they can provide their own implementation of - // SafeBrowsingBlockingPage. - static SafeBrowsingBlockingPageFactory* factory_; - - private: - // Fills the passed dictionary with the values to be passed to the template - // when creating the HTML. - void PopulateMalwareLoadTimeData(base::DictionaryValue* load_time_data) const; - void PopulateHarmfulLoadTimeData(base::DictionaryValue* load_time_data) const; - void PopulatePhishingLoadTimeData( - base::DictionaryValue* load_time_data) const; - - std::string GetMetricPrefix() const; - std::string GetExtraMetricsSuffix() const; - std::string GetRapporPrefix() const; - std::string GetSamplingEventName() const; - - scoped_ptr<IOSChromeControllerClient> controller_; - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPage); -}; - -// Factory for creating SafeBrowsingBlockingPage. Useful for tests. -class SafeBrowsingBlockingPageFactory { - public: - virtual ~SafeBrowsingBlockingPageFactory() {} - - virtual SafeBrowsingBlockingPage* CreateSafeBrowsingPage( - SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) = 0; -}; - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.mm b/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.mm deleted file mode 100644 index de757dd..0000000 --- a/ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.mm +++ /dev/null
@@ -1,598 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Implementation of the SafeBrowsingBlockingPage class. - -#include "ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.h" - -#include <string> - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/i18n/rtl.h" -#include "base/lazy_instance.h" -#include "base/macros.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/histogram.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "base/values.h" -#include "components/google/core/browser/google_util.h" -#include "components/prefs/pref_service.h" -#include "components/security_interstitials/core/controller_client.h" -#include "ios/chrome/browser/application_context.h" -#include "ios/chrome/browser/chrome_url_constants.h" -#include "ios/chrome/browser/interstitials/ios_chrome_controller_client.h" -#include "ios/chrome/browser/interstitials/ios_chrome_metrics_helper.h" -#include "ios/chrome/browser/pref_names.h" -#include "ios/chrome/browser/safe_browsing/ui_manager.h" -#include "ios/chrome/grit/ios_strings.h" -#include "ios/web/public/interstitials/web_interstitial.h" -#import "ios/web/public/navigation_manager.h" -#include "ios/web/public/web_state/web_state.h" -#include "ios/web/public/web_thread.h" -#include "net/base/escape.h" -#include "ui/base/l10n/l10n_util.h" - -namespace safe_browsing { - -namespace { - -// For malware interstitial pages, we link the problematic URL to Google's -// diagnostic page. -#if defined(GOOGLE_CHROME_BUILD) -const char kSbDiagnosticUrl[] = - "https://www.google.com/safebrowsing/" - "diagnostic?site=%s&client=googlechrome"; -#else -const char kSbDiagnosticUrl[] = - "https://www.google.com/safebrowsing/diagnostic?site=%s&client=chromium"; -#endif - -// URL for malware and phishing, V2. -const char kLearnMoreMalwareUrlV2[] = - "https://www.google.com/transparencyreport/safebrowsing/"; -const char kLearnMorePhishingUrlV2[] = - "https://www.google.com/transparencyreport/safebrowsing/"; - -// Constants for the V4 phishing string upgrades. -const char kSocialEngineeringTrial[] = "SafeBrowsingSocialEngineeringStrings"; -const char kSocialEngineeringEnabled[] = "Enabled"; - -// Constants for the Experience Sampling instrumentation. -const char kEventNameMalware[] = "safebrowsing_interstitial_"; -const char kEventNameHarmful[] = "harmful_interstitial_"; -const char kEventNamePhishing[] = "phishing_interstitial_"; -const char kEventNameOther[] = "safebrowsing_other_interstitial_"; - -// Constants for the V4 phishing string upgrades. -const char kReportPhishingErrorUrl[] = - "https://www.google.com/safebrowsing/report_error/"; -const char kReportPhishingErrorTrial[] = "SafeBrowsingReportPhishingErrorLink"; -const char kReportPhishingErrorEnabled[] = "Enabled"; - -base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> - g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; - -} // namespace - -// static -SafeBrowsingBlockingPageFactory* SafeBrowsingBlockingPage::factory_ = nullptr; - -// The default SafeBrowsingBlockingPageFactory. Global, made a singleton so we -// don't leak it. -class SafeBrowsingBlockingPageFactoryImpl - : public SafeBrowsingBlockingPageFactory { - public: - SafeBrowsingBlockingPage* CreateSafeBrowsingPage( - SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) - override { - return new SafeBrowsingBlockingPage(ui_manager, web_state, - unsafe_resources); - } - - private: - friend struct base::DefaultLazyInstanceTraits< - SafeBrowsingBlockingPageFactoryImpl>; - - SafeBrowsingBlockingPageFactoryImpl() {} - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPageFactoryImpl); -}; - -static base::LazyInstance<SafeBrowsingBlockingPageFactoryImpl> - g_safe_browsing_blocking_page_factory_impl = LAZY_INSTANCE_INITIALIZER; - -SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( - SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const UnsafeResourceList& unsafe_resources) - : IOSSecurityInterstitialPage(web_state, unsafe_resources[0].url), - ui_manager_(ui_manager), - is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), - unsafe_resources_(unsafe_resources), - proceeded_(false), - controller_(new IOSChromeControllerClient(web_state)) { - bool malware = false; - bool harmful = false; - bool phishing = false; - for (UnsafeResourceList::const_iterator iter = unsafe_resources_.begin(); - iter != unsafe_resources_.end(); ++iter) { - const UnsafeResource& resource = *iter; - SBThreatType threat_type = resource.threat_type; - if (threat_type == SB_THREAT_TYPE_URL_MALWARE || - threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { - malware = true; - } else if (threat_type == SB_THREAT_TYPE_URL_UNWANTED) { - harmful = true; - } else { - DCHECK(threat_type == SB_THREAT_TYPE_URL_PHISHING || - threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL); - phishing = true; - } - } - DCHECK(phishing || malware || harmful); - if (malware) - interstitial_reason_ = SB_REASON_MALWARE; - else if (harmful) - interstitial_reason_ = SB_REASON_HARMFUL; - else - interstitial_reason_ = SB_REASON_PHISHING; - - // This must be done after calculating |interstitial_reason_| above. - security_interstitials::MetricsHelper::ReportDetails reporting_info; - reporting_info.metric_prefix = GetMetricPrefix(); - reporting_info.extra_suffix = GetExtraMetricsSuffix(); - reporting_info.rappor_prefix = GetRapporPrefix(); - reporting_info.rappor_report_type = rappor::SAFEBROWSING_RAPPOR_TYPE; - controller_->set_metrics_helper(make_scoped_ptr( - new IOSChromeMetricsHelper(web_state, request_url(), reporting_info))); - controller_->metrics_helper()->RecordUserDecision( - security_interstitials::MetricsHelper::SHOW); - controller_->metrics_helper()->RecordUserInteraction( - security_interstitials::MetricsHelper::TOTAL_VISITS); - if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { - controller_->metrics_helper()->RecordUserDecision( - security_interstitials::MetricsHelper::PROCEEDING_DISABLED); - } - - if (!is_main_frame_load_blocked_) { - navigation_entry_index_to_remove_ = - web_state->GetNavigationManager()->GetLastCommittedItemIndex(); - } else { - navigation_entry_index_to_remove_ = -1; - } -} - -SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() {} - -void SafeBrowsingBlockingPage::CommandReceived(const std::string& page_cmd) { - if (page_cmd == "\"pageLoadComplete\"") { - // content::WaitForRenderFrameReady sends this message when the page - // load completes. Ignore it. - return; - } - - int command = 0; - bool retval = base::StringToInt(page_cmd, &command); - DCHECK(retval) << page_cmd; - - switch (command) { - case security_interstitials::CMD_DO_REPORT: { - // User enabled SB Extended Reporting via the checkbox. - controller_->SetReportingPreference(true); - break; - } - case security_interstitials::CMD_DONT_REPORT: { - // User disabled SB Extended Reporting via the checkbox. - controller_->SetReportingPreference(false); - break; - } - case security_interstitials::CMD_OPEN_HELP_CENTER: { - // User pressed "Learn more". - controller_->metrics_helper()->RecordUserInteraction( - security_interstitials::MetricsHelper::SHOW_LEARN_MORE); - GURL learn_more_url(interstitial_reason_ == SB_REASON_PHISHING - ? kLearnMorePhishingUrlV2 - : kLearnMoreMalwareUrlV2); - learn_more_url = google_util::AppendGoogleLocaleParam( - learn_more_url, GetApplicationContext()->GetApplicationLocale()); - web_state()->OpenURL(web::WebState::OpenURLParams( - learn_more_url, web::Referrer(), CURRENT_TAB, - ui::PAGE_TRANSITION_LINK, false)); - break; - } - case security_interstitials::CMD_OPEN_REPORTING_PRIVACY: { - // User pressed on the SB Extended Reporting "privacy policy" link. - controller_->OpenExtendedReportingPrivacyPolicy(); - break; - } - case security_interstitials::CMD_PROCEED: { - // User pressed on the button to proceed. - if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { - controller_->metrics_helper()->RecordUserDecision( - security_interstitials::MetricsHelper::PROCEED); - web_interstitial()->Proceed(); - // |this| has been deleted after Proceed() returns. - break; - } - // If the user can't proceed, fall through to CMD_DONT_PROCEED. - } - case security_interstitials::CMD_DONT_PROCEED: { - // User pressed on the button to return to safety. - // Don't record the user action here because there are other ways of - // triggering DontProceed, like clicking the back button. - if (is_main_frame_load_blocked_) { - // If the load is blocked, we want to close the interstitial and discard - // the pending entry. - web_interstitial()->DontProceed(); - // |this| has been deleted after DontProceed() returns. - break; - } - - // Otherwise the offending entry has committed, and we need to go back or - // to a safe page. We will close the interstitial when that page commits. - if (web_state()->GetNavigationManager()->CanGoBack()) { - web_state()->GetNavigationManager()->GoBack(); - } else { - web_state()->OpenURL(web::WebState::OpenURLParams( - GURL(kChromeUINewTabURL), web::Referrer(), CURRENT_TAB, - ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false)); - } - break; - } - case security_interstitials::CMD_OPEN_DIAGNOSTIC: { - // User wants to see why this page is blocked. - const UnsafeResource& unsafe_resource = unsafe_resources_[0]; - std::string bad_url_spec = unsafe_resource.url.spec(); - controller_->metrics_helper()->RecordUserInteraction( - security_interstitials::MetricsHelper::SHOW_DIAGNOSTIC); - std::string diagnostic = base::StringPrintf( - kSbDiagnosticUrl, - net::EscapeQueryParamValue(bad_url_spec, true).c_str()); - GURL diagnostic_url(diagnostic); - diagnostic_url = google_util::AppendGoogleLocaleParam( - diagnostic_url, GetApplicationContext()->GetApplicationLocale()); - DCHECK(unsafe_resource.threat_type == SB_THREAT_TYPE_URL_MALWARE || - unsafe_resource.threat_type == - SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL || - unsafe_resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED); - web_state()->OpenURL(web::WebState::OpenURLParams( - diagnostic_url, web::Referrer(), CURRENT_TAB, - ui::PAGE_TRANSITION_LINK, false)); - break; - } - case security_interstitials::CMD_SHOW_MORE_SECTION: { - // User has opened up the hidden text. - controller_->metrics_helper()->RecordUserInteraction( - security_interstitials::MetricsHelper::SHOW_ADVANCED); - break; - } - case security_interstitials::CMD_REPORT_PHISHING_ERROR: { - // User wants to report a phishing error. - controller_->metrics_helper()->RecordUserInteraction( - security_interstitials::MetricsHelper::REPORT_PHISHING_ERROR); - GURL phishing_error_url(kReportPhishingErrorUrl); - phishing_error_url = google_util::AppendGoogleLocaleParam( - phishing_error_url, GetApplicationContext()->GetApplicationLocale()); - web_state()->OpenURL(web::WebState::OpenURLParams( - phishing_error_url, web::Referrer(), CURRENT_TAB, - ui::PAGE_TRANSITION_LINK, false)); - break; - } - } -} - -void SafeBrowsingBlockingPage::OnProceed() { - proceeded_ = true; - ui_manager_->OnBlockingPageDone(unsafe_resources_, true); - - // Check to see if some new notifications of unsafe resources have been - // received while we were showing the interstitial. - UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); - UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_state()); - SafeBrowsingBlockingPage* blocking_page = nullptr; - if (iter != unsafe_resource_map->end() && !iter->second.empty()) { - // Build an interstitial for all the unsafe resources notifications. - // Don't show it now as showing an interstitial while an interstitial is - // already showing would cause DontProceed() to be invoked. - blocking_page = factory_->CreateSafeBrowsingPage(ui_manager_, web_state(), - iter->second); - unsafe_resource_map->erase(iter); - } - - // Now that this interstitial is gone, we can show the new one. - if (blocking_page) - blocking_page->Show(); -} - -bool SafeBrowsingBlockingPage::ShouldCreateNewNavigation() const { - return is_main_frame_load_blocked_; -} - -void SafeBrowsingBlockingPage::OnDontProceed() { - // We could have already called Proceed(), in which case we must not notify - // the SafeBrowsingUIManager again, as the client has been deleted. - if (proceeded_) - return; - - if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { - controller_->metrics_helper()->RecordUserDecision( - security_interstitials::MetricsHelper::DONT_PROCEED); - } - - ui_manager_->OnBlockingPageDone(unsafe_resources_, false); - - // The user does not want to proceed, clear the queued unsafe resources - // notifications we received while the interstitial was showing. - UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); - UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_state()); - if (iter != unsafe_resource_map->end() && !iter->second.empty()) { - ui_manager_->OnBlockingPageDone(iter->second, false); - unsafe_resource_map->erase(iter); - } - - // We don't remove the navigation entry if the tab is being destroyed as this - // would trigger a navigation that would cause trouble as the render view host - // for the tab has by then already been destroyed. We also don't delete the - // current entry if it has been committed again, which is possible on a page - // that had a subresource warning. - int last_committed_index = - web_state()->GetNavigationManager()->GetLastCommittedItemIndex(); - if (navigation_entry_index_to_remove_ != -1 && - navigation_entry_index_to_remove_ != last_committed_index && - !web_state()->IsBeingDestroyed()) { - CHECK(web_state()->GetNavigationManager()->RemoveItemAtIndex( - navigation_entry_index_to_remove_)); - navigation_entry_index_to_remove_ = -1; - } -} - -// static -SafeBrowsingBlockingPage::UnsafeResourceMap* -SafeBrowsingBlockingPage::GetUnsafeResourcesMap() { - return g_unsafe_resource_map.Pointer(); -} - -// static -SafeBrowsingBlockingPage* SafeBrowsingBlockingPage::CreateBlockingPage( - SafeBrowsingUIManager* ui_manager, - web::WebState* web_state, - const UnsafeResource& unsafe_resource) { - std::vector<UnsafeResource> resources; - resources.push_back(unsafe_resource); - // Set up the factory if this has not been done already (tests do that - // before this method is called). - if (!factory_) - factory_ = g_safe_browsing_blocking_page_factory_impl.Pointer(); - return factory_->CreateSafeBrowsingPage(ui_manager, web_state, resources); -} - -// static -void SafeBrowsingBlockingPage::ShowBlockingPage( - web::WebState* web_state, - SafeBrowsingUIManager* ui_manager, - const UnsafeResource& unsafe_resource) { - DVLOG(1) << __FUNCTION__ << " " << unsafe_resource.url.spec(); - web::WebInterstitial* web_interstitial = - web::WebInterstitial::GetWebInterstitial(web_state); - if (web_interstitial && !unsafe_resource.is_subresource) { - // There is already an interstitial showing and we are about to display a - // new one for the main frame. Just hide the current one, it is now - // irrelevent - web_interstitial->DontProceed(); - web_interstitial = nullptr; - } - - if (!web_interstitial) { - // There are no interstitial currently showing in that tab, go ahead and - // show this interstitial. - SafeBrowsingBlockingPage* blocking_page = - CreateBlockingPage(ui_manager, web_state, unsafe_resource); - blocking_page->Show(); - return; - } - - // This is an interstitial for a page's resource, let's queue it. - UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); - (*unsafe_resource_map)[web_state].push_back(unsafe_resource); -} - -// static -bool SafeBrowsingBlockingPage::IsMainPageLoadBlocked( - const UnsafeResourceList& unsafe_resources) { - // If there is more than one unsafe resource, the main page load must not be - // blocked. Otherwise, check if the one resource is. - return unsafe_resources.size() == 1 && - unsafe_resources[0].IsMainPageLoadBlocked(); -} - -std::string SafeBrowsingBlockingPage::GetMetricPrefix() const { - bool primary_subresource = unsafe_resources_[0].is_subresource; - switch (interstitial_reason_) { - case SB_REASON_MALWARE: - return primary_subresource ? "malware_subresource" : "malware"; - case SB_REASON_HARMFUL: - return primary_subresource ? "harmful_subresource" : "harmful"; - case SB_REASON_PHISHING: - return primary_subresource ? "phishing_subresource" : "phishing"; - } - NOTREACHED(); - return std::string(); -} - -// We populate a parallel set of metrics to differentiate some threat sources. -std::string SafeBrowsingBlockingPage::GetExtraMetricsSuffix() const { - switch (unsafe_resources_[0].threat_source) { - case safe_browsing::ThreatSource::DATA_SAVER: - return "from_data_saver"; - case safe_browsing::ThreatSource::REMOTE: - case safe_browsing::ThreatSource::LOCAL_PVER3: - // REMOTE and LOCAL_PVER3 can be distinguished in the logs - // by platform type: Remote is mobile, local_pver3 is desktop. - return "from_device"; - case safe_browsing::ThreatSource::LOCAL_PVER4: - return "from_device_v4"; - case safe_browsing::ThreatSource::UNKNOWN: - break; - } - NOTREACHED(); - return std::string(); -} - -std::string SafeBrowsingBlockingPage::GetRapporPrefix() const { - switch (interstitial_reason_) { - case SB_REASON_MALWARE: - return "malware"; - case SB_REASON_HARMFUL: - return "harmful"; - case SB_REASON_PHISHING: - return "phishing"; - } - NOTREACHED(); - return std::string(); -} - -std::string SafeBrowsingBlockingPage::GetSamplingEventName() const { - switch (interstitial_reason_) { - case SB_REASON_MALWARE: - return kEventNameMalware; - case SB_REASON_HARMFUL: - return kEventNameHarmful; - case SB_REASON_PHISHING: - return kEventNamePhishing; - default: - return kEventNameOther; - } -} - -void SafeBrowsingBlockingPage::PopulateInterstitialStrings( - base::DictionaryValue* load_time_data) const { - CHECK(load_time_data); - CHECK(!unsafe_resources_.empty()); - - load_time_data->SetString("type", "SAFEBROWSING"); - load_time_data->SetString( - "tabTitle", l10n_util::GetStringUTF16(IDS_IOS_SAFEBROWSING_V3_TITLE)); - load_time_data->SetString( - "openDetails", - l10n_util::GetStringUTF16(IDS_IOS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON)); - load_time_data->SetString( - "closeDetails", - l10n_util::GetStringUTF16(IDS_IOS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); - load_time_data->SetString( - "primaryButtonText", l10n_util::GetStringUTF16( - IDS_IOS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); - // TODO(crbug.com/390675): Undo this forkage. This is a temporary fix to make - // sure the broken proceed-from-unsafe-resource path can't be hit on iOS. - // Always set subresource alerts to be non-overridable. Otherwise obey the - // global pref. - bool overridable = !unsafe_resources_[0].is_subresource && - !IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled); - load_time_data->SetBoolean("overridable", overridable); - - switch (interstitial_reason_) { - case SB_REASON_MALWARE: - PopulateMalwareLoadTimeData(load_time_data); - break; - case SB_REASON_HARMFUL: - PopulateHarmfulLoadTimeData(load_time_data); - break; - case SB_REASON_PHISHING: - PopulatePhishingLoadTimeData(load_time_data); - break; - } -} - -void SafeBrowsingBlockingPage::AfterShow() { - controller_->SetWebInterstitial(web_interstitial()); -} - -void SafeBrowsingBlockingPage::PopulateMalwareLoadTimeData( - base::DictionaryValue* load_time_data) const { - load_time_data->SetBoolean("phishing", false); - load_time_data->SetString( - "heading", l10n_util::GetStringUTF16(IDS_IOS_MALWARE_V3_HEADING)); - load_time_data->SetString( - "primaryParagraph", - l10n_util::GetStringFUTF16(IDS_IOS_MALWARE_V3_PRIMARY_PARAGRAPH, - GetFormattedHostName())); - load_time_data->SetString( - "explanationParagraph", - is_main_frame_load_blocked_ - ? l10n_util::GetStringFUTF16(IDS_IOS_MALWARE_V3_EXPLANATION_PARAGRAPH, - GetFormattedHostName()) - : l10n_util::GetStringFUTF16( - IDS_IOS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE, - base::UTF8ToUTF16(web_state()->GetVisibleURL().host()), - GetFormattedHostName())); - load_time_data->SetString( - "finalParagraph", - l10n_util::GetStringUTF16(IDS_IOS_MALWARE_V3_PROCEED_PARAGRAPH)); - - load_time_data->SetBoolean(security_interstitials::kDisplayCheckBox, false); -} - -void SafeBrowsingBlockingPage::PopulateHarmfulLoadTimeData( - base::DictionaryValue* load_time_data) const { - load_time_data->SetBoolean("phishing", false); - load_time_data->SetString( - "heading", l10n_util::GetStringUTF16(IDS_IOS_HARMFUL_V3_HEADING)); - load_time_data->SetString( - "primaryParagraph", - l10n_util::GetStringFUTF16(IDS_IOS_HARMFUL_V3_PRIMARY_PARAGRAPH, - GetFormattedHostName())); - load_time_data->SetString( - "explanationParagraph", - l10n_util::GetStringFUTF16(IDS_IOS_HARMFUL_V3_EXPLANATION_PARAGRAPH, - GetFormattedHostName())); - load_time_data->SetString( - "finalParagraph", - l10n_util::GetStringUTF16(IDS_IOS_HARMFUL_V3_PROCEED_PARAGRAPH)); - - load_time_data->SetBoolean(security_interstitials::kDisplayCheckBox, false); -} - -void SafeBrowsingBlockingPage::PopulatePhishingLoadTimeData( - base::DictionaryValue* load_time_data) const { - bool use_social_engineering_strings = - base::FieldTrialList::FindFullName(kSocialEngineeringTrial) == - kSocialEngineeringEnabled; - load_time_data->SetBoolean("phishing", true); - load_time_data->SetString( - "heading", l10n_util::GetStringUTF16(use_social_engineering_strings - ? IDS_IOS_PHISHING_V4_HEADING - : IDS_IOS_PHISHING_V3_HEADING)); - load_time_data->SetString( - "primaryParagraph", - l10n_util::GetStringFUTF16(use_social_engineering_strings - ? IDS_IOS_PHISHING_V4_PRIMARY_PARAGRAPH - : IDS_IOS_PHISHING_V3_PRIMARY_PARAGRAPH, - GetFormattedHostName())); - load_time_data->SetString( - "explanationParagraph", - l10n_util::GetStringFUTF16(IDS_IOS_PHISHING_V3_EXPLANATION_PARAGRAPH, - GetFormattedHostName())); - - if (base::FieldTrialList::FindFullName(kReportPhishingErrorTrial) == - kReportPhishingErrorEnabled) { - load_time_data->SetString( - "finalParagraph", - l10n_util::GetStringUTF16( - IDS_IOS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH)); - } else { - load_time_data->SetString( - "finalParagraph", - l10n_util::GetStringUTF16(IDS_IOS_PHISHING_V3_PROCEED_PARAGRAPH)); - } - - load_time_data->SetBoolean(security_interstitials::kDisplayCheckBox, false); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_service.cc b/ios/chrome/browser/safe_browsing/safe_browsing_service.cc deleted file mode 100644 index e2bbe92a..0000000 --- a/ios/chrome/browser/safe_browsing/safe_browsing_service.cc +++ /dev/null
@@ -1,435 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/safe_browsing_service.h" - -#include <vector> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback.h" -#include "base/command_line.h" -#include "base/lazy_instance.h" -#include "base/macros.h" -#include "base/metrics/histogram_macros.h" -#include "base/path_service.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "base/threading/thread.h" -#include "base/threading/thread_restrictions.h" -#include "components/prefs/pref_change_registrar.h" -#include "components/prefs/pref_service.h" -#include "ios/chrome/browser/application_context.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h" -#include "ios/chrome/browser/chrome_paths.h" -#include "ios/chrome/browser/chrome_switches.h" -#include "ios/chrome/browser/pref_names.h" -#include "ios/chrome/browser/safe_browsing/ping_manager.h" -#include "ios/chrome/browser/safe_browsing/ui_manager.h" -#include "ios/web/public/web_thread.h" -#include "net/cookies/cookie_monster.h" -#include "net/extras/sqlite/cookie_crypto_delegate.h" -#include "net/extras/sqlite/sqlite_persistent_cookie_store.h" -#include "net/http/http_response_headers.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_getter.h" - -namespace safe_browsing { - -namespace { - -const base::FilePath::CharType kIOSChromeSafeBrowsingBaseFilename[] = - FILE_PATH_LITERAL("Safe Browsing"); - -// Filename suffix for the cookie database. -const base::FilePath::CharType kCookiesFile[] = FILE_PATH_LITERAL(" Cookies"); - -// The default URL prefix where browser fetches chunk updates, hashes, -// and reports safe browsing hits and malware details. -const char kSbDefaultURLPrefix[] = - "https://safebrowsing.google.com/safebrowsing"; - -// The backup URL prefix used when there are issues establishing a connection -// with the server at the primary URL. -const char kSbBackupConnectErrorURLPrefix[] = - "https://alt1-safebrowsing.google.com/safebrowsing"; - -// The backup URL prefix used when there are HTTP-specific issues with the -// server at the primary URL. -const char kSbBackupHttpErrorURLPrefix[] = - "https://alt2-safebrowsing.google.com/safebrowsing"; - -// The backup URL prefix used when there are local network specific issues. -const char kSbBackupNetworkErrorURLPrefix[] = - "https://alt3-safebrowsing.google.com/safebrowsing"; - -} // namespace - -class SafeBrowsingURLRequestContextGetter - : public net::URLRequestContextGetter { - public: - explicit SafeBrowsingURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> system_context_getter); - - // Implementation for net::UrlRequestContextGetter. - net::URLRequestContext* GetURLRequestContext() override; - scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() - const override; - - // Shuts down any pending requests using the getter, and sets |shut_down_| to - // true. - void ServiceShuttingDown(); - - protected: - ~SafeBrowsingURLRequestContextGetter() override; - - private: - bool shut_down_; - - scoped_refptr<net::URLRequestContextGetter> system_context_getter_; - - scoped_ptr<net::CookieStore> safe_browsing_cookie_store_; - - scoped_ptr<net::URLRequestContext> safe_browsing_request_context_; - - scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; -}; - -SafeBrowsingURLRequestContextGetter::SafeBrowsingURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> system_context_getter) - : shut_down_(false), - system_context_getter_(system_context_getter), - network_task_runner_( - web::WebThread::GetTaskRunnerForThread(web::WebThread::IO)) {} - -net::URLRequestContext* -SafeBrowsingURLRequestContextGetter::GetURLRequestContext() { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - // Check if the service has been shut down. - if (shut_down_) - return nullptr; - - if (!safe_browsing_request_context_) { - safe_browsing_request_context_.reset(new net::URLRequestContext()); - // May be NULL in unit tests. - if (system_context_getter_) { - safe_browsing_request_context_->CopyFrom( - system_context_getter_->GetURLRequestContext()); - } - - scoped_refptr<net::SQLitePersistentCookieStore> sqlite_store( - new net::SQLitePersistentCookieStore( - base::FilePath(SafeBrowsingService::GetBaseFilename().value() + - kCookiesFile), - network_task_runner_, - web::WebThread::GetBlockingPool()->GetSequencedTaskRunner( - web::WebThread::GetBlockingPool()->GetSequenceToken()), - false, nullptr)); - safe_browsing_cookie_store_.reset( - new net::CookieMonster(sqlite_store.get(), nullptr)); - safe_browsing_request_context_->set_cookie_store( - safe_browsing_cookie_store_.get()); - } - - return safe_browsing_request_context_.get(); -} - -scoped_refptr<base::SingleThreadTaskRunner> -SafeBrowsingURLRequestContextGetter::GetNetworkTaskRunner() const { - return network_task_runner_; -} - -void SafeBrowsingURLRequestContextGetter::ServiceShuttingDown() { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - shut_down_ = true; - URLRequestContextGetter::NotifyContextShuttingDown(); - safe_browsing_request_context_.reset(); -} - -SafeBrowsingURLRequestContextGetter::~SafeBrowsingURLRequestContextGetter() {} - -// static -SafeBrowsingServiceFactory* SafeBrowsingService::factory_ = nullptr; - -// The default SafeBrowsingServiceFactory. Global, made a singleton so we -// don't leak it. -class SafeBrowsingServiceFactoryImpl : public SafeBrowsingServiceFactory { - public: - SafeBrowsingService* CreateSafeBrowsingService() override { - return new SafeBrowsingService(); - } - - private: - friend struct base::DefaultLazyInstanceTraits<SafeBrowsingServiceFactoryImpl>; - - SafeBrowsingServiceFactoryImpl() {} - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceFactoryImpl); -}; - -static base::LazyInstance<SafeBrowsingServiceFactoryImpl>::Leaky - g_safe_browsing_service_factory_impl = LAZY_INSTANCE_INITIALIZER; - -// static -base::FilePath SafeBrowsingService::GetBaseFilename() { - base::FilePath path; - bool result = PathService::Get(ios::DIR_USER_DATA, &path); - DCHECK(result); - return path.Append(kIOSChromeSafeBrowsingBaseFilename); -} - -// static -SafeBrowsingService* SafeBrowsingService::CreateSafeBrowsingService() { - if (!factory_) - factory_ = g_safe_browsing_service_factory_impl.Pointer(); - return factory_->CreateSafeBrowsingService(); -} - -SafeBrowsingService::SafeBrowsingService() - : ping_manager_(nullptr), enabled_(false), enabled_by_prefs_(false) {} - -SafeBrowsingService::~SafeBrowsingService() { - // We should have already been shut down. If we're still enabled, then the - // database isn't going to be closed properly, which could lead to corruption. - DCHECK(!enabled_); -} - -void SafeBrowsingService::Initialize() { - url_request_context_getter_ = new SafeBrowsingURLRequestContextGetter( - GetApplicationContext()->GetSystemURLRequestContext()); - - ui_manager_ = CreateUIManager(); - - // Track the safe browsing preference of existing browser states. - // The SafeBrowsingService will be started if any existing browser state has - // the preference enabled. It will also listen for updates to the preferences. - ios::ChromeBrowserStateManager* browser_state_manager = - GetApplicationContext()->GetChromeBrowserStateManager(); - DCHECK(browser_state_manager); - - std::vector<ios::ChromeBrowserState*> browser_states = - browser_state_manager->GetLoadedBrowserStates(); - DCHECK_GT(browser_states.size(), 0u); - for (ios::ChromeBrowserState* browser_state : browser_states) { - if (browser_state->IsOffTheRecord()) - continue; - AddPrefService(browser_state->GetPrefs()); - } -} - -void SafeBrowsingService::ShutDown() { - // Deletes the PrefChangeRegistrars, whose dtors also unregister |this| as an - // observer of the preferences. - STLDeleteValues(&prefs_map_); - - Stop(true); - - // Since URLRequestContextGetters are refcounted, can't count on clearing - // |url_request_context_getter_| to delete it, so need to shut it down first, - // which will cancel any requests that are currently using it, and prevent - // new requests from using it as well. - web::WebThread::PostNonNestableTask( - web::WebThread::IO, FROM_HERE, - base::Bind(&SafeBrowsingURLRequestContextGetter::ServiceShuttingDown, - url_request_context_getter_)); - - // Release the URLRequestContextGetter after passing it to the IOThread. It - // has to be released now rather than in the destructor because it can only - // be deleted on the IOThread, and the SafeBrowsingService outlives the IO - // thread. - url_request_context_getter_ = nullptr; -} - -// Binhash verification is only enabled for UMA users for now. -bool SafeBrowsingService::DownloadBinHashNeeded() const { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - - return false; -} - -net::URLRequestContextGetter* SafeBrowsingService::url_request_context() { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - return url_request_context_getter_.get(); -} - -const scoped_refptr<SafeBrowsingUIManager>& SafeBrowsingService::ui_manager() - const { - return ui_manager_; -} - -SafeBrowsingPingManager* SafeBrowsingService::ping_manager() const { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - return ping_manager_; -} - -SBThreatType SafeBrowsingService::CheckResponseFromProxyRequestHeaders( - scoped_refptr<net::HttpResponseHeaders> headers) { - SBThreatType result = SB_THREAT_TYPE_SAFE; - - if (!headers.get()) - return result; - - // If safebrowsing service is disabled, don't do any check. - if (!enabled()) - return result; - - if (headers->HasHeader("X-Phishing-Url")) - result = SB_THREAT_TYPE_URL_PHISHING; - else if (headers->HasHeader("X-Malware-Url")) - result = SB_THREAT_TYPE_URL_MALWARE; - - return result; -} - -SafeBrowsingUIManager* SafeBrowsingService::CreateUIManager() { - return new SafeBrowsingUIManager(this); -} - -SafeBrowsingProtocolConfig SafeBrowsingService::GetProtocolConfig() const { - SafeBrowsingProtocolConfig config; -#if defined(GOOGLE_CHROME_BUILD) - config.client_name = "googlechrome"; -#else - config.client_name = "chromium"; -#endif - - // Mark client string to allow server to differentiate mobile. - config.client_name.append("-i"); - - base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); - config.disable_auto_update = - cmdline->HasSwitch(switches::kSbDisableAutoUpdate) || - cmdline->HasSwitch(switches::kDisableBackgroundNetworking); - config.url_prefix = kSbDefaultURLPrefix; - config.backup_connect_error_url_prefix = kSbBackupConnectErrorURLPrefix; - config.backup_http_error_url_prefix = kSbBackupHttpErrorURLPrefix; - config.backup_network_error_url_prefix = kSbBackupNetworkErrorURLPrefix; - - return config; -} - -void SafeBrowsingService::StartOnIOThread( - net::URLRequestContextGetter* url_request_context_getter) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - if (enabled_) - return; - enabled_ = true; - - SafeBrowsingProtocolConfig config = GetProtocolConfig(); - - DCHECK(!ping_manager_); - ping_manager_ = - SafeBrowsingPingManager::Create(url_request_context_getter, config); -} - -void SafeBrowsingService::StopOnIOThread(bool shutdown) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - ui_manager_->StopOnIOThread(shutdown); - - if (enabled_) { - enabled_ = false; - - delete ping_manager_; - ping_manager_ = nullptr; - } -} - -void SafeBrowsingService::Start() { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - - web::WebThread::PostTask( - web::WebThread::IO, FROM_HERE, - base::Bind(&SafeBrowsingService::StartOnIOThread, this, - base::RetainedRef(url_request_context_getter_))); -} - -void SafeBrowsingService::Stop(bool shutdown) { - web::WebThread::PostTask( - web::WebThread::IO, FROM_HERE, - base::Bind(&SafeBrowsingService::StopOnIOThread, this, shutdown)); -} - -void SafeBrowsingService::AddPrefService(PrefService* pref_service) { - DCHECK(prefs_map_.find(pref_service) == prefs_map_.end()); - PrefChangeRegistrar* registrar = new PrefChangeRegistrar(); - registrar->Init(pref_service); - registrar->Add( - prefs::kSafeBrowsingEnabled, - base::Bind(&SafeBrowsingService::RefreshState, base::Unretained(this))); - // ClientSideDetectionService will need to be refresh the models - // renderers have if extended-reporting changes. - registrar->Add( - prefs::kSafeBrowsingExtendedReportingEnabled, - base::Bind(&SafeBrowsingService::RefreshState, base::Unretained(this))); - prefs_map_[pref_service] = registrar; - RefreshState(); - - // Record the current pref state. - UMA_HISTOGRAM_BOOLEAN("SafeBrowsing.Pref.General", - pref_service->GetBoolean(prefs::kSafeBrowsingEnabled)); - UMA_HISTOGRAM_BOOLEAN( - "SafeBrowsing.Pref.Extended", - pref_service->GetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled)); -} - -void SafeBrowsingService::RemovePrefService(PrefService* pref_service) { - if (prefs_map_.find(pref_service) != prefs_map_.end()) { - delete prefs_map_[pref_service]; - prefs_map_.erase(pref_service); - RefreshState(); - } else { - NOTREACHED(); - } -} - -scoped_ptr<SafeBrowsingService::StateSubscription> -SafeBrowsingService::RegisterStateCallback( - const base::Callback<void(void)>& callback) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - return state_callback_list_.Add(callback); -} - -void SafeBrowsingService::RefreshState() { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - // Check if any browser state requires the service to be active. - bool enable = false; - std::map<PrefService*, PrefChangeRegistrar*>::iterator iter; - for (iter = prefs_map_.begin(); iter != prefs_map_.end(); ++iter) { - if (iter->first->GetBoolean(prefs::kSafeBrowsingEnabled)) { - enable = true; - break; - } - } - - enabled_by_prefs_ = enable; - - if (enable) - Start(); - else - Stop(false); - - state_callback_list_.Notify(); -} - -void SafeBrowsingService::SendDownloadRecoveryReport( - const std::string& report) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - web::WebThread::PostTask( - web::WebThread::IO, FROM_HERE, - base::Bind(&SafeBrowsingService::OnSendDownloadRecoveryReport, this, - report)); -} - -void SafeBrowsingService::OnSendDownloadRecoveryReport( - const std::string& report) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - if (ping_manager()) - ping_manager()->ReportThreatDetails(report); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_service.h b/ios/chrome/browser/safe_browsing/safe_browsing_service.h deleted file mode 100644 index 4b3507a3..0000000 --- a/ios/chrome/browser/safe_browsing/safe_browsing_service.h +++ /dev/null
@@ -1,215 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// The Safe Browsing service is responsible for downloading anti-phishing and -// anti-malware tables and checking urls against them. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ - -#include <map> -#include <string> - -#include "base/callback.h" -#include "base/callback_list.h" -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/observer_list.h" -#include "base/sequenced_task_runner_helpers.h" -#include "ios/chrome/browser/safe_browsing/util.h" -#include "ios/web/public/web_thread.h" - -class PrefChangeRegistrar; -class PrefService; -class TrackedPreferenceValidationDelegate; - -namespace base { -class Thread; -} - -namespace net { -class HttpResponseHeaders; -class URLRequest; -class URLRequestContextGetter; -} - -namespace safe_browsing { -class ClientSideDetectionService; -class DownloadProtectionService; -struct SafeBrowsingProtocolConfig; -class SafeBrowsingPingManager; -class SafeBrowsingServiceFactory; -class SafeBrowsingUIManager; -class SafeBrowsingURLRequestContextGetter; - -// Construction needs to happen on the main thread. -// The SafeBrowsingService owns both the UI and Database managers which do -// the heavylifting of safebrowsing service. Both of these managers stay -// alive until SafeBrowsingService is destroyed, however, they are disabled -// permanently when Shutdown method is called. -class SafeBrowsingService - : public base::RefCountedThreadSafe<SafeBrowsingService, - web::WebThread::DeleteOnUIThread> { - public: - // Makes the passed |factory| the factory used to instanciate - // a SafeBrowsingService. Useful for tests. - static void RegisterFactory(SafeBrowsingServiceFactory* factory) { - factory_ = factory; - } - - static base::FilePath GetBaseFilename(); - - // Create an instance of the safe browsing service. - static SafeBrowsingService* CreateSafeBrowsingService(); - - // Called on the UI thread to initialize the service. - void Initialize(); - - // Called on the main thread to let us know that the io_thread is going away. - void ShutDown(); - - // Called on UI thread to decide if the download file's sha256 hash - // should be calculated for safebrowsing. - bool DownloadBinHashNeeded() const; - - // Create a protocol config struct. - SafeBrowsingProtocolConfig GetProtocolConfig() const; - - // Get current enabled status. Must be called on IO thread. - bool enabled() const { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - return enabled_; - } - - // Whether the service is enabled by the current set of profiles. - bool enabled_by_prefs() const { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - return enabled_by_prefs_; - } - - net::URLRequestContextGetter* url_request_context(); - - const scoped_refptr<SafeBrowsingUIManager>& ui_manager() const; - - SafeBrowsingPingManager* ping_manager() const; - - // Checks |headers| from a request that has passed through a proxy which - // adds safe browsing headers, and returns the threat type indicated by those - // headers (or SB_THREAT_TYPE_SAFE if no threat is indicated). - SBThreatType CheckResponseFromProxyRequestHeaders( - scoped_refptr<net::HttpResponseHeaders> headers); - - // Type for subscriptions to SafeBrowsing service state. - typedef base::CallbackList<void(void)>::Subscription StateSubscription; - - // Adds a listener for when SafeBrowsing preferences might have changed. - // To get the current state, the callback should call enabled_by_prefs(). - // Should only be called on the UI thread. - scoped_ptr<StateSubscription> RegisterStateCallback( - const base::Callback<void(void)>& callback); - - // Sends serialized download recovery report to backend. - void SendDownloadRecoveryReport(const std::string& report); - - protected: - // Creates the safe browsing service. Need to initialize before using. - SafeBrowsingService(); - - virtual ~SafeBrowsingService(); - - SafeBrowsingUIManager* CreateUIManager(); - - private: - friend class SafeBrowsingServiceFactoryImpl; - friend struct web::WebThread::DeleteOnThread<web::WebThread::UI>; - friend class base::DeleteHelper<SafeBrowsingService>; - friend class SafeBrowsingURLRequestContextGetter; - - // Called to initialize objects that are used on the io_thread. This may be - // called multiple times during the life of the SafeBrowsingService. - void StartOnIOThread( - net::URLRequestContextGetter* url_request_context_getter); - - // Called to stop or shutdown operations on the io_thread. This may be called - // multiple times to stop during the life of the SafeBrowsingService. If - // shutdown is true, then the operations on the io thread are shutdown - // permanently and cannot be restarted. - void StopOnIOThread(bool shutdown); - - // Start up SafeBrowsing objects. This can be called at browser start, or when - // the user checks the "Enable SafeBrowsing" option in the Advanced options - // UI. - void Start(); - - // Stops the SafeBrowsingService. This can be called when the safe browsing - // preference is disabled. When shutdown is true, operation is permanently - // shutdown and cannot be restarted. - void Stop(bool shutdown); - - // Starts following the safe browsing preference on |pref_service|. - void AddPrefService(PrefService* pref_service); - - // Stop following the safe browsing preference on |pref_service|. - void RemovePrefService(PrefService* pref_service); - - // Checks if any profile is currently using the safe browsing service, and - // starts or stops the service accordingly. - void RefreshState(); - - void OnSendDownloadRecoveryReport(const std::string& report); - - // The factory used to instanciate a SafeBrowsingService object. - // Useful for tests, so they can provide their own implementation of - // SafeBrowsingService. - static SafeBrowsingServiceFactory* factory_; - - // The SafeBrowsingURLRequestContextGetter used to access - // |url_request_context_|. Accessed on UI thread. - scoped_refptr<SafeBrowsingURLRequestContextGetter> - url_request_context_getter_; - - // Provides phishing and malware statistics. Accessed on IO thread. - SafeBrowsingPingManager* ping_manager_; - - // Whether the service is running. 'enabled_' is used by SafeBrowsingService - // on the IO thread during normal operations. - bool enabled_; - - // Whether SafeBrowsing is enabled by the current set of profiles. - // Accessed on UI thread. - bool enabled_by_prefs_; - - // Tracks existing PrefServices, and the safe browsing preference on each. - // This is used to determine if any profile is currently using the safe - // browsing service, and to start it up or shut it down accordingly. - // Accessed on UI thread. - std::map<PrefService*, PrefChangeRegistrar*> prefs_map_; - - // Callbacks when SafeBrowsing state might have changed. - // Should only be accessed on the UI thread. - base::CallbackList<void(void)> state_callback_list_; - - // The UI manager handles showing interstitials. Accessed on both UI and IO - // thread. - scoped_refptr<SafeBrowsingUIManager> ui_manager_; - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingService); -}; - -// Factory for creating SafeBrowsingService. Useful for tests. -class SafeBrowsingServiceFactory { - public: - SafeBrowsingServiceFactory() {} - virtual ~SafeBrowsingServiceFactory() {} - virtual SafeBrowsingService* CreateSafeBrowsingService() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceFactory); -}; - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_
diff --git a/ios/chrome/browser/safe_browsing/ui_manager.h b/ios/chrome/browser/safe_browsing/ui_manager.h deleted file mode 100644 index 1111614..0000000 --- a/ios/chrome/browser/safe_browsing/ui_manager.h +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// The Safe Browsing service is responsible for downloading anti-phishing and -// anti-malware tables and checking urls against them. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_UI_MANAGER_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_UI_MANAGER_H_ - -#include <string> -#include <vector> - -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list.h" -#include "base/time/time.h" -#include "ios/chrome/browser/safe_browsing/hit_report.h" -#include "ios/chrome/browser/safe_browsing/util.h" -#include "url/gurl.h" - -namespace base { -class Thread; -} // namespace base - -namespace net { -class SSLInfo; -} // namespace net - -namespace web { -class WebState; -} // namespace web - -namespace safe_browsing { - -class SafeBrowsingService; - -// Construction needs to happen on the main thread. -class SafeBrowsingUIManager - : public base::RefCountedThreadSafe<SafeBrowsingUIManager> { - public: - // Passed a boolean indicating whether or not it is OK to proceed with - // loading an URL. - typedef base::Callback<void(bool /*proceed*/)> UrlCheckCallback; - - // Structure used to pass parameters between the IO and UI thread when - // interacting with the blocking page. - struct UnsafeResource { - UnsafeResource(); - ~UnsafeResource(); - - bool IsMainPageLoadBlocked() const; - - GURL url; - GURL original_url; - std::vector<GURL> redirect_urls; - bool is_subresource; - bool is_subframe; - SBThreatType threat_type; - std::string threat_metadata; - UrlCheckCallback callback; // This is called back on |callback_thread|. - scoped_refptr<base::SingleThreadTaskRunner> callback_thread; - base::WeakPtr<web::WebState> weak_web_state; - safe_browsing::ThreatSource threat_source; - }; - - // Observer class can be used to get notified when a SafeBrowsing hit - // was found. - class Observer { - public: - // The |resource| was classified as unsafe by SafeBrowsing, and is - // not whitelisted. - // The |resource| must not be accessed after OnSafeBrowsingHit returns. - // This method will be called on the UI thread. - virtual void OnSafeBrowsingHit(const UnsafeResource& resource) = 0; - - protected: - Observer() {} - virtual ~Observer() {} - - private: - DISALLOW_COPY_AND_ASSIGN(Observer); - }; - - explicit SafeBrowsingUIManager( - const scoped_refptr<SafeBrowsingService>& service); - - // Called to stop or shutdown operations on the io_thread. This may be called - // multiple times during the life of the UIManager. Should be called - // on IO thread. If shutdown is true, the manager is disabled permanently. - void StopOnIOThread(bool shutdown); - - // Called on the UI thread to display an interstitial page. - // |url| is the url of the resource that matches a safe browsing list. - // If the request contained a chain of redirects, |url| is the last url - // in the chain, and |original_url| is the first one (the root of the - // chain). Otherwise, |original_url| = |url|. - virtual void DisplayBlockingPage(const UnsafeResource& resource); - - // Returns true if we already displayed an interstitial for that top-level - // site in a given WebContents. Called on the UI thread. - bool IsWhitelisted(const UnsafeResource& resource); - - // The blocking page on the UI thread has completed. - void OnBlockingPageDone(const std::vector<UnsafeResource>& resources, - bool proceed); - - // Log the user perceived delay caused by SafeBrowsing. This delay is the time - // delta starting from when we would have started reading data from the - // network, and ending when the SafeBrowsing check completes indicating that - // the current page is 'safe'. - void LogPauseDelay(base::TimeDelta time); - - // Called on the IO thread by the ThreatDetails with the serialized - // protocol buffer, so the service can send it over. - virtual void SendSerializedThreatDetails(const std::string& serialized); - - // Report hits to the unsafe contents (malware, phishing, unsafe download URL) - // to the server. Can only be called on UI thread. If |post_data| is - // non-empty, the request will be sent as a POST instead of a GET. - // Will report only for UMA || is_extended_reporting. - virtual void MaybeReportSafeBrowsingHit( - const safe_browsing::HitReport& hit_report); - - // Report an invalid TLS/SSL certificate chain to the server. Can only - // be called on UI thread. - void ReportInvalidCertificateChain(const std::string& serialized_report, - const base::Closure& callback); - - // Add and remove observers. These methods must be invoked on the UI thread. - void AddObserver(Observer* observer); - void RemoveObserver(Observer* remove); - - protected: - virtual ~SafeBrowsingUIManager(); - - private: - friend class base::RefCountedThreadSafe<SafeBrowsingUIManager>; - - // Call protocol manager on IO thread to report hits of unsafe contents. - void ReportSafeBrowsingHitOnIOThread( - const safe_browsing::HitReport& hit_report); - - // Sends an invalid certificate chain report over the network. - void ReportInvalidCertificateChainOnIOThread( - const std::string& serialized_report); - - // Updates the whitelist state. Called on the UI thread. - void AddToWhitelist(const UnsafeResource& resource); - - // Safebrowsing service. - scoped_refptr<SafeBrowsingService> sb_service_; - - base::ObserverList<Observer> observer_list_; - - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingUIManager); -}; - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_UI_MANAGER_H_
diff --git a/ios/chrome/browser/safe_browsing/ui_manager.mm b/ios/chrome/browser/safe_browsing/ui_manager.mm deleted file mode 100644 index 884d642..0000000 --- a/ios/chrome/browser/safe_browsing/ui_manager.mm +++ /dev/null
@@ -1,336 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/ui_manager.h" - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback.h" -#include "base/debug/leak_tracker.h" -#include "base/macros.h" -#include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "base/threading/thread.h" -#include "base/threading/thread_restrictions.h" -#include "components/prefs/pref_service.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/pref_names.h" -#include "ios/chrome/browser/safe_browsing/metadata.pb.h" -#include "ios/chrome/browser/safe_browsing/ping_manager.h" -#include "ios/chrome/browser/safe_browsing/safe_browsing_blocking_page.h" -#include "ios/chrome/browser/safe_browsing/safe_browsing_service.h" -#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" -#include "ios/web/public/navigation_item.h" -#import "ios/web/public/navigation_manager.h" -#include "ios/web/public/web_state/web_state.h" -#include "ios/web/public/web_thread.h" -#include "net/base/registry_controlled_domains/registry_controlled_domain.h" -#include "net/ssl/ssl_info.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_getter.h" - -namespace { - -const void* const kWhitelistKey = &kWhitelistKey; - -class WhitelistUrlSet : public base::SupportsUserData::Data { - public: - WhitelistUrlSet() {} - - bool Contains(const GURL url) { - auto iter = set_.find(url.GetWithEmptyPath()); - return iter != set_.end(); - } - - void Insert(const GURL url) { set_.insert(url.GetWithEmptyPath()); } - - private: - std::set<GURL> set_; - - DISALLOW_COPY_AND_ASSIGN(WhitelistUrlSet); -}; - -web::NavigationItem* GetActiveItemForNavigationManager( - web::NavigationManager* navigation_manager) { - web::NavigationItem* active_item = navigation_manager->GetTransientItem(); - if (!active_item) - active_item = navigation_manager->GetPendingItem(); - if (!active_item) - active_item = navigation_manager->GetLastCommittedItem(); - return active_item; -} - -} // namespace - -namespace safe_browsing { - -// SafeBrowsingUIManager::UnsafeResource --------------------------------------- - -SafeBrowsingUIManager::UnsafeResource::UnsafeResource() - : is_subresource(false), - threat_type(SB_THREAT_TYPE_SAFE), - threat_source(safe_browsing::ThreatSource::UNKNOWN) {} - -SafeBrowsingUIManager::UnsafeResource::~UnsafeResource() {} - -bool SafeBrowsingUIManager::UnsafeResource::IsMainPageLoadBlocked() const { - // Subresource hits cannot happen until after main page load is committed. - if (is_subresource) - return false; - - // Client-side phishing detection interstitials never block the main frame - // load, since they happen after the page is finished loading. - if (threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || - threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { - return false; - } - - return true; -} - -// SafeBrowsingUIManager ------------------------------------------------------- - -SafeBrowsingUIManager::SafeBrowsingUIManager( - const scoped_refptr<SafeBrowsingService>& service) - : sb_service_(service) {} - -SafeBrowsingUIManager::~SafeBrowsingUIManager() {} - -void SafeBrowsingUIManager::StopOnIOThread(bool shutdown) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - if (shutdown) - sb_service_ = nullptr; -} - -void SafeBrowsingUIManager::LogPauseDelay(base::TimeDelta time) { - UMA_HISTOGRAM_LONG_TIMES("SB2.Delay", time); -} - -void SafeBrowsingUIManager::OnBlockingPageDone( - const std::vector<UnsafeResource>& resources, - bool proceed) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - for (const auto& resource : resources) { - if (!resource.callback.is_null()) { - DCHECK(resource.callback_thread); - resource.callback_thread->PostTask( - FROM_HERE, base::Bind(resource.callback, proceed)); - } - - if (proceed) - AddToWhitelist(resource); - } -} - -void SafeBrowsingUIManager::DisplayBlockingPage( - const UnsafeResource& resource) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - if (resource.is_subresource && !resource.is_subframe) { - // Sites tagged as serving Unwanted Software should only show a warning for - // main-frame or sub-frame resource. Similar warning restrictions should be - // applied to malware sites tagged as "landing sites" (see "Types of - // Malware sites" under - // https://developers.google.com/safe-browsing/developers_guide_v3#UserWarnings). - MalwarePatternType proto; - if (resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED || - (resource.threat_type == SB_THREAT_TYPE_URL_MALWARE && - !resource.threat_metadata.empty() && - proto.ParseFromString(resource.threat_metadata) && - proto.pattern_type() == MalwarePatternType::LANDING)) { - if (!resource.callback.is_null()) { - DCHECK(resource.callback_thread); - resource.callback_thread->PostTask(FROM_HERE, - base::Bind(resource.callback, true)); - } - - return; - } - } - - // The tab might have been closed. If it was closed, just act as if "Don't - // Proceed" had been chosen. - web::WebState* web_state = resource.weak_web_state.get(); - if (!web_state) { - std::vector<UnsafeResource> resources; - resources.push_back(resource); - OnBlockingPageDone(resources, false); - return; - } - - // Check if the user has already ignored a SB warning for the same WebState - // and top-level domain. - if (IsWhitelisted(resource)) { - if (!resource.callback.is_null()) { - DCHECK(resource.callback_thread); - resource.callback_thread->PostTask(FROM_HERE, - base::Bind(resource.callback, true)); - } - return; - } - - if (resource.threat_type != SB_THREAT_TYPE_SAFE) { - HitReport hit_report; - hit_report.malicious_url = resource.url; - hit_report.page_url = web_state->GetVisibleURL(); - hit_report.is_subresource = resource.is_subresource; - hit_report.threat_type = resource.threat_type; - hit_report.threat_source = resource.threat_source; - - web::NavigationItem* item = - GetActiveItemForNavigationManager(web_state->GetNavigationManager()); - if (item) { - hit_report.referrer_url = item->GetReferrer().url; - } - - // When the malicious url is on the main frame, and resource.original_url - // is not the same as the resource.url, that means we have a redirect from - // resource.original_url to resource.url. - // Also, at this point, page_url points to the _previous_ page that we - // were on. We replace page_url with resource.original_url and referrer - // with page_url. - if (!resource.is_subresource && !resource.original_url.is_empty() && - resource.original_url != resource.url) { - hit_report.referrer_url = hit_report.page_url; - hit_report.page_url = resource.original_url; - } - - ios::ChromeBrowserState* browser_state = - ios::ChromeBrowserState::FromBrowserState(web_state->GetBrowserState()); - hit_report.is_extended_reporting = - browser_state && - browser_state->GetPrefs()->GetBoolean( - prefs::kSafeBrowsingExtendedReportingEnabled); - hit_report.is_metrics_reporting_active = - safe_browsing::IsMetricsReportingActive(); - - MaybeReportSafeBrowsingHit(hit_report); - } - - if (resource.threat_type != SB_THREAT_TYPE_SAFE) { - FOR_EACH_OBSERVER(Observer, observer_list_, OnSafeBrowsingHit(resource)); - } - SafeBrowsingBlockingPage::ShowBlockingPage(web_state, this, resource); -} - -// A safebrowsing hit is sent after a blocking page for malware/phishing -// or after the warning dialog for download urls, only for -// UMA || extended_reporting users. -void SafeBrowsingUIManager::MaybeReportSafeBrowsingHit( - const HitReport& hit_report) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - - // Decide if we should send this report. - if (hit_report.is_metrics_reporting_active || - hit_report.is_extended_reporting) { - web::WebThread::PostTask( - web::WebThread::IO, FROM_HERE, - base::Bind(&SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread, - this, hit_report)); - } -} - -void SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread( - const HitReport& hit_report) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - // The service may delete the ping manager (i.e. when user disabling service, - // etc). This happens on the IO thread. - if (!sb_service_ || !sb_service_->ping_manager()) - return; - - DVLOG(1) << "ReportSafeBrowsingHit: " << hit_report.malicious_url << " " - << hit_report.page_url << " " << hit_report.referrer_url << " " - << hit_report.is_subresource << " " << hit_report.threat_type; - sb_service_->ping_manager()->ReportSafeBrowsingHit(hit_report); -} - -void SafeBrowsingUIManager::ReportInvalidCertificateChain( - const std::string& serialized_report, - const base::Closure& callback) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - web::WebThread::PostTaskAndReply( - web::WebThread::IO, FROM_HERE, - base::Bind( - &SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread, this, - serialized_report), - callback); -} - -void SafeBrowsingUIManager::AddObserver(Observer* observer) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - observer_list_.AddObserver(observer); -} - -void SafeBrowsingUIManager::RemoveObserver(Observer* observer) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - observer_list_.RemoveObserver(observer); -} - -void SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread( - const std::string& serialized_report) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - // The service may delete the ping manager (i.e. when user disabling service, - // etc). This happens on the IO thread. - if (!sb_service_ || !sb_service_->ping_manager()) - return; - - sb_service_->ping_manager()->ReportInvalidCertificateChain(serialized_report); -} - -// If the user had opted-in to send ThreatDetails, this gets called -// when the report is ready. -void SafeBrowsingUIManager::SendSerializedThreatDetails( - const std::string& serialized) { - DCHECK_CURRENTLY_ON(web::WebThread::IO); - - // The service may delete the ping manager (i.e. when user disabling service, - // etc). This happens on the IO thread. - if (sb_service_.get() == nullptr || sb_service_->ping_manager() == nullptr) - return; - - if (!serialized.empty()) { - DVLOG(1) << "Sending serialized threat details."; - sb_service_->ping_manager()->ReportThreatDetails(serialized); - } -} - -// Whitelist this domain in the current WebState. Either add the -// domain to an existing WhitelistUrlSet, or create a new WhitelistUrlSet. -void SafeBrowsingUIManager::AddToWhitelist(const UnsafeResource& resource) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - DCHECK(resource.weak_web_state.get()); - - web::WebState* web_state = resource.weak_web_state.get(); - WhitelistUrlSet* site_list = - static_cast<WhitelistUrlSet*>(web_state->GetUserData(kWhitelistKey)); - if (!site_list) { - site_list = new WhitelistUrlSet; - web_state->SetUserData(kWhitelistKey, site_list); - } - - GURL whitelisted_url(resource.is_subresource ? web_state->GetVisibleURL() - : resource.url); - site_list->Insert(whitelisted_url); -} - -// Check if the user has already ignored a SB warning for this WebState and -// top-level domain. -bool SafeBrowsingUIManager::IsWhitelisted(const UnsafeResource& resource) { - DCHECK_CURRENTLY_ON(web::WebThread::UI); - DCHECK(resource.weak_web_state.get()); - - web::WebState* web_state = resource.weak_web_state.get(); - GURL maybe_whitelisted_url( - resource.is_subresource ? web_state->GetVisibleURL() : resource.url); - WhitelistUrlSet* site_list = - static_cast<WhitelistUrlSet*>(web_state->GetUserData(kWhitelistKey)); - if (!site_list) - return false; - return site_list->Contains(maybe_whitelisted_url); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/util.cc b/ios/chrome/browser/safe_browsing/util.cc deleted file mode 100644 index 34052cb..0000000 --- a/ios/chrome/browser/safe_browsing/util.cc +++ /dev/null
@@ -1,395 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/safe_browsing/util.h" - -#include <stddef.h> - -#include "base/macros.h" -#include "base/strings/string_util.h" -#include "crypto/sha2.h" -#include "net/base/escape.h" -#include "url/gurl.h" -#include "url/url_util.h" - -namespace safe_browsing { - -// Utility functions ----------------------------------------------------------- - -namespace { -bool IsKnownList(const std::string& name) { - for (size_t i = 0; i < arraysize(kAllLists); ++i) { - if (!strcmp(kAllLists[i], name.c_str())) { - return true; - } - } - return false; -} -} // namespace - -// SBCachedFullHashResult ------------------------------------------------------ - -SBCachedFullHashResult::SBCachedFullHashResult() {} - -SBCachedFullHashResult::SBCachedFullHashResult( - const base::Time& in_expire_after) - : expire_after(in_expire_after) {} - -SBCachedFullHashResult::~SBCachedFullHashResult() {} - -// Listnames that browser can process. -const char kMalwareList[] = "goog-malware-shavar"; -const char kPhishingList[] = "goog-phish-shavar"; -const char kBinUrlList[] = "goog-badbinurl-shavar"; -const char kCsdWhiteList[] = "goog-csdwhite-sha256"; -const char kDownloadWhiteList[] = "goog-downloadwhite-digest256"; -const char kExtensionBlacklist[] = "goog-badcrxids-digestvar"; -const char kIPBlacklist[] = "goog-badip-digest256"; -const char kUnwantedUrlList[] = "goog-unwanted-shavar"; -const char kInclusionWhitelist[] = "goog-csdinclusionwhite-sha256"; - -const char* kAllLists[9] = { - kMalwareList, kPhishingList, kBinUrlList, - kCsdWhiteList, kDownloadWhiteList, kExtensionBlacklist, - kIPBlacklist, kUnwantedUrlList, kInclusionWhitelist, -}; - -ListType GetListId(const base::StringPiece& name) { - ListType id; - if (name == kMalwareList) { - id = MALWARE; - } else if (name == kPhishingList) { - id = PHISH; - } else if (name == kBinUrlList) { - id = BINURL; - } else if (name == kCsdWhiteList) { - id = CSDWHITELIST; - } else if (name == kDownloadWhiteList) { - id = DOWNLOADWHITELIST; - } else if (name == kExtensionBlacklist) { - id = EXTENSIONBLACKLIST; - } else if (name == kIPBlacklist) { - id = IPBLACKLIST; - } else if (name == kUnwantedUrlList) { - id = UNWANTEDURL; - } else if (name == kInclusionWhitelist) { - id = INCLUSIONWHITELIST; - } else { - id = INVALID; - } - return id; -} - -bool GetListName(ListType list_id, std::string* list) { - switch (list_id) { - case MALWARE: - *list = kMalwareList; - break; - case PHISH: - *list = kPhishingList; - break; - case BINURL: - *list = kBinUrlList; - break; - case CSDWHITELIST: - *list = kCsdWhiteList; - break; - case DOWNLOADWHITELIST: - *list = kDownloadWhiteList; - break; - case EXTENSIONBLACKLIST: - *list = kExtensionBlacklist; - break; - case IPBLACKLIST: - *list = kIPBlacklist; - break; - case UNWANTEDURL: - *list = kUnwantedUrlList; - break; - case INCLUSIONWHITELIST: - *list = kInclusionWhitelist; - break; - default: - return false; - } - DCHECK(IsKnownList(*list)); - return true; -} - -SBFullHash SBFullHashForString(const base::StringPiece& str) { - SBFullHash h; - crypto::SHA256HashString(str, &h.full_hash, sizeof(h.full_hash)); - return h; -} - -SBFullHash StringToSBFullHash(const std::string& hash_in) { - DCHECK_EQ(crypto::kSHA256Length, hash_in.size()); - SBFullHash hash_out; - memcpy(hash_out.full_hash, hash_in.data(), crypto::kSHA256Length); - return hash_out; -} - -std::string SBFullHashToString(const SBFullHash& hash) { - DCHECK_EQ(crypto::kSHA256Length, sizeof(hash.full_hash)); - return std::string(hash.full_hash, sizeof(hash.full_hash)); -} - -std::string Unescape(const std::string& url) { - std::string unescaped_str(url); - const int kMaxLoopIterations = 1024; - size_t old_size = 0; - int loop_var = 0; - do { - old_size = unescaped_str.size(); - unescaped_str = net::UnescapeURLComponent( - unescaped_str, - net::UnescapeRule::SPOOFING_AND_CONTROL_CHARS | - net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS | - net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); - } while (old_size != unescaped_str.size() && - ++loop_var <= kMaxLoopIterations); - - return unescaped_str; -} - -std::string Escape(const std::string& url) { - std::string escaped_str; - // The escaped string is larger so allocate double the length to reduce the - // chance of the string being grown. - escaped_str.reserve(url.length() * 2); - const char* kHexString = "0123456789ABCDEF"; - for (size_t i = 0; i < url.length(); i++) { - unsigned char c = static_cast<unsigned char>(url[i]); - if (c <= ' ' || c > '~' || c == '#' || c == '%') { - escaped_str += '%'; - escaped_str += kHexString[c >> 4]; - escaped_str += kHexString[c & 0xf]; - } else { - escaped_str += c; - } - } - - return escaped_str; -} - -std::string RemoveConsecutiveChars(base::StringPiece str, const char c) { - std::string output; - // Output is at most the length of the original string. - output.reserve(str.size()); - - size_t i = 0; - while (i < str.size()) { - output.append(1, str[i++]); - if (str[i - 1] == c) { - while (i < str.size() && str[i] == c) { - i++; - } - } - } - - return output; -} - -// Canonicalizes url as per Google Safe Browsing Specification. -// See section 6.1 in -// http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec. -void CanonicalizeUrl(const GURL& url, - std::string* canonicalized_hostname, - std::string* canonicalized_path, - std::string* canonicalized_query) { - DCHECK(url.is_valid()); - - // We only canonicalize "normal" URLs. - if (!url.IsStandard()) - return; - - // Following canonicalization steps are excluded since url parsing takes care - // of those :- - // 1. Remove any tab (0x09), CR (0x0d), and LF (0x0a) chars from url. - // (Exclude escaped version of these chars). - // 2. Normalize hostname to 4 dot-seperated decimal values. - // 3. Lowercase hostname. - // 4. Resolve path sequences "/../" and "/./". - - // That leaves us with the following :- - // 1. Remove fragment in URL. - GURL url_without_fragment; - GURL::Replacements f_replacements; - f_replacements.ClearRef(); - f_replacements.ClearUsername(); - f_replacements.ClearPassword(); - url_without_fragment = url.ReplaceComponents(f_replacements); - - // 2. Do URL unescaping until no more hex encoded characters exist. - std::string url_unescaped_str(Unescape(url_without_fragment.spec())); - url::Parsed parsed; - url::ParseStandardURL(url_unescaped_str.data(), url_unescaped_str.length(), - &parsed); - - // 3. In hostname, remove all leading and trailing dots. - base::StringPiece host; - if (parsed.host.len > 0) - host.set(url_unescaped_str.data() + parsed.host.begin, parsed.host.len); - - base::StringPiece host_without_end_dots = - base::TrimString(host, ".", base::TrimPositions::TRIM_ALL); - - // 4. In hostname, replace consecutive dots with a single dot. - std::string host_without_consecutive_dots( - RemoveConsecutiveChars(host_without_end_dots, '.')); - - // 5. In path, replace runs of consecutive slashes with a single slash. - base::StringPiece path; - if (parsed.path.len > 0) - path.set(url_unescaped_str.data() + parsed.path.begin, parsed.path.len); - std::string path_without_consecutive_slash(RemoveConsecutiveChars(path, '/')); - - url::Replacements<char> hp_replacements; - hp_replacements.SetHost( - host_without_consecutive_dots.data(), - url::Component(0, host_without_consecutive_dots.length())); - hp_replacements.SetPath( - path_without_consecutive_slash.data(), - url::Component(0, path_without_consecutive_slash.length())); - - std::string url_unescaped_with_can_hostpath; - url::StdStringCanonOutput output(&url_unescaped_with_can_hostpath); - url::Parsed temp_parsed; - url::ReplaceComponents(url_unescaped_str.data(), url_unescaped_str.length(), - parsed, hp_replacements, NULL, &output, &temp_parsed); - output.Complete(); - - // 6. Step needed to revert escaping done in url::ReplaceComponents. - url_unescaped_with_can_hostpath = Unescape(url_unescaped_with_can_hostpath); - - // 7. After performing all above steps, percent-escape all chars in url which - // are <= ASCII 32, >= 127, #, %. Escapes must be uppercase hex characters. - std::string escaped_canon_url_str(Escape(url_unescaped_with_can_hostpath)); - url::Parsed final_parsed; - url::ParseStandardURL(escaped_canon_url_str.data(), - escaped_canon_url_str.length(), &final_parsed); - - if (canonicalized_hostname && final_parsed.host.len > 0) { - *canonicalized_hostname = escaped_canon_url_str.substr( - final_parsed.host.begin, final_parsed.host.len); - } - if (canonicalized_path && final_parsed.path.len > 0) { - *canonicalized_path = escaped_canon_url_str.substr(final_parsed.path.begin, - final_parsed.path.len); - } - if (canonicalized_query && final_parsed.query.len > 0) { - *canonicalized_query = escaped_canon_url_str.substr( - final_parsed.query.begin, final_parsed.query.len); - } -} - -void UrlToFullHashes(const GURL& url, - bool include_whitelist_hashes, - std::vector<SBFullHash>* full_hashes) { - std::vector<std::string> hosts; - if (url.HostIsIPAddress()) { - hosts.push_back(url.host()); - } else { - GenerateHostsToCheck(url, &hosts); - } - - std::vector<std::string> paths; - GeneratePathsToCheck(url, &paths); - - for (const std::string& host : hosts) { - for (const std::string& path : paths) { - full_hashes->push_back(SBFullHashForString(host + path)); - - // We may have /foo as path-prefix in the whitelist which should - // also match with /foo/bar and /foo?bar. Hence, for every path - // that ends in '/' we also add the path without the slash. - if (include_whitelist_hashes && path.size() > 1 && - path[path.size() - 1] == '/') { - full_hashes->push_back( - SBFullHashForString(host + path.substr(0, path.size() - 1))); - } - } - } -} - -void GenerateHostsToCheck(const GURL& url, std::vector<std::string>* hosts) { - hosts->clear(); - - std::string canon_host; - CanonicalizeUrl(url, &canon_host, NULL, NULL); - - const std::string host = canon_host; // const sidesteps GCC bugs below! - if (host.empty()) - return; - - // Per the Safe Browsing Protocol v2 spec, we try the host, and also up to 4 - // hostnames formed by starting with the last 5 components and successively - // removing the leading component. The last component isn't examined alone, - // since it's the TLD or a subcomponent thereof. - // - // Note that we don't need to be clever about stopping at the "real" eTLD -- - // the data on the server side has been filtered to ensure it will not - // blacklist a whole TLD, and it's not significantly slower on our side to - // just check too much. - // - // Also note that because we have a simple blacklist, not some sort of complex - // whitelist-in-blacklist or vice versa, it doesn't matter what order we check - // these in. - const size_t kMaxHostsToCheck = 4; - bool skipped_last_component = false; - for (std::string::const_reverse_iterator i(host.rbegin()); - i != host.rend() && hosts->size() < kMaxHostsToCheck; ++i) { - if (*i == '.') { - if (skipped_last_component) - hosts->push_back(std::string(i.base(), host.end())); - else - skipped_last_component = true; - } - } - hosts->push_back(host); -} - -void GeneratePathsToCheck(const GURL& url, std::vector<std::string>* paths) { - paths->clear(); - - std::string canon_path; - std::string canon_query; - CanonicalizeUrl(url, NULL, &canon_path, &canon_query); - - const std::string path = canon_path; // const sidesteps GCC bugs below! - const std::string query = canon_query; - if (path.empty()) - return; - - // Per the Safe Browsing Protocol v2 spec, we try the exact path with/without - // the query parameters, and also up to 4 paths formed by starting at the root - // and adding more path components. - // - // As with the hosts above, it doesn't matter what order we check these in. - const size_t kMaxPathsToCheck = 4; - for (std::string::const_iterator i(path.begin()); - i != path.end() && paths->size() < kMaxPathsToCheck; ++i) { - if (*i == '/') - paths->push_back(std::string(path.begin(), i + 1)); - } - - if (!paths->empty() && paths->back() != path) - paths->push_back(path); - - if (!query.empty()) - paths->push_back(path + "?" + query); -} - -void GeneratePatternsToCheck(const GURL& url, std::vector<std::string>* urls) { - std::vector<std::string> hosts, paths; - GenerateHostsToCheck(url, &hosts); - GeneratePathsToCheck(url, &paths); - for (size_t h = 0; h < hosts.size(); ++h) { - for (size_t p = 0; p < paths.size(); ++p) { - urls->push_back(hosts[h] + paths[p]); - } - } -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/safe_browsing/util.h b/ios/chrome/browser/safe_browsing/util.h deleted file mode 100644 index 50552f3..0000000 --- a/ios/chrome/browser/safe_browsing/util.h +++ /dev/null
@@ -1,171 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Utilities for the SafeBrowsing DB code. - -#ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_UTIL_H_ -#define IOS_CHROME_BROWSER_SAFE_BROWSING_UTIL_H_ - -#include <stdint.h> - -#include <cstring> -#include <string> -#include <vector> - -#include "base/strings/string_piece.h" -#include "base/time/time.h" - -class GURL; - -namespace safe_browsing { - -// Different types of threats that SafeBrowsing protects against. -enum SBThreatType { - // No threat at all. - SB_THREAT_TYPE_SAFE, - - // The URL is being used for phishing. - SB_THREAT_TYPE_URL_PHISHING, - - // The URL hosts malware. - SB_THREAT_TYPE_URL_MALWARE, - - // The URL hosts unwanted programs. - SB_THREAT_TYPE_URL_UNWANTED, - - // The download URL is malware. - SB_THREAT_TYPE_BINARY_MALWARE_URL, - - // Url detected by the client-side phishing model. Note that unlike the - // above values, this does not correspond to a downloaded list. - SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL, - - // The Chrome extension or app (given by its ID) is malware. - SB_THREAT_TYPE_EXTENSION, - - // Url detected by the client-side malware IP list. This IP list is part - // of the client side detection model. - SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL, -}; - -// A truncated hash's type. -typedef uint32_t SBPrefix; - -// A full hash. -union SBFullHash { - char full_hash[32]; - SBPrefix prefix; -}; - -// Used when we get a gethash response. -struct SBFullHashResult { - SBFullHash hash; - // TODO(shess): Refactor to allow ListType here. - int list_id; - std::string metadata; -}; - -// Caches individual response from GETHASH request. -struct SBCachedFullHashResult { - SBCachedFullHashResult(); - explicit SBCachedFullHashResult(const base::Time& in_expire_after); - ~SBCachedFullHashResult(); - - base::Time expire_after; - std::vector<SBFullHashResult> full_hashes; -}; - -// SafeBrowsing list names. -extern const char kMalwareList[]; -extern const char kPhishingList[]; -// Binary Download list name. -extern const char kBinUrlList[]; -// SafeBrowsing client-side detection whitelist list name. -extern const char kCsdWhiteList[]; -// SafeBrowsing download whitelist list name. -extern const char kDownloadWhiteList[]; -// SafeBrowsing extension list name. -extern const char kExtensionBlacklist[]; -// SafeBrowsing csd malware IP blacklist name. -extern const char kIPBlacklist[]; -// SafeBrowsing unwanted URL list. -extern const char kUnwantedUrlList[]; -// SafeBrowsing off-domain inclusion whitelist list name. -extern const char kInclusionWhitelist[]; -// This array must contain all Safe Browsing lists. -extern const char* kAllLists[9]; - -enum ListType { - INVALID = -1, - MALWARE = 0, - PHISH = 1, - BINURL = 2, - // Obsolete BINHASH = 3, - CSDWHITELIST = 4, - // SafeBrowsing lists are stored in pairs. Keep ListType 5 - // available for a potential second list that we would store in the - // csd-whitelist store file. - DOWNLOADWHITELIST = 6, - // See above comment. Leave 7 available. - EXTENSIONBLACKLIST = 8, - // See above comment. Leave 9 available. - // Obsolete SIDEEFFECTFREEWHITELIST = 10, - // See above comment. Leave 11 available. - IPBLACKLIST = 12, - // See above comment. Leave 13 available. - UNWANTEDURL = 14, - // See above comment. Leave 15 available. - INCLUSIONWHITELIST = 16, - // See above comment. Leave 17 available. -}; - -inline bool SBFullHashEqual(const SBFullHash& a, const SBFullHash& b) { - return !memcmp(a.full_hash, b.full_hash, sizeof(a.full_hash)); -} - -inline bool SBFullHashLess(const SBFullHash& a, const SBFullHash& b) { - return memcmp(a.full_hash, b.full_hash, sizeof(a.full_hash)) < 0; -} - -// Generate full hash for the given string. -SBFullHash SBFullHashForString(const base::StringPiece& str); -SBFullHash StringToSBFullHash(const std::string& hash_in); -std::string SBFullHashToString(const SBFullHash& hash_out); - -// Maps a list name to ListType. -ListType GetListId(const base::StringPiece& name); - -// Maps a ListId to list name. Return false if fails. -bool GetListName(ListType list_id, std::string* list); - -// Canonicalizes url as per Google Safe Browsing Specification. -// See section 6.1 in -// http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec. -void CanonicalizeUrl(const GURL& url, - std::string* canonicalized_hostname, - std::string* canonicalized_path, - std::string* canonicalized_query); - -// Generate the set of full hashes to check for |url|. If -// |include_whitelist_hashes| is true we will generate additional path-prefixes -// to match against the csd whitelist. E.g., if the path-prefix /foo is on the -// whitelist it should also match /foo/bar which is not the case for all the -// other lists. We'll also always add a pattern for the empty path. -void UrlToFullHashes(const GURL& url, - bool include_whitelist_hashes, - std::vector<SBFullHash>* full_hashes); - -// Given a URL, returns all the hosts we need to check. They are returned -// in order of size (i.e. b.c is first, then a.b.c). -void GenerateHostsToCheck(const GURL& url, std::vector<std::string>* hosts); - -// Given a URL, returns all the paths we need to check. -void GeneratePathsToCheck(const GURL& url, std::vector<std::string>* paths); - -// Given a URL, returns all the patterns we need to check. -void GeneratePatternsToCheck(const GURL& url, std::vector<std::string>* urls); - -} // namespace safe_browsing - -#endif // IOS_CHROME_BROWSER_SAFE_BROWSING_UTIL_H_
diff --git a/ios/chrome/browser/safe_browsing/util_unittest.cc b/ios/chrome/browser/safe_browsing/util_unittest.cc deleted file mode 100644 index 01da998..0000000 --- a/ios/chrome/browser/safe_browsing/util_unittest.cc +++ /dev/null
@@ -1,237 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stddef.h> - -#include <algorithm> - -#include "base/macros.h" -#include "base/strings/stringprintf.h" -#include "ios/chrome/browser/safe_browsing/util.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace safe_browsing { - -namespace { - -bool VectorContains(const std::vector<std::string>& data, - const std::string& str) { - return std::find(data.begin(), data.end(), str) != data.end(); -} - -} // namespace - -// Tests that we generate the required host/path combinations for testing -// according to the Safe Browsing spec. -// See section 6.2 in -// http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec. -TEST(SafeBrowsingDbUtilTest, UrlParsing) { - std::vector<std::string> hosts, paths; - - GURL url("http://a.b.c/1/2.html?param=1"); - GenerateHostsToCheck(url, &hosts); - GeneratePathsToCheck(url, &paths); - EXPECT_EQ(hosts.size(), static_cast<size_t>(2)); - EXPECT_EQ(paths.size(), static_cast<size_t>(4)); - EXPECT_EQ(hosts[0], "b.c"); - EXPECT_EQ(hosts[1], "a.b.c"); - - EXPECT_TRUE(VectorContains(paths, "/1/2.html?param=1")); - EXPECT_TRUE(VectorContains(paths, "/1/2.html")); - EXPECT_TRUE(VectorContains(paths, "/1/")); - EXPECT_TRUE(VectorContains(paths, "/")); - - url = GURL("http://a.b.c.d.e.f.g/1.html"); - GenerateHostsToCheck(url, &hosts); - GeneratePathsToCheck(url, &paths); - EXPECT_EQ(hosts.size(), static_cast<size_t>(5)); - EXPECT_EQ(paths.size(), static_cast<size_t>(2)); - EXPECT_EQ(hosts[0], "f.g"); - EXPECT_EQ(hosts[1], "e.f.g"); - EXPECT_EQ(hosts[2], "d.e.f.g"); - EXPECT_EQ(hosts[3], "c.d.e.f.g"); - EXPECT_EQ(hosts[4], "a.b.c.d.e.f.g"); - EXPECT_TRUE(VectorContains(paths, "/1.html")); - EXPECT_TRUE(VectorContains(paths, "/")); - - url = GURL("http://a.b/saw-cgi/eBayISAPI.dll/"); - GeneratePathsToCheck(url, &paths); - EXPECT_EQ(paths.size(), static_cast<size_t>(3)); - EXPECT_TRUE(VectorContains(paths, "/saw-cgi/eBayISAPI.dll/")); - EXPECT_TRUE(VectorContains(paths, "/saw-cgi/")); - EXPECT_TRUE(VectorContains(paths, "/")); -} - -// Tests the url canonicalization according to the Safe Browsing spec. -// See section 6.1 in -// http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec. -TEST(SafeBrowsingDbUtilTest, CanonicalizeUrl) { - struct { - const char* input_url; - const char* expected_canonicalized_hostname; - const char* expected_canonicalized_path; - const char* expected_canonicalized_query; - } tests[] = { - {"http://host/%25%32%35", "host", "/%25", ""}, - {"http://host/%25%32%35%25%32%35", "host", "/%25%25", ""}, - {"http://host/%2525252525252525", "host", "/%25", ""}, - {"http://host/asdf%25%32%35asd", "host", "/asdf%25asd", ""}, - {"http://host/%%%25%32%35asd%%", "host", "/%25%25%25asd%25%25", ""}, - {"http://host/%%%25%32%35asd%%", "host", "/%25%25%25asd%25%25", ""}, - {"http://www.google.com/", "www.google.com", "/", ""}, - {"http://%31%36%38%2e%31%38%38%2e%39%39%2e%32%36/%2E%73%65%63%75%72%65/" - "%77" - "%77%77%2E%65%62%61%79%2E%63%6F%6D/", - "168.188.99.26", "/.secure/www.ebay.com/", ""}, - {"http://195.127.0.11/uploads/%20%20%20%20/.verify/" - ".eBaysecure=updateuserd" - "ataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/", - "195.127.0.11", - "/uploads/%20%20%20%20/.verify/" - ".eBaysecure=updateuserdataxplimnbqmn-xplmv" - "alidateinfoswqpcmlx=hgplmcx/", - ""}, - {"http://host.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A" - "22%252833%252944_55%252B", - "host.com", "/~a!b@c%23d$e%25f^00&11*22(33)44_55+", ""}, - {"http://3279880203/blah", "195.127.0.11", "/blah", ""}, - {"http://www.google.com/blah/..", "www.google.com", "/", ""}, - {"http://www.google.com/blah#fraq", "www.google.com", "/blah", ""}, - {"http://www.GOOgle.com/", "www.google.com", "/", ""}, - {"http://www.google.com.../", "www.google.com", "/", ""}, - {"http://www.google.com/q?", "www.google.com", "/q", ""}, - {"http://www.google.com/q?r?", "www.google.com", "/q", "r?"}, - {"http://www.google.com/q?r?s", "www.google.com", "/q", "r?s"}, - {"http://evil.com/foo#bar#baz", "evil.com", "/foo", ""}, - {"http://evil.com/foo;", "evil.com", "/foo;", ""}, - {"http://evil.com/foo?bar;", "evil.com", "/foo", "bar;"}, - {"http://notrailingslash.com", "notrailingslash.com", "/", ""}, - {"http://www.gotaport.com:1234/", "www.gotaport.com", "/", ""}, - {" http://www.google.com/ ", "www.google.com", "/", ""}, - {"http:// leadingspace.com/", "%20leadingspace.com", "/", ""}, - {"http://%20leadingspace.com/", "%20leadingspace.com", "/", ""}, - {"https://www.securesite.com/", "www.securesite.com", "/", ""}, - {"http://host.com/ab%23cd", "host.com", "/ab%23cd", ""}, - {"http://host%3e.com//twoslashes?more//slashes", "host>.com", - "/twoslashes", "more//slashes"}, - {"http://host.com/abc?val=xyz#anything", "host.com", "/abc", "val=xyz"}, - {"http://abc:def@host.com/xyz", "host.com", "/xyz", ""}, - {"http://host%3e.com/abc/%2e%2e%2fdef", "host>.com", "/def", ""}, - {"http://.......host...com.....//abc/////def%2F%2F%2Fxyz", "host.com", - "/abc/def/xyz", ""}, - {"ftp://host.com/foo?bar", "host.com", "/foo", "bar"}, - {"data:text/html;charset=utf-8,%0D%0A", "", "", ""}, - {"javascript:alert()", "", "", ""}, - {"mailto:abc@example.com", "", "", ""}, - }; - for (size_t i = 0; i < arraysize(tests); ++i) { - SCOPED_TRACE(base::StringPrintf("Test: %s", tests[i].input_url)); - GURL url(tests[i].input_url); - - std::string canonicalized_hostname; - std::string canonicalized_path; - std::string canonicalized_query; - CanonicalizeUrl(url, &canonicalized_hostname, &canonicalized_path, - &canonicalized_query); - - EXPECT_EQ(tests[i].expected_canonicalized_hostname, canonicalized_hostname); - EXPECT_EQ(tests[i].expected_canonicalized_path, canonicalized_path); - EXPECT_EQ(tests[i].expected_canonicalized_query, canonicalized_query); - } -} - -TEST(SafeBrowsingDbUtilTest, UrlToFullHashes) { - std::vector<SBFullHash> results; - GURL url("http://www.evil.com/evil1/evilness.html"); - UrlToFullHashes(url, false, &results); - - EXPECT_EQ(6UL, results.size()); - EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/"), results[0])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("evil.com/evil1/"), results[1])); - EXPECT_TRUE(SBFullHashEqual( - SBFullHashForString("evil.com/evil1/evilness.html"), results[2])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("www.evil.com/"), results[3])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("www.evil.com/evil1/"), results[4])); - EXPECT_TRUE(SBFullHashEqual( - SBFullHashForString("www.evil.com/evil1/evilness.html"), results[5])); - - results.clear(); - GURL url2("http://www.evil.com/evil1/evilness.html"); - UrlToFullHashes(url2, true, &results); - - EXPECT_EQ(8UL, results.size()); - EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/"), results[0])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("evil.com/evil1/"), results[1])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("evil.com/evil1"), results[2])); - EXPECT_TRUE(SBFullHashEqual( - SBFullHashForString("evil.com/evil1/evilness.html"), results[3])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("www.evil.com/"), results[4])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("www.evil.com/evil1/"), results[5])); - EXPECT_TRUE( - SBFullHashEqual(SBFullHashForString("www.evil.com/evil1"), results[6])); - EXPECT_TRUE(SBFullHashEqual( - SBFullHashForString("www.evil.com/evil1/evilness.html"), results[7])); -} - -TEST(SafeBrowsingDbUtilTest, ListIdListNameConversion) { - std::string list_name; - EXPECT_FALSE(GetListName(INVALID, &list_name)); - EXPECT_TRUE(GetListName(MALWARE, &list_name)); - EXPECT_EQ(list_name, std::string(kMalwareList)); - EXPECT_EQ(MALWARE, GetListId(list_name)); - - EXPECT_TRUE(GetListName(PHISH, &list_name)); - EXPECT_EQ(list_name, std::string(kPhishingList)); - EXPECT_EQ(PHISH, GetListId(list_name)); - - EXPECT_TRUE(GetListName(BINURL, &list_name)); - EXPECT_EQ(list_name, std::string(kBinUrlList)); - EXPECT_EQ(BINURL, GetListId(list_name)); -} - -// Since the ids are saved in file, we need to make sure they don't change. -// Since only the last bit of each id is saved in file together with -// chunkids, this checks only last bit. -TEST(SafeBrowsingDbUtilTest, ListIdVerification) { - EXPECT_EQ(0, MALWARE % 2); - EXPECT_EQ(1, PHISH % 2); - EXPECT_EQ(0, BINURL % 2); -} - -TEST(SafeBrowsingDbUtilTest, StringToSBFullHashAndSBFullHashToString) { - // 31 chars plus the last \0 as full_hash. - const std::string hash_in = "12345678902234567890323456789012"; - SBFullHash hash_out = StringToSBFullHash(hash_in); - EXPECT_EQ(0x34333231U, hash_out.prefix); - EXPECT_EQ(0, memcmp(hash_in.data(), hash_out.full_hash, sizeof(SBFullHash))); - - std::string hash_final = SBFullHashToString(hash_out); - EXPECT_EQ(hash_in, hash_final); -} - -TEST(SafeBrowsingDbUtilTest, FullHashOperators) { - const SBFullHash kHash1 = SBFullHashForString("one"); - const SBFullHash kHash2 = SBFullHashForString("two"); - - EXPECT_TRUE(SBFullHashEqual(kHash1, kHash1)); - EXPECT_TRUE(SBFullHashEqual(kHash2, kHash2)); - EXPECT_FALSE(SBFullHashEqual(kHash1, kHash2)); - EXPECT_FALSE(SBFullHashEqual(kHash2, kHash1)); - - EXPECT_FALSE(SBFullHashLess(kHash1, kHash2)); - EXPECT_TRUE(SBFullHashLess(kHash2, kHash1)); - - EXPECT_FALSE(SBFullHashLess(kHash1, kHash1)); - EXPECT_FALSE(SBFullHashLess(kHash2, kHash2)); -} - -} // namespace safe_browsing
diff --git a/ios/chrome/browser/search_engines/template_url_service_factory.cc b/ios/chrome/browser/search_engines/template_url_service_factory.cc index a4d2936..264fe0d 100644 --- a/ios/chrome/browser/search_engines/template_url_service_factory.cc +++ b/ios/chrome/browser/search_engines/template_url_service_factory.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -37,15 +38,16 @@ #endif } -scoped_ptr<KeyedService> BuildTemplateURLService(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildTemplateURLService( + web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new TemplateURLService( + return base::WrapUnique(new TemplateURLService( browser_state->GetPrefs(), - make_scoped_ptr(new ios::UIThreadSearchTermsData(browser_state)), + base::WrapUnique(new ios::UIThreadSearchTermsData(browser_state)), ios::WebDataServiceFactory::GetKeywordWebDataForBrowserState( browser_state, ServiceAccessType::EXPLICIT_ACCESS), - make_scoped_ptr(new ios::TemplateURLServiceClientImpl( + base::WrapUnique(new ios::TemplateURLServiceClientImpl( ios::HistoryServiceFactory::GetForBrowserState( browser_state, ServiceAccessType::EXPLICIT_ACCESS))), ios::GoogleURLTrackerFactory::GetForBrowserState(browser_state), @@ -90,7 +92,8 @@ TemplateURLService::RegisterProfilePrefs(registry); } -scoped_ptr<KeyedService> TemplateURLServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +TemplateURLServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { return BuildTemplateURLService(context); }
diff --git a/ios/chrome/browser/search_engines/template_url_service_factory.h b/ios/chrome/browser/search_engines/template_url_service_factory.h index 36fbf6f5..ac819c8 100644 --- a/ios/chrome/browser/search_engines/template_url_service_factory.h +++ b/ios/chrome/browser/search_engines/template_url_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -42,7 +43,7 @@ // BrowserStateKeyedServiceFactory implementation. void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.cc b/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.cc index 6f176ef..abe148c2 100644 --- a/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.cc +++ b/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/memory/singleton.h" #include "base/threading/sequenced_worker_pool.h" @@ -41,7 +42,7 @@ IOSChromeGCMProfileServiceFactory::~IOSChromeGCMProfileServiceFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeGCMProfileServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { DCHECK(!context->IsOffTheRecord()); @@ -53,14 +54,14 @@ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new gcm::GCMProfileService( + return base::WrapUnique(new gcm::GCMProfileService( browser_state->GetPrefs(), browser_state->GetStatePath(), browser_state->GetRequestContext(), ::GetChannel(), - make_scoped_ptr(new ProfileIdentityProvider( + base::WrapUnique(new ProfileIdentityProvider( ios::SigninManagerFactory::GetForBrowserState(browser_state), OAuth2TokenServiceFactory::GetForBrowserState(browser_state), base::Closure())), - make_scoped_ptr(new gcm::GCMClientFactory), + base::WrapUnique(new gcm::GCMClientFactory), web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), web::WebThread::GetTaskRunnerForThread(web::WebThread::IO), blocking_task_runner));
diff --git a/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.h b/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.h index 93794fcc..edef829 100644 --- a/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.h +++ b/ios/chrome/browser/services/gcm/ios_chrome_gcm_profile_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SERVICES_GCM_IOS_CHROME_GCM_PROFILE_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SERVICES_GCM_IOS_CHROME_GCM_PROFILE_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -39,7 +40,7 @@ ~IOSChromeGCMProfileServiceFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(IOSChromeGCMProfileServiceFactory);
diff --git a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.cc b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.cc index ff57860..b96e022 100644 --- a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.cc +++ b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/sessions/core/persistent_tab_restore_service.h" @@ -12,13 +13,14 @@ namespace { -scoped_ptr<KeyedService> BuildTabRestoreService(web::BrowserState* context) { +std::unique_ptr<KeyedService> BuildTabRestoreService( + web::BrowserState* context) { DCHECK(!context->IsOffTheRecord()); ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new sessions::PersistentTabRestoreService( - make_scoped_ptr(new IOSChromeTabRestoreServiceClient(browser_state)), + return base::WrapUnique(new sessions::PersistentTabRestoreService( + base::WrapUnique(new IOSChromeTabRestoreServiceClient(browser_state)), nullptr)); } @@ -55,7 +57,7 @@ return true; } -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeTabRestoreServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { return BuildTabRestoreService(context);
diff --git a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h index eb7f59cd..73daf12 100644 --- a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h +++ b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_SESSIONS_IOS_CHROME_TAB_RESTORE_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SESSIONS_IOS_CHROME_TAB_RESTORE_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -43,7 +45,7 @@ ~IOSChromeTabRestoreServiceFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; bool ServiceIsNULLWhileTesting() const override;
diff --git a/ios/chrome/browser/share_extension/share_extension_service.h b/ios/chrome/browser/share_extension/share_extension_service.h index df62907..516aa31 100644 --- a/ios/chrome/browser/share_extension/share_extension_service.h +++ b/ios/chrome/browser/share_extension/share_extension_service.h
@@ -5,7 +5,6 @@ #ifndef IOS_INTERNAL_CHROME_BROWSER_SHARE_EXTENSION_SHARE_EXTENSION_SERVICE_H_ #define IOS_INTERNAL_CHROME_BROWSER_SHARE_EXTENSION_SHARE_EXTENSION_SERVICE_H_ -#include "base/memory/scoped_ptr.h" #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "ios/chrome/browser/reading_list/reading_list_model_observer.h"
diff --git a/ios/chrome/browser/share_extension/share_extension_service_factory.cc b/ios/chrome/browser/share_extension/share_extension_service_factory.cc index 04f155b..1bde094 100644 --- a/ios/chrome/browser/share_extension/share_extension_service_factory.cc +++ b/ios/chrome/browser/share_extension/share_extension_service_factory.cc
@@ -41,11 +41,12 @@ ShareExtensionServiceFactory::~ShareExtensionServiceFactory() {} -scoped_ptr<KeyedService> ShareExtensionServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +ShareExtensionServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<ShareExtensionService> share_extension_service( + std::unique_ptr<ShareExtensionService> share_extension_service( new ShareExtensionService( ios::BookmarkModelFactory::GetForBrowserState(chrome_browser_state), ReadingListModelFactory::GetForBrowserState(chrome_browser_state)));
diff --git a/ios/chrome/browser/share_extension/share_extension_service_factory.h b/ios/chrome/browser/share_extension/share_extension_service_factory.h index 9dfa912..1947dce 100644 --- a/ios/chrome/browser/share_extension/share_extension_service_factory.h +++ b/ios/chrome/browser/share_extension/share_extension_service_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_SHARE_EXTENSION_SHARE_EXTENSION_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SHARE_EXTENSION_SHARE_EXTENSION_SERVICE_FACTORY_H_ +#include <memory> + #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -35,7 +37,7 @@ ~ShareExtensionServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/signin/about_signin_internals_factory.cc b/ios/chrome/browser/signin/about_signin_internals_factory.cc index 33f66fd..09ea8d0 100644 --- a/ios/chrome/browser/signin/about_signin_internals_factory.cc +++ b/ios/chrome/browser/signin/about_signin_internals_factory.cc
@@ -45,11 +45,12 @@ return base::Singleton<AboutSigninInternalsFactory>::get(); } -scoped_ptr<KeyedService> AboutSigninInternalsFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AboutSigninInternalsFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<AboutSigninInternals> service(new AboutSigninInternals( + std::unique_ptr<AboutSigninInternals> service(new AboutSigninInternals( OAuth2TokenServiceFactory::GetForBrowserState(chrome_browser_state), AccountTrackerServiceFactory::GetForBrowserState(chrome_browser_state), SigninManagerFactory::GetForBrowserState(chrome_browser_state),
diff --git a/ios/chrome/browser/signin/about_signin_internals_factory.h b/ios/chrome/browser/signin/about_signin_internals_factory.h index 70175e76..45d70f7 100644 --- a/ios/chrome/browser/signin/about_signin_internals_factory.h +++ b/ios/chrome/browser/signin/about_signin_internals_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_ABOUT_SIGNIN_INTERNALS_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_ABOUT_SIGNIN_INTERNALS_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -39,7 +40,7 @@ ~AboutSigninInternalsFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override;
diff --git a/ios/chrome/browser/signin/account_consistency_service_factory.h b/ios/chrome/browser/signin/account_consistency_service_factory.h index 055ca67f..beee94c3 100644 --- a/ios/chrome/browser/signin/account_consistency_service_factory.h +++ b/ios/chrome/browser/signin/account_consistency_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_CONSISTENCY_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_CONSISTENCY_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -44,7 +45,7 @@ // BrowserStateKeyedServiceFactory: void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(AccountConsistencyServiceFactory);
diff --git a/ios/chrome/browser/signin/account_consistency_service_factory.mm b/ios/chrome/browser/signin/account_consistency_service_factory.mm index f01e0e8..f3a9818 100644 --- a/ios/chrome/browser/signin/account_consistency_service_factory.mm +++ b/ios/chrome/browser/signin/account_consistency_service_factory.mm
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/account_consistency_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/signin/ios/browser/account_consistency_service.h" @@ -47,12 +48,12 @@ AccountConsistencyService::RegisterPrefs(registry); } -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> AccountConsistencyServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new AccountConsistencyService( + return base::WrapUnique(new AccountConsistencyService( chrome_browser_state, ios::AccountReconcilorFactory::GetForBrowserState(chrome_browser_state), ios::CookieSettingsFactory::GetForBrowserState(chrome_browser_state),
diff --git a/ios/chrome/browser/signin/account_fetcher_service_factory.cc b/ios/chrome/browser/signin/account_fetcher_service_factory.cc index cce0abd..f052d4f 100644 --- a/ios/chrome/browser/signin/account_fetcher_service_factory.cc +++ b/ios/chrome/browser/signin/account_fetcher_service_factory.cc
@@ -45,11 +45,12 @@ AccountFetcherService::RegisterPrefs(registry); } -scoped_ptr<KeyedService> AccountFetcherServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AccountFetcherServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<AccountFetcherService> service(new AccountFetcherService()); + std::unique_ptr<AccountFetcherService> service(new AccountFetcherService()); service->Initialize( SigninClientFactory::GetForBrowserState(browser_state), OAuth2TokenServiceFactory::GetForBrowserState(browser_state),
diff --git a/ios/chrome/browser/signin/account_fetcher_service_factory.h b/ios/chrome/browser/signin/account_fetcher_service_factory.h index 3090acd1..10150c9 100644 --- a/ios/chrome/browser/signin/account_fetcher_service_factory.h +++ b/ios/chrome/browser/signin/account_fetcher_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" class AccountFetcherService; @@ -35,7 +36,7 @@ // BrowserStateKeyedServiceFactory implementation void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(AccountFetcherServiceFactory);
diff --git a/ios/chrome/browser/signin/account_reconcilor_factory.cc b/ios/chrome/browser/signin/account_reconcilor_factory.cc index cefb147..a4b81e343 100644 --- a/ios/chrome/browser/signin/account_reconcilor_factory.cc +++ b/ios/chrome/browser/signin/account_reconcilor_factory.cc
@@ -41,11 +41,11 @@ return base::Singleton<AccountReconcilorFactory>::get(); } -scoped_ptr<KeyedService> AccountReconcilorFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> AccountReconcilorFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<AccountReconcilor> reconcilor(new AccountReconcilor( + std::unique_ptr<AccountReconcilor> reconcilor(new AccountReconcilor( OAuth2TokenServiceFactory::GetForBrowserState(chrome_browser_state), SigninManagerFactory::GetForBrowserState(chrome_browser_state), SigninClientFactory::GetForBrowserState(chrome_browser_state),
diff --git a/ios/chrome/browser/signin/account_reconcilor_factory.h b/ios/chrome/browser/signin/account_reconcilor_factory.h index 6a69d75..553fb7d8 100644 --- a/ios/chrome/browser/signin/account_reconcilor_factory.h +++ b/ios/chrome/browser/signin/account_reconcilor_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_RECONCILOR_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_RECONCILOR_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -40,7 +41,7 @@ ~AccountReconcilorFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(AccountReconcilorFactory);
diff --git a/ios/chrome/browser/signin/account_tracker_service_factory.cc b/ios/chrome/browser/signin/account_tracker_service_factory.cc index 6d4e1d0..8ce413c 100644 --- a/ios/chrome/browser/signin/account_tracker_service_factory.cc +++ b/ios/chrome/browser/signin/account_tracker_service_factory.cc
@@ -40,11 +40,12 @@ AccountTrackerService::RegisterPrefs(registry); } -scoped_ptr<KeyedService> AccountTrackerServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AccountTrackerServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<AccountTrackerService> service(new AccountTrackerService()); + std::unique_ptr<AccountTrackerService> service(new AccountTrackerService()); service->Initialize( SigninClientFactory::GetForBrowserState(chrome_browser_state)); return std::move(service);
diff --git a/ios/chrome/browser/signin/account_tracker_service_factory.h b/ios/chrome/browser/signin/account_tracker_service_factory.h index 507d995..415a03b 100644 --- a/ios/chrome/browser/signin/account_tracker_service_factory.h +++ b/ios/chrome/browser/signin/account_tracker_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_TRACKER_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_TRACKER_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" class AccountTrackerService; @@ -43,7 +44,7 @@ // BrowserStateKeyedServiceFactory implementation. void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(AccountTrackerServiceFactory);
diff --git a/ios/chrome/browser/signin/chrome_identity_service_observer_bridge_unittest.mm b/ios/chrome/browser/signin/chrome_identity_service_observer_bridge_unittest.mm index 5a1120a11..fa0eff5 100644 --- a/ios/chrome/browser/signin/chrome_identity_service_observer_bridge_unittest.mm +++ b/ios/chrome/browser/signin/chrome_identity_service_observer_bridge_unittest.mm
@@ -4,8 +4,9 @@ #import "ios/chrome/browser/signin/chrome_identity_service_observer_bridge.h" +#include <memory> + #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" #include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" #include "testing/gtest_mac.h" @@ -24,7 +25,7 @@ @end @implementation TestChromeIdentityServiceObserver { - scoped_ptr<ios::ChromeIdentityService::Observer> observer_bridge_; + std::unique_ptr<ios::ChromeIdentityService::Observer> observer_bridge_; } @synthesize onIdentityListChangedCalled = _onIdentityListChangedCalled;
diff --git a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.h b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.h index fde891d9..0887666 100644 --- a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.h +++ b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_FAKE_OAUTH2_TOKEN_SERVICE_BUILDER_H_ #define IOS_CHROME_BROWSER_SIGNIN_FAKE_OAUTH2_TOKEN_SERVICE_BUILDER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> namespace web { class BrowserState; @@ -16,7 +16,7 @@ // Helper function to be used with // BrowserStateKeyedServiceFactory::SetTestingFactory() that returns a // FakeProfileOAuth2TokenService object. -scoped_ptr<KeyedService> BuildFakeOAuth2TokenService( +std::unique_ptr<KeyedService> BuildFakeOAuth2TokenService( web::BrowserState* context); #endif // IOS_CHROME_BROWSER_SIGNIN_FAKE_OAUTH2_TOKEN_SERVICE_BUILDER_H_
diff --git a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm index edb2800..2ff9a2f 100644 --- a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm +++ b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/fake_oauth2_token_service_builder.h" +#include "base/memory/ptr_util.h" #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" #include "components/signin/ios/browser/fake_profile_oauth2_token_service_ios_delegate.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -12,7 +13,7 @@ #include "ios/chrome/browser/signin/signin_error_controller_factory.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" -scoped_ptr<KeyedService> BuildFakeOAuth2TokenService( +std::unique_ptr<KeyedService> BuildFakeOAuth2TokenService( web::BrowserState* context) { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); @@ -23,5 +24,5 @@ ->GetProfileOAuth2TokenServiceIOSProvider(), ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state), ios::SigninErrorControllerFactory::GetForBrowserState(browser_state)); - return make_scoped_ptr(new FakeProfileOAuth2TokenService(delegate)); + return base::WrapUnique(new FakeProfileOAuth2TokenService(delegate)); }
diff --git a/ios/chrome/browser/signin/fake_signin_manager_builder.cc b/ios/chrome/browser/signin/fake_signin_manager_builder.cc index d2d97e7..8ac5c86 100644 --- a/ios/chrome/browser/signin/fake_signin_manager_builder.cc +++ b/ios/chrome/browser/signin/fake_signin_manager_builder.cc
@@ -16,11 +16,11 @@ namespace ios { -scoped_ptr<KeyedService> BuildFakeSigninManager( +std::unique_ptr<KeyedService> BuildFakeSigninManager( web::BrowserState* browser_state) { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(browser_state); - scoped_ptr<SigninManager> manager(new FakeSigninManager( + std::unique_ptr<SigninManager> manager(new FakeSigninManager( SigninClientFactory::GetForBrowserState(chrome_browser_state), OAuth2TokenServiceFactory::GetForBrowserState(chrome_browser_state), ios::AccountTrackerServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/signin/fake_signin_manager_builder.h b/ios/chrome/browser/signin/fake_signin_manager_builder.h index f752597..1d06ad4 100644 --- a/ios/chrome/browser/signin/fake_signin_manager_builder.h +++ b/ios/chrome/browser/signin/fake_signin_manager_builder.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_FAKE_SIGNIN_MANAGER_H_ #define IOS_CHROME_BROWSER_SIGNIN_FAKE_SIGNIN_MANAGER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> namespace web { class BrowserState; @@ -17,7 +17,7 @@ // Helper function to be used with KeyedService::SetTestingFactory(). // The returned instance is initialized. -scoped_ptr<KeyedService> BuildFakeSigninManager( +std::unique_ptr<KeyedService> BuildFakeSigninManager( web::BrowserState* browser_state); } // namespace ios
diff --git a/ios/chrome/browser/signin/gaia_auth_fetcher_ios.h b/ios/chrome/browser/signin/gaia_auth_fetcher_ios.h index 01ecf71..48a8f089 100644 --- a/ios/chrome/browser/signin/gaia_auth_fetcher_ios.h +++ b/ios/chrome/browser/signin/gaia_auth_fetcher_ios.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_GAIA_AUTH_FETCHER_IOS_H_ #define IOS_CHROME_BROWSER_SIGNIN_GAIA_AUTH_FETCHER_IOS_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "google_apis/gaia/gaia_auth_fetcher.h" class GaiaAuthFetcherIOSBridge; @@ -57,7 +58,7 @@ const net::URLRequestStatus& status, int response_code); - scoped_ptr<GaiaAuthFetcherIOSBridge> bridge_; + std::unique_ptr<GaiaAuthFetcherIOSBridge> bridge_; web::BrowserState* browser_state_; DISALLOW_COPY_AND_ASSIGN(GaiaAuthFetcherIOS);
diff --git a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm index 9b5fa1c..5263f67d 100644 --- a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm +++ b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm
@@ -4,8 +4,9 @@ #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios.h" +#include <memory> + #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/run_loop.h" #include "google_apis/gaia/gaia_urls.h" #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios_private.h" @@ -77,7 +78,7 @@ // BrowserState, required for WKWebView creation. web::TestBrowserState browser_state_; MockGaiaConsumer consumer_; - scoped_ptr<GaiaAuthFetcherIOS> gaia_auth_fetcher_; + std::unique_ptr<GaiaAuthFetcherIOS> gaia_auth_fetcher_; }; // Tests that the cancel mechanism works properly by cancelling an OAuthLogin @@ -134,7 +135,7 @@ EXPECT_CALL(consumer_, OnGetCheckConnectionInfoSuccess(data)).Times(1); // Set up the fake URL Fetcher. - scoped_ptr<net::FakeURLFetcherFactory> fake_url_fetcher_factory( + std::unique_ptr<net::FakeURLFetcherFactory> fake_url_fetcher_factory( new net::FakeURLFetcherFactory(new net::URLFetcherImplFactory())); fake_url_fetcher_factory->SetFakeResponse( GaiaUrls::GetInstance()->GetCheckConnectionInfoURLWithSource(
diff --git a/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.cc b/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.cc index bb20c11..7ee2d70 100644 --- a/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.cc +++ b/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/gaia_cookie_manager_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -39,12 +40,12 @@ return base::Singleton<GaiaCookieManagerServiceFactory>::get(); } -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> GaiaCookieManagerServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new GaiaCookieManagerService( + return base::WrapUnique(new GaiaCookieManagerService( OAuth2TokenServiceFactory::GetForBrowserState(chrome_browser_state), GaiaConstants::kChromeSource, SigninClientFactory::GetForBrowserState(chrome_browser_state)));
diff --git a/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.h b/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.h index f23bbd3..9471403 100644 --- a/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.h +++ b/ios/chrome/browser/signin/gaia_cookie_manager_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_GAIA_COOKIE_MANAGER_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_GAIA_COOKIE_MANAGER_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -41,7 +42,7 @@ ~GaiaCookieManagerServiceFactory() override; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(GaiaCookieManagerServiceFactory);
diff --git a/ios/chrome/browser/signin/oauth2_token_service_factory.h b/ios/chrome/browser/signin/oauth2_token_service_factory.h index 1f757aa..39bef718 100644 --- a/ios/chrome/browser/signin/oauth2_token_service_factory.h +++ b/ios/chrome/browser/signin/oauth2_token_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_OAUTH2_TOKEN_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_OAUTH2_TOKEN_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace ios { @@ -41,7 +42,7 @@ ~OAuth2TokenServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override;
diff --git a/ios/chrome/browser/signin/oauth2_token_service_factory.mm b/ios/chrome/browser/signin/oauth2_token_service_factory.mm index 63de60a4..154b95b 100644 --- a/ios/chrome/browser/signin/oauth2_token_service_factory.mm +++ b/ios/chrome/browser/signin/oauth2_token_service_factory.mm
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/oauth2_token_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -45,7 +46,8 @@ registry->RegisterListPref(prefs::kTokenServiceExcludedSecondaryAccounts); } -scoped_ptr<KeyedService> OAuth2TokenServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +OAuth2TokenServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); @@ -58,5 +60,5 @@ chrome_browser_state), ios::SigninErrorControllerFactory::GetForBrowserState( chrome_browser_state)); - return make_scoped_ptr(new ProfileOAuth2TokenService(delegate)); + return base::WrapUnique(new ProfileOAuth2TokenService(delegate)); }
diff --git a/ios/chrome/browser/signin/signin_client_factory.cc b/ios/chrome/browser/signin/signin_client_factory.cc index 5ba3b3b..6d59667 100644 --- a/ios/chrome/browser/signin/signin_client_factory.cc +++ b/ios/chrome/browser/signin/signin_client_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/signin_client_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -32,11 +33,11 @@ SigninClientFactory::~SigninClientFactory() {} -scoped_ptr<KeyedService> SigninClientFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> SigninClientFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new SigninClientImpl( + return base::WrapUnique(new SigninClientImpl( chrome_browser_state, ios::SigninErrorControllerFactory::GetForBrowserState( chrome_browser_state)));
diff --git a/ios/chrome/browser/signin/signin_client_factory.h b/ios/chrome/browser/signin/signin_client_factory.h index aec8a12..42c6b07 100644 --- a/ios/chrome/browser/signin/signin_client_factory.h +++ b/ios/chrome/browser/signin/signin_client_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_SIGNIN_CLIENT_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_SIGNIN_CLIENT_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -35,7 +36,7 @@ ~SigninClientFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(SigninClientFactory);
diff --git a/ios/chrome/browser/signin/signin_client_impl.h b/ios/chrome/browser/signin/signin_client_impl.h index fca1fc8..bdca2d4 100644 --- a/ios/chrome/browser/signin/signin_client_impl.h +++ b/ios/chrome/browser/signin/signin_client_impl.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_SIGNIN_CLIENT_IMPL_H_ #define IOS_CHROME_BROWSER_SIGNIN_SIGNIN_CLIENT_IMPL_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/signin/core/browser/signin_client.h" #include "components/signin/core/browser/signin_error_controller.h" #include "google_apis/gaia/gaia_oauth_client.h" @@ -69,7 +70,7 @@ // <Build Info> <OS> <Version number> (<Last change>)<channel or "-devel"> // If version information is unavailable, returns "invalid." std::string GetProductVersion() override; - scoped_ptr<CookieChangedSubscription> AddCookieChangedCallback( + std::unique_ptr<CookieChangedSubscription> AddCookieChangedCallback( const GURL& url, const std::string& name, const net::CookieStore::CookieChangedCallback& callback) override; @@ -83,7 +84,7 @@ // gaia::GaiaOAuthClient::Delegate implementation. void OnGetTokenInfoResponse( - scoped_ptr<base::DictionaryValue> token_info) override; + std::unique_ptr<base::DictionaryValue> token_info) override; void OnOAuthError() override; void OnNetworkError(int response_code) override; @@ -104,8 +105,8 @@ SigninErrorController* signin_error_controller_; std::list<base::Closure> delayed_callbacks_; - scoped_ptr<gaia::GaiaOAuthClient> oauth_client_; - scoped_ptr<OAuth2TokenService::Request> oauth_request_; + std::unique_ptr<gaia::GaiaOAuthClient> oauth_client_; + std::unique_ptr<OAuth2TokenService::Request> oauth_request_; DISALLOW_COPY_AND_ASSIGN(SigninClientImpl); };
diff --git a/ios/chrome/browser/signin/signin_client_impl.mm b/ios/chrome/browser/signin/signin_client_impl.mm index e3d76392..64ace6e 100644 --- a/ios/chrome/browser/signin/signin_client_impl.mm +++ b/ios/chrome/browser/signin/signin_client_impl.mm
@@ -133,7 +133,7 @@ ->RemoveObserver(observer); } -scoped_ptr<SigninClient::CookieChangedSubscription> +std::unique_ptr<SigninClient::CookieChangedSubscription> SigninClientImpl::AddCookieChangedCallback( const GURL& url, const std::string& name, @@ -141,7 +141,7 @@ scoped_refptr<net::URLRequestContextGetter> context_getter = browser_state_->GetRequestContext(); DCHECK(context_getter.get()); - scoped_ptr<SigninCookieChangedSubscription> subscription( + std::unique_ptr<SigninCookieChangedSubscription> subscription( new SigninCookieChangedSubscription(context_getter, url, name, callback)); return std::move(subscription); } @@ -176,7 +176,7 @@ } void SigninClientImpl::OnGetTokenInfoResponse( - scoped_ptr<base::DictionaryValue> token_info) { + std::unique_ptr<base::DictionaryValue> token_info) { oauth_request_.reset(); }
diff --git a/ios/chrome/browser/signin/signin_error_controller_factory.cc b/ios/chrome/browser/signin/signin_error_controller_factory.cc index 86106b2..e959680 100644 --- a/ios/chrome/browser/signin/signin_error_controller_factory.cc +++ b/ios/chrome/browser/signin/signin_error_controller_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/signin/signin_error_controller_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -33,9 +34,10 @@ SigninErrorControllerFactory::~SigninErrorControllerFactory() { } -scoped_ptr<KeyedService> SigninErrorControllerFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +SigninErrorControllerFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - return make_scoped_ptr(new SigninErrorController); + return base::WrapUnique(new SigninErrorController); } } // namespace ios
diff --git a/ios/chrome/browser/signin/signin_error_controller_factory.h b/ios/chrome/browser/signin/signin_error_controller_factory.h index c0ae719..75fd678f 100644 --- a/ios/chrome/browser/signin/signin_error_controller_factory.h +++ b/ios/chrome/browser/signin/signin_error_controller_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_SIGNIN_ERROR_CONTROLLER_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_SIGNIN_ERROR_CONTROLLER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -35,7 +36,7 @@ ~SigninErrorControllerFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(SigninErrorControllerFactory);
diff --git a/ios/chrome/browser/signin/signin_manager_factory.cc b/ios/chrome/browser/signin/signin_manager_factory.cc index 201bc99..aef5a4b 100644 --- a/ios/chrome/browser/signin/signin_manager_factory.cc +++ b/ios/chrome/browser/signin/signin_manager_factory.cc
@@ -79,11 +79,11 @@ SigninManagerCreated(manager)); } -scoped_ptr<KeyedService> SigninManagerFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> SigninManagerFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* chrome_browser_state = ios::ChromeBrowserState::FromBrowserState(context); - scoped_ptr<SigninManager> service(new SigninManager( + std::unique_ptr<SigninManager> service(new SigninManager( SigninClientFactory::GetForBrowserState(chrome_browser_state), OAuth2TokenServiceFactory::GetForBrowserState(chrome_browser_state), ios::AccountTrackerServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/signin/signin_manager_factory.h b/ios/chrome/browser/signin/signin_manager_factory.h index 3bfb2b7..357f443 100644 --- a/ios/chrome/browser/signin/signin_manager_factory.h +++ b/ios/chrome/browser/signin/signin_manager_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_FACTORY_H_ #define IOS_CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -62,7 +63,7 @@ mutable base::ObserverList<SigninManagerFactoryObserver, true> observer_list_; // BrowserStateKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; void BrowserStateShutdown(web::BrowserState* context) override; };
diff --git a/ios/chrome/browser/snapshots/lru_cache.mm b/ios/chrome/browser/snapshots/lru_cache.mm index d9a35c6..ffbf1dd 100644 --- a/ios/chrome/browser/snapshots/lru_cache.mm +++ b/ios/chrome/browser/snapshots/lru_cache.mm
@@ -6,11 +6,12 @@ #include <stddef.h> +#include <memory> + #include "base/containers/hash_tables.h" #include "base/containers/mru_cache.h" #include "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace { @@ -56,7 +57,7 @@ } // namespace @implementation LRUCache { - scoped_ptr<NSObjectMRUCache> _cache; + std::unique_ptr<NSObjectMRUCache> _cache; } @synthesize maxCacheSize = _maxCacheSize;
diff --git a/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.h b/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.h index 63d032a..4503c8da 100644 --- a/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.h +++ b/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SSL_IOS_CHROME_SECURITY_STATE_MODEL_CLIENT_H_ #define IOS_CHROME_BROWSER_SSL_IOS_CHROME_SECURITY_STATE_MODEL_CLIENT_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/security_state/security_state_model.h" #include "components/security_state/security_state_model_client.h" #include "ios/web/public/web_state/web_state_user_data.h" @@ -38,7 +39,7 @@ friend class web::WebStateUserData<IOSChromeSecurityStateModelClient>; web::WebState* web_state_; - scoped_ptr<security_state::SecurityStateModel> security_state_model_; + std::unique_ptr<security_state::SecurityStateModel> security_state_model_; DISALLOW_COPY_AND_ASSIGN(IOSChromeSecurityStateModelClient); };
diff --git a/ios/chrome/browser/ssl/ios_ssl_blocking_page.h b/ios/chrome/browser/ssl/ios_ssl_blocking_page.h index be5b9463..c653a5e 100644 --- a/ios/chrome/browser/ssl/ios_ssl_blocking_page.h +++ b/ios/chrome/browser/ssl/ios_ssl_blocking_page.h
@@ -71,8 +71,8 @@ // expired. const bool expired_but_previously_allowed_; - scoped_ptr<IOSChromeControllerClient> controller_; - scoped_ptr<security_interstitials::SSLErrorUI> ssl_error_ui_; + std::unique_ptr<IOSChromeControllerClient> controller_; + std::unique_ptr<security_interstitials::SSLErrorUI> ssl_error_ui_; DISALLOW_COPY_AND_ASSIGN(IOSSSLBlockingPage); };
diff --git a/ios/chrome/browser/ssl/ios_ssl_blocking_page.mm b/ios/chrome/browser/ssl/ios_ssl_blocking_page.mm index e41fec13..659711e 100644 --- a/ios/chrome/browser/ssl/ios_ssl_blocking_page.mm +++ b/ios/chrome/browser/ssl/ios_ssl_blocking_page.mm
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -93,7 +94,7 @@ reporting_info.rappor_report_type = rappor::UMA_RAPPOR_TYPE; IOSChromeMetricsHelper* ios_chrome_metrics_helper = new IOSChromeMetricsHelper(web_state, request_url, reporting_info); - controller_->set_metrics_helper(make_scoped_ptr(ios_chrome_metrics_helper)); + controller_->set_metrics_helper(base::WrapUnique(ios_chrome_metrics_helper)); ssl_error_ui_.reset(new SSLErrorUI(request_url, cert_error, ssl_info, options_mask, time_triggered,
diff --git a/ios/chrome/browser/suggestions/image_fetcher_impl.h b/ios/chrome/browser/suggestions/image_fetcher_impl.h index 8cd0c01..a0f0036 100644 --- a/ios/chrome/browser/suggestions/image_fetcher_impl.h +++ b/ios/chrome/browser/suggestions/image_fetcher_impl.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_SUGGESTIONS_IMAGE_FETCHER_IMPL_H_ #define IOS_CHROME_BROWSER_SUGGESTIONS_IMAGE_FETCHER_IMPL_H_ +#include <memory> + #include "base/callback_forward.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/suggestions/image_fetcher.h" class GURL; @@ -44,7 +45,7 @@ base::Callback<void(const GURL&, const SkBitmap*)> callback) override; private: - scoped_ptr<image_fetcher::ImageFetcher> imageFetcher_; + std::unique_ptr<image_fetcher::ImageFetcher> imageFetcher_; ImageFetcherDelegate* delegate_;
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.h b/ios/chrome/browser/suggestions/suggestions_service_factory.h index 0cb8f821..d9d9c8c 100644 --- a/ios/chrome/browser/suggestions/suggestions_service_factory.h +++ b/ios/chrome/browser/suggestions/suggestions_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SUGGESTIONS_SUGGESTIONS_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SUGGESTIONS_SUGGESTIONS_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -39,7 +40,7 @@ ~SuggestionsServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override;
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.mm b/ios/chrome/browser/suggestions/suggestions_service_factory.mm index 52e03d0db..b771df4 100644 --- a/ios/chrome/browser/suggestions/suggestions_service_factory.mm +++ b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
@@ -7,6 +7,7 @@ #include <utility> #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/sequenced_task_runner.h" #include "base/threading/sequenced_worker_pool.h" @@ -58,7 +59,8 @@ SuggestionsServiceFactory::~SuggestionsServiceFactory() { } -scoped_ptr<KeyedService> SuggestionsServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +SuggestionsServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { base::SequencedWorkerPool* sequenced_worker_pool = web::WebThread::GetBlockingPool(); @@ -76,18 +78,18 @@ IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state); base::FilePath database_dir( browser_state->GetStatePath().Append(kThumbnailDirectory)); - scoped_ptr<SuggestionsStore> suggestions_store( + std::unique_ptr<SuggestionsStore> suggestions_store( new SuggestionsStore(browser_state->GetPrefs())); - scoped_ptr<BlacklistStore> blacklist_store( + std::unique_ptr<BlacklistStore> blacklist_store( new BlacklistStore(browser_state->GetPrefs())); - scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ImageData>> db( + std::unique_ptr<leveldb_proto::ProtoDatabaseImpl<ImageData>> db( new leveldb_proto::ProtoDatabaseImpl<ImageData>(background_task_runner)); - scoped_ptr<ImageFetcher> image_fetcher(new ImageFetcherImpl( + std::unique_ptr<ImageFetcher> image_fetcher(new ImageFetcherImpl( browser_state->GetRequestContext(), sequenced_worker_pool)); - scoped_ptr<ImageManager> thumbnail_manager(new ImageManager( + std::unique_ptr<ImageManager> thumbnail_manager(new ImageManager( std::move(image_fetcher), std::move(db), database_dir, web::WebThread::GetTaskRunnerForThread(web::WebThread::DB))); - return make_scoped_ptr(new SuggestionsService( + return base::WrapUnique(new SuggestionsService( signin_manager, token_service, sync_service, browser_state->GetRequestContext(), std::move(suggestions_store), std::move(thumbnail_manager), std::move(blacklist_store)));
diff --git a/ios/chrome/browser/sync/fake_sync_service_factory.cc b/ios/chrome/browser/sync/fake_sync_service_factory.cc index 8889f0b..7e5b0d29 100644 --- a/ios/chrome/browser/sync/fake_sync_service_factory.cc +++ b/ios/chrome/browser/sync/fake_sync_service_factory.cc
@@ -5,6 +5,7 @@ #include "ios/chrome/browser/sync/fake_sync_service_factory.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -60,9 +61,9 @@ FakeSyncServiceFactory::~FakeSyncServiceFactory() {} -scoped_ptr<KeyedService> FakeSyncServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> FakeSyncServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - return make_scoped_ptr(new KeyedFakeSyncService); + return base::WrapUnique(new KeyedFakeSyncService); } } // namespace ios
diff --git a/ios/chrome/browser/sync/fake_sync_service_factory.h b/ios/chrome/browser/sync/fake_sync_service_factory.h index 60741fb..cc5de42 100644 --- a/ios/chrome/browser/sync/fake_sync_service_factory.h +++ b/ios/chrome/browser/sync/fake_sync_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SYNC_FAKE_SYNC_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SYNC_FAKE_SYNC_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -42,7 +43,7 @@ ~FakeSyncServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(FakeSyncServiceFactory);
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.cc b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.cc index 361b57d..4c8a4a0 100644 --- a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.cc +++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "base/time/time.h" #include "components/browser_sync/browser/profile_sync_service.h" @@ -108,7 +109,7 @@ IOSChromeProfileSyncServiceFactory::~IOSChromeProfileSyncServiceFactory() {} -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> IOSChromeProfileSyncServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = @@ -128,12 +129,12 @@ ProfileSyncService::InitParams init_params; init_params.signin_wrapper = - make_scoped_ptr(new SigninManagerWrapper(signin)); + base::WrapUnique(new SigninManagerWrapper(signin)); init_params.oauth2_token_service = OAuth2TokenServiceFactory::GetForBrowserState(browser_state); init_params.start_behavior = ProfileSyncService::MANUAL_START; init_params.sync_client = - make_scoped_ptr(new IOSChromeSyncClient(browser_state)); + base::WrapUnique(new IOSChromeSyncClient(browser_state)); init_params.network_time_update_callback = base::Bind(&UpdateNetworkTime); init_params.base_directory = browser_state->GetStatePath(); init_params.url_request_context = browser_state->GetRequestContext(); @@ -145,7 +146,7 @@ web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE); init_params.blocking_pool = web::WebThread::GetBlockingPool(); - auto pss = make_scoped_ptr(new ProfileSyncService(std::move(init_params))); + auto pss = base::WrapUnique(new ProfileSyncService(std::move(init_params))); // Will also initialize the sync client. pss->Initialize();
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h index 3b66d08..d455a23 100644 --- a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h +++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_SYNC_IOS_CHROME_PROFILE_SYNC_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SYNC_IOS_CHROME_PROFILE_SYNC_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -40,7 +42,7 @@ ~IOSChromeProfileSyncServiceFactory() override; // BrowserContextKeyedServiceFactory: - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; };
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.cc b/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.cc index b53ab59..f530e233 100644 --- a/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.cc +++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.cc
@@ -5,6 +5,7 @@ #include "ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h" #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/browser_sync/browser/profile_sync_test_util.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" @@ -18,18 +19,18 @@ #include "ios/web/public/web_thread.h" ProfileSyncService::InitParams CreateProfileSyncServiceParamsForTest( - scoped_ptr<sync_driver::SyncClient> sync_client, + std::unique_ptr<sync_driver::SyncClient> sync_client, ios::ChromeBrowserState* browser_state) { ProfileSyncService::InitParams init_params; - init_params.signin_wrapper = make_scoped_ptr(new SigninManagerWrapper( + init_params.signin_wrapper = base::WrapUnique(new SigninManagerWrapper( ios::SigninManagerFactory::GetForBrowserState(browser_state))); init_params.oauth2_token_service = OAuth2TokenServiceFactory::GetForBrowserState(browser_state); init_params.start_behavior = ProfileSyncService::MANUAL_START; init_params.sync_client = sync_client ? std::move(sync_client) - : make_scoped_ptr(new IOSChromeSyncClient(browser_state)); + : base::WrapUnique(new IOSChromeSyncClient(browser_state)); init_params.network_time_update_callback = base::Bind(&browser_sync::EmptyNetworkTimeUpdate); init_params.base_directory = browser_state->GetStatePath(); @@ -45,9 +46,9 @@ return init_params; } -scoped_ptr<KeyedService> BuildMockProfileSyncService( +std::unique_ptr<KeyedService> BuildMockProfileSyncService( web::BrowserState* context) { - return make_scoped_ptr( + return base::WrapUnique( new ProfileSyncServiceMock(CreateProfileSyncServiceParamsForTest( nullptr, ios::ChromeBrowserState::FromBrowserState(context)))); }
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h b/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h index 4968ff81..3444237 100644 --- a/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h +++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h
@@ -5,7 +5,8 @@ #ifndef IOS_CHROME_BROWSER_SYNC_IOS_CHROME_PROFILE_SYNC_TEST_UTIL_H_ #define IOS_CHROME_BROWSER_SYNC_IOS_CHROME_PROFILE_SYNC_TEST_UTIL_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "components/browser_sync/browser/profile_sync_service.h" namespace ios { @@ -23,12 +24,12 @@ // Helper method for constructing ProfileSyncService mocks. If |sync_client| // is null, a fresh one is created. ProfileSyncService::InitParams CreateProfileSyncServiceParamsForTest( - scoped_ptr<sync_driver::SyncClient> sync_client, + std::unique_ptr<sync_driver::SyncClient> sync_client, ios::ChromeBrowserState* browser_state); // Helper routine to be used in conjunction with // BrowserStateKeyedServiceFactory::SetTestingFactory(). -scoped_ptr<KeyedService> BuildMockProfileSyncService( +std::unique_ptr<KeyedService> BuildMockProfileSyncService( web::BrowserState* context); #endif // IOS_CHROME_BROWSER_SYNC_IOS_CHROME_PROFILE_SYNC_TEST_UTIL_H_
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.h b/ios/chrome/browser/sync/ios_chrome_sync_client.h index 3708fdf..2a5fafa9 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.h +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNC_CLIENT_H__ #define IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNC_CLIENT_H__ +#include <memory> #include <vector> #include "base/macros.h" @@ -59,7 +60,7 @@ sync_driver::SyncApiComponentFactory* GetSyncApiComponentFactory() override; void SetSyncApiComponentFactoryForTesting( - scoped_ptr<sync_driver::SyncApiComponentFactory> component_factory); + std::unique_ptr<sync_driver::SyncApiComponentFactory> component_factory); // Iterates over browser states and returns any trackers that can be found. static void GetDeviceInfoTrackers( @@ -69,14 +70,14 @@ ios::ChromeBrowserState* const browser_state_; // The sync api component factory in use by this client. - scoped_ptr<sync_driver::SyncApiComponentFactory> component_factory_; + std::unique_ptr<sync_driver::SyncApiComponentFactory> component_factory_; // Members that must be fetched on the UI thread but accessed on their // respective backend threads. scoped_refptr<autofill::AutofillWebDataService> web_data_service_; scoped_refptr<password_manager::PasswordStore> password_store_; - scoped_ptr<sync_sessions::SyncSessionsClient> sync_sessions_client_; + std::unique_ptr<sync_sessions::SyncSessionsClient> sync_sessions_client_; const scoped_refptr<syncer::ExtensionsActivity> dummy_extensions_activity_;
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm index 4d0796d..c5ec6a6 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "components/autofill/core/browser/webdata/autocomplete_syncable_service.h" #include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h" #include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h" @@ -110,18 +111,18 @@ return window_delegates_getter_.get(); } - scoped_ptr<browser_sync::LocalSessionEventRouter> GetLocalSessionEventRouter() - override { + std::unique_ptr<browser_sync::LocalSessionEventRouter> + GetLocalSessionEventRouter() override { syncer::SyncableService::StartSyncFlare flare( ios::sync_start_util::GetFlareForSyncableService( browser_state_->GetStatePath())); - return make_scoped_ptr( + return base::WrapUnique( new IOSChromeLocalSessionEventRouter(browser_state_, this, flare)); } private: ios::ChromeBrowserState* const browser_state_; - const scoped_ptr<browser_sync::SyncedWindowDelegatesGetter> + const std::unique_ptr<browser_sync::SyncedWindowDelegatesGetter> window_delegates_getter_; DISALLOW_COPY_AND_ASSIGN(SyncSessionsClientImpl); @@ -381,7 +382,7 @@ } void IOSChromeSyncClient::SetSyncApiComponentFactoryForTesting( - scoped_ptr<sync_driver::SyncApiComponentFactory> component_factory) { + std::unique_ptr<sync_driver::SyncApiComponentFactory> component_factory) { component_factory_ = std::move(component_factory); }
diff --git a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h b/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h index 08b7e09..4d79429f 100644 --- a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h +++ b/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h
@@ -7,6 +7,7 @@ #include <stddef.h> +#include <memory> #include <set> #include "base/callback_list.h" @@ -72,11 +73,11 @@ sync_sessions::SyncSessionsClient* const sessions_client_; syncer::SyncableService::StartSyncFlare flare_; - scoped_ptr<base::CallbackList<void(const std::set<GURL>&, - const GURL&)>::Subscription> + std::unique_ptr<base::CallbackList<void(const std::set<GURL>&, + const GURL&)>::Subscription> favicon_changed_subscription_; - scoped_ptr<base::CallbackList<void(web::WebState*)>::Subscription> + std::unique_ptr<base::CallbackList<void(web::WebState*)>::Subscription> tab_parented_subscription_; DISALLOW_COPY_AND_ASSIGN(IOSChromeLocalSessionEventRouter);
diff --git a/ios/chrome/browser/sync/sync_setup_service_factory.cc b/ios/chrome/browser/sync/sync_setup_service_factory.cc index 1f44598..6a197d5 100644 --- a/ios/chrome/browser/sync/sync_setup_service_factory.cc +++ b/ios/chrome/browser/sync/sync_setup_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/sync/sync_setup_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/browser_sync/browser/profile_sync_service.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -40,11 +41,11 @@ SyncSetupServiceFactory::~SyncSetupServiceFactory() { } -scoped_ptr<KeyedService> SyncSetupServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> SyncSetupServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr(new SyncSetupService( + return base::WrapUnique(new SyncSetupService( IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state), browser_state->GetPrefs())); }
diff --git a/ios/chrome/browser/sync/sync_setup_service_factory.h b/ios/chrome/browser/sync/sync_setup_service_factory.h index e0870959..6ad3c22 100644 --- a/ios/chrome/browser/sync/sync_setup_service_factory.h +++ b/ios/chrome/browser/sync/sync_setup_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -38,7 +39,7 @@ ~SyncSetupServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(SyncSetupServiceFactory);
diff --git a/ios/chrome/browser/tab_parenting_global_observer.cc b/ios/chrome/browser/tab_parenting_global_observer.cc index 1ed07d1..8c0ae3b 100644 --- a/ios/chrome/browser/tab_parenting_global_observer.cc +++ b/ios/chrome/browser/tab_parenting_global_observer.cc
@@ -10,7 +10,7 @@ return base::Singleton<TabParentingGlobalObserver>::get(); } -scoped_ptr<base::CallbackList<void(web::WebState*)>::Subscription> +std::unique_ptr<base::CallbackList<void(web::WebState*)>::Subscription> TabParentingGlobalObserver::RegisterCallback(const OnTabParentedCallback& cb) { return on_tab_parented_callback_list_.Add(cb); }
diff --git a/ios/chrome/browser/tab_parenting_global_observer.h b/ios/chrome/browser/tab_parenting_global_observer.h index 61f64ac..ff14a07 100644 --- a/ios/chrome/browser/tab_parenting_global_observer.h +++ b/ios/chrome/browser/tab_parenting_global_observer.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_TAB_PARENTING_GLOBAL_OBSERVER_H_ #define IOS_CHROME_BROWSER_TAB_PARENTING_GLOBAL_OBSERVER_H_ +#include <memory> + #include "base/callback_list.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace base { template <typename T> @@ -29,7 +30,7 @@ static TabParentingGlobalObserver* GetInstance(); // Registers |cb| to be invoked when a tab is parented. - scoped_ptr<base::CallbackList<void(web::WebState*)>::Subscription> + std::unique_ptr<base::CallbackList<void(web::WebState*)>::Subscription> RegisterCallback(const OnTabParentedCallback& cb); // Called to notify all registered callbacks that |web_state| was parented.
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.h b/ios/chrome/browser/translate/chrome_ios_translate_client.h index 63b1f936..da7d420 100644 --- a/ios/chrome/browser/translate/chrome_ios_translate_client.h +++ b/ios/chrome/browser/translate/chrome_ios_translate_client.h
@@ -5,10 +5,10 @@ #ifndef IOS_CHROME_BROWSER_TRANSLATE_CHROME_IOS_TRANSLATE_CLIENT_H_ #define IOS_CHROME_BROWSER_TRANSLATE_CHROME_IOS_TRANSLATE_CLIENT_H_ +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/translate/core/browser/translate_client.h" #include "components/translate/core/browser/translate_step.h" #include "components/translate/core/common/translate_errors.h" @@ -36,7 +36,7 @@ ~ChromeIOSTranslateClient() override; // Helper method to return a new TranslatePrefs instance. - static scoped_ptr<translate::TranslatePrefs> CreateTranslatePrefs( + static std::unique_ptr<translate::TranslatePrefs> CreateTranslatePrefs( PrefService* prefs); // Gets the associated TranslateManager. @@ -45,11 +45,12 @@ // TranslateClient implementation. translate::TranslateDriver* GetTranslateDriver() override; PrefService* GetPrefs() override; - scoped_ptr<translate::TranslatePrefs> GetTranslatePrefs() override; + std::unique_ptr<translate::TranslatePrefs> GetTranslatePrefs() override; translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages() override; int GetInfobarIconID() const override; - scoped_ptr<infobars::InfoBar> CreateInfoBar( - scoped_ptr<translate::TranslateInfoBarDelegate> delegate) const override; + std::unique_ptr<infobars::InfoBar> CreateInfoBar( + std::unique_ptr<translate::TranslateInfoBarDelegate> delegate) + const override; void ShowTranslateUI(translate::TranslateStep step, const std::string& source_language, const std::string& target_language, @@ -65,7 +66,7 @@ // web::WebStateObserver implementation. void WebStateDestroyed() override; - scoped_ptr<translate::TranslateManager> translate_manager_; + std::unique_ptr<translate::TranslateManager> translate_manager_; translate::IOSTranslateDriver translate_driver_; DISALLOW_COPY_AND_ASSIGN(ChromeIOSTranslateClient);
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm index 33c9bb5..6338ae52 100644 --- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm +++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -46,9 +46,9 @@ } // static -scoped_ptr<translate::TranslatePrefs> +std::unique_ptr<translate::TranslatePrefs> ChromeIOSTranslateClient::CreateTranslatePrefs(PrefService* prefs) { - return scoped_ptr<translate::TranslatePrefs>( + return std::unique_ptr<translate::TranslatePrefs>( new translate::TranslatePrefs(prefs, prefs::kAcceptLanguages, nullptr)); } @@ -58,11 +58,11 @@ // TranslateClient implementation: -scoped_ptr<infobars::InfoBar> ChromeIOSTranslateClient::CreateInfoBar( - scoped_ptr<translate::TranslateInfoBarDelegate> delegate) const { +std::unique_ptr<infobars::InfoBar> ChromeIOSTranslateClient::CreateInfoBar( + std::unique_ptr<translate::TranslateInfoBarDelegate> delegate) const { translate::TranslateStep step = delegate->translate_step(); - scoped_ptr<InfoBarIOS> infobar(new InfoBarIOS(std::move(delegate))); + std::unique_ptr<InfoBarIOS> infobar(new InfoBarIOS(std::move(delegate))); base::scoped_nsobject<InfoBarController> controller; switch (step) { case translate::TRANSLATE_STEP_AFTER_TRANSLATE: @@ -119,7 +119,7 @@ return chrome_browser_state->GetOriginalChromeBrowserState()->GetPrefs(); } -scoped_ptr<translate::TranslatePrefs> +std::unique_ptr<translate::TranslatePrefs> ChromeIOSTranslateClient::GetTranslatePrefs() { DCHECK(web_state()); ios::ChromeBrowserState* chrome_browser_state =
diff --git a/ios/chrome/browser/translate/translate_accept_languages_factory.cc b/ios/chrome/browser/translate/translate_accept_languages_factory.cc index 53f7483..f7b45a5 100644 --- a/ios/chrome/browser/translate/translate_accept_languages_factory.cc +++ b/ios/chrome/browser/translate/translate_accept_languages_factory.cc
@@ -5,6 +5,7 @@ #include "ios/chrome/browser/translate/translate_accept_languages_factory.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/prefs/pref_service.h" @@ -67,12 +68,12 @@ TranslateAcceptLanguagesFactory::~TranslateAcceptLanguagesFactory() { } -scoped_ptr<KeyedService> +std::unique_ptr<KeyedService> TranslateAcceptLanguagesFactory::BuildServiceInstanceFor( web::BrowserState* context) const { ios::ChromeBrowserState* browser_state = ios::ChromeBrowserState::FromBrowserState(context); - return make_scoped_ptr( + return base::WrapUnique( new TranslateAcceptLanguagesService(browser_state->GetPrefs())); }
diff --git a/ios/chrome/browser/translate/translate_accept_languages_factory.h b/ios/chrome/browser/translate/translate_accept_languages_factory.h index 14852538..9c20619 100644 --- a/ios/chrome/browser/translate/translate_accept_languages_factory.h +++ b/ios/chrome/browser/translate/translate_accept_languages_factory.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_ACCEPT_LANGUAGES_FACTORY_H_ #define IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_ACCEPT_LANGUAGES_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" @@ -32,7 +34,7 @@ ~TranslateAcceptLanguagesFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.h b/ios/chrome/browser/ui/autofill/autofill_client_ios.h index e3e87ba2..646c154 100644 --- a/ios/chrome/browser/ui/autofill/autofill_client_ios.h +++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.h
@@ -5,11 +5,11 @@ #ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_CLIENT_IOS_H_ #define IOS_CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_CLIENT_IOS_H_ +#include <memory> #include <vector> #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h" #include "components/autofill/ios/browser/autofill_client_ios_bridge.h" @@ -46,7 +46,7 @@ infobars::InfoBarManager* infobar_manager, id<AutofillClientIOSBridge> bridge, password_manager::PasswordGenerationManager* password_generation_manager, - scoped_ptr<IdentityProvider> identity_provider); + std::unique_ptr<IdentityProvider> identity_provider); ~AutofillClientIOS() override; // AutofillClient implementation. @@ -64,7 +64,7 @@ const base::Closure& callback) override; void ConfirmSaveCreditCardToCloud( const CreditCard& card, - scoped_ptr<base::DictionaryValue> legal_message, + std::unique_ptr<base::DictionaryValue> legal_message, const base::Closure& callback) override; void LoadRiskData( const base::Callback<void(const std::string&)>& callback) override; @@ -98,7 +98,7 @@ infobars::InfoBarManager* infobar_manager_; id<AutofillClientIOSBridge> bridge_; // Weak password_manager::PasswordGenerationManager* password_generation_manager_; - scoped_ptr<IdentityProvider> identity_provider_; + std::unique_ptr<IdentityProvider> identity_provider_; CardUnmaskPromptControllerImpl unmask_controller_; DISALLOW_COPY_AND_ASSIGN(AutofillClientIOS);
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm index e0f2eb97..279f96f 100644 --- a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm +++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h" #include "components/autofill/core/browser/autofill_save_card_infobar_mobile.h" #include "components/autofill/core/browser/ui/card_unmask_prompt_view.h" @@ -30,7 +31,7 @@ infobars::InfoBarManager* infobar_manager, id<AutofillClientIOSBridge> bridge, password_manager::PasswordGenerationManager* password_generation_manager, - scoped_ptr<IdentityProvider> identity_provider) + std::unique_ptr<IdentityProvider> identity_provider) : browser_state_(browser_state), infobar_manager_(infobar_manager), bridge_(bridge), @@ -95,16 +96,17 @@ // InfoBarService is a WebContentsUserData, it must also be alive at this // time. infobar_manager_->AddInfoBar(CreateSaveCardInfoBarMobile( - make_scoped_ptr(new AutofillSaveCardInfoBarDelegateMobile( - false, card, scoped_ptr<base::DictionaryValue>(nullptr), callback)))); + base::WrapUnique(new AutofillSaveCardInfoBarDelegateMobile( + false, card, std::unique_ptr<base::DictionaryValue>(nullptr), + callback)))); } void AutofillClientIOS::ConfirmSaveCreditCardToCloud( const CreditCard& card, - scoped_ptr<base::DictionaryValue> legal_message, + std::unique_ptr<base::DictionaryValue> legal_message, const base::Closure& callback) { infobar_manager_->AddInfoBar(CreateSaveCardInfoBarMobile( - make_scoped_ptr(new AutofillSaveCardInfoBarDelegateMobile( + base::WrapUnique(new AutofillSaveCardInfoBarDelegateMobile( true, card, std::move(legal_message), callback)))); }
diff --git a/ios/chrome/browser/ui/autofill/autofill_save_card_infobar.mm b/ios/chrome/browser/ui/autofill/autofill_save_card_infobar.mm index 0f34f3d..3f07713 100644 --- a/ios/chrome/browser/ui/autofill/autofill_save_card_infobar.mm +++ b/ios/chrome/browser/ui/autofill/autofill_save_card_infobar.mm
@@ -11,8 +11,8 @@ namespace autofill { -scoped_ptr<infobars::InfoBar> CreateSaveCardInfoBarMobile( - scoped_ptr<AutofillSaveCardInfoBarDelegateMobile> delegate) { +std::unique_ptr<infobars::InfoBar> CreateSaveCardInfoBarMobile( + std::unique_ptr<AutofillSaveCardInfoBarDelegateMobile> delegate) { // TODO(jdonnelly): Implement iOS save card infobar. http://crbug.com/535784 return ::CreateConfirmInfoBar(std::move(delegate)); }
diff --git a/ios/chrome/browser/ui/webui/flags_ui.cc b/ios/chrome/browser/ui/webui/flags_ui.cc index 9d48d27..c72ce34 100644 --- a/ios/chrome/browser/ui/webui/flags_ui.cc +++ b/ios/chrome/browser/ui/webui/flags_ui.cc
@@ -113,7 +113,7 @@ void HandleResetAllFlags(const base::ListValue* args); private: - scoped_ptr<flags_ui::FlagsStorage> flags_storage_; + std::unique_ptr<flags_ui::FlagsStorage> flags_storage_; flags_ui::FlagAccess access_; bool experimental_features_requested_; @@ -158,8 +158,8 @@ base::DictionaryValue results; - scoped_ptr<base::ListValue> supported_features(new base::ListValue); - scoped_ptr<base::ListValue> unsupported_features(new base::ListValue); + std::unique_ptr<base::ListValue> supported_features(new base::ListValue); + std::unique_ptr<base::ListValue> unsupported_features(new base::ListValue); GetFlagFeatureEntries(flags_storage_.get(), access_, supported_features.get(), unsupported_features.get()); results.Set(flags_ui::kSupportedFeatures, supported_features.release());
diff --git a/ios/chrome/browser/ui/webui/history/browsing_history_handler.cc b/ios/chrome/browser/ui/webui/history/browsing_history_handler.cc index da8d6d2..73a1d26 100644 --- a/ios/chrome/browser/ui/webui/history/browsing_history_handler.cc +++ b/ios/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -110,7 +110,7 @@ DCHECK(sync_service->GetDeviceInfoTracker()); DCHECK(sync_service->GetDeviceInfoTracker()->IsSyncing()); - scoped_ptr<sync_driver::DeviceInfo> device_info = + std::unique_ptr<sync_driver::DeviceInfo> device_info = sync_service->GetDeviceInfoTracker()->GetDeviceInfo(client_id); if (device_info.get()) { *name = device_info->client_name(); @@ -182,11 +182,12 @@ result->SetString("title", title_to_set); } -scoped_ptr<base::DictionaryValue> BrowsingHistoryHandler::HistoryEntry::ToValue( +std::unique_ptr<base::DictionaryValue> +BrowsingHistoryHandler::HistoryEntry::ToValue( BookmarkModel* bookmark_model, SupervisedUserService* supervised_user_service, const ProfileSyncService* sync_service) const { - scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); + std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); SetUrlAndTitle(result.get()); base::string16 domain = url_formatter::IDNToUnicode(url.host()); @@ -203,7 +204,7 @@ result->SetDouble("time", time.ToJsTime()); // Pass the timestamps in a list. - scoped_ptr<base::ListValue> timestamps(new base::ListValue); + std::unique_ptr<base::ListValue> timestamps(new base::ListValue); for (int64_t timestamp : all_timestamps) { timestamps->AppendDouble( base::Time::FromInternalValue(timestamp).ToJsTime()); @@ -589,7 +590,7 @@ // Convert the result vector into a ListValue. base::ListValue results_value; for (const BrowsingHistoryHandler::HistoryEntry& entry : query_results_) { - scoped_ptr<base::Value> value( + std::unique_ptr<base::Value> value( entry.ToValue(bookmark_model, nullptr, sync_service)); results_value.Append(value.release()); }
diff --git a/ios/chrome/browser/ui/webui/history/browsing_history_handler.h b/ios/chrome/browser/ui/webui/history/browsing_history_handler.h index 1a6254c..233ffad0 100644 --- a/ios/chrome/browser/ui/webui/history/browsing_history_handler.h +++ b/ios/chrome/browser/ui/webui/history/browsing_history_handler.h
@@ -7,10 +7,10 @@ #include <stdint.h> +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" #include "base/strings/string16.h" @@ -68,7 +68,7 @@ void SetUrlAndTitle(base::DictionaryValue* result) const; // Converts the entry to a DictionaryValue to be owned by the caller. - scoped_ptr<base::DictionaryValue> ToValue( + std::unique_ptr<base::DictionaryValue> ToValue( bookmarks::BookmarkModel* bookmark_model, SupervisedUserService* supervised_user_service, const ProfileSyncService* sync_service) const; @@ -186,7 +186,7 @@ // The currently-executing request for synced history results. // Deleting the request will cancel it. - scoped_ptr<history::WebHistoryService::Request> web_history_request_; + std::unique_ptr<history::WebHistoryService::Request> web_history_request_; // True if there is a pending delete requests to the history service. bool has_pending_delete_request_;
diff --git a/ios/chrome/browser/ui/webui/net_export/net_export_ui.cc b/ios/chrome/browser/ui/webui/net_export/net_export_ui.cc index 4c68b8b..6e822b21 100644 --- a/ios/chrome/browser/ui/webui/net_export/net_export_ui.cc +++ b/ios/chrome/browser/ui/webui/net_export/net_export_ui.cc
@@ -4,12 +4,12 @@ #include "ios/chrome/browser/ui/webui/net_export/net_export_ui.h" +#include <memory> #include <string> #include "base/bind.h" #include "base/location.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" @@ -226,7 +226,7 @@ } void NetExportMessageHandler::OnExportNetLogInfoChanged(base::Value* arg) { - scoped_ptr<base::Value> value(arg); + std::unique_ptr<base::Value> value(arg); DCHECK_CURRENTLY_ON(web::WebThread::UI); web_ui()->CallJavascriptFunction(net_log::kOnExportNetLogInfoChanged, *arg); }
diff --git a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc index d48d2ee..0f4cb54 100644 --- a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc +++ b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -120,7 +120,7 @@ const base::ListValue* args) { DCHECK(args->empty()); base::DictionaryValue event_details; - scoped_ptr<base::ListValue> type_list(new base::ListValue()); + std::unique_ptr<base::ListValue> type_list(new base::ListValue()); ModelTypeSet protocol_types = syncer::ProtocolTypes(); for (ModelTypeSet::Iterator it = protocol_types.First(); it.Good(); it.Inc()) { @@ -150,7 +150,7 @@ void SyncInternalsMessageHandler::OnReceivedAllNodes( int request_id, - scoped_ptr<base::ListValue> nodes) { + std::unique_ptr<base::ListValue> nodes) { base::FundamentalValue id(request_id); web_ui()->CallJavascriptFunction( sync_driver::sync_ui_util::kGetAllNodesCallback, id, *nodes); @@ -162,7 +162,7 @@ void SyncInternalsMessageHandler::OnProtocolEvent( const syncer::ProtocolEvent& event) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( syncer::ProtocolEvent::ToValue(event)); web_ui()->CallJavascriptFunction( sync_driver::sync_ui_util::kDispatchEvent, @@ -193,8 +193,8 @@ void SyncInternalsMessageHandler::EmitCounterUpdate( syncer::ModelType type, const std::string& counter_type, - scoped_ptr<base::DictionaryValue> value) { - scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue()); + std::unique_ptr<base::DictionaryValue> value) { + std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue()); details->SetString(sync_driver::sync_ui_util::kModelType, ModelTypeToString(type)); details->SetString(sync_driver::sync_ui_util::kCounterType, counter_type); @@ -219,7 +219,7 @@ SigninManager* signin_manager = ios::SigninManagerFactory::GetForBrowserState(browser_state); sync_driver::SyncService* sync_service = GetSyncService(); - scoped_ptr<base::DictionaryValue> value = + std::unique_ptr<base::DictionaryValue> value = sync_driver::sync_ui_util::ConstructAboutInformation( sync_service, signin_manager, GetChannel()); web_ui()->CallJavascriptFunction(
diff --git a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h index 40c5f89..6ff02ee 100644 --- a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h +++ b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_WEBUI_SYNC_INTERNALS_SYNC_INTERNALS_MESSAGE_HANDLER_H_ #define IOS_CHROME_BROWSER_UI_WEBUI_SYNC_INTERNALS_SYNC_INTERNALS_MESSAGE_HANDLER_H_ +#include <memory> #include <string> #include "base/macros.h" @@ -52,7 +53,8 @@ const syncer::JsEventDetails& details) override; // Callback used in GetAllNodes. - void OnReceivedAllNodes(int request_id, scoped_ptr<base::ListValue> nodes); + void OnReceivedAllNodes(int request_id, + std::unique_ptr<base::ListValue> nodes); // sync_driver::SyncServiceObserver implementation. void OnStateChanged() override; @@ -75,7 +77,7 @@ // counter type. void EmitCounterUpdate(syncer::ModelType type, const std::string& counter_type, - scoped_ptr<base::DictionaryValue> value); + std::unique_ptr<base::DictionaryValue> value); private: // Fetches updated aboutInfo and sends it to the page in the form of an
diff --git a/ios/chrome/browser/ui/webui/version_handler.cc b/ios/chrome/browser/ui/webui/version_handler.cc index 9dd03a15..ba654cf 100644 --- a/ios/chrome/browser/ui/webui/version_handler.cc +++ b/ios/chrome/browser/ui/webui/version_handler.cc
@@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/memory/scoped_ptr.h" #include "base/values.h" #include "components/version_ui/version_handler_helper.h" #include "components/version_ui/version_ui_constants.h"
diff --git a/ios/chrome/browser/undo/bookmark_undo_service_factory.cc b/ios/chrome/browser/undo/bookmark_undo_service_factory.cc index f08731d..b500a4a 100644 --- a/ios/chrome/browser/undo/bookmark_undo_service_factory.cc +++ b/ios/chrome/browser/undo/bookmark_undo_service_factory.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/undo/bookmark_undo_service_factory.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/undo/bookmark_undo_service.h" @@ -39,9 +40,10 @@ BookmarkUndoServiceFactory::~BookmarkUndoServiceFactory() { } -scoped_ptr<KeyedService> BookmarkUndoServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +BookmarkUndoServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - return make_scoped_ptr(new BookmarkUndoService); + return base::WrapUnique(new BookmarkUndoService); } } // namespace ios
diff --git a/ios/chrome/browser/undo/bookmark_undo_service_factory.h b/ios/chrome/browser/undo/bookmark_undo_service_factory.h index cbd569cb..0427de4 100644 --- a/ios/chrome/browser/undo/bookmark_undo_service_factory.h +++ b/ios/chrome/browser/undo/bookmark_undo_service_factory.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_BROWSER_UNDO_BOOKMARK_UNDO_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_UNDO_BOOKMARK_UNDO_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -37,7 +38,7 @@ ~BookmarkUndoServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; DISALLOW_COPY_AND_ASSIGN(BookmarkUndoServiceFactory);
diff --git a/ios/chrome/browser/updatable_config/updatable_config_base.mm b/ios/chrome/browser/updatable_config/updatable_config_base.mm index f6c4cfd..3c0b809 100644 --- a/ios/chrome/browser/updatable_config/updatable_config_base.mm +++ b/ios/chrome/browser/updatable_config/updatable_config_base.mm
@@ -6,11 +6,12 @@ #include <stdint.h> +#include <memory> + #include "base/logging.h" #import "base/mac/bind_objc_block.h" #include "base/mac/scoped_nsobject.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/updatable_resource_provider.h" #include "ios/web/public/web_thread.h" @@ -97,14 +98,14 @@ private: UpdatableConfigBase* owner_; id<UpdatableResourceDescriptorBridge> descriptor_; - scoped_ptr<net::URLFetcher> fetcher_; + std::unique_ptr<net::URLFetcher> fetcher_; }; } // namespace @implementation UpdatableConfigBase { base::scoped_nsprotocol<id<UpdatableResourceBridge>> _updatableResource; - scoped_ptr<ConfigFetcher> _configFetcher; + std::unique_ptr<ConfigFetcher> _configFetcher; scoped_refptr<net::URLRequestContextGetter> _requestContextGetter; }
diff --git a/ios/chrome/browser/web_data_service_factory.cc b/ios/chrome/browser/web_data_service_factory.cc index a070cd0f..b49f331 100644 --- a/ios/chrome/browser/web_data_service_factory.cc +++ b/ios/chrome/browser/web_data_service_factory.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/files/file_path.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/memory/singleton.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/keyed_service/core/service_access_type.h" @@ -93,10 +94,10 @@ WebDataServiceFactory::~WebDataServiceFactory() { } -scoped_ptr<KeyedService> WebDataServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> WebDataServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { const base::FilePath& browser_state_path = context->GetStatePath(); - return make_scoped_ptr(new WebDataServiceWrapper( + return base::WrapUnique(new WebDataServiceWrapper( browser_state_path, GetApplicationContext()->GetApplicationLocale(), web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), web::WebThread::GetTaskRunnerForThread(web::WebThread::DB),
diff --git a/ios/chrome/browser/web_data_service_factory.h b/ios/chrome/browser/web_data_service_factory.h index fee7432..99801be 100644 --- a/ios/chrome/browser/web_data_service_factory.h +++ b/ios/chrome/browser/web_data_service_factory.h
@@ -5,9 +5,10 @@ #ifndef IOS_CHROME_BROWSER_WEB_DATA_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_WEB_DATA_SERVICE_FACTORY_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "components/keyed_service/ios/browser_state_keyed_service_factory.h" namespace base { @@ -64,7 +65,7 @@ ~WebDataServiceFactory() override; // BrowserStateKeyedServiceFactory implementation. - scoped_ptr<KeyedService> BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceFor( web::BrowserState* context) const override; web::BrowserState* GetBrowserStateToUse( web::BrowserState* context) const override;
diff --git a/ios/chrome/browser/web_resource/web_resource_util.cc b/ios/chrome/browser/web_resource/web_resource_util.cc index cceb553..f759da2 100644 --- a/ios/chrome/browser/web_resource/web_resource_util.cc +++ b/ios/chrome/browser/web_resource/web_resource_util.cc
@@ -42,7 +42,7 @@ return; } - scoped_ptr<base::Value> value(base::JSONReader::Read(data)); + std::unique_ptr<base::Value> value(base::JSONReader::Read(data)); if (!value.get()) { // Page information not properly read, or corrupted. PostErrorTask(task_runner, error_callback, kInvalidDataTypeError);
diff --git a/ios/chrome/browser/web_resource/web_resource_util_unittest.cc b/ios/chrome/browser/web_resource/web_resource_util_unittest.cc index b01f6d9..15293a8 100644 --- a/ios/chrome/browser/web_resource/web_resource_util_unittest.cc +++ b/ios/chrome/browser/web_resource/web_resource_util_unittest.cc
@@ -33,7 +33,7 @@ } // Called on success. - void OnParseSuccess(scoped_ptr<base::Value> value) { + void OnParseSuccess(std::unique_ptr<base::Value> value) { success_called_ = true; value_ = std::move(value); } @@ -56,7 +56,7 @@ base::MessageLoop loop_; std::string error_; - scoped_ptr<base::Value> value_; + std::unique_ptr<base::Value> value_; bool error_called_; bool success_called_; };
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp index ac2fe3a..e054957 100644 --- a/ios/chrome/ios_chrome.gyp +++ b/ios/chrome/ios_chrome.gyp
@@ -682,28 +682,6 @@ 'ios_chrome_browser_rlz', ], }], - ['safe_browsing!=0', { - 'sources': [ - 'browser/safe_browsing/hit_report.cc', - 'browser/safe_browsing/hit_report.h', - 'browser/safe_browsing/ping_manager.cc', - 'browser/safe_browsing/ping_manager.h', - 'browser/safe_browsing/protocol_manager_helper.cc', - 'browser/safe_browsing/protocol_manager_helper.h', - 'browser/safe_browsing/safe_browsing_blocking_page.h', - 'browser/safe_browsing/safe_browsing_blocking_page.mm', - 'browser/safe_browsing/safe_browsing_service.cc', - 'browser/safe_browsing/safe_browsing_service.h', - 'browser/safe_browsing/ui_manager.h', - 'browser/safe_browsing/ui_manager.mm', - 'browser/safe_browsing/util.cc', - 'browser/safe_browsing/util.h', - ], - 'dependencies': [ - '../../crypto/crypto.gyp:crypto', - 'ios_chrome_safe_browsing_proto', - ], - }] ], # TODO(crbug.com/569158): Suppresses warnings that are treated as errors # when minimum iOS version support is increased to iOS 9 and up. @@ -877,20 +855,5 @@ }, ], }], - ['safe_browsing!=0', { - 'targets': [ - { - # GN version: //ios/chrome/browser/safe_browsing:proto - 'target_name': 'ios_chrome_safe_browsing_proto', - 'type': 'static_library', - 'sources': [ 'browser/safe_browsing/metadata.proto' ], - 'variables': { - 'proto_in_dir': 'browser/safe_browsing', - 'proto_out_dir': 'ios/chrome/browser/safe_browsing', - }, - 'includes': [ '../../build/protoc.gypi' ], - }, - ], - }], ], }
diff --git a/ios/chrome/ios_chrome_tests.gyp b/ios/chrome/ios_chrome_tests.gyp index 66bd53b..ab4d86b 100644 --- a/ios/chrome/ios_chrome_tests.gyp +++ b/ios/chrome/ios_chrome_tests.gyp
@@ -90,13 +90,6 @@ 'includes': [ '../../build/copy_test_data_ios.gypi' ] }, ], - 'conditions': [ - ['safe_browsing!=0', { - 'sources': [ - 'browser/safe_browsing/util_unittest.cc', - ], - }], - ], 'includes': ['ios_chrome_resources_bundle.gypi'], }, {
diff --git a/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.h b/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.h index b457384..18b57e58 100644 --- a/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.h +++ b/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_TEST_IOS_CHROME_SCOPED_TESTING_CHROME_BROWSER_PROVIDER_H_ #define IOS_CHROME_TEST_IOS_CHROME_SCOPED_TESTING_CHROME_BROWSER_PROVIDER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace ios { class ChromeBrowserProvider; @@ -17,11 +18,11 @@ class IOSChromeScopedTestingChromeBrowserProvider { public: explicit IOSChromeScopedTestingChromeBrowserProvider( - scoped_ptr<ios::ChromeBrowserProvider> chrome_browser_provider); + std::unique_ptr<ios::ChromeBrowserProvider> chrome_browser_provider); ~IOSChromeScopedTestingChromeBrowserProvider(); private: - scoped_ptr<ios::ChromeBrowserProvider> chrome_browser_provider_; + std::unique_ptr<ios::ChromeBrowserProvider> chrome_browser_provider_; ios::ChromeBrowserProvider* original_chrome_browser_provider_; DISALLOW_COPY_AND_ASSIGN(IOSChromeScopedTestingChromeBrowserProvider);
diff --git a/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.mm b/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.mm index 8d71507..9f87bb4 100644 --- a/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.mm +++ b/ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_provider.mm
@@ -9,7 +9,7 @@ IOSChromeScopedTestingChromeBrowserProvider:: IOSChromeScopedTestingChromeBrowserProvider( - scoped_ptr<ios::ChromeBrowserProvider> chrome_browser_provider) + std::unique_ptr<ios::ChromeBrowserProvider> chrome_browser_provider) : chrome_browser_provider_(std::move(chrome_browser_provider)), original_chrome_browser_provider_(ios::GetChromeBrowserProvider()) { ios::SetChromeBrowserProvider(chrome_browser_provider_.get());
diff --git a/ios/chrome/test/ios_chrome_unit_test_suite.mm b/ios/chrome/test/ios_chrome_unit_test_suite.mm index 203d2f23..f72ea03 100644 --- a/ios/chrome/test/ios_chrome_unit_test_suite.mm +++ b/ios/chrome/test/ios_chrome_unit_test_suite.mm
@@ -51,10 +51,10 @@ } private: - scoped_ptr<web::WebClient> web_client_; - scoped_ptr<ios::TestChromeProviderInitializer> + std::unique_ptr<web::WebClient> web_client_; + std::unique_ptr<ios::TestChromeProviderInitializer> test_ios_chrome_provider_initializer_; - scoped_ptr<ApplicationContext> application_context_; + std::unique_ptr<ApplicationContext> application_context_; DISALLOW_COPY_AND_ASSIGN(IOSChromeUnitTestSuiteInitializer); };
diff --git a/ios/chrome/test/testing_application_context.h b/ios/chrome/test/testing_application_context.h index be61a58..506e520 100644 --- a/ios/chrome/test/testing_application_context.h +++ b/ios/chrome/test/testing_application_context.h
@@ -5,8 +5,9 @@ #ifndef IOS_CHROME_TEST_TESTING_APPLICATION_CONTEXT_H_ #define IOS_CHROME_TEST_TESTING_APPLICATION_CONTEXT_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "ios/chrome/browser/application_context.h" @@ -49,14 +50,13 @@ component_updater::ComponentUpdateService* GetComponentUpdateService() override; CRLSetFetcher* GetCRLSetFetcher() override; - safe_browsing::SafeBrowsingService* GetSafeBrowsingService() override; private: base::ThreadChecker thread_checker_; std::string application_locale_; PrefService* local_state_; ios::ChromeBrowserStateManager* chrome_browser_state_manager_; - scoped_ptr<network_time::NetworkTimeTracker> network_time_tracker_; + std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_; bool was_last_shutdown_clean_; DISALLOW_COPY_AND_ASSIGN(TestingApplicationContext);
diff --git a/ios/chrome/test/testing_application_context.mm b/ios/chrome/test/testing_application_context.mm index e2372bc..0bf790e5 100644 --- a/ios/chrome/test/testing_application_context.mm +++ b/ios/chrome/test/testing_application_context.mm
@@ -5,6 +5,7 @@ #include "ios/chrome/test/testing_application_context.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/time/default_clock.h" #include "base/time/default_tick_clock.h" #include "components/network_time/network_time_tracker.h" @@ -125,8 +126,8 @@ if (!network_time_tracker_) { DCHECK(local_state_); network_time_tracker_.reset(new network_time::NetworkTimeTracker( - make_scoped_ptr(new base::DefaultClock), - make_scoped_ptr(new base::DefaultTickClock), local_state_)); + base::WrapUnique(new base::DefaultClock), + base::WrapUnique(new base::DefaultTickClock), local_state_)); } return network_time_tracker_.get(); } @@ -157,9 +158,3 @@ DCHECK(thread_checker_.CalledOnValidThread()); return nullptr; } - -safe_browsing::SafeBrowsingService* -TestingApplicationContext::GetSafeBrowsingService() { - DCHECK(thread_checker_.CalledOnValidThread()); - return nullptr; -}
diff --git a/ios/chrome/tools/strings/generate_localizable_strings.mm b/ios/chrome/tools/strings/generate_localizable_strings.mm index 0352f9e..95e733f 100644 --- a/ios/chrome/tools/strings/generate_localizable_strings.mm +++ b/ios/chrome/tools/strings/generate_localizable_strings.mm
@@ -41,9 +41,10 @@ // Load the packed resource data pack for |locale| from |packed_data_pack_dir|. // If loading fails, null is returned. -scoped_ptr<ui::DataPack> LoadResourceDataPack(NSString* packed_data_pack_dir, - NSString* locale_name) { - scoped_ptr<ui::DataPack> resource_data_pack; +std::unique_ptr<ui::DataPack> LoadResourceDataPack( + NSString* packed_data_pack_dir, + NSString* locale_name) { + std::unique_ptr<ui::DataPack> resource_data_pack; NSString* resource_path = [NSString stringWithFormat:@"%@/%@.lproj/locale.pak", packed_data_pack_dir, locale_name]; @@ -336,7 +337,7 @@ } for (NSString* locale in locales) { - scoped_ptr<ui::DataPack> data_pack = + std::unique_ptr<ui::DataPack> data_pack = LoadResourceDataPack(data_pack_dir, locale); if (!data_pack) { fprintf(stderr, "ERROR: Failed to load branded pak for language: %s\n",
diff --git a/ios/crnet/crnet_environment.h b/ios/crnet/crnet_environment.h index 5a698897..34dd2f8f 100644 --- a/ios/crnet/crnet_environment.h +++ b/ios/crnet/crnet_environment.h
@@ -5,6 +5,8 @@ #ifndef IOS_CRNET_CRNET_ENVIRONMENT_H_ #define IOS_CRNET_CRNET_ENVIRONMENT_H_ +#include <memory> + #include "base/files/file_path.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" @@ -138,24 +140,25 @@ std::string sdch_pref_store_filename_; static CrNetEnvironment* chrome_net_; - scoped_ptr<base::Thread> network_io_thread_; - scoped_ptr<base::Thread> network_cache_thread_; - scoped_ptr<base::Thread> file_thread_; - scoped_ptr<base::Thread> file_user_blocking_thread_; - scoped_ptr<net::SdchManager> sdch_manager_; - scoped_ptr<net::SdchOwner> sdch_owner_; + std::unique_ptr<base::Thread> network_io_thread_; + std::unique_ptr<base::Thread> network_cache_thread_; + std::unique_ptr<base::Thread> file_thread_; + std::unique_ptr<base::Thread> file_user_blocking_thread_; + std::unique_ptr<net::SdchManager> sdch_manager_; + std::unique_ptr<net::SdchOwner> sdch_owner_; scoped_refptr<base::SequencedTaskRunner> pref_store_worker_pool_; scoped_refptr<JsonPrefStore> net_pref_store_; - scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; - scoped_ptr<net::ProxyConfigService> proxy_config_service_; - scoped_ptr<net::HttpServerProperties> http_server_properties_; - scoped_ptr<net::CookieStore> cookie_store_; + std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; + std::unique_ptr<net::ProxyConfigService> proxy_config_service_; + std::unique_ptr<net::HttpServerProperties> http_server_properties_; + std::unique_ptr<net::CookieStore> cookie_store_; scoped_refptr<net::URLRequestContextGetter> main_context_getter_; - scoped_ptr<net::URLRequestContext> main_context_; - scoped_ptr<CrNetHttpProtocolHandlerDelegate> http_protocol_handler_delegate_; + std::unique_ptr<net::URLRequestContext> main_context_; + std::unique_ptr<CrNetHttpProtocolHandlerDelegate> + http_protocol_handler_delegate_; std::string user_agent_product_name_; - scoped_ptr<net::NetLog> net_log_; - scoped_ptr<net::WriteToFileNetLogObserver> net_log_observer_; + std::unique_ptr<net::NetLog> net_log_; + std::unique_ptr<net::WriteToFileNetLogObserver> net_log_observer_; DISALLOW_COPY_AND_ASSIGN(CrNetEnvironment); };
diff --git a/ios/crnet/crnet_environment.mm b/ios/crnet/crnet_environment.mm index 7f2428f..b564111 100644 --- a/ios/crnet/crnet_environment.mm +++ b/ios/crnet/crnet_environment.mm
@@ -20,6 +20,7 @@ #include "base/mac/foundation_util.h" #include "base/mac/scoped_block.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/metrics/statistics_recorder.h" #include "base/path_service.h" #include "base/threading/worker_pool.h" @@ -352,13 +353,11 @@ if (!sdch_pref_store_filename_.empty()) { base::FilePath path(sdch_pref_store_filename_); pref_store_worker_pool_ = file_user_blocking_thread_->task_runner(); - net_pref_store_ = new JsonPrefStore( - path, - pref_store_worker_pool_.get(), - scoped_ptr<PrefFilter>()); + net_pref_store_ = new JsonPrefStore(path, pref_store_worker_pool_.get(), + std::unique_ptr<PrefFilter>()); net_pref_store_->ReadPrefsAsync(nullptr); sdch_owner_->EnablePersistentStorage( - scoped_ptr<net::SdchOwner::PrefStorage>( + std::unique_ptr<net::SdchOwner::PrefStorage>( new SdchOwnerPrefStorage(net_pref_store_.get()))); } context->set_sdch_manager(sdch_manager_.get()); @@ -425,7 +424,7 @@ base::FilePath cache_path = base::mac::NSStringToFilePath([dirs objectAtIndex:0]); cache_path = cache_path.Append(FILE_PATH_LITERAL("crnet")); - scoped_ptr<net::HttpCache::DefaultBackend> main_backend( + std::unique_ptr<net::HttpCache::DefaultBackend> main_backend( new net::HttpCache::DefaultBackend(net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path, 0, // Default cache size. @@ -473,9 +472,9 @@ net::URLRequestJobFactoryImpl* job_factory = new net::URLRequestJobFactoryImpl; job_factory->SetProtocolHandler( - "data", make_scoped_ptr(new net::DataProtocolHandler)); + "data", base::WrapUnique(new net::DataProtocolHandler)); job_factory->SetProtocolHandler( - "file", make_scoped_ptr( + "file", base::WrapUnique( new net::FileProtocolHandler(file_thread_->task_runner()))); main_context_->set_job_factory(job_factory);
diff --git a/ios/crnet/sdch_owner_pref_storage.cc b/ios/crnet/sdch_owner_pref_storage.cc index 3af81f5..292eaa24 100644 --- a/ios/crnet/sdch_owner_pref_storage.cc +++ b/ios/crnet/sdch_owner_pref_storage.cc
@@ -72,7 +72,8 @@ return result_value->GetAsDictionary(result); } -void SdchOwnerPrefStorage::SetValue(scoped_ptr<base::DictionaryValue> value) { +void SdchOwnerPrefStorage::SetValue( + std::unique_ptr<base::DictionaryValue> value) { storage_->SetValue(storage_key_, std::move(value), WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); }
diff --git a/ios/crnet/sdch_owner_pref_storage.h b/ios/crnet/sdch_owner_pref_storage.h index fbb177e..5ecaf1e 100644 --- a/ios/crnet/sdch_owner_pref_storage.h +++ b/ios/crnet/sdch_owner_pref_storage.h
@@ -5,6 +5,8 @@ #ifndef IOS_CRNET_SDCH_OWNER_PREF_STORAGE_H_ #define IOS_CRNET_SDCH_OWNER_PREF_STORAGE_H_ +#include <memory> + #include "base/macros.h" #include "components/prefs/pref_store.h" #include "net/sdch/sdch_owner.h" @@ -24,7 +26,7 @@ ReadError GetReadError() const override; bool GetValue(const base::DictionaryValue** result) const override; bool GetMutableValue(base::DictionaryValue** result) override; - void SetValue(scoped_ptr<base::DictionaryValue> value) override; + void SetValue(std::unique_ptr<base::DictionaryValue> value) override; void ReportValueChanged() override; bool IsInitializationComplete() override; void StartObservingInit(net::SdchOwner* observer) override;
diff --git a/ios/net/clients/crn_network_client_protocol.h b/ios/net/clients/crn_network_client_protocol.h index d000789..b8142ab 100644 --- a/ios/net/clients/crn_network_client_protocol.h +++ b/ios/net/clients/crn_network_client_protocol.h
@@ -8,7 +8,6 @@ #import <Foundation/Foundation.h> #include "base/callback_forward.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string_util.h" namespace net {
diff --git a/ios/net/cookies/cookie_store_ios.h b/ios/net/cookies/cookie_store_ios.h index 4a08929d..ee2f678 100644 --- a/ios/net/cookies/cookie_store_ios.h +++ b/ios/net/cookies/cookie_store_ios.h
@@ -6,6 +6,7 @@ #define IOS_NET_COOKIES_COOKIE_STORE_IOS_H_ #include <map> +#include <memory> #include <string> #include <utility> #include <vector> @@ -14,7 +15,6 @@ #include "base/cancelable_callback.h" #include "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" @@ -88,7 +88,7 @@ // as its default backend and is initially synchronized with it. // Apple does not persist the cookies' creation dates in NSHTTPCookieStorage, // so callers should not expect these values to be populated. - static scoped_ptr<CookieStoreIOS> CreateCookieStore( + static std::unique_ptr<CookieStoreIOS> CreateCookieStore( NSHTTPCookieStorage* cookie_storage); // As there is only one system store, only one CookieStoreIOS at a time may @@ -157,7 +157,7 @@ void DeleteSessionCookiesAsync(const DeleteCallback& callback) override; void FlushStore(const base::Closure& callback) override; - scoped_ptr<CookieChangedSubscription> AddCallbackForCookie( + std::unique_ptr<CookieChangedSubscription> AddCallbackForCookie( const GURL& url, const std::string& name, const CookieChangedCallback& callback) override; @@ -204,9 +204,9 @@ void DeleteCookiesWithFilter(const CookieFilterFunction& filter, const DeleteCallback& callback); - scoped_ptr<net::CookieMonster> cookie_monster_; + std::unique_ptr<net::CookieMonster> cookie_monster_; base::scoped_nsobject<NSHTTPCookieStorage> system_store_; - scoped_ptr<CookieCreationTimeManager> creation_time_manager_; + std::unique_ptr<CookieCreationTimeManager> creation_time_manager_; bool metrics_enabled_; base::TimeDelta flush_delay_; base::CancelableClosure flush_closure_; @@ -321,7 +321,7 @@ // Cached values of system cookies. Only cookies which have an observer added // with AddCallbackForCookie are kept in this cache. - scoped_ptr<CookieCache> cookie_cache_; + std::unique_ptr<CookieCache> cookie_cache_; // Callbacks for cookie changes installed by AddCallbackForCookie. typedef std::map<std::pair<GURL, std::string>, CookieChangedCallbackList*>
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm index 78fb510f..84e687dc 100644 --- a/ios/net/cookies/cookie_store_ios.mm +++ b/ios/net/cookies/cookie_store_ios.mm
@@ -327,7 +327,7 @@ } // static -scoped_ptr<CookieStoreIOS> CookieStoreIOS::CreateCookieStore( +std::unique_ptr<CookieStoreIOS> CookieStoreIOS::CreateCookieStore( NSHTTPCookieStorage* cookie_storage) { DCHECK(cookie_storage); // TODO(huey): Update this when CrNet supports multiple cookie jars. @@ -335,7 +335,7 @@ // Create a cookie store with no persistent store backing. Then, populate // it from the system's cookie jar. - scoped_ptr<CookieStoreIOS> cookie_store( + std::unique_ptr<CookieStoreIOS> cookie_store( new CookieStoreIOS(nullptr, cookie_storage)); cookie_store->synchronization_state_ = SYNCHRONIZED; cookie_store->FlushStore(base::Closure()); @@ -482,11 +482,10 @@ // First create a CanonicalCookie, to normalize the arguments, // particularly domain and path, and perform validation. - scoped_ptr<net::CanonicalCookie> canonical_cookie = + std::unique_ptr<net::CanonicalCookie> canonical_cookie = net::CanonicalCookie::Create( url, name, value, domain, path, creation_time, expiration_time, - secure, http_only, same_site, enforce_strict_secure, - priority); + secure, http_only, same_site, enforce_strict_secure, priority); if (canonical_cookie) { NSHTTPCookie* cookie = @@ -981,7 +980,7 @@ FROM_HERE, flush_closure_.callback(), flush_delay_); } -scoped_ptr<net::CookieStore::CookieChangedSubscription> +std::unique_ptr<net::CookieStore::CookieChangedSubscription> CookieStoreIOS::AddCallbackForCookie(const GURL& gurl, const std::string& name, const CookieChangedCallback& callback) {
diff --git a/ios/net/cookies/cookie_store_ios_unittest.mm b/ios/net/cookies/cookie_store_ios_unittest.mm index af2c94e..f5cd3c1 100644 --- a/ios/net/cookies/cookie_store_ios_unittest.mm +++ b/ios/net/cookies/cookie_store_ios_unittest.mm
@@ -6,9 +6,11 @@ #import <Foundation/Foundation.h> +#include <memory> + #include "base/bind_helpers.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/strings/sys_string_conversions.h" #import "net/base/mac/url_conversions.h" @@ -30,9 +32,9 @@ namespace net { struct CookieStoreIOSTestTraits { - static scoped_ptr<net::CookieStore> Create() { + static std::unique_ptr<net::CookieStore> Create() { ClearCookies(); - scoped_ptr<CookieStoreIOS> store(new CookieStoreIOS(nullptr)); + std::unique_ptr<CookieStoreIOS> store(new CookieStoreIOS(nullptr)); store->synchronization_state_ = CookieStoreIOS::SYNCHRONIZED; return std::move(store); } @@ -49,8 +51,8 @@ }; struct InactiveCookieStoreIOSTestTraits { - static scoped_ptr<net::CookieStore> Create() { - return make_scoped_ptr(new CookieStoreIOS(nullptr)); + static std::unique_ptr<net::CookieStore> Create() { + return base::WrapUnique(new CookieStoreIOS(nullptr)); } static const bool is_cookie_monster = false; @@ -172,11 +174,11 @@ store_->FlushStore(callback); } - scoped_ptr<CookieStore::CookieChangedSubscription> AddCallbackForCookie( + std::unique_ptr<CookieStore::CookieChangedSubscription> AddCallbackForCookie( const GURL& url, const std::string& name, const CookieChangedCallback& callback) override { - return scoped_ptr<CookieStore::CookieChangedSubscription>(); + return std::unique_ptr<CookieStore::CookieChangedSubscription>(); } bool IsEphemeral() override { @@ -193,16 +195,16 @@ CookieStoreIOS::SwitchSynchronizedStore(dummy_store_.get(), store_.get()); } - scoped_ptr<CookieStoreIOS> store_; + std::unique_ptr<CookieStoreIOS> store_; // |dummy_store_| is not directly used, but is needed to make |store_| // inactive. - scoped_ptr<CookieStoreIOS> dummy_store_; + std::unique_ptr<CookieStoreIOS> dummy_store_; }; struct RoundTripTestCookieStoreTraits { - static scoped_ptr<net::CookieStore> Create() { + static std::unique_ptr<net::CookieStore> Create() { ClearCookies(); - return make_scoped_ptr(new RoundTripTestCookieStore()); + return base::WrapUnique(new RoundTripTestCookieStore()); } static const bool is_cookie_monster = false; @@ -250,7 +252,7 @@ net::CookieOptions options; options.set_include_httponly(); - scoped_ptr<net::CanonicalCookie> cookie(net::CanonicalCookie::Create( + std::unique_ptr<net::CanonicalCookie> cookie(net::CanonicalCookie::Create( kTestCookieURL, "a=b", base::Time::Now(), options)); cookies.push_back(cookie.release()); @@ -433,8 +435,8 @@ base::MessageLoop loop_; scoped_refptr<TestPersistentCookieStore> backend_; - scoped_ptr<net::CookieStoreIOS> store_; - scoped_ptr<net::CookieStore::CookieChangedSubscription> + std::unique_ptr<net::CookieStoreIOS> store_; + std::unique_ptr<net::CookieStore::CookieChangedSubscription> cookie_changed_callback_; std::vector<net::CanonicalCookie> cookies_changed_; std::vector<bool> cookies_removed_; @@ -533,7 +535,7 @@ base::MessageLoop loop; const GURL kTestCookieURL("http://foo.google.com/bar"); ClearCookies(); - scoped_ptr<CookieStoreIOS> cookie_store(new CookieStoreIOS(nullptr)); + std::unique_ptr<CookieStoreIOS> cookie_store(new CookieStoreIOS(nullptr)); CookieStoreIOS::SwitchSynchronizedStore(nullptr, cookie_store.get()); // Add a cookie. net::CookieOptions options; @@ -611,7 +613,7 @@ // unsynchronized while synchronization is in progress). TEST_F(CookieStoreIOSWithBackend, SyncThenUnsync) { ClearCookies(); - scoped_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); + std::unique_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); // Switch back and forth before synchronization can complete. CookieStoreIOS::SwitchSynchronizedStore(nullptr, store_.get()); CookieStoreIOS::SwitchSynchronizedStore(store_.get(), dummy_store.get()); @@ -632,7 +634,7 @@ // and there are pending tasks). TEST_F(CookieStoreIOSWithBackend, SyncThenUnsyncWithPendingTasks) { ClearCookies(); - scoped_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); + std::unique_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); // Start synchornization. CookieStoreIOS::SwitchSynchronizedStore(nullptr, store_.get()); // Create a pending task while synchronization is in progress. @@ -730,7 +732,7 @@ } TEST_F(CookieStoreIOSWithBackend, FlushOnSwitch) { - scoped_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); + std::unique_ptr<CookieStoreIOS> dummy_store(new CookieStoreIOS(nullptr)); CookieStoreIOS::SwitchSynchronizedStore(nullptr, store_.get()); EXPECT_FALSE(backend_->flushed()); CookieStoreIOS::SwitchSynchronizedStore(store_.get(), dummy_store.get()); @@ -801,7 +803,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; std::vector<bool> removes; - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, &removes)); @@ -828,7 +830,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; std::vector<bool> removes; - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, &removes)); @@ -855,7 +857,7 @@ std::vector<net::CanonicalCookie> cookies; std::vector<bool> removes; SetSystemCookie(kTestCookieURL, "abc", "def"); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, &removes)); @@ -876,7 +878,7 @@ CookieStoreIOS::SwitchSynchronizedStore(nullptr, store_.get()); backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr)); @@ -896,19 +898,19 @@ std::vector<net::CanonicalCookie> cookies2; std::vector<net::CanonicalCookie> cookies3; std::vector<net::CanonicalCookie> cookies4; - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr)); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle2 = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle2 = store_->AddCallbackForCookie( kTestCookieURL2, "abc", base::Bind(&RecordCookieChanges, &cookies2, nullptr)); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle3 = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle3 = store_->AddCallbackForCookie( kTestCookieURL3, "abc", base::Bind(&RecordCookieChanges, &cookies3, nullptr)); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle4 = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle4 = store_->AddCallbackForCookie( kTestCookieURL4, "abc", base::Bind(&RecordCookieChanges, &cookies4, nullptr)); @@ -932,7 +934,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; SetSystemCookie(kTestCookieURL2, "abc", "def"); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL2, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr)); @@ -948,7 +950,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; SetSystemCookie(kTestCookieURL3, "abc", "def"); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL2, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr)); @@ -964,7 +966,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; SetSystemCookie(kTestCookieURL3, "abc", "def"); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL2, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr)); @@ -980,7 +982,7 @@ backend_->RunLoadedCallback(); std::vector<net::CanonicalCookie> cookies; SetSystemCookie(kTestCookieURL, "abc", "def"); - scoped_ptr<net::CookieStore::CookieChangedSubscription> handle = + std::unique_ptr<net::CookieStore::CookieChangedSubscription> handle = store_->AddCallbackForCookie( kTestCookieURL, "abc", base::Bind(&RecordCookieChanges, &cookies, nullptr));
diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm index 477eb13..845d19c 100644 --- a/ios/net/crn_http_protocol_handler.mm +++ b/ios/net/crn_http_protocol_handler.mm
@@ -6,6 +6,7 @@ #include <stdint.h> +#include <memory> #include <utility> #include <vector> @@ -14,8 +15,8 @@ #include "base/mac/bind_objc_block.h" #include "base/mac/scoped_nsobject.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" @@ -199,7 +200,7 @@ // Stream delegate to read the HTTPBodyStream. base::scoped_nsobject<CRWHTTPStreamDelegate> stream_delegate_; // Vector of readers used to accumulate a POST data stream. - std::vector<scoped_ptr<UploadElementReader>> post_data_readers_; + std::vector<std::unique_ptr<UploadElementReader>> post_data_readers_; // This cannot be a scoped pointer because it must be deleted on the IO // thread. @@ -243,7 +244,7 @@ if (!post_data_readers_.empty()) { // NOTE: This call will result in |post_data_readers_| being cleared, // which is the desired behavior. - net_request_->set_upload(make_scoped_ptr( + net_request_->set_upload(base::WrapUnique( new ElementsUploadDataStream(std::move(post_data_readers_), 0))); DCHECK(post_data_readers_.empty()); } @@ -259,7 +260,7 @@ if (length) { std::vector<char> owned_data(buffer_->data(), buffer_->data() + length); post_data_readers_.push_back( - make_scoped_ptr(new UploadOwnedBytesElementReader(&owned_data))); + base::WrapUnique(new UploadOwnedBytesElementReader(&owned_data))); } break; } @@ -721,7 +722,7 @@ if (body_length > 0) { const char* source_bytes = reinterpret_cast<const char*>([body bytes]); std::vector<char> owned_data(source_bytes, source_bytes + body_length); - scoped_ptr<UploadElementReader> reader( + std::unique_ptr<UploadElementReader> reader( new UploadOwnedBytesElementReader(&owned_data)); net_request_->set_upload( ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
diff --git a/ios/net/http_cache_helper.cc b/ios/net/http_cache_helper.cc index 1702cac..45f86db 100644 --- a/ios/net/http_cache_helper.cc +++ b/ios/net/http_cache_helper.cc
@@ -30,7 +30,7 @@ } // Clears the disk_cache::Backend on the IO thread and deletes |backend|. -void DoomHttpCache(scoped_ptr<disk_cache::Backend*> backend, +void DoomHttpCache(std::unique_ptr<disk_cache::Backend*> backend, const scoped_refptr<base::TaskRunner>& client_task_runner, const net::CompletionCallback& callback, int error) { @@ -66,7 +66,8 @@ if (sdch_manager) sdch_manager->ClearData(); - scoped_ptr<disk_cache::Backend*> backend(new disk_cache::Backend*(nullptr)); + std::unique_ptr<disk_cache::Backend*> backend( + new disk_cache::Backend*(nullptr)); disk_cache::Backend** backend_ptr = backend.get(); net::CompletionCallback doom_callback = base::Bind(&DoomHttpCache, base::Passed(std::move(backend)),
diff --git a/ios/net/http_response_headers_util.h b/ios/net/http_response_headers_util.h index 4bc00199..34b5b26 100644 --- a/ios/net/http_response_headers_util.h +++ b/ios/net/http_response_headers_util.h
@@ -5,7 +5,6 @@ #ifndef IOS_NET_HTTP_RESPONSE_HEADERS_UTIL_H_ #define IOS_NET_HTTP_RESPONSE_HEADERS_UTIL_H_ -#include "base/memory/scoped_ptr.h" #include "net/http/http_response_headers.h" @class NSHTTPURLResponse;
diff --git a/ios/net/protocol_handler_util_unittest.mm b/ios/net/protocol_handler_util_unittest.mm index 5e7226fd..eab5338 100644 --- a/ios/net/protocol_handler_util_unittest.mm +++ b/ios/net/protocol_handler_util_unittest.mm
@@ -4,10 +4,11 @@ #import "ios/net/protocol_handler_util.h" +#include <memory> #include <utility> #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/sys_string_conversions.h" @@ -114,9 +115,9 @@ ProtocolHandlerUtilTest() : request_context_(new TestURLRequestContext) { // Ownership of the protocol handlers is transferred to the factory. job_factory_.SetProtocolHandler("http", - make_scoped_ptr(new NetProtocolHandler)); + base::WrapUnique(new NetProtocolHandler)); job_factory_.SetProtocolHandler("data", - make_scoped_ptr(new DataProtocolHandler)); + base::WrapUnique(new DataProtocolHandler)); request_context_->set_job_factory(&job_factory_); } @@ -131,7 +132,7 @@ url_string += ","; GURL url(url_string); - scoped_ptr<URLRequest> request( + std::unique_ptr<URLRequest> request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, this)); request->Start(); base::RunLoop loop; @@ -155,7 +156,7 @@ protected: base::MessageLoop loop_; URLRequestJobFactoryImpl job_factory_; - scoped_ptr<URLRequestContext> request_context_; + std::unique_ptr<URLRequestContext> request_context_; }; } // namespace @@ -173,7 +174,7 @@ TEST_F(ProtocolHandlerUtilTest, GetResponseHttpTest) { // Create a request. GURL url(std::string("http://url")); - scoped_ptr<URLRequest> request( + std::unique_ptr<URLRequest> request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, this)); request->Start(); // Create a response from the request. @@ -200,7 +201,7 @@ // Create a request using the magic domain that triggers a garbage // content-type in the test framework. GURL url(std::string("http://badcontenttype")); - scoped_ptr<URLRequest> request( + std::unique_ptr<URLRequest> request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, this)); request->Start(); // Create a response from the request. @@ -216,7 +217,7 @@ // Create a request using the magic domain that triggers a garbage // content-type in the test framework. GURL url(std::string("http://multiplecontenttype")); - scoped_ptr<URLRequest> request( + std::unique_ptr<URLRequest> request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, this)); request->Start(); // Create a response from the request. @@ -239,7 +240,7 @@ @"Accept" : @"money/cash", @"Foo" : @"bar", }]; - scoped_ptr<URLRequest> out_request( + std::unique_ptr<URLRequest> out_request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, nullptr)); CopyHttpHeaders(in_request, out_request.get()); @@ -258,10 +259,10 @@ GURL url(std::string("http://url")); base::scoped_nsobject<NSMutableURLRequest> in_request( [[NSMutableURLRequest alloc] initWithURL:NSURLWithGURL(url)]); - scoped_ptr<URLRequest> out_request( + std::unique_ptr<URLRequest> out_request( request_context_->CreateRequest(url, DEFAULT_PRIORITY, nullptr)); out_request->set_method("POST"); - scoped_ptr<UploadElementReader> reader( + std::unique_ptr<UploadElementReader> reader( new UploadBytesElementReader(nullptr, 0)); out_request->set_upload( ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.h b/ios/public/provider/chrome/browser/chrome_browser_provider.h index 69daac1..6083525 100644 --- a/ios/public/provider/chrome/browser/chrome_browser_provider.h +++ b/ios/public/provider/chrome/browser/chrome_browser_provider.h
@@ -7,12 +7,13 @@ #include <CoreGraphics/CoreGraphics.h> #include <stddef.h> + +#include <memory> #include <string> #include <vector> #include "base/callback_forward.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "components/favicon_base/favicon_callback.h" class AutocompleteProvider; @@ -113,17 +114,9 @@ // metrics_services_manager_client.h for details on |on_update_callback|. virtual bool IsSafeBrowsingEnabled(const base::Closure& on_update_callback); - // Called when the IOSChromeMetricsServiceClientManager instance is - // destroyed. - virtual void OnMetricsServicesManagerClientDestroyed(); - // Returns the SyncedWindowDelegatesGetter implementation. - virtual scoped_ptr<browser_sync::SyncedWindowDelegatesGetter> + virtual std::unique_ptr<browser_sync::SyncedWindowDelegatesGetter> CreateSyncedWindowDelegatesGetter(ios::ChromeBrowserState* browser_state); - - // Gets the URLRequestContextGetter used by the SafeBrowsing service. Returns - // null if there is no SafeBrowsing service. - virtual net::URLRequestContextGetter* GetSafeBrowsingURLRequestContext(); }; } // namespace ios
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.mm b/ios/public/provider/chrome/browser/chrome_browser_provider.mm index 3254f1f..8d48b480 100644 --- a/ios/public/provider/chrome/browser/chrome_browser_provider.mm +++ b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
@@ -104,17 +104,10 @@ return false; } -void ChromeBrowserProvider::OnMetricsServicesManagerClientDestroyed() {} - -scoped_ptr<browser_sync::SyncedWindowDelegatesGetter> +std::unique_ptr<browser_sync::SyncedWindowDelegatesGetter> ChromeBrowserProvider::CreateSyncedWindowDelegatesGetter( ios::ChromeBrowserState* browser_state) { return nullptr; } -net::URLRequestContextGetter* -ChromeBrowserProvider::GetSafeBrowsingURLRequestContext() { - return nullptr; -} - } // namespace ios
diff --git a/ios/public/provider/chrome/browser/test_chrome_browser_provider.h b/ios/public/provider/chrome/browser/test_chrome_browser_provider.h index 863121f..760d314 100644 --- a/ios/public/provider/chrome/browser/test_chrome_browser_provider.h +++ b/ios/public/provider/chrome/browser/test_chrome_browser_provider.h
@@ -5,8 +5,9 @@ #ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_BROWSER_PROVIDER_H_ #define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_BROWSER_PROVIDER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" class FakeProfileOAuth2TokenServiceIOSProvider; @@ -30,10 +31,11 @@ UpdatableResourceProvider* GetUpdatableResourceProvider() override; private: - scoped_ptr<FakeProfileOAuth2TokenServiceIOSProvider> + std::unique_ptr<FakeProfileOAuth2TokenServiceIOSProvider> oauth2_token_service_provider_; - scoped_ptr<ChromeIdentityService> chrome_identity_service_; - scoped_ptr<TestUpdatableResourceProvider> test_updatable_resource_provider_; + std::unique_ptr<ChromeIdentityService> chrome_identity_service_; + std::unique_ptr<TestUpdatableResourceProvider> + test_updatable_resource_provider_; DISALLOW_COPY_AND_ASSIGN(TestChromeBrowserProvider); };
diff --git a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h index 2f2bb49..c9ef180 100644 --- a/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h +++ b/ios/public/provider/chrome/browser/test_chrome_provider_initializer.h
@@ -5,8 +5,9 @@ #ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_PROVIDER_INITIALIZER_H_ #define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_TEST_CHROME_PROVIDER_INITIALIZER_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace ios { @@ -21,7 +22,7 @@ virtual ~TestChromeProviderInitializer(); private: - scoped_ptr<TestChromeBrowserProvider> chrome_browser_provider_; + std::unique_ptr<TestChromeBrowserProvider> chrome_browser_provider_; DISALLOW_COPY_AND_ASSIGN(TestChromeProviderInitializer); };
diff --git a/ios/public/provider/web/web_controller_provider.h b/ios/public/provider/web/web_controller_provider.h index 0845ad6..1fe9aef 100644 --- a/ios/public/provider/web/web_controller_provider.h +++ b/ios/public/provider/web/web_controller_provider.h
@@ -5,7 +5,8 @@ #ifndef IOS_PUBLIC_PROVIDER_WEB_WEB_CONTROLLER_PROVIDER_H_ #define IOS_PUBLIC_PROVIDER_WEB_WEB_CONTROLLER_PROVIDER_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "ios/web/public/block_types.h" #include "ios/web/public/web_state/web_state_observer.h" #include "url/gurl.h" @@ -60,7 +61,7 @@ // Vends WebControllerProviders created using |browser_state|, passing // ownership to callers. - virtual scoped_ptr<WebControllerProvider> CreateWebControllerProvider( + virtual std::unique_ptr<WebControllerProvider> CreateWebControllerProvider( web::BrowserState* browser_state); };
diff --git a/ios/public/provider/web/web_controller_provider.mm b/ios/public/provider/web/web_controller_provider.mm index 82aa875..70fde98 100644 --- a/ios/public/provider/web/web_controller_provider.mm +++ b/ios/public/provider/web/web_controller_provider.mm
@@ -43,10 +43,10 @@ WebControllerProviderFactory::~WebControllerProviderFactory() { } -scoped_ptr<WebControllerProvider> +std::unique_ptr<WebControllerProvider> WebControllerProviderFactory::CreateWebControllerProvider( web::BrowserState* browser_state) { - return scoped_ptr<WebControllerProvider>( + return std::unique_ptr<WebControllerProvider>( new WebControllerProvider(browser_state)); }
diff --git a/ios/web/active_state_manager_impl_unittest.mm b/ios/web/active_state_manager_impl_unittest.mm index 110fdb0..8538860 100644 --- a/ios/web/active_state_manager_impl_unittest.mm +++ b/ios/web/active_state_manager_impl_unittest.mm
@@ -4,7 +4,6 @@ #include "ios/web/active_state_manager_impl.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/active_state_manager.h" #include "ios/web/public/browser_state.h" #include "ios/web/public/test/test_browser_state.h"
diff --git a/ios/web/app/web_main_loop.h b/ios/web/app/web_main_loop.h index 9797cfc..67f0fb5 100644 --- a/ios/web/app/web_main_loop.h +++ b/ios/web/app/web_main_loop.h
@@ -5,9 +5,10 @@ #ifndef IOS_WEB_APP_WEB_MAIN_LOOP_H_ #define IOS_WEB_APP_WEB_MAIN_LOOP_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" namespace base { class CommandLine; @@ -68,28 +69,28 @@ bool created_threads_; // Members initialized in |MainMessageLoopStart()| --------------------------- - scoped_ptr<base::MessageLoop> main_message_loop_; - scoped_ptr<base::SystemMonitor> system_monitor_; - scoped_ptr<base::PowerMonitor> power_monitor_; - scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; + std::unique_ptr<base::MessageLoop> main_message_loop_; + std::unique_ptr<base::SystemMonitor> system_monitor_; + std::unique_ptr<base::PowerMonitor> power_monitor_; + std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; // Destroy parts_ before main_message_loop_ (required) and before other // classes constructed in web (but after main_thread_). - scoped_ptr<WebMainParts> parts_; + std::unique_ptr<WebMainParts> parts_; // Members initialized in |InitializeMainThread()| --------------------------- // This must get destroyed before other threads that are created in parts_. - scoped_ptr<WebThreadImpl> main_thread_; + std::unique_ptr<WebThreadImpl> main_thread_; // Members initialized in |RunMainMessageLoopParts()| ------------------------ - scoped_ptr<WebThreadImpl> db_thread_; - scoped_ptr<WebThreadImpl> file_user_blocking_thread_; - scoped_ptr<WebThreadImpl> file_thread_; - scoped_ptr<WebThreadImpl> cache_thread_; - scoped_ptr<WebThreadImpl> io_thread_; + std::unique_ptr<WebThreadImpl> db_thread_; + std::unique_ptr<WebThreadImpl> file_user_blocking_thread_; + std::unique_ptr<WebThreadImpl> file_thread_; + std::unique_ptr<WebThreadImpl> cache_thread_; + std::unique_ptr<WebThreadImpl> io_thread_; // Members initialized in |WebThreadsStarted()| -------------------------- - scoped_ptr<CookieNotificationBridge> cookie_notification_bridge_; + std::unique_ptr<CookieNotificationBridge> cookie_notification_bridge_; DISALLOW_COPY_AND_ASSIGN(WebMainLoop); };
diff --git a/ios/web/app/web_main_loop.mm b/ios/web/app/web_main_loop.mm index ac91ba6..017ffa4 100644 --- a/ios/web/app/web_main_loop.mm +++ b/ios/web/app/web_main_loop.mm
@@ -82,7 +82,7 @@ system_monitor_.reset(new base::SystemMonitor); #endif // TODO(rohitrao): Do we need PowerMonitor on iOS, or can we get rid of it? - scoped_ptr<base::PowerMonitorSource> power_monitor_source( + std::unique_ptr<base::PowerMonitorSource> power_monitor_source( new base::PowerMonitorDeviceSource()); power_monitor_.reset(new base::PowerMonitor(std::move(power_monitor_source))); network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); @@ -130,7 +130,7 @@ // Must be size_t so we can increment it. for (size_t thread_id = WebThread::UI + 1; thread_id < WebThread::ID_COUNT; ++thread_id) { - scoped_ptr<WebThreadImpl>* thread_to_start = nullptr; + std::unique_ptr<WebThreadImpl>* thread_to_start = nullptr; base::Thread::Options options; switch (thread_id) {
diff --git a/ios/web/app/web_main_runner.mm b/ios/web/app/web_main_runner.mm index cf0dbba..ac422f7 100644 --- a/ios/web/app/web_main_runner.mm +++ b/ios/web/app/web_main_runner.mm
@@ -112,8 +112,8 @@ // Used if the embedder doesn't set one. WebClient empty_web_client_; - scoped_ptr<base::AtExitManager> exit_manager_; - scoped_ptr<WebMainLoop> main_loop_; + std::unique_ptr<base::AtExitManager> exit_manager_; + std::unique_ptr<WebMainLoop> main_loop_; DISALLOW_COPY_AND_ASSIGN(WebMainRunnerImpl); };
diff --git a/ios/web/browser_state_web_view_partition_inttest.mm b/ios/web/browser_state_web_view_partition_inttest.mm index 9e39ea6..3497478 100644 --- a/ios/web/browser_state_web_view_partition_inttest.mm +++ b/ios/web/browser_state_web_view_partition_inttest.mm
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <string> #import <WebKit/WebKit.h> +#include <memory> +#include <string> + #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/test/ios/wait_util.h" #include "ios/web/public/browser_state.h" #import "ios/web/public/test/http_server.h" @@ -133,7 +134,7 @@ private: // The ResponseProvider used to load a simple web page. - scoped_ptr<web::ResponseProvider> provider_; + std::unique_ptr<web::ResponseProvider> provider_; // The OTR browser state used in tests. web::TestBrowserState otr_browser_state_; };
diff --git a/ios/web/interstitials/html_web_interstitial_impl.h b/ios/web/interstitials/html_web_interstitial_impl.h index b590512..777f30ad 100644 --- a/ios/web/interstitials/html_web_interstitial_impl.h +++ b/ios/web/interstitials/html_web_interstitial_impl.h
@@ -7,8 +7,9 @@ #import <WebKit/WebKit.h> +#include <memory> + #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/interstitials/web_interstitial_impl.h" namespace web { @@ -20,10 +21,11 @@ // interstitials created via HTML. class HtmlWebInterstitialImpl : public WebInterstitialImpl { public: - HtmlWebInterstitialImpl(WebStateImpl* web_state, - bool new_navigation, - const GURL& url, - scoped_ptr<HtmlWebInterstitialDelegate> delegate); + HtmlWebInterstitialImpl( + WebStateImpl* web_state, + bool new_navigation, + const GURL& url, + std::unique_ptr<HtmlWebInterstitialDelegate> delegate); ~HtmlWebInterstitialImpl() override; // Called by |web_view_controller_delegate_| when |web_view_controller_| @@ -42,7 +44,7 @@ private: // The HTML interstitial delegate. - scoped_ptr<HtmlWebInterstitialDelegate> delegate_; + std::unique_ptr<HtmlWebInterstitialDelegate> delegate_; // The |web_view_|'s delegate. Used to forward JavaScript commands // resulting from user interaction with the interstitial content. base::scoped_nsprotocol<id<WKNavigationDelegate>> web_view_delegate_;
diff --git a/ios/web/interstitials/html_web_interstitial_impl.mm b/ios/web/interstitials/html_web_interstitial_impl.mm index 0a22dba..1443b73 100644 --- a/ios/web/interstitials/html_web_interstitial_impl.mm +++ b/ios/web/interstitials/html_web_interstitial_impl.mm
@@ -77,7 +77,7 @@ WebState* web_state, bool new_navigation, const GURL& url, - scoped_ptr<HtmlWebInterstitialDelegate> delegate) { + std::unique_ptr<HtmlWebInterstitialDelegate> delegate) { WebStateImpl* web_state_impl = static_cast<WebStateImpl*>(web_state); return new HtmlWebInterstitialImpl(web_state_impl, new_navigation, url, std::move(delegate)); @@ -87,7 +87,7 @@ WebStateImpl* web_state, bool new_navigation, const GURL& url, - scoped_ptr<HtmlWebInterstitialDelegate> delegate) + std::unique_ptr<HtmlWebInterstitialDelegate> delegate) : WebInterstitialImpl(web_state, new_navigation, url), delegate_(std::move(delegate)) { DCHECK(delegate_);
diff --git a/ios/web/interstitials/native_web_interstitial_impl.h b/ios/web/interstitials/native_web_interstitial_impl.h index 1280ef49..4a9d4f4 100644 --- a/ios/web/interstitials/native_web_interstitial_impl.h +++ b/ios/web/interstitials/native_web_interstitial_impl.h
@@ -7,6 +7,8 @@ #include "ios/web/interstitials/web_interstitial_impl.h" +#include <memory> + #include "base/ios/weak_nsobject.h" #include "base/mac/scoped_nsobject.h" @@ -18,10 +20,11 @@ // interstitials created via native views. class NativeWebInterstitialImpl : public WebInterstitialImpl { public: - NativeWebInterstitialImpl(WebStateImpl* web_state, - bool new_navigation, - const GURL& url, - scoped_ptr<NativeWebInterstitialDelegate> delegate); + NativeWebInterstitialImpl( + WebStateImpl* web_state, + bool new_navigation, + const GURL& url, + std::unique_ptr<NativeWebInterstitialDelegate> delegate); ~NativeWebInterstitialImpl() override; // WebInterstitialImpl implementation: @@ -36,7 +39,7 @@ private: // The native interstitial delegate. - scoped_ptr<NativeWebInterstitialDelegate> delegate_; + std::unique_ptr<NativeWebInterstitialDelegate> delegate_; // The transient content view containing interstitial content. base::scoped_nsobject<CRWContentView> content_view_; };
diff --git a/ios/web/interstitials/native_web_interstitial_impl.mm b/ios/web/interstitials/native_web_interstitial_impl.mm index 438705e..a2a86dd7 100644 --- a/ios/web/interstitials/native_web_interstitial_impl.mm +++ b/ios/web/interstitials/native_web_interstitial_impl.mm
@@ -19,7 +19,7 @@ WebState* web_state, bool new_navigation, const GURL& url, - scoped_ptr<NativeWebInterstitialDelegate> delegate) { + std::unique_ptr<NativeWebInterstitialDelegate> delegate) { WebStateImpl* web_state_impl = static_cast<WebStateImpl*>(web_state); return new NativeWebInterstitialImpl(web_state_impl, new_navigation, url, std::move(delegate)); @@ -29,7 +29,7 @@ WebStateImpl* web_state, bool new_navigation, const GURL& url, - scoped_ptr<NativeWebInterstitialDelegate> delegate) + std::unique_ptr<NativeWebInterstitialDelegate> delegate) : web::WebInterstitialImpl(web_state, new_navigation, url), delegate_(std::move(delegate)) { DCHECK(delegate_);
diff --git a/ios/web/navigation/crw_session_controller.mm b/ios/web/navigation/crw_session_controller.mm index ba45a32..afd78bf 100644 --- a/ios/web/navigation/crw_session_controller.mm +++ b/ios/web/navigation/crw_session_controller.mm
@@ -188,7 +188,7 @@ scoped_items.release(&items); for (size_t i = 0; i < items.size(); ++i) { - scoped_ptr<web::NavigationItem> item(items[i]); + std::unique_ptr<web::NavigationItem> item(items[i]); base::scoped_nsobject<CRWSessionEntry> entry( [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item)]); [_entries addObject:entry]; @@ -873,7 +873,7 @@ GURL loaded_url(url); BOOL urlWasRewritten = NO; if (_navigationManager) { - scoped_ptr<std::vector<web::BrowserURLRewriter::URLRewriter>> + std::unique_ptr<std::vector<web::BrowserURLRewriter::URLRewriter>> transientRewriters = _navigationManager->GetTransientURLRewriters(); if (transientRewriters) { urlWasRewritten = web::BrowserURLRewriter::RewriteURLWithWriters( @@ -884,7 +884,7 @@ web::BrowserURLRewriter::GetInstance()->RewriteURLIfNecessary( &loaded_url, _browserState); } - scoped_ptr<web::NavigationItemImpl> item(new web::NavigationItemImpl()); + std::unique_ptr<web::NavigationItemImpl> item(new web::NavigationItemImpl()); item->SetURL(loaded_url); item->SetReferrer(referrer); item->SetTransitionType(transition);
diff --git a/ios/web/navigation/crw_session_controller_unittest.mm b/ios/web/navigation/crw_session_controller_unittest.mm index 807eff39..1c1731a 100644 --- a/ios/web/navigation/crw_session_controller_unittest.mm +++ b/ios/web/navigation/crw_session_controller_unittest.mm
@@ -10,7 +10,6 @@ #include "base/logging.h" #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #import "ios/web/navigation/crw_session_controller+private_constructors.h" #include "ios/web/navigation/crw_session_entry.h"
diff --git a/ios/web/navigation/crw_session_entry.h b/ios/web/navigation/crw_session_entry.h index bb41c68e..2a8ce257 100644 --- a/ios/web/navigation/crw_session_entry.h +++ b/ios/web/navigation/crw_session_entry.h
@@ -8,7 +8,8 @@ #import <Foundation/Foundation.h> #include <stdint.h> -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "base/strings/string16.h" #include "base/time/time.h" #include "ui/base/page_transition_types.h" @@ -71,7 +72,8 @@ @property(nonatomic, readonly) web::NavigationItemImpl* navigationItemImpl; // Initialize the session entry with the given NavigationItem. -- (instancetype)initWithNavigationItem:(scoped_ptr<web::NavigationItem>)item; +- (instancetype)initWithNavigationItem: + (std::unique_ptr<web::NavigationItem>)item; @end
diff --git a/ios/web/navigation/crw_session_entry.mm b/ios/web/navigation/crw_session_entry.mm index a4c462e..ae293f6 100644 --- a/ios/web/navigation/crw_session_entry.mm +++ b/ios/web/navigation/crw_session_entry.mm
@@ -6,9 +6,10 @@ #include <stdint.h> +#include <memory> + #include "base/mac/objc_property_releaser.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "ios/web/navigation/navigation_item_impl.h" #include "ios/web/navigation/nscoder_util.h" @@ -48,7 +49,7 @@ // The NavigationItemImpl corresponding to this CRWSessionEntry. // TODO(stuartmorgan): Move ownership to NavigationManagerImpl. - scoped_ptr<web::NavigationItemImpl> _navigationItem; + std::unique_ptr<web::NavigationItemImpl> _navigationItem; base::mac::ObjCPropertyReleaser _propertyReleaser_CRWSessionEntry; } @@ -70,7 +71,8 @@ @synthesize originalUrl = _originalUrl; -- (instancetype)initWithNavigationItem:(scoped_ptr<web::NavigationItem>)item { +- (instancetype)initWithNavigationItem: + (std::unique_ptr<web::NavigationItem>)item { self = [super init]; if (self) { _propertyReleaser_CRWSessionEntry.Init(self, [CRWSessionEntry class]);
diff --git a/ios/web/navigation/crw_session_entry_unittest.mm b/ios/web/navigation/crw_session_entry_unittest.mm index 3d7aae9e..97db7da3 100644 --- a/ios/web/navigation/crw_session_entry_unittest.mm +++ b/ios/web/navigation/crw_session_entry_unittest.mm
@@ -39,7 +39,8 @@ GURL url("http://init.test"); ui::PageTransition transition = ui::PAGE_TRANSITION_AUTO_BOOKMARK; - scoped_ptr<web::NavigationItemImpl> item(new web::NavigationItemImpl()); + std::unique_ptr<web::NavigationItemImpl> item( + new web::NavigationItemImpl()); item->SetURL(url); item->SetTransitionType(transition); item->SetTimestamp(base::Time::Now());
diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h index 8462cbd..882b62dc 100644 --- a/ios/web/navigation/navigation_item_impl.h +++ b/ios/web/navigation/navigation_item_impl.h
@@ -7,8 +7,9 @@ #import <Foundation/Foundation.h> +#include <memory> + #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "ios/web/navigation/navigation_item_facade_delegate.h" #include "ios/web/public/favicon_status.h" @@ -36,7 +37,7 @@ // NOTE: to minimize facade synchronization code, NavigationItems take // ownership of their facade delegates. void SetFacadeDelegate( - scoped_ptr<NavigationItemFacadeDelegate> facade_delegate); + std::unique_ptr<NavigationItemFacadeDelegate> facade_delegate); NavigationItemFacadeDelegate* GetFacadeDelegate() const; // NavigationItem implementation: @@ -138,7 +139,7 @@ mutable base::string16 cached_display_title_; // Weak pointer to the facade delegate. - scoped_ptr<NavigationItemFacadeDelegate> facade_delegate_; + std::unique_ptr<NavigationItemFacadeDelegate> facade_delegate_; // Copy and assignment is explicitly allowed for this class. };
diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm index 7d7e748..6c79202 100644 --- a/ios/web/navigation/navigation_item_impl.mm +++ b/ios/web/navigation/navigation_item_impl.mm
@@ -6,10 +6,10 @@ #include <stddef.h> +#include <memory> #include <utility> #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "components/url_formatter/url_formatter.h" #include "ui/base/page_transition_types.h" #include "ui/gfx/text_elider.h" @@ -28,8 +28,8 @@ namespace web { // static -scoped_ptr<NavigationItem> NavigationItem::Create() { - return scoped_ptr<NavigationItem>(new NavigationItemImpl()); +std::unique_ptr<NavigationItem> NavigationItem::Create() { + return std::unique_ptr<NavigationItem>(new NavigationItemImpl()); } NavigationItemImpl::NavigationItemImpl() @@ -71,7 +71,7 @@ } void NavigationItemImpl::SetFacadeDelegate( - scoped_ptr<NavigationItemFacadeDelegate> facade_delegate) { + std::unique_ptr<NavigationItemFacadeDelegate> facade_delegate) { facade_delegate_ = std::move(facade_delegate); }
diff --git a/ios/web/navigation/navigation_item_impl_unittest.mm b/ios/web/navigation/navigation_item_impl_unittest.mm index 0189ea0..e978e2f 100644 --- a/ios/web/navigation/navigation_item_impl_unittest.mm +++ b/ios/web/navigation/navigation_item_impl_unittest.mm
@@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ios/web/navigation/navigation_item_impl.h" + +#include <memory> + #include "base/logging.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" -#include "ios/web/navigation/navigation_item_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest_mac.h" #include "testing/platform_test.h" @@ -31,7 +33,7 @@ } // The NavigationItemImpl instance being tested. - scoped_ptr<NavigationItemImpl> item_; + std::unique_ptr<NavigationItemImpl> item_; }; // TODO(rohitrao): Add and adapt tests from NavigationEntryImpl.
diff --git a/ios/web/navigation/navigation_manager_impl.h b/ios/web/navigation/navigation_manager_impl.h index f8d8709..72eb2dc 100644 --- a/ios/web/navigation/navigation_manager_impl.h +++ b/ios/web/navigation/navigation_manager_impl.h
@@ -7,11 +7,11 @@ #include <stddef.h> +#include <memory> #include <vector> #include "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #import "ios/web/public/navigation_manager.h" #include "ui/base/page_transition_types.h" @@ -120,7 +120,7 @@ // the caller. // TODO(crbug.com/546197): remove once NavigationItem creation occurs in this // class. - scoped_ptr<std::vector<BrowserURLRewriter::URLRewriter>> + std::unique_ptr<std::vector<BrowserURLRewriter::URLRewriter>> GetTransientURLRewriters(); // Called to reset the transient url rewriter list. @@ -145,7 +145,7 @@ NavigationManagerFacadeDelegate* facade_delegate_; // List of transient url rewriters added by |AddTransientURLRewriter()|. - scoped_ptr<std::vector<BrowserURLRewriter::URLRewriter>> + std::unique_ptr<std::vector<BrowserURLRewriter::URLRewriter>> transient_url_rewriters_; DISALLOW_COPY_AND_ASSIGN(NavigationManagerImpl);
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index 9844df5..49ec5ae3 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -306,7 +306,7 @@ delegate_->GetWebState()->OpenURL(params); } -scoped_ptr<std::vector<BrowserURLRewriter::URLRewriter>> +std::unique_ptr<std::vector<BrowserURLRewriter::URLRewriter>> NavigationManagerImpl::GetTransientURLRewriters() { return std::move(transient_url_rewriters_); }
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm index 9460fb0..356a177f 100644 --- a/ios/web/navigation/navigation_manager_impl_unittest.mm +++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -17,7 +17,7 @@ void SetUp() override { manager_.reset(new NavigationManagerImpl(NULL, &browser_state_)); } - scoped_ptr<NavigationManagerImpl> manager_; + std::unique_ptr<NavigationManagerImpl> manager_; TestBrowserState browser_state_; };
diff --git a/ios/web/net/cert_verifier_block_adapter.cc b/ios/web/net/cert_verifier_block_adapter.cc index dd3a8360..781e483 100644 --- a/ios/web/net/cert_verifier_block_adapter.cc +++ b/ios/web/net/cert_verifier_block_adapter.cc
@@ -35,7 +35,7 @@ // verification request is not cancelled. CertVerifierBlockAdapter::Verify // guarantees its completion handler to be called, which will not happen if // verification request is cancelled. - scoped_ptr<net::CertVerifier::Request> request; + std::unique_ptr<net::CertVerifier::Request> request; // The result of certificate verification. net::CertVerifyResult result; // Certificate being verified. @@ -84,7 +84,7 @@ net::CompletionCallback callback = base::BindBlock(^(int error) { completion_handler(context->result, error); }); - scoped_ptr<net::CertVerifier::Request> request; + std::unique_ptr<net::CertVerifier::Request> request; int error = cert_verifier_->Verify(params.cert.get(), params.hostname, params.ocsp_response, params.flags, params.crl_set.get(), &(context->result),
diff --git a/ios/web/net/cert_verifier_block_adapter.h b/ios/web/net/cert_verifier_block_adapter.h index e2d4732..851bdc1 100644 --- a/ios/web/net/cert_verifier_block_adapter.h +++ b/ios/web/net/cert_verifier_block_adapter.h
@@ -5,7 +5,6 @@ #ifndef IOS_WEB_NET_CERT_VERIFIER_BLOCK_ADAPTER_H_ #define IOS_WEB_NET_CERT_VERIFIER_BLOCK_ADAPTER_H_ -#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/threading/thread_checker.h" #include "net/cert/cert_verifier.h"
diff --git a/ios/web/net/cert_verifier_block_adapter_unittest.cc b/ios/web/net/cert_verifier_block_adapter_unittest.cc index 9480571..cfb8d9dc 100644 --- a/ios/web/net/cert_verifier_block_adapter_unittest.cc +++ b/ios/web/net/cert_verifier_block_adapter_unittest.cc
@@ -87,7 +87,8 @@ // net::CertVerifier and ok_cert.pem cert. TEST_F(CertVerifierBlockAdapterTest, DefaultParamsAndAsync) { // Call |Verify|. - scoped_ptr<net::CertVerifier> verifier(net::CertVerifier::CreateDefault()); + std::unique_ptr<net::CertVerifier> verifier( + net::CertVerifier::CreateDefault()); CertVerifierBlockAdapter test_adapter(verifier.get(), &net_log_); CertVerifierBlockAdapter::Params params(cert_.get(), kHostName); net::CertVerifyResult actual_result; @@ -151,8 +152,9 @@ // Tests that the completion handler passed to |Verify()| is called, even if the // adapter is destroyed. TEST_F(CertVerifierBlockAdapterTest, CompletionHandlerIsAlwaysCalled) { - scoped_ptr<net::CertVerifier> verifier(net::CertVerifier::CreateDefault()); - scoped_ptr<CertVerifierBlockAdapter> test_adapter( + std::unique_ptr<net::CertVerifier> verifier( + net::CertVerifier::CreateDefault()); + std::unique_ptr<CertVerifierBlockAdapter> test_adapter( new CertVerifierBlockAdapter(verifier.get(), &net_log_)); // Call |Verify| and destroy the adapter.
diff --git a/ios/web/net/crw_cert_verification_controller.mm b/ios/web/net/crw_cert_verification_controller.mm index d88925b4..188ab4a2 100644 --- a/ios/web/net/crw_cert_verification_controller.mm +++ b/ios/web/net/crw_cert_verification_controller.mm
@@ -124,7 +124,7 @@ @interface CRWCertVerificationController () { // Cert verification object which wraps |net::CertVerifier|. Must be created, // used and destroyed on IO Thread. - scoped_ptr<web::CertVerifierBlockAdapter> _certVerifier; + std::unique_ptr<web::CertVerifierBlockAdapter> _certVerifier; // URLRequestContextGetter for obtaining net layer objects. net::URLRequestContextGetter* _contextGetter;
diff --git a/ios/web/net/crw_ssl_status_updater_unittest.mm b/ios/web/net/crw_ssl_status_updater_unittest.mm index d35fefe7..4cb05ff 100644 --- a/ios/web/net/crw_ssl_status_updater_unittest.mm +++ b/ios/web/net/crw_ssl_status_updater_unittest.mm
@@ -121,7 +121,7 @@ base::scoped_nsobject<CRWSSLStatusUpdaterTestDataSource> data_source_; base::scoped_nsprotocol<id> delegate_; - scoped_ptr<web::NavigationManagerImpl> nav_manager_; + std::unique_ptr<web::NavigationManagerImpl> nav_manager_; base::scoped_nsobject<CRWSSLStatusUpdater> ssl_status_updater_; base::scoped_nsobject<NSArray> cert_chain_; };
diff --git a/ios/web/net/request_tracker_impl_unittest.mm b/ios/web/net/request_tracker_impl_unittest.mm index 2cc83a7..c3a5d05 100644 --- a/ios/web/net/request_tracker_impl_unittest.mm +++ b/ios/web/net/request_tracker_impl_unittest.mm
@@ -9,6 +9,7 @@ #include "base/logging.h" #include "base/mac/scoped_nsobject.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/scoped_vector.h" #include "base/message_loop/message_loop.h" #include "base/strings/sys_string_conversions.h" @@ -236,7 +237,7 @@ net::TestJobInterceptor* AddInterceptorToRequest(size_t i) { // |interceptor| will be deleted from |job_factory_|'s destructor. net::TestJobInterceptor* protocol_handler = new net::TestJobInterceptor(); - job_factory_.SetProtocolHandler("http", make_scoped_ptr(protocol_handler)); + job_factory_.SetProtocolHandler("http", base::WrapUnique(protocol_handler)); contexts_[i]->set_job_factory(&job_factory_); return protocol_handler; } @@ -440,7 +441,7 @@ // TODO(mmenke): This is really bizarre. Do something more reasonable. const_cast<net::HttpResponseInfo&>(request->response_info()).headers = new net::HttpResponseHeaders(headers); - scoped_ptr<net::URLRequestTestJob> job(new net::URLRequestTestJob( + std::unique_ptr<net::URLRequestTestJob> job(new net::URLRequestTestJob( request, request->context()->network_delegate(), headers, "", false)); AddInterceptorToRequest(0)->set_main_intercept_job(std::move(job)); request->Start();
diff --git a/ios/web/net/web_http_protocol_handler_delegate_unittest.mm b/ios/web/net/web_http_protocol_handler_delegate_unittest.mm index 2e353fc1..bb53e698 100644 --- a/ios/web/net/web_http_protocol_handler_delegate_unittest.mm +++ b/ios/web/net/web_http_protocol_handler_delegate_unittest.mm
@@ -6,9 +6,11 @@ #import <Foundation/Foundation.h> +#include <memory> + #include "base/mac/scoped_nsobject.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/thread_task_runner_handle.h" #include "ios/web/public/test/scoped_testing_web_client.h" @@ -51,12 +53,12 @@ : context_getter_(new net::TestURLRequestContextGetter( base::ThreadTaskRunnerHandle::Get())), delegate_(new WebHTTPProtocolHandlerDelegate(context_getter_.get())), - web_client_(make_scoped_ptr(new AppSpecificURLTestWebClient)) {} + web_client_(base::WrapUnique(new AppSpecificURLTestWebClient)) {} protected: base::MessageLoop message_loop_; scoped_refptr<net::URLRequestContextGetter> context_getter_; - scoped_ptr<WebHTTPProtocolHandlerDelegate> delegate_; + std::unique_ptr<WebHTTPProtocolHandlerDelegate> delegate_; web::ScopedTestingWebClient web_client_; };
diff --git a/ios/web/public/app/web_main.h b/ios/web/public/app/web_main.h index 34ac01a..8ae8ce8 100644 --- a/ios/web/public/app/web_main.h +++ b/ios/web/public/app/web_main.h
@@ -5,7 +5,8 @@ #ifndef IOS_WEB_PUBLIC_APP_WEB_MAIN_H_ #define IOS_WEB_PUBLIC_APP_WEB_MAIN_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "ios/web/public/app/web_main_delegate.h" namespace web { @@ -40,7 +41,7 @@ ~WebMain(); private: - scoped_ptr<WebMainRunner> web_main_runner_; + std::unique_ptr<WebMainRunner> web_main_runner_; }; } // namespace web
diff --git a/ios/web/public/interstitials/web_interstitial.h b/ios/web/public/interstitials/web_interstitial.h index 35ba5d9..1aa22d0 100644 --- a/ios/web/public/interstitials/web_interstitial.h +++ b/ios/web/public/interstitials/web_interstitial.h
@@ -5,7 +5,7 @@ #ifndef IOS_WEB_PUBLIC_INTERSTITIALS_WEB_INTERSTITIAL_H_ #define IOS_WEB_PUBLIC_INTERSTITIALS_WEB_INTERSTITIAL_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> class GURL; @@ -36,12 +36,12 @@ WebState* web_state, bool new_navigation, const GURL& url, - scoped_ptr<HtmlWebInterstitialDelegate> delegate); + std::unique_ptr<HtmlWebInterstitialDelegate> delegate); static WebInterstitial* CreateNativeInterstitial( WebState* web_state, bool new_navigation, const GURL& url, - scoped_ptr<NativeWebInterstitialDelegate> delegate); + std::unique_ptr<NativeWebInterstitialDelegate> delegate); // Retrieves the WebInterstitial if any associated with the specified // |web_state|.
diff --git a/ios/web/public/navigation_item.h b/ios/web/public/navigation_item.h index d84240b..6e79828d 100644 --- a/ios/web/public/navigation_item.h +++ b/ios/web/public/navigation_item.h
@@ -5,7 +5,8 @@ #ifndef IOS_WEB_PUBLIC_NAVIGATION_ITEM_H_ #define IOS_WEB_PUBLIC_NAVIGATION_ITEM_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "base/strings/string16.h" #include "base/supports_user_data.h" #include "base/time/time.h" @@ -27,7 +28,7 @@ class NavigationItem : public base::SupportsUserData { public: // Creates a new NavigationItem. - static scoped_ptr<NavigationItem> Create(); + static std::unique_ptr<NavigationItem> Create(); // Page-related stuff --------------------------------------------------------
diff --git a/ios/web/public/test/http_server.h b/ios/web/public/test/http_server.h index bc96a1f..daf359f5 100644 --- a/ios/web/public/test/http_server.h +++ b/ios/web/public/test/http_server.h
@@ -5,12 +5,12 @@ #ifndef IOS_WEB_PUBLIC_TEST_HTTP_SERVER_H_ #define IOS_WEB_PUBLIC_TEST_HTTP_SERVER_H_ +#include <memory> #include <vector> #import "base/mac/scoped_nsobject.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/synchronization/lock.h" #include "ios/web/public/test/response_providers/response_provider.h" @@ -36,7 +36,7 @@ private: friend class base::RefCounted<RefCountedResponseProviderWrapper>; // The ResponseProvider that backs this object. - scoped_ptr<ResponseProvider> response_provider_; + std::unique_ptr<ResponseProvider> response_provider_; virtual ~RefCountedResponseProviderWrapper(); };
diff --git a/ios/web/public/test/http_server_inttest.mm b/ios/web/public/test/http_server_inttest.mm index faf7d66..2c81da2a 100644 --- a/ios/web/public/test/http_server_inttest.mm +++ b/ios/web/public/test/http_server_inttest.mm
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/web/public/test/http_server.h" - #import <Foundation/Foundation.h> + +#include <memory> #include <string> #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" +#import "ios/web/public/test/http_server.h" #include "ios/web/public/test/response_providers/string_response_provider.h" #import "ios/web/test/web_int_test.h" #import "net/base/mac/url_conversions.h" @@ -25,7 +25,7 @@ // requests and response from |TestResponseProvider|. TEST_F(HttpServerTest, StartAndInterfaceWithResponseProvider) { const std::string kHelloWorld = "Hello World"; - scoped_ptr<web::StringResponseProvider> provider( + std::unique_ptr<web::StringResponseProvider> provider( new web::StringResponseProvider(kHelloWorld)); web::test::HttpServer& server = web::test::HttpServer::GetSharedInstance();
diff --git a/ios/web/public/test/response_providers/file_based_response_provider.h b/ios/web/public/test/response_providers/file_based_response_provider.h index 5578e719..b9c98b7 100644 --- a/ios/web/public/test/response_providers/file_based_response_provider.h +++ b/ios/web/public/test/response_providers/file_based_response_provider.h
@@ -5,8 +5,9 @@ #ifndef IOS_WEB_PUBLIC_TEST_RESPONSE_PROVIDERS_FILE_BASED_RESPONSE_PROVIDER_H_ #define IOS_WEB_PUBLIC_TEST_RESPONSE_PROVIDERS_FILE_BASED_RESPONSE_PROVIDER_H_ +#include <memory> + #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/test/response_providers/file_based_response_provider_impl.h" #include "ios/web/public/test/response_providers/response_provider.h" @@ -29,7 +30,7 @@ const Request& request) override; private: - scoped_ptr<FileBasedResponseProviderImpl> response_provider_impl_; + std::unique_ptr<FileBasedResponseProviderImpl> response_provider_impl_; }; }
diff --git a/ios/web/public/test/scoped_testing_web_client.h b/ios/web/public/test/scoped_testing_web_client.h index 51f7969f..65a221e 100644 --- a/ios/web/public/test/scoped_testing_web_client.h +++ b/ios/web/public/test/scoped_testing_web_client.h
@@ -5,8 +5,9 @@ #ifndef IOS_WEB_PUBLIC_TEST_SCOPED_TESTING_WEB_CLIENT_H_ #define IOS_WEB_PUBLIC_TEST_SCOPED_TESTING_WEB_CLIENT_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace web { @@ -15,13 +16,13 @@ // Helper class to register a WebClient during unit testing. class ScopedTestingWebClient { public: - explicit ScopedTestingWebClient(scoped_ptr<WebClient> web_client); + explicit ScopedTestingWebClient(std::unique_ptr<WebClient> web_client); ~ScopedTestingWebClient(); WebClient* Get(); private: - scoped_ptr<WebClient> web_client_; + std::unique_ptr<WebClient> web_client_; WebClient* original_web_client_; };
diff --git a/ios/web/public/test/scoped_testing_web_client.mm b/ios/web/public/test/scoped_testing_web_client.mm index a24058333..fd06b97 100644 --- a/ios/web/public/test/scoped_testing_web_client.mm +++ b/ios/web/public/test/scoped_testing_web_client.mm
@@ -9,7 +9,8 @@ namespace web { -ScopedTestingWebClient::ScopedTestingWebClient(scoped_ptr<WebClient> web_client) +ScopedTestingWebClient::ScopedTestingWebClient( + std::unique_ptr<WebClient> web_client) : web_client_(std::move(web_client)), original_web_client_(GetWebClient()) { SetWebClient(web_client_.get()); }
diff --git a/ios/web/public/test/test_web_client.h b/ios/web/public/test/test_web_client.h index a912fed..9f3c0b2 100644 --- a/ios/web/public/test/test_web_client.h +++ b/ios/web/public/test/test_web_client.h
@@ -9,7 +9,6 @@ #include "base/compiler_specific.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/web_client.h" namespace web {
diff --git a/ios/web/public/test/test_web_thread.h b/ios/web/public/test/test_web_thread.h index 4ad9eb70..b1159d1 100644 --- a/ios/web/public/test/test_web_thread.h +++ b/ios/web/public/test/test_web_thread.h
@@ -5,8 +5,9 @@ #ifndef IOS_WEB_PUBLIC_TEST_TEST_WEB_THREAD_H_ #define IOS_WEB_PUBLIC_TEST_TEST_WEB_THREAD_H_ +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/web_thread.h" namespace base { @@ -44,7 +45,7 @@ bool IsRunning(); private: - scoped_ptr<TestWebThreadImpl> impl_; + std::unique_ptr<TestWebThreadImpl> impl_; DISALLOW_COPY_AND_ASSIGN(TestWebThread); };
diff --git a/ios/web/public/test/test_web_thread_bundle.h b/ios/web/public/test/test_web_thread_bundle.h index 1f586d5..47f76b8 100644 --- a/ios/web/public/test/test_web_thread_bundle.h +++ b/ios/web/public/test/test_web_thread_bundle.h
@@ -30,8 +30,9 @@ // IO_MAINLOOP will use a MessageLoopForIO for the main MessageLoop. // Most of the time, this avoids needing to use a REAL_IO_THREAD. +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace base { class MessageLoop; @@ -64,13 +65,13 @@ private: void Init(int options); - scoped_ptr<base::MessageLoop> message_loop_; - scoped_ptr<TestWebThread> ui_thread_; - scoped_ptr<TestWebThread> db_thread_; - scoped_ptr<TestWebThread> file_thread_; - scoped_ptr<TestWebThread> file_user_blocking_thread_; - scoped_ptr<TestWebThread> cache_thread_; - scoped_ptr<TestWebThread> io_thread_; + std::unique_ptr<base::MessageLoop> message_loop_; + std::unique_ptr<TestWebThread> ui_thread_; + std::unique_ptr<TestWebThread> db_thread_; + std::unique_ptr<TestWebThread> file_thread_; + std::unique_ptr<TestWebThread> file_user_blocking_thread_; + std::unique_ptr<TestWebThread> cache_thread_; + std::unique_ptr<TestWebThread> io_thread_; DISALLOW_COPY_AND_ASSIGN(TestWebThreadBundle); };
diff --git a/ios/web/public/web_controller_factory.h b/ios/web/public/web_controller_factory.h index c6d1545..e846762 100644 --- a/ios/web/public/web_controller_factory.h +++ b/ios/web/public/web_controller_factory.h
@@ -5,7 +5,7 @@ #ifndef IOS_WEB_PUBLIC_WEB_CONTROLLER_FACTORY_H_ #define IOS_WEB_PUBLIC_WEB_CONTROLLER_FACTORY_H_ -#include "base/memory/scoped_ptr.h" +#include <memory> @class CRWWebController; @@ -16,7 +16,7 @@ // Returns a new instance of CRWWebViewController. // Note: Callers are responsible for releasing the returned web controller. -CRWWebController* CreateWebController(scoped_ptr<WebStateImpl> web_state); +CRWWebController* CreateWebController(std::unique_ptr<WebStateImpl> web_state); // Returns a new instance of CRWWebViewController. // Temporary factory method for use in components that require a web controller.
diff --git a/ios/web/public/web_controller_factory.mm b/ios/web/public/web_controller_factory.mm index e23e880..2947af8 100644 --- a/ios/web/public/web_controller_factory.mm +++ b/ios/web/public/web_controller_factory.mm
@@ -12,14 +12,15 @@ namespace web { -CRWWebController* CreateWebController(scoped_ptr<WebStateImpl> web_state) { +CRWWebController* CreateWebController(std::unique_ptr<WebStateImpl> web_state) { return [[CRWWKWebViewWebController alloc] initWithWebState:std::move(web_state)]; } CRWWebController* CreateWebController(BrowserState* browser_state) { DCHECK(browser_state); - scoped_ptr<web::WebStateImpl> web_state(new web::WebStateImpl(browser_state)); + std::unique_ptr<web::WebStateImpl> web_state( + new web::WebStateImpl(browser_state)); web_state->GetNavigationManagerImpl().InitializeSession(nil, nil, NO, -1); return CreateWebController(std::move(web_state)); }
diff --git a/ios/web/public/web_thread.h b/ios/web/public/web_thread.h index 7c71956..7f7c414 100644 --- a/ios/web/public/web_thread.h +++ b/ios/web/public/web_thread.h
@@ -217,9 +217,9 @@ // Returns an appropriate error message for when DCHECK_CURRENTLY_ON() fails. static std::string GetDCheckCurrentlyOnErrorMessage(ID expected); - // Use these templates in conjunction with RefCountedThreadSafe or scoped_ptr - // when you want to ensure that an object is deleted on a specific thread. - // This is needed when an object can hop between threads + // Use these templates in conjunction with RefCountedThreadSafe or + // std::unique_ptr when you want to ensure that an object is deleted on a + // specific thread. This is needed when an object can hop between threads // (i.e. IO -> FILE -> IO), and thread switching delays can mean that the // final IO tasks executes before the FILE task's stack unwinds. // This would lead to the object destructing on the FILE thread, which often @@ -257,8 +257,8 @@ // // ~Foo(); // - // Sample usage with scoped_ptr: - // scoped_ptr<Foo, web::WebThread::DeleteOnIOThread> ptr; + // Sample usage with std::unique_ptr: + // std::unique_ptr<Foo, web::WebThread::DeleteOnIOThread> ptr; struct DeleteOnUIThread : public DeleteOnThread<UI> {}; struct DeleteOnIOThread : public DeleteOnThread<IO> {}; struct DeleteOnFileThread : public DeleteOnThread<FILE> {};
diff --git a/ios/web/shell/app_delegate.mm b/ios/web/shell/app_delegate.mm index d5d239b..87e65a5 100644 --- a/ios/web/shell/app_delegate.mm +++ b/ios/web/shell/app_delegate.mm
@@ -4,8 +4,9 @@ #import "ios/web/shell/app_delegate.h" +#include <memory> + #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/app/web_main.h" #include "ios/web/public/web_client.h" #include "ios/web/public/web_state/web_state.h" @@ -15,8 +16,8 @@ #import "ios/web/shell/view_controller.h" @interface AppDelegate () { - scoped_ptr<web::ShellMainDelegate> _delegate; - scoped_ptr<web::WebMain> _webMain; + std::unique_ptr<web::ShellMainDelegate> _delegate; + std::unique_ptr<web::WebMain> _webMain; } @end
diff --git a/ios/web/shell/shell_browser_state.h b/ios/web/shell/shell_browser_state.h index f08121da..b9a693d 100644 --- a/ios/web/shell/shell_browser_state.h +++ b/ios/web/shell/shell_browser_state.h
@@ -5,12 +5,10 @@ #ifndef IOS_WEB_SHELL_SHELL_BROWSER_STATE_H_ #define IOS_WEB_SHELL_SHELL_BROWSER_STATE_H_ -#include "ios/web/public/browser_state.h" - #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" +#include "ios/web/public/browser_state.h" namespace web {
diff --git a/ios/web/shell/shell_browser_state.mm b/ios/web/shell/shell_browser_state.mm index 08f5a25..ecffe42 100644 --- a/ios/web/shell/shell_browser_state.mm +++ b/ios/web/shell/shell_browser_state.mm
@@ -6,7 +6,6 @@ #include "base/base_paths.h" #include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/threading/thread_restrictions.h"
diff --git a/ios/web/shell/shell_main_delegate.h b/ios/web/shell/shell_main_delegate.h index 7f07f63..afd2ccb 100644 --- a/ios/web/shell/shell_main_delegate.h +++ b/ios/web/shell/shell_main_delegate.h
@@ -5,8 +5,9 @@ #ifndef IOS_WEB_SHELL_SHELL_MAIN_DELEGATE_H_ #define IOS_WEB_SHELL_SHELL_MAIN_DELEGATE_H_ +#include <memory> + #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/app/web_main_delegate.h" namespace web { @@ -20,7 +21,7 @@ void BasicStartupComplete() override; private: - scoped_ptr<ShellWebClient> web_client_; + std::unique_ptr<ShellWebClient> web_client_; }; } // namespace web
diff --git a/ios/web/shell/shell_url_request_context_getter.h b/ios/web/shell/shell_url_request_context_getter.h index 2d536765..9d440e93 100644 --- a/ios/web/shell/shell_url_request_context_getter.h +++ b/ios/web/shell/shell_url_request_context_getter.h
@@ -5,11 +5,12 @@ #ifndef IOS_WEB_SHELL_SHELL_URL_REQUEST_CONTEXT_GETTER_H_ #define IOS_WEB_SHELL_SHELL_URL_REQUEST_CONTEXT_GETTER_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/single_thread_task_runner.h" #include "net/url_request/url_request_context_getter.h" @@ -47,12 +48,13 @@ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> cache_task_runner_; - scoped_ptr<net::ProxyConfigService> proxy_config_service_; - scoped_ptr<net::NetworkDelegate> network_delegate_; - scoped_ptr<net::URLRequestContextStorage> storage_; - scoped_ptr<net::URLRequestContext> url_request_context_; - scoped_ptr<net::NetLog> net_log_; - scoped_ptr<net::TransportSecurityPersister> transport_security_persister_; + std::unique_ptr<net::ProxyConfigService> proxy_config_service_; + std::unique_ptr<net::NetworkDelegate> network_delegate_; + std::unique_ptr<net::URLRequestContextStorage> storage_; + std::unique_ptr<net::URLRequestContext> url_request_context_; + std::unique_ptr<net::NetLog> net_log_; + std::unique_ptr<net::TransportSecurityPersister> + transport_security_persister_; DISALLOW_COPY_AND_ASSIGN(ShellURLRequestContextGetter); };
diff --git a/ios/web/shell/shell_url_request_context_getter.mm b/ios/web/shell/shell_url_request_context_getter.mm index e93a2e6..1a352fb3 100644 --- a/ios/web/shell/shell_url_request_context_getter.mm +++ b/ios/web/shell/shell_url_request_context_getter.mm
@@ -4,12 +4,13 @@ #include "ios/web/shell/shell_url_request_context_getter.h" +#include <memory> #include <utility> #include "base/base_paths.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/path_service.h" #include "base/threading/worker_pool.h" #include "ios/net/cookies/cookie_store_ios.h" @@ -77,13 +78,13 @@ web::WebThread::GetBlockingPool()->GetSequencedTaskRunner( web::WebThread::GetBlockingPool()->GetSequenceToken()), true, nullptr); - scoped_ptr<net::CookieStoreIOS> cookie_store( + std::unique_ptr<net::CookieStoreIOS> cookie_store( new net::CookieStoreIOS(persistent_store.get())); net::CookieStoreIOS::SwitchSynchronizedStore(nullptr, cookie_store.get()); storage_->set_cookie_store(std::move(cookie_store)); std::string user_agent = web::GetWebClient()->GetUserAgent(false); - storage_->set_http_user_agent_settings(make_scoped_ptr( + storage_->set_http_user_agent_settings(base::WrapUnique( new net::StaticHttpUserAgentSettings("en-us,en", user_agent))); storage_->set_proxy_service( net::ProxyService::CreateUsingSystemProxyResolver( @@ -93,17 +94,18 @@ storage_->set_cert_verifier(net::CertVerifier::CreateDefault()); storage_->set_transport_security_state( - make_scoped_ptr(new net::TransportSecurityState())); + base::WrapUnique(new net::TransportSecurityState())); transport_security_persister_.reset(new net::TransportSecurityPersister( url_request_context_->transport_security_state(), base_path_, file_task_runner_, false)); - storage_->set_channel_id_service(make_scoped_ptr( + storage_->set_channel_id_service(base::WrapUnique( new net::ChannelIDService(new net::DefaultChannelIDStore(nullptr), base::WorkerPool::GetTaskRunner(true)))); - storage_->set_http_server_properties(scoped_ptr<net::HttpServerProperties>( - new net::HttpServerPropertiesImpl())); + storage_->set_http_server_properties( + std::unique_ptr<net::HttpServerProperties>( + new net::HttpServerPropertiesImpl())); - scoped_ptr<net::HostResolver> host_resolver( + std::unique_ptr<net::HostResolver> host_resolver( net::HostResolver::CreateDefaultResolver( url_request_context_->net_log())); storage_->set_http_auth_handler_factory( @@ -130,21 +132,21 @@ url_request_context_->host_resolver(); base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache")); - scoped_ptr<net::HttpCache::DefaultBackend> main_backend( + std::unique_ptr<net::HttpCache::DefaultBackend> main_backend( new net::HttpCache::DefaultBackend(net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path, 0, cache_task_runner_)); storage_->set_http_network_session( - make_scoped_ptr(new net::HttpNetworkSession(network_session_params))); - storage_->set_http_transaction_factory(make_scoped_ptr(new net::HttpCache( + base::WrapUnique(new net::HttpNetworkSession(network_session_params))); + storage_->set_http_transaction_factory(base::WrapUnique(new net::HttpCache( storage_->http_network_session(), std::move(main_backend), true /* set_up_quic_server_info */))); - scoped_ptr<net::URLRequestJobFactoryImpl> job_factory( + std::unique_ptr<net::URLRequestJobFactoryImpl> job_factory( new net::URLRequestJobFactoryImpl()); bool set_protocol = job_factory->SetProtocolHandler( - "data", make_scoped_ptr(new net::DataProtocolHandler)); + "data", base::WrapUnique(new net::DataProtocolHandler)); DCHECK(set_protocol); storage_->set_job_factory(std::move(job_factory));
diff --git a/ios/web/shell/shell_web_client.h b/ios/web/shell/shell_web_client.h index 85ad1e4..0f26919 100644 --- a/ios/web/shell/shell_web_client.h +++ b/ios/web/shell/shell_web_client.h
@@ -5,9 +5,10 @@ #ifndef IOS_WEB_SHELL_SHELL_WEB_CLIENT_H_ #define IOS_WEB_SHELL_SHELL_WEB_CLIENT_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "ios/web/public/web_client.h" namespace web { @@ -27,7 +28,7 @@ ShellBrowserState* browser_state() const; private: - scoped_ptr<ShellWebMainParts> web_main_parts_; + std::unique_ptr<ShellWebMainParts> web_main_parts_; DISALLOW_COPY_AND_ASSIGN(ShellWebClient); };
diff --git a/ios/web/shell/shell_web_main_parts.h b/ios/web/shell/shell_web_main_parts.h index 6b6f001e..2cd6a87f 100644 --- a/ios/web/shell/shell_web_main_parts.h +++ b/ios/web/shell/shell_web_main_parts.h
@@ -5,9 +5,10 @@ #ifndef IOS_WEB_SHELL_SHELL_WEB_MAIN_PARTS_H_ #define IOS_WEB_SHELL_SHELL_WEB_MAIN_PARTS_H_ +#include <memory> + #include "ios/web/public/app/web_main_parts.h" -#include "base/memory/scoped_ptr.h" namespace web { class ShellBrowserState; @@ -24,7 +25,7 @@ void PreMainMessageLoopRun() override; private: - scoped_ptr<ShellBrowserState> browser_state_; + std::unique_ptr<ShellBrowserState> browser_state_; }; } // namespace web
diff --git a/ios/web/shell/view_controller.mm b/ios/web/shell/view_controller.mm index 98ebd10a..5bf37c5 100644 --- a/ios/web/shell/view_controller.mm +++ b/ios/web/shell/view_controller.mm
@@ -6,11 +6,11 @@ #include <stdint.h> +#include <memory> #include <utility> #include "base/mac/objc_property_releaser.h" #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/sys_string_conversions.h" #include "ios/net/cookies/cookie_store_ios.h" #import "ios/net/crn_http_protocol_handler.h" @@ -33,7 +33,7 @@ @interface ViewController ()<CRWWebStateObserver> { web::BrowserState* _browserState; base::scoped_nsobject<CRWWebController> _webController; - scoped_ptr<web::WebStateObserverBridge> _webStateObserver; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserver; base::mac::ObjCPropertyReleaser _propertyReleaser_ViewController; } @@ -110,7 +110,8 @@ // Set up the network stack before creating the WebState. [self setUpNetworkStack]; - scoped_ptr<web::WebStateImpl> webState(new web::WebStateImpl(_browserState)); + std::unique_ptr<web::WebStateImpl> webState( + new web::WebStateImpl(_browserState)); webState->GetNavigationManagerImpl().InitializeSession(nil, nil, NO, 0); _webController.reset(web::CreateWebController(std::move(webState))); [_webController setDelegate:self];
diff --git a/ios/web/test/web_test.mm b/ios/web/test/web_test.mm index fb43ada..0ef56ead 100644 --- a/ios/web/test/web_test.mm +++ b/ios/web/test/web_test.mm
@@ -7,6 +7,7 @@ #include <utility> #include "base/base64.h" +#include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" #import "base/test/ios/wait_util.h" #import "ios/testing/ocmock_complex_type_helper.h" @@ -36,7 +37,7 @@ #pragma mark - -WebTest::WebTest() : web_client_(make_scoped_ptr(new TestWebClient)) {} +WebTest::WebTest() : web_client_(base::WrapUnique(new TestWebClient)) {} WebTest::~WebTest() {} void WebTest::SetUp() { @@ -219,7 +220,8 @@ } CRWWebController* WebTestWithWebController::CreateWebController() { - scoped_ptr<WebStateImpl> web_state_impl(new WebStateImpl(GetBrowserState())); + std::unique_ptr<WebStateImpl> web_state_impl( + new WebStateImpl(GetBrowserState())); return [[CRWWKWebViewWebController alloc] initWithWebState:std::move(web_state_impl)]; }
diff --git a/ios/web/web_state/crw_pass_kit_downloader.mm b/ios/web/web_state/crw_pass_kit_downloader.mm index 1b61538..15b6012 100644 --- a/ios/web/web_state/crw_pass_kit_downloader.mm +++ b/ios/web/web_state/crw_pass_kit_downloader.mm
@@ -4,10 +4,11 @@ #import "ios/web/web_state/crw_pass_kit_downloader.h" +#include <memory> + #import "base/ios/weak_nsobject.h" #include "base/mac/scoped_block.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "base/strings/sys_string_conversions.h" #import "ios/web/crw_network_activity_indicator_manager.h" @@ -86,10 +87,10 @@ // URLFetcher with which PassKit data is downloaded. It is initialized // whenever |downloadPassKitFileWithURL| is called. - scoped_ptr<URLFetcher> _fetcher; + std::unique_ptr<URLFetcher> _fetcher; // Delegate to bridge between URLFetcher callback and CRWPassKitDownlaoder. - scoped_ptr<PassKitFetcherDelegate> _fetcherDelegate; + std::unique_ptr<PassKitFetcherDelegate> _fetcherDelegate; // Context getter which is passed to the URLFetcher, as required by // URLFetcher API.
diff --git a/ios/web/web_state/crw_pass_kit_downloader_unittest.mm b/ios/web/web_state/crw_pass_kit_downloader_unittest.mm index c65b238..b7bf7ac 100644 --- a/ios/web/web_state/crw_pass_kit_downloader_unittest.mm +++ b/ios/web/web_state/crw_pass_kit_downloader_unittest.mm
@@ -6,8 +6,9 @@ #import <Foundation/Foundation.h> +#include <memory> + #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #import "ios/web/test/web_test.h" #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" @@ -63,7 +64,7 @@ // Test fetcher factory from which we access and control the URLFetcher // used in CRWPassKitDownloader. - scoped_ptr<net::TestURLFetcherFactory> fetcher_factory_; + std::unique_ptr<net::TestURLFetcherFactory> fetcher_factory_; // The CRWPassKitDownloader that is being tested. base::scoped_nsobject<CRWPassKitDownloader> downloader_;
diff --git a/ios/web/web_state/js/credential_util_unittest.mm b/ios/web/web_state/js/credential_util_unittest.mm index 92d8e66eb..5716660 100644 --- a/ios/web/web_state/js/credential_util_unittest.mm +++ b/ios/web/web_state/js/credential_util_unittest.mm
@@ -4,7 +4,9 @@ #include "ios/web/public/web_state/js/credential_util.h" -#include "base/memory/scoped_ptr.h" +#include <memory> + +#include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "ios/web/public/web_state/credential.h" @@ -64,8 +66,9 @@ // Returns a value representing the credential returned by // |GetTestPasswordCredential()|. -scoped_ptr<base::DictionaryValue> GetTestPasswordCredentialDictionaryValue() { - scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue); +std::unique_ptr<base::DictionaryValue> +GetTestPasswordCredentialDictionaryValue() { + std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue); value->SetString("type", kTestCredentialTypePassword); value->SetString("id", kTestCredentialID); value->SetString("name", kTestCredentialName); @@ -76,8 +79,9 @@ // Returns a value representing the credential returned by // |GetTestFederatedCredentialDictionaryValue()|. -scoped_ptr<base::DictionaryValue> GetTestFederatedCredentialDictionaryValue() { - scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue); +std::unique_ptr<base::DictionaryValue> +GetTestFederatedCredentialDictionaryValue() { + std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue); value->SetString("type", kTestCredentialTypeFederated); value->SetString("id", kTestCredentialID); value->SetString("name", kTestCredentialName); @@ -96,7 +100,7 @@ // Tests that parsing a value with a bad type fails. TEST(CredentialUtilTest, ParsingValueWithBadTypeFails) { - scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue); + std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue); value->SetString("type", "FooCredential"); Credential credential; EXPECT_FALSE(DictionaryValueToCredential(*value, &credential)); @@ -114,7 +118,7 @@ // Tests that parsing a value representing a PasswordCredential but with no ID // specified fails. TEST(CredentialUtilTest, ParsingPasswordCredentialWithNoIDFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestPasswordCredentialDictionaryValue()); value->RemoveWithoutPathExpansion("id", nullptr); Credential credential; @@ -124,7 +128,7 @@ // Tests that parsing a value representing a PasswordCredential with a badly- // formed avatarURL fails. TEST(CredentialUtilTest, ParsingPasswordCredentialWithBadAvatarURLFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestPasswordCredentialDictionaryValue()); value->SetString("avatarURL", "foo"); Credential credential; @@ -134,7 +138,7 @@ // Tests that parsing a value representing a PasswordCredential with no password // specified fails. TEST(CredentialUtilTest, ParsingPasswordCredentialWithNoPasswordFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestPasswordCredentialDictionaryValue()); value->Remove("password", nullptr); Credential credential; @@ -153,7 +157,7 @@ // Tests that parsing a value representing a FederatedCredential with no ID // fails. TEST(CredentialUtilTest, ParsingFederatedCredentialWithNoIDFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestFederatedCredentialDictionaryValue()); value->RemoveWithoutPathExpansion("id", nullptr); Credential credential; @@ -163,7 +167,7 @@ // Tests that parsing a value representing a FederatedCredential with a badly- // formed avatarURL fails. TEST(CredentialUtilTest, ParsingFederatedCredentialWithBadAvatarURLFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestFederatedCredentialDictionaryValue()); value->SetString("avatarURL", "foo"); Credential credential; @@ -173,7 +177,7 @@ // Tests that parsing a value representing a FederatedCredential with no // federation URL fails. TEST(CredentialUtilTest, ParsingFederatedValueWithNoFederationURLFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestFederatedCredentialDictionaryValue()); value->Remove("federation", nullptr); Credential credential; @@ -183,7 +187,7 @@ // Tests that parsing a value representing a FederatedCredential with a badly- // formed federationURL fails. TEST(CredentialUtilTest, ParsingFederatedValueWithBadFederationURLFails) { - scoped_ptr<base::DictionaryValue> value( + std::unique_ptr<base::DictionaryValue> value( GetTestFederatedCredentialDictionaryValue()); value->SetString("federation", "bar"); Credential credential; @@ -213,7 +217,7 @@ base::DictionaryValue value; Credential credential; CredentialToDictionaryValue(credential, &value); - EXPECT_TRUE(make_scoped_ptr(new base::DictionaryValue)->Equals(&value)); + EXPECT_TRUE(base::WrapUnique(new base::DictionaryValue)->Equals(&value)); } TEST(CredentialUtilTest, SerializeEmptyCredentialIntoNonEmptyDictionary) { @@ -221,7 +225,7 @@ value.SetString("foo", "bar"); Credential credential; CredentialToDictionaryValue(credential, &value); - EXPECT_TRUE(make_scoped_ptr(new base::DictionaryValue)->Equals(&value)); + EXPECT_TRUE(base::WrapUnique(new base::DictionaryValue)->Equals(&value)); } } // namespace
diff --git a/ios/web/web_state/js/crw_js_early_script_manager_unittest.mm b/ios/web/web_state/js/crw_js_early_script_manager_unittest.mm index c06ad6e..ef5f5a6fa 100644 --- a/ios/web/web_state/js/crw_js_early_script_manager_unittest.mm +++ b/ios/web/web_state/js/crw_js_early_script_manager_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/web/web_state/js/crw_js_early_script_manager.h" #include "base/mac/scoped_nsobject.h" +#include "base/memory/ptr_util.h" #import "ios/web/public/test/crw_test_js_injection_receiver.h" #include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/web_client.h" @@ -17,7 +18,8 @@ class CRWJSEarlyScriptManagerTest : public PlatformTest { public: - CRWJSEarlyScriptManagerTest() : web_client_(make_scoped_ptr(new WebClient)) {} + CRWJSEarlyScriptManagerTest() + : web_client_(base::WrapUnique(new WebClient)) {} protected: void SetUp() override {
diff --git a/ios/web/web_state/js/crw_js_window_id_manager_unittest.mm b/ios/web/web_state/js/crw_js_window_id_manager_unittest.mm index 758855c8..040e656 100644 --- a/ios/web/web_state/js/crw_js_window_id_manager_unittest.mm +++ b/ios/web/web_state/js/crw_js_window_id_manager_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/web/web_state/js/crw_js_window_id_manager.h" #include "base/mac/scoped_nsobject.h" +#include "base/memory/ptr_util.h" #import "ios/web/public/test/crw_test_js_injection_receiver.h" #import "ios/web/public/test/js_test_util.h" #include "ios/web/public/test/scoped_testing_web_client.h" @@ -16,7 +17,7 @@ class JSWindowIDManagerTest : public PlatformTest { public: - JSWindowIDManagerTest() : web_client_(make_scoped_ptr(new web::WebClient)) {} + JSWindowIDManagerTest() : web_client_(base::WrapUnique(new web::WebClient)) {} protected: void SetUp() override {
diff --git a/ios/web/web_state/ui/crw_web_controller+protected.h b/ios/web/web_state/ui/crw_web_controller+protected.h index a1105cc48..a0ee53b 100644 --- a/ios/web/web_state/ui/crw_web_controller+protected.h +++ b/ios/web/web_state/ui/crw_web_controller+protected.h
@@ -9,6 +9,8 @@ #import <WebKit/WebKit.h> +#include <memory> + #include "base/mac/scoped_nsobject.h" #import "ios/web/public/navigation_manager.h" #include "ios/web/public/referrer.h" @@ -80,7 +82,7 @@ @property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; // Designated initializer. -- (instancetype)initWithWebState:(scoped_ptr<web::WebStateImpl>)webState; +- (instancetype)initWithWebState:(std::unique_ptr<web::WebStateImpl>)webState; // Creates a web view if it's not yet created. - (void)ensureWebViewCreated;
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h index 1448f1f..582485d 100644 --- a/ios/web/web_state/ui/crw_web_controller.h +++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -7,7 +7,6 @@ #import <UIKit/UIKit.h> -#include "base/memory/scoped_ptr.h" #import "ios/web/net/crw_request_tracker_delegate.h" #import "ios/web/public/navigation_manager.h" #import "ios/web/public/web_state/crw_web_user_interface_delegate.h"
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 7af8b46..1fa5259 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -8,6 +8,7 @@ #include <stddef.h> #include <cmath> +#include <memory> #include <utility> #include "base/ios/block_types.h" @@ -22,7 +23,6 @@ #include "base/mac/objc_property_releaser.h" #include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "base/metrics/user_metrics_action.h" #include "base/strings/string_util.h" @@ -45,8 +45,8 @@ #include "ios/web/net/request_group_util.h" #include "ios/web/public/browser_state.h" #include "ios/web/public/favicon_url.h" -#import "ios/web/public/navigation_manager.h" #include "ios/web/public/navigation_item.h" +#import "ios/web/public/navigation_manager.h" #include "ios/web/public/referrer.h" #include "ios/web/public/referrer_util.h" #include "ios/web/public/ssl_status.h" @@ -71,10 +71,10 @@ #import "ios/web/web_state/crw_web_view_proxy_impl.h" #import "ios/web/web_state/error_translation_util.h" #include "ios/web/web_state/frame_info.h" -#import "ios/web/web_state/page_viewport_state.h" #import "ios/web/web_state/js/crw_js_early_script_manager.h" #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" #import "ios/web/web_state/js/crw_js_window_id_manager.h" +#import "ios/web/web_state/page_viewport_state.h" #import "ios/web/web_state/ui/crw_context_menu_provider.h" #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" #import "ios/web/web_state/ui/crw_web_controller+protected.h" @@ -247,11 +247,11 @@ // because retreiving DOM element relies on async API so element info can not // be built on demand. May contain the following keys: "href", "src", "title", // "referrerPolicy". All values are strings. Used for showing context menus. - scoped_ptr<base::DictionaryValue> _DOMElementForLastTouch; + std::unique_ptr<base::DictionaryValue> _DOMElementForLastTouch; // Whether a click is in progress. BOOL _clickInProgress; // Data on the recorded last user interaction. - scoped_ptr<web::UserInteractionEvent> _lastUserInteraction; + std::unique_ptr<web::UserInteractionEvent> _lastUserInteraction; // YES if there has been user interaction with views owned by this controller. BOOL _userInteractedWithWebController; // The time of the last page transfer start, measured in seconds since Jan 1 @@ -275,10 +275,10 @@ // window.history.didPushState or window.history.didReplaceState. BOOL _changingHistoryState; - scoped_ptr<web::NewWindowInfo> _externalRequest; + std::unique_ptr<web::NewWindowInfo> _externalRequest; // The WebStateImpl instance associated with this CRWWebController. - scoped_ptr<WebStateImpl> _webStateImpl; + std::unique_ptr<WebStateImpl> _webStateImpl; // A set of URLs opened in external applications; stored so that errors // from the web view can be identified as resulting from these events. @@ -350,7 +350,8 @@ // way to run the evaluation or the evaluation returns a nil value) or an // NSError if there is an error. The |handler| can be nil. - (void)evaluateJavaScript:(NSString*)script - JSONResultHandler:(void (^)(scoped_ptr<base::Value>, NSError*))handler; + JSONResultHandler: + (void (^)(std::unique_ptr<base::Value>, NSError*))handler; // Attempts to handle a script message. Returns YES on success, NO otherwise. - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; // Generates the JavaScript string used to update the UIWebView's URL so that it @@ -397,12 +398,13 @@ // for element format description. - (void)fetchDOMElementAtPoint:(CGPoint)point completionHandler: - (void (^)(scoped_ptr<base::DictionaryValue>))handler; + (void (^)(std::unique_ptr<base::DictionaryValue>))handler; // Extracts context menu information from the given DOM element. // result keys are defined in crw_context_menu_provider.h. - (NSDictionary*)contextMenuInfoForElement:(base::DictionaryValue*)element; // Sets the value of |_DOMElementForLastTouch|. -- (void)setDOMElementForLastTouch:(scoped_ptr<base::DictionaryValue>)element; +- (void)setDOMElementForLastTouch: + (std::unique_ptr<base::DictionaryValue>)element; // Called when the window has determined there was a long-press and context menu // must be shown. - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer; @@ -576,7 +578,7 @@ return [super allocWithZone:zone]; } -- (instancetype)initWithWebState:(scoped_ptr<WebStateImpl>)webState { +- (instancetype)initWithWebState:(std::unique_ptr<WebStateImpl>)webState { self = [super init]; if (self) { _webStateImpl = std::move(webState); @@ -880,16 +882,18 @@ completionHandler:(void (^)(BOOL))completionHandler { CGPoint webViewPoint = [gestureRecognizer locationInView:self.webView]; base::WeakNSObject<CRWWebController> weakSelf(self); - [self fetchDOMElementAtPoint:webViewPoint - completionHandler:^(scoped_ptr<base::DictionaryValue> element) { - std::string link; - BOOL hasLink = - element && element->GetString("href", &link) && link.size(); - completionHandler(hasLink); - }]; + [self + fetchDOMElementAtPoint:webViewPoint + completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { + std::string link; + BOOL hasLink = + element && element->GetString("href", &link) && link.size(); + completionHandler(hasLink); + }]; } -- (void)setDOMElementForLastTouch:(scoped_ptr<base::DictionaryValue>)element { +- (void)setDOMElementForLastTouch: + (std::unique_ptr<base::DictionaryValue>)element { _DOMElementForLastTouch = std::move(element); } @@ -1854,12 +1858,12 @@ - (void)evaluateJavaScript:(NSString*)script JSONResultHandler: - (void (^)(scoped_ptr<base::Value>, NSError*))handler { + (void (^)(std::unique_ptr<base::Value>, NSError*))handler { [self evaluateJavaScript:script stringResultHandler:^(NSString* stringResult, NSError* error) { DCHECK(stringResult || error); if (handler) { - scoped_ptr<base::Value> result( + std::unique_ptr<base::Value> result( base::JSONReader::Read(base::SysNSStringToUTF8(stringResult))); handler(std::move(result), error); } @@ -2133,9 +2137,10 @@ CHECK(scriptMessage.frameInfo.mainFrame); int errorCode = 0; std::string errorMessage; - scoped_ptr<base::Value> inputJSONData(base::JSONReader::ReadAndReturnError( - base::SysNSStringToUTF8(scriptMessage.body), false, &errorCode, - &errorMessage)); + std::unique_ptr<base::Value> inputJSONData( + base::JSONReader::ReadAndReturnError( + base::SysNSStringToUTF8(scriptMessage.body), false, &errorCode, + &errorMessage)); if (errorCode) { DLOG(WARNING) << "JSON parse error: %s" << errorMessage.c_str(); return NO; @@ -3042,10 +3047,11 @@ // fetched - system context menu will be shown. [self setDOMElementForLastTouch:nullptr]; base::WeakNSObject<CRWWebController> weakSelf(self); - [self fetchDOMElementAtPoint:[touch locationInView:self.webView] - completionHandler:^(scoped_ptr<base::DictionaryValue> element) { - [weakSelf setDOMElementForLastTouch:std::move(element)]; - }]; + [self + fetchDOMElementAtPoint:[touch locationInView:self.webView] + completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { + [weakSelf setDOMElementForLastTouch:std::move(element)]; + }]; return YES; } @@ -3604,7 +3610,7 @@ - (void)fetchDOMElementAtPoint:(CGPoint)point completionHandler: - (void (^)(scoped_ptr<base::DictionaryValue>))handler { + (void (^)(std::unique_ptr<base::DictionaryValue>))handler { DCHECK(handler); // Convert point into web page's coordinate system (which may be scaled and/or // scrolled). @@ -3618,20 +3624,21 @@ NSString* const kGetElementScript = [NSString stringWithFormat:@"__gCrWeb.getElementFromPoint(%g, %g);", localPoint.x, localPoint.y]; - [weakSelf evaluateJavaScript:kGetElementScript - JSONResultHandler:^(scoped_ptr<base::Value> element, NSError*) { - // Release raw element and call handler with DictionaryValue. - scoped_ptr<base::DictionaryValue> elementAsDict; - if (element) { - base::DictionaryValue* elementAsDictPtr = nullptr; - element.release()->GetAsDictionary(&elementAsDictPtr); - // |rawElement| and |elementPtr| now point to the same - // memory. |elementPtr| ownership will be transferred to - // |element| scoped_ptr. - elementAsDict.reset(elementAsDictPtr); - } - handler(std::move(elementAsDict)); - }]; + [weakSelf + evaluateJavaScript:kGetElementScript + JSONResultHandler:^(std::unique_ptr<base::Value> element, NSError*) { + // Release raw element and call handler with DictionaryValue. + std::unique_ptr<base::DictionaryValue> elementAsDict; + if (element) { + base::DictionaryValue* elementAsDictPtr = nullptr; + element.release()->GetAsDictionary(&elementAsDictPtr); + // |rawElement| and |elementPtr| now point to the same + // memory. |elementPtr| ownership will be transferred to + // |element| scoped_ptr. + elementAsDict.reset(elementAsDictPtr); + } + handler(std::move(elementAsDict)); + }]; }]; }
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index a6d426a9..ffa44dad 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -151,7 +151,7 @@ @implementation MockInteractionLoader { // Backs up the property with the same name. - scoped_ptr<web::BlockedPopupInfo> _blockedPopupInfo; + std::unique_ptr<web::BlockedPopupInfo> _blockedPopupInfo; } @synthesize popupURL = _popupURL; @synthesize sourceURL = _sourceURL;
diff --git a/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm b/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm index 2e91f43..0f25615 100644 --- a/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm +++ b/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm
@@ -6,6 +6,7 @@ #include "base/mac/scoped_block.h" #include "base/mac/scoped_nsobject.h" +#include "base/memory/ptr_util.h" #include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" @@ -28,7 +29,7 @@ class CRWWKScriptMessageRouterTest : public web::WebTest { public: CRWWKScriptMessageRouterTest() - : web_client_(make_scoped_ptr(new web::WebClient)) {} + : web_client_(base::WrapUnique(new web::WebClient)) {} protected: void SetUp() override {
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.h b/ios/web/web_state/ui/crw_wk_web_view_web_controller.h index 394f446..44eef2d2 100644 --- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.h +++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.h
@@ -7,11 +7,13 @@ #import "ios/web/web_state/ui/crw_web_controller.h" +#include <memory> + // A concrete implementation of CRWWebController based on WKWebView. @interface CRWWKWebViewWebController : CRWWebController // Designated initializer. -- (instancetype)initWithWebState:(scoped_ptr<web::WebStateImpl>)webState; +- (instancetype)initWithWebState:(std::unique_ptr<web::WebStateImpl>)webState; @end
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm index 884a4a00..ece3a51c 100644 --- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm +++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
@@ -190,7 +190,7 @@ // Key is leaf-cert/host pair. This storage is used to carry calculated // cert status from |didReceiveAuthenticationChallenge:| to // |didFailProvisionalNavigation:| delegate method. - scoped_ptr<CertVerificationErrorsCacheType> _certVerificationErrors; + std::unique_ptr<CertVerificationErrorsCacheType> _certVerificationErrors; // YES if the user has interacted with the content area since the last URL // change. @@ -352,7 +352,7 @@ #pragma mark CRWWebController public methods -- (instancetype)initWithWebState:(scoped_ptr<web::WebStateImpl>)webState { +- (instancetype)initWithWebState:(std::unique_ptr<web::WebStateImpl>)webState { DCHECK(webState); web::BrowserState* browserState = webState->GetBrowserState(); self = [super initWithWebState:std::move(webState)];
diff --git a/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm b/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm index 8be0bdcf..e293335e 100644 --- a/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm +++ b/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm
@@ -20,7 +20,7 @@ // Tests that FromNavigationItem returns the same holder for the same // NavigationItem. TEST_F(WKBackForwardListItemHolderTest, GetHolderFromNavigationItem) { - scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder1 = WKBackForwardListItemHolder::FromNavigationItem(item.get()); WKBackForwardListItemHolder* holder2 = @@ -32,8 +32,8 @@ // NavigationItem objects. TEST_F(WKBackForwardListItemHolderTest, GetHolderFromDifferentNavigationItem) { // Create two NavigationItem objects. - scoped_ptr<web::NavigationItem> item1(NavigationItem::Create()); - scoped_ptr<web::NavigationItem> item2(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item1(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item2(NavigationItem::Create()); EXPECT_NE(item1.get(), item2.get()); // Verify that the two objects have different holders. @@ -49,7 +49,7 @@ // because WKBackForwardListItem alloc/release is not designed to be called // directly and will crash. TEST_F(WKBackForwardListItemHolderTest, GetBackForwardListItemFromHolder) { - scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item(NavigationItem::Create()); base::scoped_nsobject<NSObject> input([[NSObject alloc] init]); WKBackForwardListItemHolder* holder = WKBackForwardListItemHolder::FromNavigationItem(item.get()); @@ -61,7 +61,7 @@ // Tests that acessors for navigation type work as expected. TEST_F(WKBackForwardListItemHolderTest, GetNavigationTypeFromHolder) { - scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder = WKBackForwardListItemHolder::FromNavigationItem(item.get()); @@ -107,7 +107,7 @@ // instead of WKBackForwardListItem because WKBackForwardListItem alloc/ // release is not designed to be called directly and will crash. TEST_F(WKBackForwardListItemHolderTest, GetNilBackForwardListItemFromHolder) { - scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); + std::unique_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder = WKBackForwardListItemHolder::FromNavigationItem(item.get());
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm b/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm index 70c0bee2..8196b96 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm
@@ -7,6 +7,7 @@ #import <WebKit/WebKit.h> #import "base/ios/weak_nsobject.h" +#include "base/memory/ptr_util.h" #include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/test/test_browser_state.h" #include "ios/web/public/web_client.h" @@ -22,7 +23,7 @@ class WKWebViewConfigurationProviderTest : public PlatformTest { public: WKWebViewConfigurationProviderTest() - : web_client_(make_scoped_ptr(new web::WebClient)) {} + : web_client_(base::WrapUnique(new web::WebClient)) {} protected: // Returns WKWebViewConfigurationProvider associated with |browser_state_|.
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h index 7924ae2..5b506bd 100644 --- a/ios/web/web_state/web_state_impl.h +++ b/ios/web/web_state/web_state_impl.h
@@ -9,12 +9,12 @@ #include <stdint.h> #include <map> +#include <memory> #include <string> #include <vector> #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "base/values.h" #include "ios/web/navigation/navigation_manager_delegate.h" @@ -295,7 +295,7 @@ // |web::WebUIIOS| object for the current page if it is a WebUI page that // uses the web-based WebUI framework, or nullptr otherwise. - scoped_ptr<web::WebUIIOS> web_ui_; + std::unique_ptr<web::WebUIIOS> web_ui_; // A list of observers notified when page state changes. Weak references. base::ObserverList<WebStateObserver, true> observers_;
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm index 15bef0a..e946cea 100644 --- a/ios/web/web_state/web_state_impl_unittest.mm +++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -2,11 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ios/web/web_state/web_state_impl.h" + #include <stddef.h> +#include <memory> + #include "base/bind.h" #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/values.h" #include "ios/web/public/load_committed_details.h" #include "ios/web/public/test/test_browser_state.h" @@ -14,7 +17,6 @@ #include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_policy_decider.h" #include "ios/web/web_state/global_web_state_event_tracker.h" -#include "ios/web/web_state/web_state_impl.h" #include "net/http/http_response_headers.h" #include "net/http/http_util.h" #include "testing/gmock/include/gmock/gmock.h" @@ -230,7 +232,7 @@ } web::TestBrowserState browser_state_; - scoped_ptr<WebStateImpl> web_state_; + std::unique_ptr<WebStateImpl> web_state_; }; TEST_F(WebStateTest, ResponseHeaders) { @@ -293,7 +295,7 @@ } TEST_F(WebStateTest, ObserverTest) { - scoped_ptr<TestWebStateObserver> observer( + std::unique_ptr<TestWebStateObserver> observer( new TestWebStateObserver(web_state_.get())); EXPECT_EQ(web_state_.get(), observer->web_state()); @@ -345,7 +347,7 @@ // Verifies that GlobalWebStateObservers are called when expected. TEST_F(WebStateTest, GlobalObserverTest) { - scoped_ptr<TestGlobalWebStateObserver> observer( + std::unique_ptr<TestGlobalWebStateObserver> observer( new TestGlobalWebStateObserver()); // Test that NavigationItemsPruned() is called.
diff --git a/ios/web/web_state/web_view_internal_creation_util_unittest.mm b/ios/web/web_state/web_view_internal_creation_util_unittest.mm index fa3a4ec..bac88e85 100644 --- a/ios/web/web_state/web_view_internal_creation_util_unittest.mm +++ b/ios/web/web_state/web_view_internal_creation_util_unittest.mm
@@ -8,6 +8,7 @@ #import <WebKit/WebKit.h> #include "base/mac/scoped_nsobject.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "ios/web/net/request_group_util.h" #include "ios/web/public/test/scoped_testing_web_client.h" @@ -36,7 +37,7 @@ class WebViewCreationUtilsTest : public WebTest { public: WebViewCreationUtilsTest() - : web_client_(make_scoped_ptr(new CreationUtilsWebClient)) {} + : web_client_(base::WrapUnique(new CreationUtilsWebClient)) {} protected: CreationUtilsWebClient* creation_utils_web_client() {
diff --git a/ios/web/web_state/wk_web_view_security_util_unittest.mm b/ios/web/web_state/wk_web_view_security_util_unittest.mm index b785e02..bce18cf7e 100644 --- a/ios/web/web_state/wk_web_view_security_util_unittest.mm +++ b/ios/web/web_state/wk_web_view_security_util_unittest.mm
@@ -7,8 +7,9 @@ #import <Foundation/Foundation.h> #include <Security/Security.h> +#include <memory> + #include "base/mac/scoped_cftyperef.h" -#include "base/memory/scoped_ptr.h" #include "crypto/rsa_private_key.h" #include "net/cert/x509_cert_types.h" #include "net/cert/x509_certificate.h" @@ -28,7 +29,7 @@ // Returns an autoreleased certificate chain for testing. Chain will contain a // single self-signed cert with |subject| as a subject. NSArray* MakeTestCertChain(const std::string& subject) { - scoped_ptr<crypto::RSAPrivateKey> private_key; + std::unique_ptr<crypto::RSAPrivateKey> private_key; std::string der_cert; net::x509_util::CreateKeyAndSelfSignedCert( "CN=" + subject, 1, base::Time::Now(),
diff --git a/ios/web/webui/crw_web_ui_manager.h b/ios/web/webui/crw_web_ui_manager.h index a4b8053..b9550d2 100644 --- a/ios/web/webui/crw_web_ui_manager.h +++ b/ios/web/webui/crw_web_ui_manager.h
@@ -7,6 +7,8 @@ #import <Foundation/Foundation.h> +#include <memory> + #import "ios/web/public/web_state/web_state_observer_bridge.h" #import "ios/web/webui/url_fetcher_block_adapter.h" @@ -31,9 +33,9 @@ // Returns URLFetcherBlockAdapter for fetching resource for URL. Can be // overwritten by test classes to mock resource retrieval. -- (scoped_ptr<web::URLFetcherBlockAdapter>) - fetcherForURL:(const GURL&)URL - completionHandler:(web::URLFetcherBlockAdapterCompletion)handler; +- (std::unique_ptr<web::URLFetcherBlockAdapter>) + fetcherForURL:(const GURL&)URL +completionHandler:(web::URLFetcherBlockAdapterCompletion)handler; @end
diff --git a/ios/web/webui/crw_web_ui_manager.mm b/ios/web/webui/crw_web_ui_manager.mm index 84cd21a..2a8bd77 100644 --- a/ios/web/webui/crw_web_ui_manager.mm +++ b/ios/web/webui/crw_web_ui_manager.mm
@@ -52,7 +52,7 @@ // Set of live WebUI fetchers for retrieving data. ScopedVector<web::URLFetcherBlockAdapter> _fetchers; // Bridge to observe the web state from Objective-C. - scoped_ptr<web::WebStateObserverBridge> _webStateObserverBridge; + std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; // Weak WebStateImpl this CRWWebUIManager is associated with. web::WebStateImpl* _webState; } @@ -215,10 +215,10 @@ #pragma mark - Testing-Only Methods -- (scoped_ptr<web::URLFetcherBlockAdapter>) - fetcherForURL:(const GURL&)URL - completionHandler:(web::URLFetcherBlockAdapterCompletion)handler { - return scoped_ptr<web::URLFetcherBlockAdapter>( +- (std::unique_ptr<web::URLFetcherBlockAdapter>) + fetcherForURL:(const GURL&)URL +completionHandler:(web::URLFetcherBlockAdapterCompletion)handler { + return std::unique_ptr<web::URLFetcherBlockAdapter>( new web::URLFetcherBlockAdapter( URL, _webState->GetBrowserState()->GetRequestContext(), handler)); }
diff --git a/ios/web/webui/crw_web_ui_manager_unittest.mm b/ios/web/webui/crw_web_ui_manager_unittest.mm index c5fac6f..48528011 100644 --- a/ios/web/webui/crw_web_ui_manager_unittest.mm +++ b/ios/web/webui/crw_web_ui_manager_unittest.mm
@@ -4,11 +4,13 @@ #import "ios/web/webui/crw_web_ui_manager.h" +#include <memory> + #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/logging.h" #import "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/strings/stringprintf.h" @@ -93,16 +95,16 @@ // Subclass of CRWWebUIManager for testing. @interface CRWTestWebUIManager : CRWWebUIManager // Use mock URLFetcherBlockAdapter. -- (scoped_ptr<web::URLFetcherBlockAdapter>) - fetcherForURL:(const GURL&)URL - completionHandler:(web::URLFetcherBlockAdapterCompletion)handler; +- (std::unique_ptr<web::URLFetcherBlockAdapter>) + fetcherForURL:(const GURL&)URL +completionHandler:(web::URLFetcherBlockAdapterCompletion)handler; @end @implementation CRWTestWebUIManager -- (scoped_ptr<web::URLFetcherBlockAdapter>) - fetcherForURL:(const GURL&)URL - completionHandler:(web::URLFetcherBlockAdapterCompletion)handler { - return scoped_ptr<web::URLFetcherBlockAdapter>( +- (std::unique_ptr<web::URLFetcherBlockAdapter>) + fetcherForURL:(const GURL&)URL +completionHandler:(web::URLFetcherBlockAdapterCompletion)handler { + return std::unique_ptr<web::URLFetcherBlockAdapter>( new web::MockURLFetcherBlockAdapter(URL, nil, handler)); } @end @@ -113,7 +115,7 @@ class CRWWebUIManagerTest : public PlatformTest { public: CRWWebUIManagerTest() - : web_client_(make_scoped_ptr(new web::AppSpecificTestWebClient)) {} + : web_client_(base::WrapUnique(new web::AppSpecificTestWebClient)) {} protected: void SetUp() override { @@ -125,10 +127,10 @@ } // TestBrowserState for creation of WebStateImpl. - scoped_ptr<TestBrowserState> test_browser_state_; + std::unique_ptr<TestBrowserState> test_browser_state_; // MockWebStateImpl for detection of LoadHtml and EvaluateJavaScriptAync // calls. - scoped_ptr<MockWebStateImpl> web_state_impl_; + std::unique_ptr<MockWebStateImpl> web_state_impl_; // WebUIManager for testing. base::scoped_nsobject<CRWTestWebUIManager> web_ui_manager_; // The WebClient used in tests. @@ -153,7 +155,7 @@ // Create mock JavaScript message to request favicon. base::ListValue* arguments(new base::ListValue()); arguments->AppendString(favicon_url_string); - scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue()); + std::unique_ptr<base::DictionaryValue> message(new base::DictionaryValue()); message->SetString("message", "webui.requestFavicon"); message->Set("arguments", arguments);
diff --git a/ios/web/webui/url_data_manager_ios_backend.h b/ios/web/webui/url_data_manager_ios_backend.h index 1135881..e483c321 100644 --- a/ios/web/webui/url_data_manager_ios_backend.h +++ b/ios/web/webui/url_data_manager_ios_backend.h
@@ -6,12 +6,12 @@ #define IOS_INTERNAL_WEB_WEBUI_URL_DATA_MANAGER_BACKEND_IOS_H_ #include <map> +#include <memory> #include <string> #include <vector> #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/supports_user_data.h" #include "ios/web/public/url_data_source_ios.h" #include "ios/web/webui/url_data_manager_ios.h" @@ -40,7 +40,7 @@ // Invoked to create the protocol handler for chrome://. |is_incognito| should // be set for incognito browser states. Called on the UI thread. - static scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> + static std::unique_ptr<net::URLRequestJobFactory::ProtocolHandler> CreateProtocolHandler(BrowserState* browser_state); // Adds a DataSource to the collection of data sources.
diff --git a/ios/web/webui/url_data_manager_ios_backend.mm b/ios/web/webui/url_data_manager_ios_backend.mm index ce3e279..5ee98be 100644 --- a/ios/web/webui/url_data_manager_ios_backend.mm +++ b/ios/web/webui/url_data_manager_ios_backend.mm
@@ -12,6 +12,7 @@ #include "base/debug/alias.h" #include "base/lazy_instance.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/memory/weak_ptr.h" @@ -397,10 +398,10 @@ } // static -scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> +std::unique_ptr<net::URLRequestJobFactory::ProtocolHandler> URLDataManagerIOSBackend::CreateProtocolHandler(BrowserState* browser_state) { DCHECK(browser_state); - return make_scoped_ptr(new ChromeProtocolHandler( + return base::WrapUnique(new ChromeProtocolHandler( browser_state, browser_state->IsOffTheRecord())); }
diff --git a/ios/web/webui/url_data_source_ios_impl.h b/ios/web/webui/url_data_source_ios_impl.h index 8544f83..bb9b2b1 100644 --- a/ios/web/webui/url_data_source_ios_impl.h +++ b/ios/web/webui/url_data_source_ios_impl.h
@@ -5,8 +5,9 @@ #ifndef IOS_INTERNAL_WEB_WEBUI_URL_DATA_SOURCE_IMPL_IOS_H_ #define IOS_INTERNAL_WEB_WEBUI_URL_DATA_SOURCE_IMPL_IOS_H_ +#include <memory> + #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/sequenced_task_runner_helpers.h" #include "ios/web/webui/url_data_manager_ios.h" @@ -91,7 +92,7 @@ // source. URLDataManagerIOSBackend* backend_; - scoped_ptr<URLDataSourceIOS> source_; + std::unique_ptr<URLDataSourceIOS> source_; }; } // namespace web
diff --git a/ios/web/webui/url_fetcher_block_adapter.h b/ios/web/webui/url_fetcher_block_adapter.h index 095240b4..b55381e 100644 --- a/ios/web/webui/url_fetcher_block_adapter.h +++ b/ios/web/webui/url_fetcher_block_adapter.h
@@ -7,8 +7,9 @@ #import <Foundation/Foundation.h> +#include <memory> + #include "base/mac/scoped_block.h" -#include "base/memory/scoped_ptr.h" #include "net/url_request/url_fetcher_delegate.h" #include "url/gurl.h" @@ -52,7 +53,7 @@ base::mac::ScopedBlock<web::URLFetcherBlockAdapterCompletion> completion_handler_; // URLFetcher for retrieving data from net stack. - scoped_ptr<net::URLFetcher> fetcher_; + std::unique_ptr<net::URLFetcher> fetcher_; }; } // namespace web
diff --git a/ios/web/webui/web_ui_ios_impl.h b/ios/web/webui/web_ui_ios_impl.h index 2d7a72e..d7595e8 100644 --- a/ios/web/webui/web_ui_ios_impl.h +++ b/ios/web/webui/web_ui_ios_impl.h
@@ -6,10 +6,10 @@ #define IOS_WEB_WEBUI_WEB_UI_IOS_IMPL_H_ #include <map> +#include <memory> #include "base/compiler_specific.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/memory/weak_ptr.h" #include "ios/public/provider/web/web_ui_ios.h" @@ -70,7 +70,7 @@ // Non-owning pointer to the WebStateImpl this WebUIIOS is associated with. WebStateImpl* web_state_; - scoped_ptr<WebUIIOSController> controller_; + std::unique_ptr<WebUIIOSController> controller_; DISALLOW_COPY_AND_ASSIGN(WebUIIOSImpl); };
diff --git a/mash/quick_launch/quick_launch_application.cc b/mash/quick_launch/quick_launch_application.cc index 9e26168f..179c6af 100644 --- a/mash/quick_launch/quick_launch_application.cc +++ b/mash/quick_launch/quick_launch_application.cc
@@ -158,5 +158,9 @@ window->Show(); } +bool QuickLaunchApplication::AcceptConnection(mojo::Connection* connection) { + return true; +} + } // namespace quick_launch } // namespace mash
diff --git a/mash/quick_launch/quick_launch_application.h b/mash/quick_launch/quick_launch_application.h index 0057e9c..a5c7b30 100644 --- a/mash/quick_launch/quick_launch_application.h +++ b/mash/quick_launch/quick_launch_application.h
@@ -29,6 +29,7 @@ void Initialize(mojo::Connector* connector, const mojo::Identity& identity, uint32_t id) override; + bool AcceptConnection(mojo::Connection* connection) override; mojo::TracingImpl tracing_; std::unique_ptr<views::AuraInit> aura_init_;
diff --git a/mash/session/session.cc b/mash/session/session.cc index 0e5a142..843fab3 100644 --- a/mash/session/session.cc +++ b/mash/session/session.cc
@@ -11,6 +11,16 @@ #include "mojo/shell/public/cpp/connection.h" #include "mojo/shell/public/cpp/connector.h" +namespace { + +void LogAndCallServiceRestartCallback(const std::string& url, + const base::Closure& callback) { + LOG(ERROR) << "Restarting service: " << url; + callback.Run(); +} + +} // namespace + namespace mash { namespace session { @@ -128,7 +138,8 @@ std::unique_ptr<mojo::Connection> connection = connector_->Connect(url); // Note: |connection| may be null if we've lost our connection to the shell. if (connection) { - connection->SetConnectionLostClosure(restart_callback); + connection->SetConnectionLostClosure( + base::Bind(&LogAndCallServiceRestartCallback, url, restart_callback)); connection->AddInterface<mojom::Session>(this); connections_[url] = std::move(connection); }
diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc index d351940..6c519fe 100644 --- a/media/audio/mac/audio_low_latency_input_mac.cc +++ b/media/audio/mac/audio_low_latency_input_mac.cc
@@ -78,6 +78,8 @@ // Maps internal enumerator values (e.g. kAudioDevicePropertyDeviceHasChanged) // into local values that are suitable for UMA stats. // See AudioObjectPropertySelector in CoreAudio/AudioHardware.h for details. +// TODO(henrika): ensure that the "other" bucket contains as few counts as +// possible by adding more valid enumerators below. enum AudioDevicePropertyResult { PROPERTY_OTHER = 0, // Use for all non-supported property changes PROPERTY_DEVICE_HAS_CHANGED = 1, @@ -99,7 +101,42 @@ PROPERTY_VOLUME_DECIBELS = 17, PROPERTY_VOLUME_SCALAR = 18, PROPERTY_MUTE = 19, - PROPERTY_MAX = PROPERTY_MUTE + PROPERTY_PLUGIN = 20, + PROPERTY_USES_VARIABLE_BUFFER_FRAME_SIZES = 21, + PROPERTY_IO_CYCLE_USAGE = 22, + PROPERTY_IO_PROC_STREAM_USAGE = 23, + PROPERTY_CONFIGURATION_APPLICATION = 24, + PROPERTY_DEVICE_UID = 25, + PROPERTY_MODE_UID = 26, + PROPERTY_TRANSPORT_TYPE = 27, + PROPERTY_RELATED_DEVICES = 28, + PROPERTY_CLOCK_DOMAIN = 29, + PROPERTY_DEVICE_CAN_BE_DEFAULT_DEVICE = 30, + PROPERTY_DEVICE_CAN_BE_DEFAULT_SYSTEM_DEVICE = 31, + PROPERTY_LATENCY = 32, + PROPERTY_STREAMS = 33, + PROPERTY_CONTROL_LIST = 34, + PROPERTY_SAFETY_OFFSET = 35, + PROPERTY_AVAILABLE_NOMINAL_SAMPLE_RATES = 36, + PROPERTY_ICON = 37, + PROPERTY_IS_HIDDEN = 38, + PROPERTY_PREFERRED_CHANNELS_FOR_STEREO = 39, + PROPERTY_PREFERRED_CHANNEL_LAYOUT = 40, + PROPERTY_VOLUME_RANGE_DECIBELS = 41, + PROPERTY_VOLUME_SCALAR_TO_DECIBELS = 42, + PROPERTY_VOLUME_DECIBEL_TO_SCALAR = 43, + PROPERTY_STEREO_PAN = 44, + PROPERTY_STEREO_PAN_CHANNELS = 45, + PROPERTY_SOLO = 46, + PROPERTY_PHANTOM_POWER = 47, + PROPERTY_PHASE_INVERT = 48, + PROPERTY_CLIP_LIGHT = 49, + PROPERTY_TALKBACK = 50, + PROPERTY_LISTENBACK = 51, + PROPERTY_CLOCK_SOURCE = 52, + PROPERTY_CLOCK_SOURCES = 53, + PROPERTY_SUB_MUTE = 54, + PROPERTY_MAX = PROPERTY_SUB_MUTE }; // Add the provided value in |result| to a UMA histogram. @@ -1200,10 +1237,9 @@ // Scan the map of all available property changes (notification types) and // filter out some that make sense to add to UMA stats. // TODO(henrika): figure out if the set of stats is sufficient or not. - for (auto it = device_property_changes_map_.begin(); - it != device_property_changes_map_.end(); ++it) { - UInt32 device_property = it->first; - int change_count = it->second; + for (const auto& entry : device_property_changes_map_) { + UInt32 device_property = entry.first; + int change_count = entry.second; AudioDevicePropertyResult uma_result = PROPERTY_OTHER; switch (device_property) { case kAudioDevicePropertyDeviceHasChanged: @@ -1282,6 +1318,146 @@ uma_result = PROPERTY_MUTE; DVLOG(1) << "kAudioDevicePropertyMute"; break; + case kAudioDevicePropertyPlugIn: + uma_result = PROPERTY_PLUGIN; + DVLOG(1) << "kAudioDevicePropertyPlugIn"; + break; + case kAudioDevicePropertyUsesVariableBufferFrameSizes: + uma_result = PROPERTY_USES_VARIABLE_BUFFER_FRAME_SIZES; + DVLOG(1) << "kAudioDevicePropertyUsesVariableBufferFrameSizes"; + break; + case kAudioDevicePropertyIOCycleUsage: + uma_result = PROPERTY_IO_CYCLE_USAGE; + DVLOG(1) << "kAudioDevicePropertyIOCycleUsage"; + break; + case kAudioDevicePropertyIOProcStreamUsage: + uma_result = PROPERTY_IO_PROC_STREAM_USAGE; + DVLOG(1) << "kAudioDevicePropertyIOProcStreamUsage"; + break; + case kAudioDevicePropertyConfigurationApplication: + uma_result = PROPERTY_CONFIGURATION_APPLICATION; + DVLOG(1) << "kAudioDevicePropertyConfigurationApplication"; + break; + case kAudioDevicePropertyDeviceUID: + uma_result = PROPERTY_DEVICE_UID; + DVLOG(1) << "kAudioDevicePropertyDeviceUID"; + break; + case kAudioDevicePropertyModelUID: + uma_result = PROPERTY_MODE_UID; + DVLOG(1) << "kAudioDevicePropertyModelUID"; + break; + case kAudioDevicePropertyTransportType: + uma_result = PROPERTY_TRANSPORT_TYPE; + DVLOG(1) << "kAudioDevicePropertyTransportType"; + break; + case kAudioDevicePropertyRelatedDevices: + uma_result = PROPERTY_RELATED_DEVICES; + DVLOG(1) << "kAudioDevicePropertyRelatedDevices"; + break; + case kAudioDevicePropertyClockDomain: + uma_result = PROPERTY_CLOCK_DOMAIN; + DVLOG(1) << "kAudioDevicePropertyClockDomain"; + break; + case kAudioDevicePropertyDeviceCanBeDefaultDevice: + uma_result = PROPERTY_DEVICE_CAN_BE_DEFAULT_DEVICE; + DVLOG(1) << "kAudioDevicePropertyDeviceCanBeDefaultDevice"; + break; + case kAudioDevicePropertyDeviceCanBeDefaultSystemDevice: + uma_result = PROPERTY_DEVICE_CAN_BE_DEFAULT_SYSTEM_DEVICE; + DVLOG(1) << "kAudioDevicePropertyDeviceCanBeDefaultSystemDevice"; + break; + case kAudioDevicePropertyLatency: + uma_result = PROPERTY_LATENCY; + DVLOG(1) << "kAudioDevicePropertyLatency"; + break; + case kAudioDevicePropertyStreams: + uma_result = PROPERTY_STREAMS; + DVLOG(1) << "kAudioDevicePropertyStreams"; + break; + case kAudioObjectPropertyControlList: + uma_result = PROPERTY_CONTROL_LIST; + DVLOG(1) << "kAudioObjectPropertyControlList"; + break; + case kAudioDevicePropertySafetyOffset: + uma_result = PROPERTY_SAFETY_OFFSET; + DVLOG(1) << "kAudioDevicePropertySafetyOffset"; + break; + case kAudioDevicePropertyAvailableNominalSampleRates: + uma_result = PROPERTY_AVAILABLE_NOMINAL_SAMPLE_RATES; + DVLOG(1) << "kAudioDevicePropertyAvailableNominalSampleRates"; + break; + case kAudioDevicePropertyIcon: + uma_result = PROPERTY_ICON; + DVLOG(1) << "kAudioDevicePropertyIcon"; + break; + case kAudioDevicePropertyIsHidden: + uma_result = PROPERTY_IS_HIDDEN; + DVLOG(1) << "kAudioDevicePropertyIsHidden"; + break; + case kAudioDevicePropertyPreferredChannelsForStereo: + uma_result = PROPERTY_PREFERRED_CHANNELS_FOR_STEREO; + DVLOG(1) << "kAudioDevicePropertyPreferredChannelsForStereo"; + break; + case kAudioDevicePropertyPreferredChannelLayout: + uma_result = PROPERTY_PREFERRED_CHANNEL_LAYOUT; + DVLOG(1) << "kAudioDevicePropertyPreferredChannelLayout"; + break; + case kAudioDevicePropertyVolumeRangeDecibels: + uma_result = PROPERTY_VOLUME_RANGE_DECIBELS; + DVLOG(1) << "kAudioDevicePropertyVolumeRangeDecibels"; + break; + case kAudioDevicePropertyVolumeScalarToDecibels: + uma_result = PROPERTY_VOLUME_SCALAR_TO_DECIBELS; + DVLOG(1) << "kAudioDevicePropertyVolumeScalarToDecibels"; + break; + case kAudioDevicePropertyVolumeDecibelsToScalar: + uma_result = PROPERTY_VOLUME_DECIBEL_TO_SCALAR; + DVLOG(1) << "kAudioDevicePropertyVolumeDecibelsToScalar"; + break; + case kAudioDevicePropertyStereoPan: + uma_result = PROPERTY_STEREO_PAN; + DVLOG(1) << "kAudioDevicePropertyStereoPan"; + break; + case kAudioDevicePropertyStereoPanChannels: + uma_result = PROPERTY_STEREO_PAN_CHANNELS; + DVLOG(1) << "kAudioDevicePropertyStereoPanChannels"; + break; + case kAudioDevicePropertySolo: + uma_result = PROPERTY_SOLO; + DVLOG(1) << "kAudioDevicePropertySolo"; + break; + case kAudioDevicePropertyPhantomPower: + uma_result = PROPERTY_PHANTOM_POWER; + DVLOG(1) << "kAudioDevicePropertyPhantomPower"; + break; + case kAudioDevicePropertyPhaseInvert: + uma_result = PROPERTY_PHASE_INVERT; + DVLOG(1) << "kAudioDevicePropertyPhaseInvert"; + break; + case kAudioDevicePropertyClipLight: + uma_result = PROPERTY_CLIP_LIGHT; + DVLOG(1) << "kAudioDevicePropertyClipLight"; + break; + case kAudioDevicePropertyTalkback: + uma_result = PROPERTY_TALKBACK; + DVLOG(1) << "kAudioDevicePropertyTalkback"; + break; + case kAudioDevicePropertyListenback: + uma_result = PROPERTY_LISTENBACK; + DVLOG(1) << "kAudioDevicePropertyListenback"; + break; + case kAudioDevicePropertyClockSource: + uma_result = PROPERTY_CLOCK_SOURCE; + DVLOG(1) << "kAudioDevicePropertyClockSource"; + break; + case kAudioDevicePropertyClockSources: + uma_result = PROPERTY_CLOCK_SOURCES; + DVLOG(1) << "kAudioDevicePropertyClockSources"; + break; + case kAudioDevicePropertySubMute: + uma_result = PROPERTY_SUB_MUTE; + DVLOG(1) << "kAudioDevicePropertySubMute"; + break; default: uma_result = PROPERTY_OTHER; DVLOG(1) << "Property change is ignored";
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java index 5599b459..a3afab08 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -209,20 +209,29 @@ // We blacklist popular Samsung Galaxy S4 models before Android L. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && (Build.MODEL.startsWith("GT-I9505") - || (Build.MODEL.startsWith("GT-I9500")))) { + || Build.MODEL.startsWith("GT-I9500"))) { return false; } // Samsung Galaxy S4 Mini. // Only GT-I9190 was tested with Android 4.4.2 // We blacklist it and the popular GT-I9195 for all Android versions. - if (Build.MODEL.startsWith("GT-I9190") || (Build.MODEL.startsWith("GT-I9195"))) { + if (Build.MODEL.startsWith("GT-I9190") || Build.MODEL.startsWith("GT-I9195")) { return false; } } - } else if (mime.equals("video/x-vnd.on2.vp9") - && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - return false; + // MediaTek decoders do not work properly on vp8. See http://crbug.com/446974 and + // http://crbug.com/597836. + if (getDefaultCodecName(mime, MEDIA_CODEC_DECODER).startsWith("OMX.MTK.")) return false; + } else if (mime.equals("video/x-vnd.on2.vp9")) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return false; + + // MediaTek decoders do not work properly on vp9 before Lollipop. See + // http://crbug.com/597836. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP + && getDefaultCodecName(mime, MEDIA_CODEC_DECODER).startsWith("OMX.MTK.")) { + return false; + } } else if (mime.equals("audio/opus") && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return false;
diff --git a/media/base/android/media_codec_util.cc b/media/base/android/media_codec_util.cc index 5ad3254..ce92879 100644 --- a/media/base/android/media_codec_util.cc +++ b/media/base/android/media_codec_util.cc
@@ -54,6 +54,13 @@ return ConvertJavaStringToUTF8(env, j_codec_name.obj()); } +static bool IsDecoderSupportedByDevice(const std::string& mime_type) { + DCHECK(MediaCodecUtil::IsMediaCodecAvailable()); + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime_type); + return Java_MediaCodecUtil_isDecoderSupportedForDevice(env, j_mime.obj()); +} + // static bool MediaCodecUtil::IsMediaCodecAvailable() { // MediaCodec is only available on JB and greater. @@ -120,19 +127,27 @@ if (!codec_name.size()) return true; + // MediaTek hardware vp8 is known slower than the software implementation. + // MediaTek hardware vp9 is known crashy, see http://crbug.com/446974 and + // http://crbug.com/597836. + if (base::StartsWith(codec_name, "OMX.MTK.", base::CompareCase::SENSITIVE)) { + if (mime_type == "video/x-vnd.on2.vp8") + return true; + + if (mime_type == "video/x-vnd.on2.vp9") + return base::android::BuildInfo::GetInstance()->sdk_int() < 21; + + return false; + } + // It would be nice if MediaCodecInfo externalized some notion of // HW-acceleration but it doesn't. Android Media guidance is that the // "OMX.google" prefix is always used for SW decoders, so that's what we // use. "OMX.SEC.*" codec is Samsung software implementation - report it - // as unaccelerated as well. MediaTek hardware vp8 is known slower than - // the software implementation. http://crbug.com/446974. + // as unaccelerated as well. return base::StartsWith(codec_name, "OMX.google.", base::CompareCase::SENSITIVE) || - base::StartsWith(codec_name, "OMX.SEC.", - base::CompareCase::SENSITIVE) || - (base::StartsWith(codec_name, "OMX.MTK.", - base::CompareCase::SENSITIVE) && - mime_type == "video/x-vnd.on2.vp8"); + base::StartsWith(codec_name, "OMX.SEC.", base::CompareCase::SENSITIVE); } // static @@ -163,12 +178,7 @@ // static bool MediaCodecUtil::IsVp8DecoderAvailable() { - if (!IsMediaCodecAvailable()) - return false; - - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, "vp8"); - return Java_MediaCodecUtil_isDecoderSupportedForDevice(env, j_mime.obj()); + return IsMediaCodecAvailable() && IsDecoderSupportedByDevice("vp8"); } // static @@ -178,4 +188,9 @@ return IsVp8DecoderAvailable(); } +// static +bool MediaCodecUtil::IsVp9DecoderAvailable() { + return IsMediaCodecAvailable() && IsDecoderSupportedByDevice("vp9"); +} + } // namespace media
diff --git a/media/base/android/media_codec_util.h b/media/base/android/media_codec_util.h index a6f13368..9603e38 100644 --- a/media/base/android/media_codec_util.h +++ b/media/base/android/media_codec_util.h
@@ -69,6 +69,9 @@ // Indicates if the vp8 decoder or encoder is available on this device. static bool IsVp8DecoderAvailable(); static bool IsVp8EncoderAvailable(); + + // Indicates if the vp9 decoder is available on this device. + static bool IsVp9DecoderAvailable(); }; } // namespace media
diff --git a/media/base/media.cc b/media/base/media.cc index 920b33fd..9fd89cc 100644 --- a/media/base/media.cc +++ b/media/base/media.cc
@@ -87,10 +87,6 @@ return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; } -bool PlatformHasVp9Support() { - return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; -} - bool IsUnifiedMediaPipelineEnabled() { // TODO(dalecurtis): This experiment is temporary and should be removed once // we have enough data to support the primacy of the unified media pipeline;
diff --git a/media/base/media.h b/media/base/media.h index ca5a8175..c0fd87ee 100644 --- a/media/base/media.h +++ b/media/base/media.h
@@ -28,10 +28,9 @@ MEDIA_EXPORT void EnablePlatformDecoderSupport(); MEDIA_EXPORT bool HasPlatformDecoderSupport(); -// Indicates if the platform supports Opus or VP9. Determined *ONLY* by the -// platform version, so does not guarantee that either can actually be played. +// Indicates if the platform supports Opus. Determined *ONLY* by the platform +// version, so does not guarantee that either can actually be played. MEDIA_EXPORT bool PlatformHasOpusSupport(); -MEDIA_EXPORT bool PlatformHasVp9Support(); // Returns true if the unified media pipeline is enabled; the pipeline may still // not work for all codecs if HasPlatformDecoderSupport() is false. Please see
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc index 882ccb7a..7a26254f 100644 --- a/media/base/mime_util_internal.cc +++ b/media/base/mime_util_internal.cc
@@ -195,8 +195,9 @@ platform_info_.has_platform_decoders = ArePlatformDecodersAvailable(); platform_info_.has_platform_vp8_decoder = MediaCodecUtil::IsVp8DecoderAvailable(); + platform_info_.has_platform_vp9_decoder = + MediaCodecUtil::IsVp9DecoderAvailable(); platform_info_.supports_opus = PlatformHasOpusSupport(); - platform_info_.supports_vp9 = PlatformHasVp9Support(); #endif InitializeMimeTypeMaps(); @@ -553,7 +554,7 @@ return true; // Otherwise, platform support is required. - return platform_info.supports_vp9; + return platform_info.has_platform_vp9_decoder; } }
diff --git a/media/base/mime_util_internal.h b/media/base/mime_util_internal.h index ff215e9..67396cf6 100644 --- a/media/base/mime_util_internal.h +++ b/media/base/mime_util_internal.h
@@ -48,8 +48,8 @@ bool has_platform_decoders = false; bool has_platform_vp8_decoder = false; + bool has_platform_vp9_decoder = false; bool supports_opus = false; - bool supports_vp9 = false; bool is_unified_media_pipeline_enabled = false; };
diff --git a/media/base/mime_util_unittest.cc b/media/base/mime_util_unittest.cc index 97474b76..4db5aa7c9 100644 --- a/media/base/mime_util_unittest.cc +++ b/media/base/mime_util_unittest.cc
@@ -55,8 +55,8 @@ // Stuff states to test into vectors for easy for_each() iteration. MAKE_TEST_VECTOR(has_platform_decoders); MAKE_TEST_VECTOR(has_platform_vp8_decoder); + MAKE_TEST_VECTOR(has_platform_vp9_decoder); MAKE_TEST_VECTOR(supports_opus); - MAKE_TEST_VECTOR(supports_vp9); MAKE_TEST_VECTOR(is_unified_media_pipeline_enabled); #undef MAKE_TEST_VECTOR @@ -69,18 +69,19 @@ RUN_TEST_VECTOR(has_platform_decoders) { RUN_TEST_VECTOR(has_platform_vp8_decoder) { - RUN_TEST_VECTOR(supports_opus) { - RUN_TEST_VECTOR(supports_vp9) { + RUN_TEST_VECTOR(has_platform_vp9_decoder) { + RUN_TEST_VECTOR(supports_opus) { RUN_TEST_VECTOR(is_unified_media_pipeline_enabled) { for (int codec = MimeUtil::INVALID_CODEC; codec <= MimeUtil::LAST_CODEC; ++codec) { SCOPED_TRACE(base::StringPrintf( "has_platform_decoders=%d, has_platform_vp8_decoder=%d, " "supports_opus=%d, " - "supports_vp9=%d, is_unified_media_pipeline_enabled=%d, " + "has_platform_vp9_decoder=%d, " + "is_unified_media_pipeline_enabled=%d, " "codec=%d", info.has_platform_decoders, info.has_platform_vp8_decoder, - info.supports_opus, info.supports_vp9, + info.supports_opus, info.has_platform_vp9_decoder, info.is_unified_media_pipeline_enabled, codec)); test_func(info, static_cast<MimeUtil::Codec>(codec)); } @@ -97,8 +98,8 @@ static MimeUtil::PlatformInfo VaryAllFields() { MimeUtil::PlatformInfo states_to_vary; states_to_vary.has_platform_vp8_decoder = true; + states_to_vary.has_platform_vp9_decoder = true; states_to_vary.supports_opus = true; - states_to_vary.supports_vp9 = true; states_to_vary.is_unified_media_pipeline_enabled = true; states_to_vary.has_platform_decoders = true; return states_to_vary; @@ -278,7 +279,7 @@ break; case MimeUtil::VP9: - EXPECT_EQ(info.supports_vp9, result); + EXPECT_EQ(info.has_platform_vp9_decoder, result); break; case MimeUtil::HEVC_MAIN: @@ -328,7 +329,7 @@ break; case MimeUtil::VP9: - EXPECT_EQ(info.supports_vp9, result); + EXPECT_EQ(info.has_platform_vp9_decoder, result); break; case MimeUtil::HEVC_MAIN:
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc index b5dc7177..be839bb 100644 --- a/media/filters/ffmpeg_audio_decoder.cc +++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -300,10 +300,18 @@ ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( codec_context_->channel_layout, codec_context_->channels); - if (av_frame_->sample_rate != config_.samples_per_second() || - channel_layout != config_.channel_layout() || + bool is_config_stale = + av_frame_->sample_rate != config_.samples_per_second() || channels != ChannelLayoutToChannelCount(config_.channel_layout()) || - av_frame_->format != av_sample_format_) { + av_frame_->format != av_sample_format_; + + // Only consider channel layout changes for AAC. + // TODO(tguilbert, dalecurtis): Due to http://crbug.com/600538 we need to + // allow channel layout changes for the moment. See if ffmpeg is fixable. + if (config_.codec() == kCodecAAC) + is_config_stale |= channel_layout != config_.channel_layout(); + + if (is_config_stale) { // Only allow midstream configuration changes for AAC. Sample format is // not expected to change between AAC profiles. if (config_.codec() == kCodecAAC && @@ -322,7 +330,8 @@ config_.extra_data(), config_.encryption_scheme(), config_.seek_preroll(), config_.codec_delay()); config_changed = true; - ResetTimestampState(); + if (av_frame_->sample_rate != config_.samples_per_second()) + ResetTimestampState(); } else { MEDIA_LOG(ERROR, media_log_) << "Unsupported midstream configuration change!"
diff --git a/media/filters/h264_bit_reader.cc b/media/filters/h264_bit_reader.cc index 5b009a1..145d2e19 100644 --- a/media/filters/h264_bit_reader.cc +++ b/media/filters/h264_bit_reader.cc
@@ -79,7 +79,7 @@ } *out |= (curr_byte_ >> (num_remaining_bits_in_curr_byte_ - bits_left)); - *out &= ((1 << num_bits) - 1); + *out &= ((1u << num_bits) - 1u); num_remaining_bits_in_curr_byte_ -= bits_left; return true;
diff --git a/media/filters/h264_parser.cc b/media/filters/h264_parser.cc index d751de7..d1fa685 100644 --- a/media/filters/h264_parser.cc +++ b/media/filters/h264_parser.cc
@@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "media/filters/h264_parser.h" + +#include <limits> + #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/stl_util.h" - #include "media/base/decrypt_config.h" -#include "media/filters/h264_parser.h" namespace media { @@ -318,7 +320,15 @@ return kInvalidStream; // Calculate exp-Golomb code value of size num_bits. - *val = (1 << num_bits) - 1; + // Special case for |num_bits| == 31 to avoid integer overflow. The only + // valid representation as an int is 2^31 - 1, so the remaining bits must + // be 0 or else the number is too large. + *val = (1u << num_bits) - 1u; + + if (num_bits == 31) { + READ_BITS_OR_RETURN(num_bits, &rest); + return (rest == 0) ? kOk : kInvalidStream; + } if (num_bits > 0) { READ_BITS_OR_RETURN(num_bits, &rest);
diff --git a/media/filters/stream_parser_factory.cc b/media/filters/stream_parser_factory.cc index 02470987..693e6518 100644 --- a/media/filters/stream_parser_factory.cc +++ b/media/filters/stream_parser_factory.cc
@@ -348,7 +348,7 @@ return false; } if (codec_info->tag == CodecInfo::HISTOGRAM_VP9 && - !media::PlatformHasVp9Support() && + !media::MediaCodecUtil::IsVp9DecoderAvailable() && !media::IsUnifiedMediaPipelineEnabled()) { return false; }
diff --git a/media/muxers/webm_muxer.cc b/media/muxers/webm_muxer.cc index 729f348..5cbaa79 100644 --- a/media/muxers/webm_muxer.cc +++ b/media/muxers/webm_muxer.cc
@@ -117,8 +117,8 @@ // http://www.matroska.org/technical/specs/index.html#Tracks AddVideoTrack(video_frame->visible_rect().size(), GetFrameRate(video_frame)); - if (first_frame_timestamp_.is_null()) - first_frame_timestamp_ = timestamp; + if (first_frame_timestamp_video_.is_null()) + first_frame_timestamp_video_ = timestamp; } // TODO(ajose): Support multiple tracks: http://crbug.com/528523 @@ -134,14 +134,15 @@ // Dump all saved encoded video frames if any. while (!encoded_frames_queue_.empty()) { - AddFrame(std::move(encoded_frames_queue_.front()->data), video_track_index_, - encoded_frames_queue_.front()->timestamp, - encoded_frames_queue_.front()->is_keyframe); + AddFrame( + std::move(encoded_frames_queue_.front()->data), video_track_index_, + encoded_frames_queue_.front()->timestamp - first_frame_timestamp_video_, + encoded_frames_queue_.front()->is_keyframe); encoded_frames_queue_.pop_front(); } - AddFrame(std::move(encoded_data), video_track_index_, timestamp, - is_key_frame); + AddFrame(std::move(encoded_data), video_track_index_, + timestamp - first_frame_timestamp_video_, is_key_frame); } void WebmMuxer::OnEncodedAudio(const media::AudioParameters& params, @@ -152,8 +153,8 @@ if (!audio_track_index_) { AddAudioTrack(params); - if (first_frame_timestamp_.is_null()) - first_frame_timestamp_ = timestamp; + if (first_frame_timestamp_audio_.is_null()) + first_frame_timestamp_audio_ = timestamp; } // TODO(ajose): Don't drop audio data: http://crbug.com/547948 @@ -165,13 +166,15 @@ // Dump all saved encoded video frames if any. while (!encoded_frames_queue_.empty()) { - AddFrame(std::move(encoded_frames_queue_.front()->data), video_track_index_, - encoded_frames_queue_.front()->timestamp, - encoded_frames_queue_.front()->is_keyframe); + AddFrame( + std::move(encoded_frames_queue_.front()->data), video_track_index_, + encoded_frames_queue_.front()->timestamp - first_frame_timestamp_video_, + encoded_frames_queue_.front()->is_keyframe); encoded_frames_queue_.pop_front(); } - AddFrame(std::move(encoded_data), audio_track_index_, timestamp, + AddFrame(std::move(encoded_data), audio_track_index_, + timestamp - first_frame_timestamp_audio_, true /* is_key_frame -- always true for audio */); } @@ -280,15 +283,14 @@ void WebmMuxer::AddFrame(scoped_ptr<std::string> encoded_data, uint8_t track_index, - base::TimeTicks timestamp, + base::TimeDelta timestamp, bool is_key_frame) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(!has_video_ || video_track_index_); DCHECK(!has_audio_ || audio_track_index_); most_recent_timestamp_ = - std::max(most_recent_timestamp_, - timestamp - total_time_in_pause_ - first_frame_timestamp_); + std::max(most_recent_timestamp_, timestamp - total_time_in_pause_); segment_.AddFrame(reinterpret_cast<const uint8_t*>(encoded_data->data()), encoded_data->size(), track_index,
diff --git a/media/muxers/webm_muxer.h b/media/muxers/webm_muxer.h index ecec31ce..1dd6c65 100644 --- a/media/muxers/webm_muxer.h +++ b/media/muxers/webm_muxer.h
@@ -90,7 +90,7 @@ // Helper to simplify saving frames. void AddFrame(scoped_ptr<std::string> encoded_data, uint8_t track_index, - base::TimeTicks timestamp, + base::TimeDelta timestamp, bool is_key_frame); // Used to DCHECK that we are called on the correct thread. @@ -105,7 +105,8 @@ uint8_t audio_track_index_; // Origin of times for frame timestamps. - base::TimeTicks first_frame_timestamp_; + base::TimeTicks first_frame_timestamp_video_; + base::TimeTicks first_frame_timestamp_audio_; base::TimeDelta most_recent_timestamp_; // Variables to measure and accumulate, respectively, the time in pause state.
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc index 6689e36c..0912eeb 100644 --- a/media/renderers/audio_renderer_impl.cc +++ b/media/renderers/audio_renderer_impl.cc
@@ -535,6 +535,26 @@ } } } else { + // TODO(chcunningham, tguilbert): Figure out if we want to support implicit + // config changes during src=. Doing so requires resampling each individual + // stream which is inefficient when there are many tags in a page. + // + // Check if the buffer we received matches the expected configuration. + // Note: We explicitly do not check channel layout here to avoid breaking + // weird behavior with multichannel wav files: http://crbug.com/600538. + if (!buffer->end_of_stream() && + (buffer->sample_rate() != audio_parameters_.sample_rate() || + buffer->channel_count() != audio_parameters_.channels())) { + MEDIA_LOG(ERROR, media_log_) + << "Unsupported midstream configuration change!" + << " Sample Rate: " << buffer->sample_rate() << " vs " + << audio_parameters_.sample_rate() + << ", Channels: " << buffer->channel_count() << " vs " + << audio_parameters_.channels(); + HandleAbortedReadOrDecodeError(PIPELINE_ERROR_DECODE); + return; + } + if (!splicer_->AddInput(buffer)) { HandleAbortedReadOrDecodeError(AUDIO_RENDERER_ERROR_SPLICE_FAILED); return;
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn index 62bb452..218ba914 100644 --- a/mojo/BUILD.gn +++ b/mojo/BUILD.gn
@@ -41,7 +41,6 @@ "//mojo/edk/test:mojo_public_bindings_unittests", "//mojo/edk/test:mojo_public_system_perftests", "//mojo/edk/test:mojo_public_system_unittests", - "//mojo/services/network:unittests", "//mojo/shell/public/cpp/tests:mojo_public_application_unittests", "//mojo/shell/runner/host:mojo_runner_host_unittests", "//mojo/shell/tests",
diff --git a/mojo/converters/network/BUILD.gn b/mojo/converters/network/BUILD.gn deleted file mode 100644 index 17308b07..0000000 --- a/mojo/converters/network/BUILD.gn +++ /dev/null
@@ -1,13 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -source_set("network") { - public_deps = [ - "//mojo/services/network/public/interfaces", - ] - sources = [ - "network_type_converters.cc", - "network_type_converters.h", - ] -}
diff --git a/mojo/converters/network/network_type_converters.cc b/mojo/converters/network/network_type_converters.cc deleted file mode 100644 index 1453c500..0000000 --- a/mojo/converters/network/network_type_converters.cc +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/converters/network/network_type_converters.h" - -namespace mojo { - -// static -URLRequestPtr TypeConverter<URLRequestPtr, std::string>::Convert( - const std::string& input) { - URLRequestPtr result(URLRequest::New()); - result->url = input; - return result; -} - -} // namespace mojo
diff --git a/mojo/converters/network/network_type_converters.h b/mojo/converters/network/network_type_converters.h deleted file mode 100644 index 4092cd7..0000000 --- a/mojo/converters/network/network_type_converters.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_CONVERTERS_NETWORK_NETWORK_TYPE_CONVERTERS_H_ -#define MOJO_CONVERTERS_NETWORK_NETWORK_TYPE_CONVERTERS_H_ - -#include <string> - -#include "mojo/services/network/public/interfaces/url_loader.mojom.h" - -namespace mojo { - -template <> -struct TypeConverter<URLRequestPtr, std::string> { - static URLRequestPtr Convert(const std::string& input); -}; - -} // namespace mojo - -#endif // MOJO_CONVERTERS_NETWORK_NETWORK_TYPE_CONVERTERS_H_
diff --git a/mojo/mojo_base.gyp b/mojo/mojo_base.gyp index 009dda1..b13343b6 100644 --- a/mojo/mojo_base.gyp +++ b/mojo/mojo_base.gyp
@@ -177,7 +177,6 @@ '../base/base.gyp:base_i18n', 'mojo_application_bindings', 'mojo_public.gyp:mojo_message_pump_lib', - 'mojo_services.gyp:network_type_converters', ], }, { @@ -187,10 +186,6 @@ 'dependencies': [ 'mojo_application_bindings_mojom', 'mojo_public.gyp:mojo_cpp_bindings', - 'mojo_services.gyp:network_service_bindings_lib', - ], - 'export_dependent_settings': [ - 'mojo_services.gyp:network_service_bindings_lib', ], }, {
diff --git a/mojo/mojo_services.gyp b/mojo/mojo_services.gyp index a42243187..2ac03d0b 100644 --- a/mojo/mojo_services.gyp +++ b/mojo/mojo_services.gyp
@@ -5,63 +5,6 @@ { 'targets': [ { - 'target_name': 'network_service_bindings_mojom', - 'type': 'none', - 'variables': { - 'mojom_files': [ - 'services/network/public/interfaces/cookie_store.mojom', - 'services/network/public/interfaces/http_connection.mojom', - 'services/network/public/interfaces/http_message.mojom', - 'services/network/public/interfaces/http_server.mojom', - 'services/network/public/interfaces/net_address.mojom', - 'services/network/public/interfaces/network_error.mojom', - 'services/network/public/interfaces/network_service.mojom', - 'services/network/public/interfaces/tcp_bound_socket.mojom', - 'services/network/public/interfaces/tcp_connected_socket.mojom', - 'services/network/public/interfaces/tcp_server_socket.mojom', - 'services/network/public/interfaces/udp_socket.mojom', - 'services/network/public/interfaces/url_loader.mojom', - 'services/network/public/interfaces/url_loader_factory.mojom', - 'services/network/public/interfaces/web_socket.mojom', - 'services/network/public/interfaces/web_socket_factory.mojom', - ], - 'mojom_include_path': '<(DEPTH)/mojo/services', - }, - 'includes': [ - 'mojom_bindings_generator_explicit.gypi', - ], - }, - { - # GN version: //mojo/services/network/public/interfaces - 'target_name': 'network_service_bindings_lib', - 'type': 'static_library', - 'dependencies': [ - 'network_service_bindings_mojom', - ], - }, - { - # Target used to depend only on the bindings generation action, not on any - # outputs. - 'target_name': 'network_service_bindings_generation', - 'type': 'none', - 'hard_dependency': 1, - 'dependencies': [ - 'network_service_bindings_mojom', - ], - }, - { - # GN version: //mojo/converters/network - 'target_name': 'network_type_converters', - 'type': 'static_library', - 'dependencies': [ - 'network_service_bindings_lib', - ], - 'sources': [ - 'converters/network/network_type_converters.cc', - 'converters/network/network_type_converters.h', - ], - }, - { 'target_name': 'tracing_service_bindings_mojom', 'type': 'none', 'variables': {
diff --git a/mojo/mojo_shell.gyp b/mojo/mojo_shell.gyp index 25e6bce2..1decb57f 100644 --- a/mojo/mojo_shell.gyp +++ b/mojo/mojo_shell.gyp
@@ -147,5 +147,18 @@ ], }], ], + }, { + # GN version: //mojo/services/catalog:manifest + 'target_name': 'mojo_catalog_manifest', + 'type': 'none', + 'variables': { + 'application_type': 'mojo', + 'application_name': 'catalog', + 'source_manifest': '<(DEPTH)/mojo/services/catalog/manifest.json', + }, + 'includes': [ + '../mojo/public/mojo_application_manifest.gypi', + ], + 'hard_dependency': 1, }], }
diff --git a/mojo/public/mojo_application_manifest.gni b/mojo/public/mojo_application_manifest.gni index 589e30e..b66626b8 100644 --- a/mojo/public/mojo_application_manifest.gni +++ b/mojo/public/mojo_application_manifest.gni
@@ -12,12 +12,20 @@ # The manifest file template for this application, must be valid JSON with # a valid 'url' key matching application_name. # +# base_manifest (optional) +# A manifest file template to use as a base for |source|. Any properties +# defined in |source| will overwrite or be merged with properties defined +# in |base_manifest|. +# # application_name # The host portion of the mojo: URL of the application. The script # validates that the value of this parameter matches the host name portion # of the 'url' property set in the manifest and throws a ValueError if # they do not. # +# base_deps (optional) +# Dependencies required to generate |base_manifest| if applicable. +# # deps (optional) # An array of dependent instances of this template. This template enforces # that dependencies can only be instances of this template. @@ -86,6 +94,11 @@ "--output=$rebase_output", ] + if (defined(invoker.base_manifest)) { + rebase_base = rebase_path(invoker.base_manifest, root_build_dir) + args += [ "--base-manifest=$rebase_base" ] + } + if (defined(invoker.packaged_applications)) { foreach(application_name, invoker.packaged_applications) { input = "$root_out_dir/$mojo_application_subdir/$application_name/manifest.json" @@ -97,6 +110,9 @@ if (defined(invoker.deps)) { deps += invoker.deps } + if (defined(invoker.base_deps)) { + deps += invoker.base_deps + } } all_deps = []
diff --git a/mojo/public/mojo_application_manifest.gypi b/mojo/public/mojo_application_manifest.gypi index ddb202d2..bda8640 100644 --- a/mojo/public/mojo_application_manifest.gypi +++ b/mojo/public/mojo_application_manifest.gypi
@@ -7,9 +7,11 @@ 'variables': { 'application_name%': '<(application_name)', 'application_type%': '<(application_type)', + 'base_manifest%': 'none', }, 'application_type%': '<(application_type)', 'application_name%': '<(application_name)', + 'base_manifest%': '<(base_manifest)', 'manifest_collator_script%': '<(DEPTH)/mojo/public/tools/manifest/manifest_collator.py', 'source_manifest%': '<(source_manifest)', @@ -19,6 +21,11 @@ }, { 'output_manifest%': '<(PRODUCT_DIR)/<(application_name)_manifest.json', }], + ['base_manifest!="none"', { + 'extra_args%': [ '--base-manifest=<(base_manifest)', ], + }, { + 'extra_args%': [], + }] ], }, 'actions': [{ @@ -36,6 +43,7 @@ '--application-name', '<(application_name)', '--parent=<(source_manifest)', '--output=<(output_manifest)', + '<@(extra_args)', ], }], }
diff --git a/mojo/public/tools/manifest/manifest_collator.py b/mojo/public/tools/manifest/manifest_collator.py index e05763b..fa95e37 100755 --- a/mojo/public/tools/manifest/manifest_collator.py +++ b/mojo/public/tools/manifest/manifest_collator.py
@@ -11,6 +11,7 @@ import sys import urlparse + def ParseJSONFile(filename): with open(filename) as json_file: try: @@ -19,18 +20,46 @@ print "%s is not a valid JSON document" % filename return None + +def MergeDicts(left, right): + for k, v in right.iteritems(): + if k not in left: + left[k] = v + else: + if isinstance(v, dict): + assert isinstance(left[k], dict) + MergeDicts(left[k], v) + elif isinstance(v, list): + assert isinstance(left[k], list) + left[k].extend(v) + else: + raise "Refusing to merge conflicting non-collection values." + return left + + +def MergeBaseManifest(parent, base): + MergeDicts(parent["capabilities"], base["capabilities"]) + + def main(): parser = argparse.ArgumentParser( description="Collate Mojo application manifests.") parser.add_argument("--parent") parser.add_argument("--output") parser.add_argument("--application-name") + parser.add_argument("--base-manifest", default=None) args, children = parser.parse_known_args() parent = ParseJSONFile(args.parent) if parent == None: return 1 + if args.base_manifest: + base = ParseJSONFile(args.base_manifest) + if base == None: + return 1 + MergeBaseManifest(parent, base) + app_path = parent['name'].split(':')[1] if app_path.startswith('//'): raise ValueError("Application name path component '%s' must not start " \
diff --git a/mojo/services/BUILD.gn b/mojo/services/BUILD.gn index 969d793..aaf9aab 100644 --- a/mojo/services/BUILD.gn +++ b/mojo/services/BUILD.gn
@@ -9,7 +9,6 @@ testonly = true deps = [ "//mojo/services/catalog", - "//mojo/services/network", "//mojo/services/tracing", ] }
diff --git a/mojo/services/catalog/BUILD.gn b/mojo/services/catalog/BUILD.gn index 19369ba..fa28ec62 100644 --- a/mojo/services/catalog/BUILD.gn +++ b/mojo/services/catalog/BUILD.gn
@@ -21,6 +21,7 @@ "entry.h", "factory.cc", "factory.h", + "manifest_provider.h", "store.cc", "store.h", "types.h",
diff --git a/mojo/services/catalog/catalog.cc b/mojo/services/catalog/catalog.cc index 1d75a301..c031022 100644 --- a/mojo/services/catalog/catalog.cc +++ b/mojo/services/catalog/catalog.cc
@@ -6,10 +6,13 @@ #include "base/bind.h" #include "base/json/json_file_value_serializer.h" +#include "base/json/json_reader.h" #include "base/strings/string_split.h" #include "base/task_runner_util.h" +#include "base/thread_task_runner_handle.h" #include "mojo/common/url_type_converters.h" #include "mojo/services/catalog/entry.h" +#include "mojo/services/catalog/manifest_provider.h" #include "mojo/services/catalog/store.h" #include "mojo/shell/public/cpp/names.h" #include "url/gurl.h" @@ -52,6 +55,27 @@ return base::FilePath(); } +scoped_ptr<ReadManifestResult> ProcessManifest( + const base::FilePath& user_package_dir, + const base::FilePath& system_package_dir, + const std::string& name, + scoped_ptr<base::Value> manifest_root) { + scoped_ptr<Entry> entry(new Entry(name)); + if (manifest_root) { + const base::DictionaryValue* dictionary = nullptr; + CHECK(manifest_root->GetAsDictionary(&dictionary)); + entry = Entry::Deserialize(*dictionary); + } + entry->set_path(GetPackagePath(system_package_dir, name)); + + scoped_ptr<ReadManifestResult> result(new ReadManifestResult); + // NOTE: This TypeConverter must run on a thread which allows IO. + result->resolve_result = mojo::shell::mojom::ResolveResult::From(*entry); + result->catalog_entry = std::move(entry); + result->package_dir = system_package_dir; + return result; +} + scoped_ptr<ReadManifestResult> ReadManifest( const base::FilePath& user_package_dir, const base::FilePath& system_package_dir, @@ -60,12 +84,11 @@ JSONFileValueDeserializer deserializer(manifest_path); int error = 0; std::string message; + // TODO(beng): probably want to do more detailed error checking. This should // be done when figuring out if to unblock connection completion. - scoped_ptr<ReadManifestResult> result(new ReadManifestResult); - result->manifest_root = deserializer.Deserialize(&error, &message); - result->package_dir = system_package_dir; - return result; + return ProcessManifest(user_package_dir, system_package_dir, name, + deserializer.Deserialize(&error, &message)); } void AddEntryToMap(const Entry& entry, @@ -85,8 +108,10 @@ Catalog::Catalog(scoped_ptr<Store> store, base::TaskRunner* file_task_runner, - EntryCache* system_catalog) - : store_(std::move(store)), + EntryCache* system_catalog, + ManifestProvider* manifest_provider) + : manifest_provider_(manifest_provider), + store_(std::move(store)), file_task_runner_(file_task_runner), system_catalog_(system_catalog), weak_factory_(this) { @@ -112,11 +137,6 @@ //////////////////////////////////////////////////////////////////////////////// // Catalog, mojom::Resolver: -void Catalog::ResolveResponse(mojo::URLResponsePtr response, - const ResolveResponseCallback& callback) { - // TODO(beng): implement. -} - void Catalog::ResolveInterfaces(mojo::Array<mojo::String> interfaces, const ResolveInterfacesCallback& callback) { // TODO(beng): implement. @@ -155,12 +175,27 @@ callback.Run(mojo::shell::mojom::ResolveResult::From(*entry->second)); return; } - base::PostTaskAndReplyWithResult( - file_task_runner_, FROM_HERE, - base::Bind(&ReadManifest, base::FilePath(), system_package_dir_, - mojo_name), - base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), - mojo_name, callback)); + + std::string manifest_contents; + if (manifest_provider_ && + manifest_provider_->GetApplicationManifest(mojo_name.To<std::string>(), + &manifest_contents)) { + scoped_ptr<base::Value> manifest_root = + base::JSONReader::Read(manifest_contents); + base::PostTaskAndReplyWithResult( + file_task_runner_, FROM_HERE, + base::Bind(&ProcessManifest, user_package_dir_, system_package_dir_, + mojo_name, base::Passed(&manifest_root)), + base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), + mojo_name, callback)); + } else { + base::PostTaskAndReplyWithResult( + file_task_runner_, FROM_HERE, + base::Bind(&ReadManifest, user_package_dir_, system_package_dir_, + mojo_name), + base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), + mojo_name, callback)); + } } //////////////////////////////////////////////////////////////////////////////// @@ -224,18 +259,11 @@ const std::string& name, const ResolveMojoNameCallback& callback, scoped_ptr<ReadManifestResult> result) { - scoped_ptr<Entry> entry(new Entry(name)); - if (result->manifest_root) { - const base::DictionaryValue* dictionary = nullptr; - CHECK(result->manifest_root->GetAsDictionary(&dictionary)); - entry = Entry::Deserialize(*dictionary); - } - entry->set_path(GetPackagePath(result->package_dir, name)); - - callback.Run(mojo::shell::mojom::ResolveResult::From(*entry)); + callback.Run(std::move(result ->resolve_result)); if (catalog) { catalog->AddEntryToCatalog( - std::move(entry), result->package_dir == catalog->system_package_dir_); + std::move(result->catalog_entry), + result->package_dir == catalog->system_package_dir_); } }
diff --git a/mojo/services/catalog/catalog.h b/mojo/services/catalog/catalog.h index d2dc7bd9..6e46120a 100644 --- a/mojo/services/catalog/catalog.h +++ b/mojo/services/catalog/catalog.h
@@ -20,12 +20,14 @@ namespace catalog { +class ManifestProvider; class Store; struct ReadManifestResult { ReadManifestResult(); ~ReadManifestResult(); - scoped_ptr<base::Value> manifest_root; + mojo::shell::mojom::ResolveResultPtr resolve_result; + scoped_ptr<Entry> catalog_entry; base::FilePath package_dir; }; @@ -33,9 +35,11 @@ public mojo::shell::mojom::ShellResolver, public mojom::Catalog { public: + // |manifest_provider| may be null. Catalog(scoped_ptr<Store> store, base::TaskRunner* file_task_runner, - EntryCache* system_catalog); + EntryCache* system_catalog, + ManifestProvider* manifest_provider); ~Catalog() override; void BindResolver(mojom::ResolverRequest request); @@ -47,9 +51,6 @@ std::map<std::string, std::pair<std::string, std::string>>; // mojom::Resolver: - void ResolveResponse( - mojo::URLResponsePtr response, - const ResolveResponseCallback& callback) override; void ResolveInterfaces(mojo::Array<mojo::String> interfaces, const ResolveInterfacesCallback& callback) override; void ResolveMIMEType(const mojo::String& mime_type, @@ -81,6 +82,8 @@ // via callback. void AddEntryToCatalog(scoped_ptr<Entry> entry, bool is_system_catalog); + ManifestProvider* const manifest_provider_; + // Directory that contains packages and executables visible to all users. base::FilePath system_package_dir_; // Directory that contains packages visible to this Catalog instance's user. @@ -90,7 +93,7 @@ scoped_ptr<Store> store_; // Task runner for performing file operations. - base::TaskRunner* file_task_runner_; + base::TaskRunner* const file_task_runner_; mojo::BindingSet<mojom::Resolver> resolver_bindings_; mojo::BindingSet<mojo::shell::mojom::ShellResolver> shell_resolver_bindings_;
diff --git a/mojo/services/catalog/factory.cc b/mojo/services/catalog/factory.cc index 09b1806..89972ea 100644 --- a/mojo/services/catalog/factory.cc +++ b/mojo/services/catalog/factory.cc
@@ -11,13 +11,17 @@ namespace catalog { -Factory::Factory(base::TaskRunner* file_task_runner, scoped_ptr<Store> store) +Factory::Factory(base::TaskRunner* file_task_runner, + scoped_ptr<Store> store, + ManifestProvider* manifest_provider) : file_task_runner_(file_task_runner), store_(std::move(store)), + manifest_provider_(manifest_provider), weak_factory_(this) { mojo::shell::mojom::ShellClientRequest request = GetProxy(&shell_client_); shell_connection_.reset(new mojo::ShellConnection(this, std::move(request))); } + Factory::~Factory() {} mojo::shell::mojom::ShellClientPtr Factory::TakeShellClient() { @@ -58,8 +62,8 @@ return it->second.get(); // TODO(beng): There needs to be a way to load the store from different users. - Catalog* instance = - new Catalog(std::move(store_), file_task_runner_, &system_catalog_); + Catalog* instance = new Catalog(std::move(store_), file_task_runner_, + &system_catalog_, manifest_provider_); catalogs_[user_id] = make_scoped_ptr(instance); return instance; }
diff --git a/mojo/services/catalog/factory.h b/mojo/services/catalog/factory.h index 758d9da..a21200b 100644 --- a/mojo/services/catalog/factory.h +++ b/mojo/services/catalog/factory.h
@@ -30,6 +30,7 @@ namespace catalog { class Catalog; +class ManifestProvider; class Store; // Creates and owns an instance of the catalog. Exposes a ShellClientPtr that @@ -40,7 +41,10 @@ public mojo::InterfaceFactory<mojom::Resolver>, public mojo::InterfaceFactory<mojo::shell::mojom::ShellResolver> { public: - Factory(base::TaskRunner* file_task_runner, scoped_ptr<Store> store); + // |manifest_provider| may be null. + Factory(base::TaskRunner* file_task_runner, + scoped_ptr<Store> store, + ManifestProvider* manifest_provider); ~Factory() override; mojo::shell::mojom::ShellClientPtr TakeShellClient(); @@ -63,8 +67,9 @@ Catalog* GetCatalogForUserId(const std::string& user_id); - base::TaskRunner* file_task_runner_; + base::TaskRunner* const file_task_runner_; scoped_ptr<Store> store_; + ManifestProvider* const manifest_provider_; mojo::shell::mojom::ShellClientPtr shell_client_; scoped_ptr<mojo::ShellConnection> shell_connection_;
diff --git a/mojo/services/catalog/manifest_provider.h b/mojo/services/catalog/manifest_provider.h new file mode 100644 index 0000000..f3cf101 --- /dev/null +++ b/mojo/services/catalog/manifest_provider.h
@@ -0,0 +1,29 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MOJO_SERVICES_CATALOG_MANIFEST_PROVIDER_H_ +#define MOJO_SERVICES_CATALOG_MANIFEST_PROVIDER_H_ + +#include <string> + +#include "base/strings/string_piece.h" + +namespace catalog { + +// An interface which can be implemented by a catalog embedder to override +// manifest fetching behavior. +class ManifestProvider { + public: + virtual ~ManifestProvider() {} + + // Retrieves the raw contents of the manifest for application named |name|. + // Returns true if |name| is known and |*manifest_contents| is populated. + // returns false otherwise. + virtual bool GetApplicationManifest(const base::StringPiece& name, + std::string* manifest_contents) = 0; +}; + +} // namespace catalog + +#endif // MOJO_SERVICES_CATALOG_MANIFEST_PROVIDER_H_
diff --git a/mojo/services/catalog/public/interfaces/BUILD.gn b/mojo/services/catalog/public/interfaces/BUILD.gn index c775ebe..068a2fe0 100644 --- a/mojo/services/catalog/public/interfaces/BUILD.gn +++ b/mojo/services/catalog/public/interfaces/BUILD.gn
@@ -13,7 +13,6 @@ import_dirs = [ "//mojo/services" ] deps = [ - "//mojo/services/network/public/interfaces", "//mojo/shell/public/interfaces", ] }
diff --git a/mojo/services/catalog/public/interfaces/resolver.mojom b/mojo/services/catalog/public/interfaces/resolver.mojom index 1f370fa..0faf7e1 100644 --- a/mojo/services/catalog/public/interfaces/resolver.mojom +++ b/mojo/services/catalog/public/interfaces/resolver.mojom
@@ -4,18 +4,9 @@ module catalog.mojom; -import "network/public/interfaces/url_loader.mojom"; - // Resolves various things to Mojo names that can be passed to mojo::Shell's // ConnectToApplication(). interface Resolver { - // Returns the mojo: name of the service that can consume the content - // contained in |response|. The implementation takes the response and may read - // a small portion of it to make this determination, before passing it back - // via the supplied response callback. - ResolveResponse(mojo.URLResponse response) => - (string resolved_mojo_name, mojo.URLResponse response); - // Returns the mojo: name of the service that exports to the caller every // interface in |interfaces|. ResolveInterfaces(array<string> interfaces) => (string resolved_mojo_name);
diff --git a/mojo/services/network/BUILD.gn b/mojo/services/network/BUILD.gn deleted file mode 100644 index 7d54a96..0000000 --- a/mojo/services/network/BUILD.gn +++ /dev/null
@@ -1,170 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//mojo/public/mojo_application.gni") -import("//mojo/public/mojo_application_manifest.gni") -import("//testing/test.gni") - -if (is_android) { - import("//build/config/android/rules.gni") - - java_library_path = "$target_out_dir/java_library.dex.jar" - - mojo_android_application("network") { - output_name = "network_service" - input_so = "$root_shlib_dir/${shlib_prefix}network_service$shlib_extension" - input_dex_jar = java_library_path - deps = [ - ":java_library", - ":native_library", - ] - } - - shared_library("native_library") { - output_name = "network_service" - - sources = [ - "android_hooks.cc", - ] - - deps = [ - ":sources", - "//base", - "//build/config/sanitizers:deps", - "//net", - ] - } - - android_standalone_library("java_library") { - dex_path = java_library_path - - deps = [ - "//net/android:net_java", - ] - } -} else { - mojo_native_application("network") { - output_name = "network_service" - - deps = [ - ":sources", - ] - } -} - -source_set("lib") { - sources = [ - "cookie_store_impl.cc", - "cookie_store_impl.h", - "http_connection_impl.cc", - "http_connection_impl.h", - "http_server_impl.cc", - "http_server_impl.h", - "net_adapters.cc", - "net_adapters.h", - "net_address_type_converters.cc", - "net_address_type_converters.h", - "network_context.cc", - "network_context.h", - "network_service_delegate.cc", - "network_service_delegate.h", - "network_service_delegate_observer.h", - "network_service_impl.cc", - "network_service_impl.h", - "tcp_bound_socket_impl.cc", - "tcp_bound_socket_impl.h", - "tcp_connected_socket_impl.cc", - "tcp_connected_socket_impl.h", - "tcp_server_socket_impl.cc", - "tcp_server_socket_impl.h", - "udp_socket_impl.cc", - "udp_socket_impl.h", - "url_loader_factory_impl.cc", - "url_loader_factory_impl.h", - "url_loader_impl.cc", - "url_loader_impl.h", - "web_socket_factory_impl.cc", - "web_socket_factory_impl.h", - "web_socket_impl.cc", - "web_socket_impl.h", - ] - - deps = [ - "//base", - "//mojo/common:common_base", - "//mojo/common:url_type_converters", - "//mojo/message_pump", - "//mojo/public/cpp/system:system", - "//mojo/services/network/public/cpp", - "//mojo/services/network/public/interfaces", - "//mojo/services/tracing/public/cpp", - "//mojo/shell/public/cpp", - "//net", - "//net:extras", - "//net:http_server", - "//url", - ] -} - -source_set("sources") { - visibility = [ ":*" ] - - sources = [ - "main.cc", - ] - - deps = [ - ":lib", - "//base", - "//mojo/public/c/system:for_shared_library", - "//mojo/public/cpp/bindings:bindings", - "//mojo/services/network/public/cpp", - "//mojo/services/network/public/interfaces", - "//mojo/shell/public/cpp", - ] -} - -group("network_service_unittests") { - testonly = true - deps = [ - ":unittests", - ] -} - -test("unittests") { - output_name = "network_service_unittests" - - sources = [ - "http_server_unittest.cc", - "udp_socket_unittest.cc", - "url_loader_impl_unittest.cc", - ] - - deps = [ - ":lib", - ":network", - "//base", - "//mojo/common:common_base", - "//mojo/message_pump", - "//mojo/public/cpp/bindings:callback", - "//mojo/services/network/public/cpp", - "//mojo/services/network/public/interfaces", - "//mojo/shell/public/cpp:shell_test_support", - "//mojo/shell/public/cpp:sources", - "//mojo/shell/public/cpp/test:run_all_shelltests", - "//net", - "//net:test_support", - "//testing/gtest", - ] - - data_deps = [ - ":test_manifest", - ] -} - -mojo_application_manifest("test_manifest") { - type = "exe" - application_name = "network_service_unittests" - source = "test_manifest.json" -}
diff --git a/mojo/services/network/DEPS b/mojo/services/network/DEPS deleted file mode 100644 index d7b3016..0000000 --- a/mojo/services/network/DEPS +++ /dev/null
@@ -1,11 +0,0 @@ -include_rules = [ - "+base", - "+components/filesystem/public/interfaces", - "+mojo/shell", - "+mojo/common", - "+mojo/message_pump", - "+mojo/services", - "+mojo/util", - "+net", - "+sql", -]
diff --git a/mojo/services/network/android_hooks.cc b/mojo/services/network/android_hooks.cc deleted file mode 100644 index cb06741..0000000 --- a/mojo/services/network/android_hooks.cc +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <vector> - -#include "base/android/base_jni_onload.h" -#include "base/android/context_utils.h" -#include "base/android/jni_android.h" -#include "base/android/library_loader/library_loader_hooks.h" -#include "base/bind.h" -#include "net/android/net_jni_registrar.h" - -namespace { -bool RegisterJNI(JNIEnv* env) { - return net::android::RegisterJni(env); -} - -bool Init() { - return true; -} -} // namespace - - -// This is called by the VM when the shared library is first loaded. -JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { - std::vector<base::android::RegisterCallback> register_callbacks; - register_callbacks.push_back(base::Bind(&RegisterJNI)); - - std::vector<base::android::InitCallback> init_callbacks; - init_callbacks.push_back(base::Bind(&Init)); - - if (!base::android::OnJNIOnLoadRegisterJNI(vm, register_callbacks) || - !base::android::OnJNIOnLoadInit(init_callbacks)) { - return -1; - } - - // There cannot be two AtExitManagers at the same time. Remove the one from - // LibraryLoader as ApplicationRunner also uses one. - base::android::LibraryLoaderExitHook(); - - return JNI_VERSION_1_4; -} - -extern "C" JNI_EXPORT void InitApplicationContext( - const base::android::JavaRef<jobject>& context) { - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::InitApplicationContext(env, context); -}
diff --git a/mojo/services/network/cookie_store_impl.cc b/mojo/services/network/cookie_store_impl.cc deleted file mode 100644 index ebd0c92..0000000 --- a/mojo/services/network/cookie_store_impl.cc +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/cookie_store_impl.h" - -#include <utility> - -#include "mojo/common/url_type_converters.h" -#include "mojo/services/network/network_context.h" -#include "net/cookies/cookie_store.h" -#include "net/url_request/url_request_context.h" - -namespace mojo { -namespace { - -void AdaptGetCookiesCallback(const Callback<void(String)>& callback, - const std::string& cookies) { - callback.Run(cookies); -} - -void AdaptSetCookieCallback(const Callback<void(bool)>& callback, - bool success) { - callback.Run(success); -} - -} // namespace - -CookieStoreImpl::CookieStoreImpl(NetworkContext* context, - const GURL& origin, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<CookieStore> request) - : context_(context), - origin_(origin), - app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -CookieStoreImpl::~CookieStoreImpl() { -} - -void CookieStoreImpl::Get(const String& url, - const Callback<void(String)>& callback) { - // TODO(darin): Perform origin restriction. - net::CookieStore* store = context_->url_request_context()->cookie_store(); - if (!store) { - callback.Run(String()); - return; - } - store->GetCookiesWithOptionsAsync( - url.To<GURL>(), - net::CookieOptions(), - base::Bind(&AdaptGetCookiesCallback, callback)); -} - -void CookieStoreImpl::Set(const String& url, - const String& cookie, - const Callback<void(bool)>& callback) { - // TODO(darin): Perform origin restriction. - net::CookieStore* store = context_->url_request_context()->cookie_store(); - if (!store) { - callback.Run(false); - return; - } - store->SetCookieWithOptionsAsync( - url.To<GURL>(), - cookie, - net::CookieOptions(), - base::Bind(&AdaptSetCookieCallback, callback)); -} - -} // namespace mojo
diff --git a/mojo/services/network/cookie_store_impl.h b/mojo/services/network/cookie_store_impl.h deleted file mode 100644 index 224490c..0000000 --- a/mojo/services/network/cookie_store_impl.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_COOKIE_STORE_IMPL_H_ -#define MOJO_SERVICES_NETWORK_COOKIE_STORE_IMPL_H_ - -#include "base/macros.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/cookie_store.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "url/gurl.h" - -namespace mojo { -class NetworkContext; - -class CookieStoreImpl : public CookieStore { - public: - CookieStoreImpl(NetworkContext* context, - const GURL& origin, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<CookieStore> request); - ~CookieStoreImpl() override; - - private: - // CookieStore methods: - void Get(const String& url, const Callback<void(String)>& callback) override; - void Set(const String& url, - const String& cookie, - const Callback<void(bool)>& callback) override; - - NetworkContext* context_; - GURL origin_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<CookieStore> binding_; - - DISALLOW_COPY_AND_ASSIGN(CookieStoreImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_COOKIE_STORE_IMPL_H_
diff --git a/mojo/services/network/http_connection_impl.cc b/mojo/services/network/http_connection_impl.cc deleted file mode 100644 index b2c7fd1..0000000 --- a/mojo/services/network/http_connection_impl.cc +++ /dev/null
@@ -1,427 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/http_connection_impl.h" - -#include <stddef.h> -#include <stdint.h> - -#include <limits> -#include <utility> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/public/cpp/bindings/type_converter.h" -#include "mojo/public/cpp/system/data_pipe.h" -#include "mojo/services/network/http_server_impl.h" -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/public/cpp/web_socket_read_queue.h" -#include "mojo/services/network/public/cpp/web_socket_write_queue.h" -#include "mojo/services/network/public/interfaces/web_socket.mojom.h" -#include "net/base/net_errors.h" -#include "net/http/http_request_headers.h" -#include "net/http/http_status_code.h" -#include "net/server/http_server.h" -#include "net/server/http_server_request_info.h" -#include "net/server/http_server_response_info.h" - -namespace mojo { - -// SimpleDataPipeReader reads till end-of-file, stores the data in a string and -// notifies completion. -class HttpConnectionImpl::SimpleDataPipeReader { - public: - using CompletionCallback = - base::Callback<void(SimpleDataPipeReader*, scoped_ptr<std::string>)>; - - SimpleDataPipeReader() {} - ~SimpleDataPipeReader() {} - - void Start(ScopedDataPipeConsumerHandle consumer, - const CompletionCallback& completion_callback) { - DCHECK(consumer.is_valid() && !consumer_.is_valid()); - consumer_ = std::move(consumer); - completion_callback_ = completion_callback; - buffer_.reset(new std::string); - ReadMore(); - } - - private: - void ReadMore() { - const void* buf; - uint32_t buf_size; - MojoResult rv = BeginReadDataRaw(consumer_.get(), &buf, &buf_size, - MOJO_READ_DATA_FLAG_NONE); - if (rv == MOJO_RESULT_OK) { - buffer_->append(static_cast<const char*>(buf), buf_size); - EndReadDataRaw(consumer_.get(), buf_size); - WaitToReadMore(); - } else if (rv == MOJO_RESULT_SHOULD_WAIT) { - WaitToReadMore(); - } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) { - // We reached end-of-file. - completion_callback_.Run(this, std::move(buffer_)); - // Note: This object may have been destroyed in the callback. - } else { - CHECK(false); - } - } - - void WaitToReadMore() { - watcher_.Start(consumer_.get(), MOJO_HANDLE_SIGNAL_READABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&SimpleDataPipeReader::OnHandleReady, - base::Unretained(this))); - } - - void OnHandleReady(MojoResult result) { ReadMore(); } - - ScopedDataPipeConsumerHandle consumer_; - common::HandleWatcher watcher_; - CompletionCallback completion_callback_; - scoped_ptr<std::string> buffer_; - - DISALLOW_COPY_AND_ASSIGN(SimpleDataPipeReader); -}; - -class HttpConnectionImpl::WebSocketImpl : public WebSocket { - public: - // |connection| must outlive this object. - WebSocketImpl(HttpConnectionImpl* connection, - InterfaceRequest<WebSocket> request, - ScopedDataPipeConsumerHandle send_stream, - WebSocketClientPtr client) - : connection_(connection), - binding_(this, std::move(request)), - client_(std::move(client)), - send_stream_(std::move(send_stream)), - read_send_stream_(new WebSocketReadQueue(send_stream_.get())), - pending_send_count_(0) { - DCHECK(binding_.is_bound()); - DCHECK(client_); - DCHECK(send_stream_.is_valid()); - - binding_.set_connection_error_handler([this]() { Close(); }); - client_.set_connection_error_handler([this]() { Close(); }); - - DataPipe data_pipe; - receive_stream_ = std::move(data_pipe.producer_handle); - write_receive_stream_.reset(new WebSocketWriteQueue(receive_stream_.get())); - - client_->DidConnect("", "", std::move(data_pipe.consumer_handle)); - } - - ~WebSocketImpl() override {} - - void Close() { - DCHECK(!IsClosing()); - - binding_.Close(); - client_.reset(); - - NotifyOwnerCloseIfAllDone(); - } - - void OnReceivedWebSocketMessage(const std::string& data) { - if (IsClosing()) - return; - - // TODO(yzshen): It shouldn't be an issue to pass an empty message. However, - // WebSocket{Read,Write}Queue doesn't handle that correctly. - if (data.empty()) - return; - - uint32_t size = static_cast<uint32_t>(data.size()); - write_receive_stream_->Write( - &data[0], size, - base::Bind(&WebSocketImpl::OnFinishedWritingReceiveStream, - base::Unretained(this), size)); - } - - private: - // WebSocket implementation. - void Connect(const String& url, - Array<String> protocols, - const String& origin, - ScopedDataPipeConsumerHandle send_stream, - WebSocketClientPtr client) override { - NOTREACHED(); - } - - void Send(bool fin, MessageType type, uint32_t num_bytes) override { - if (!fin || type != MessageType::TEXT) { - NOTIMPLEMENTED(); - Close(); - } - - // TODO(yzshen): It shouldn't be an issue to pass an empty message. However, - // WebSocket{Read,Write}Queue doesn't handle that correctly. - if (num_bytes == 0) - return; - - pending_send_count_++; - read_send_stream_->Read( - num_bytes, base::Bind(&WebSocketImpl::OnFinishedReadingSendStream, - base::Unretained(this), num_bytes)); - } - - void FlowControl(int64_t quota) override { NOTIMPLEMENTED(); } - - void Close(uint16_t code, const String& reason) override { - Close(); - } - - void OnFinishedReadingSendStream(uint32_t num_bytes, const char* data) { - DCHECK_GT(pending_send_count_, 0u); - pending_send_count_--; - - if (data) { - connection_->server_->server()->SendOverWebSocket( - connection_->connection_id_, std::string(data, num_bytes)); - } - - if (IsClosing()) - NotifyOwnerCloseIfAllDone(); - } - - void OnFinishedWritingReceiveStream(uint32_t num_bytes, const char* buffer) { - if (IsClosing()) - return; - - if (buffer) - client_->DidReceiveData(true, MessageType::TEXT, num_bytes); - } - - // Checks whether Close() has been called. - bool IsClosing() const { return !binding_.is_bound(); } - - void NotifyOwnerCloseIfAllDone() { - DCHECK(IsClosing()); - - if (pending_send_count_ == 0) - connection_->OnWebSocketClosed(); - } - - HttpConnectionImpl* const connection_; - - Binding<WebSocket> binding_; - WebSocketClientPtr client_; - - ScopedDataPipeConsumerHandle send_stream_; - scoped_ptr<WebSocketReadQueue> read_send_stream_; - size_t pending_send_count_; - - ScopedDataPipeProducerHandle receive_stream_; - scoped_ptr<WebSocketWriteQueue> write_receive_stream_; - - DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); -}; - -template <> -struct TypeConverter<HttpRequestPtr, net::HttpServerRequestInfo> { - static HttpRequestPtr Convert(const net::HttpServerRequestInfo& obj) { - HttpRequestPtr request(HttpRequest::New()); - request->method = obj.method; - request->url = obj.path; - request->headers.resize(obj.headers.size()); - size_t index = 0; - for (const auto& item : obj.headers) { - HttpHeaderPtr header(HttpHeader::New()); - header->name = item.first; - header->value = item.second; - request->headers[index++] = std::move(header); - } - if (!obj.data.empty()) { - uint32_t num_bytes = static_cast<uint32_t>(obj.data.size()); - MojoCreateDataPipeOptions options; - options.struct_size = sizeof(MojoCreateDataPipeOptions); - options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; - options.element_num_bytes = 1; - options.capacity_num_bytes = num_bytes; - DataPipe data_pipe(options); - request->body = std::move(data_pipe.consumer_handle); - MojoResult result = - WriteDataRaw(data_pipe.producer_handle.get(), obj.data.data(), - &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE); - CHECK_EQ(MOJO_RESULT_OK, result); - } - return request; - } -}; - -HttpConnectionImpl::HttpConnectionImpl(int connection_id, - HttpServerImpl* server, - HttpConnectionDelegatePtr delegate, - HttpConnectionPtr* connection) - : connection_id_(connection_id), - server_(server), - delegate_(std::move(delegate)), - binding_(this, connection) { - DCHECK(delegate_); - binding_.set_connection_error_handler([this]() { Close(); }); - delegate_.set_connection_error_handler([this]() { Close(); }); -} - -HttpConnectionImpl::~HttpConnectionImpl() { - STLDeleteElements(&response_body_readers_); -} - -void HttpConnectionImpl::OnReceivedHttpRequest( - const net::HttpServerRequestInfo& info) { - if (IsClosing()) - return; - - delegate_->OnReceivedRequest( - HttpRequest::From(info), [this](HttpResponsePtr response) { - if (response->body.is_valid()) { - SimpleDataPipeReader* reader = new SimpleDataPipeReader; - response_body_readers_.insert(reader); - ScopedDataPipeConsumerHandle body = std::move(response->body); - reader->Start( - std::move(body), - base::Bind(&HttpConnectionImpl::OnFinishedReadingResponseBody, - base::Unretained(this), base::Passed(&response))); - } else { - OnFinishedReadingResponseBody(std::move(response), nullptr, nullptr); - } - }); -} - -void HttpConnectionImpl::OnReceivedWebSocketRequest( - const net::HttpServerRequestInfo& info) { - if (IsClosing()) - return; - - delegate_->OnReceivedWebSocketRequest( - HttpRequest::From(info), - [this, info](InterfaceRequest<WebSocket> web_socket, - ScopedDataPipeConsumerHandle send_stream, - WebSocketClientPtr web_socket_client) { - if (!web_socket.is_pending() || !send_stream.is_valid() || - !web_socket_client) { - Close(); - return; - } - - web_socket_.reset(new WebSocketImpl(this, std::move(web_socket), - std::move(send_stream), - std::move(web_socket_client))); - server_->server()->AcceptWebSocket(connection_id_, info); - }); -} - -void HttpConnectionImpl::OnReceivedWebSocketMessage(const std::string& data) { - if (IsClosing()) - return; - - web_socket_->OnReceivedWebSocketMessage(data); -} - -void HttpConnectionImpl::SetSendBufferSize( - uint32_t size, - const SetSendBufferSizeCallback& callback) { - if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) - size = std::numeric_limits<int32_t>::max(); - - server_->server()->SetSendBufferSize(connection_id_, - static_cast<int32_t>(size)); - callback.Run(MakeNetworkError(net::OK)); -} - -void HttpConnectionImpl::SetReceiveBufferSize( - uint32_t size, - const SetReceiveBufferSizeCallback& callback) { - if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) - size = std::numeric_limits<int32_t>::max(); - - server_->server()->SetReceiveBufferSize(connection_id_, - static_cast<int32_t>(size)); - callback.Run(MakeNetworkError(net::OK)); -} - -void HttpConnectionImpl::OnFinishedReadingResponseBody( - HttpResponsePtr response, - SimpleDataPipeReader* reader, - scoped_ptr<std::string> body) { - if (reader) { - delete reader; - response_body_readers_.erase(reader); - } - - net::HttpServerResponseInfo info( - static_cast<net::HttpStatusCode>(response->status_code)); - - std::string content_type; - for (size_t i = 0; i < response->headers.size(); ++i) { - const HttpHeader& header = *(response->headers[i]); - - if (body) { - // net::HttpServerResponseInfo::SetBody() automatically sets - // Content-Length and Content-Types, so skip the two here. - // - // TODO(yzshen): Consider adding to net::HttpServerResponseInfo a simple - // setter for body which doesn't fiddle with headers. - base::StringPiece name_piece(header.name.data(), header.name.size()); - if (base::EqualsCaseInsensitiveASCII( - name_piece, net::HttpRequestHeaders::kContentLength)) { - continue; - } else if (base::EqualsCaseInsensitiveASCII( - name_piece, net::HttpRequestHeaders::kContentType)) { - content_type = header.value; - continue; - } - } - info.AddHeader(header.name, header.value); - } - - if (body) - info.SetBody(*body, content_type); - - server_->server()->SendResponse(connection_id_, info); - - if (IsClosing()) - NotifyOwnerCloseIfAllDone(); -} - -void HttpConnectionImpl::Close() { - DCHECK(!IsClosing()); - - binding_.Close(); - delegate_.reset(); - - if (web_socket_) - web_socket_->Close(); - - NotifyOwnerCloseIfAllDone(); -} - -void HttpConnectionImpl::NotifyOwnerCloseIfAllDone() { - DCHECK(IsClosing()); - - // Don't close the connection until all pending sends are done. - bool should_wait = !response_body_readers_.empty() || web_socket_; - if (!should_wait) - server_->server()->Close(connection_id_); -} - -void HttpConnectionImpl::OnWebSocketClosed() { - web_socket_.reset(); - - if (IsClosing()) { - // The close operation is initiated by this object. - NotifyOwnerCloseIfAllDone(); - } else { - // The close operation is initiated by |web_socket_|; start closing this - // object. - Close(); - } -} - -} // namespace mojo
diff --git a/mojo/services/network/http_connection_impl.h b/mojo/services/network/http_connection_impl.h deleted file mode 100644 index a403bc2..0000000 --- a/mojo/services/network/http_connection_impl.h +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_HTTP_CONNECTION_IMPL_H_ -#define MOJO_SERVICES_NETWORK_HTTP_CONNECTION_IMPL_H_ - -#include <stdint.h> - -#include <set> -#include <string> - -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/services/network/public/interfaces/http_connection.mojom.h" -#include "mojo/services/network/public/interfaces/http_message.mojom.h" - -namespace net { -class HttpServerRequestInfo; -} - -namespace mojo { - -class HttpServerImpl; - -class HttpConnectionImpl : public HttpConnection { - public: - // |server| must outlive this object. - HttpConnectionImpl(int connection_id, - HttpServerImpl* server, - HttpConnectionDelegatePtr delegate, - HttpConnectionPtr* connection); - - ~HttpConnectionImpl() override; - - void OnReceivedHttpRequest(const net::HttpServerRequestInfo& info); - void OnReceivedWebSocketRequest(const net::HttpServerRequestInfo& info); - void OnReceivedWebSocketMessage(const std::string& data); - - private: - class SimpleDataPipeReader; - class WebSocketImpl; - - // HttpConnection implementation. - void SetSendBufferSize(uint32_t size, - const SetSendBufferSizeCallback& callback) override; - void SetReceiveBufferSize( - uint32_t size, - const SetReceiveBufferSizeCallback& callback) override; - - void OnConnectionError(); - - void OnFinishedReadingResponseBody(HttpResponsePtr response_ptr, - SimpleDataPipeReader* reader, - scoped_ptr<std::string> body); - - void Close(); - - // Checks whether Close() has been called. - bool IsClosing() const { return !binding_.is_bound(); } - - // Checks whether all wrap-up work has been done during the closing process. - // If yes, notifies the owner, which may result in the destruction of this - // object. - void NotifyOwnerCloseIfAllDone(); - - void OnWebSocketClosed(); - - const int connection_id_; - HttpServerImpl* const server_; - HttpConnectionDelegatePtr delegate_; - Binding<HttpConnection> binding_; - // Owns its elements. - std::set<SimpleDataPipeReader*> response_body_readers_; - - scoped_ptr<WebSocketImpl> web_socket_; - - DISALLOW_COPY_AND_ASSIGN(HttpConnectionImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_HTTP_CONNECTION_IMPL_H_
diff --git a/mojo/services/network/http_server_impl.cc b/mojo/services/network/http_server_impl.cc deleted file mode 100644 index b7e080a6..0000000 --- a/mojo/services/network/http_server_impl.cc +++ /dev/null
@@ -1,119 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/http_server_impl.h" - -#include <utility> - -#include "base/logging.h" -#include "mojo/services/network/http_connection_impl.h" -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/net_address_type_converters.h" -#include "net/base/ip_endpoint.h" -#include "net/base/net_errors.h" -#include "net/log/net_log.h" -#include "net/socket/tcp_server_socket.h" - -namespace mojo { - -namespace { - -const int kBackLog = 10; - -} // namespace - -// static -void HttpServerImpl::Create( - NetAddressPtr local_address, - HttpServerDelegatePtr delegate, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback) { - HttpServerImpl* http_server = - new HttpServerImpl(std::move(delegate), std::move(app_refcount)); - - int net_error = http_server->Start(std::move(local_address)); - if (net_error != net::OK) { - callback.Run(MakeNetworkError(net_error), nullptr); - delete http_server; - return; - } - callback.Run(MakeNetworkError(net::OK), http_server->GetLocalAddress()); -} - -HttpServerImpl::HttpServerImpl(HttpServerDelegatePtr delegate, - scoped_ptr<mojo::MessageLoopRef> app_refcount) - : delegate_(std::move(delegate)), app_refcount_(std::move(app_refcount)) { - DCHECK(delegate_); - delegate_.set_connection_error_handler([this]() { delete this; }); -} - -HttpServerImpl::~HttpServerImpl() {} - -int HttpServerImpl::Start(NetAddressPtr local_address) { - DCHECK(local_address); - - scoped_ptr<net::ServerSocket> socket( - new net::TCPServerSocket(nullptr, net::NetLog::Source())); - int net_result = socket->Listen(local_address.To<net::IPEndPoint>(), - kBackLog); - if (net_result != net::OK) - return net_result; - - server_.reset(new net::HttpServer(std::move(socket), this)); - - return net::OK; -} - -NetAddressPtr HttpServerImpl::GetLocalAddress() const { - if (!server_) - return nullptr; - - net::IPEndPoint address; - int net_result = server_->GetLocalAddress(&address); - if (net_result != net::OK) - return nullptr; - - return NetAddress::From(address); -} - -void HttpServerImpl::OnConnect(int connection_id) { - DCHECK(connections_.find(connection_id) == connections_.end()); - - HttpConnectionPtr connection; - HttpConnectionDelegatePtr connection_delegate; - InterfaceRequest<HttpConnectionDelegate> delegate_request = - GetProxy(&connection_delegate); - linked_ptr<HttpConnectionImpl> connection_impl(new HttpConnectionImpl( - connection_id, this, std::move(connection_delegate), &connection)); - - connections_[connection_id] = connection_impl; - - delegate_->OnConnected(std::move(connection), std::move(delegate_request)); -} - -void HttpServerImpl::OnHttpRequest(int connection_id, - const net::HttpServerRequestInfo& info) { - DCHECK(connections_.find(connection_id) != connections_.end()); - connections_[connection_id]->OnReceivedHttpRequest(info); -} - -void HttpServerImpl::OnWebSocketRequest( - int connection_id, - const net::HttpServerRequestInfo& info) { - DCHECK(connections_.find(connection_id) != connections_.end()); - connections_[connection_id]->OnReceivedWebSocketRequest(info); -} - -void HttpServerImpl::OnWebSocketMessage(int connection_id, - const std::string& data) { - DCHECK(connections_.find(connection_id) != connections_.end()); - connections_[connection_id]->OnReceivedWebSocketMessage(data); -} - -void HttpServerImpl::OnClose(int connection_id) { - DCHECK(connections_.find(connection_id) != connections_.end()); - connections_.erase(connection_id); -} - -} // namespace mojo
diff --git a/mojo/services/network/http_server_impl.h b/mojo/services/network/http_server_impl.h deleted file mode 100644 index f79b7a8..0000000 --- a/mojo/services/network/http_server_impl.h +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_HTTP_SERVER_IMPL_H_ -#define MOJO_SERVICES_NETWORK_HTTP_SERVER_IMPL_H_ - -#include <map> - -#include "base/macros.h" -#include "base/memory/linked_ptr.h" -#include "base/memory/scoped_ptr.h" -#include "mojo/services/network/public/interfaces/http_server.mojom.h" -#include "mojo/services/network/public/interfaces/net_address.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/server/http_server.h" - -namespace net { -class HttpServer; -} - -namespace mojo { - -class HttpConnectionImpl; - -class HttpServerImpl : public net::HttpServer::Delegate { - public: - static void Create( - NetAddressPtr local_address, - HttpServerDelegatePtr delegate, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback); - - net::HttpServer* server() { return server_.get(); } - - private: - // The lifetime of the returned HttpServerImpl object is bound to that of - // |delegate|'s underlying pipe. The object will self-destruct when it is - // notified that |delegate|'s pipe is closed. Deleting the object directly - // before that is okay, too. - HttpServerImpl(HttpServerDelegatePtr delegate, - scoped_ptr<mojo::MessageLoopRef> app_refcount); - ~HttpServerImpl() override; - - int Start(NetAddressPtr local_address); - NetAddressPtr GetLocalAddress() const; - - // net::HttpServer::Delegate implementation. - void OnConnect(int connection_id) override; - void OnHttpRequest(int connection_id, - const net::HttpServerRequestInfo& info) override; - void OnWebSocketRequest(int connection_id, - const net::HttpServerRequestInfo& info) override; - void OnWebSocketMessage(int connection_id, const std::string& data) override; - void OnClose(int connection_id) override; - - HttpServerDelegatePtr delegate_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - scoped_ptr<net::HttpServer> server_; - - std::map<int, linked_ptr<HttpConnectionImpl>> connections_; - - DISALLOW_COPY_AND_ASSIGN(HttpServerImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_HTTP_SERVER_IMPL_H_
diff --git a/mojo/services/network/http_server_unittest.cc b/mojo/services/network/http_server_unittest.cc deleted file mode 100644 index dc9769b7..0000000 --- a/mojo/services/network/http_server_unittest.cc +++ /dev/null
@@ -1,701 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stddef.h> -#include <stdint.h> - -#include <utility> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/memory/linked_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/run_loop.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "mojo/common/data_pipe_utils.h" -#include "mojo/services/network/net_address_type_converters.h" -#include "mojo/services/network/public/cpp/web_socket_read_queue.h" -#include "mojo/services/network/public/cpp/web_socket_write_queue.h" -#include "mojo/services/network/public/interfaces/http_connection.mojom.h" -#include "mojo/services/network/public/interfaces/http_message.mojom.h" -#include "mojo/services/network/public/interfaces/http_server.mojom.h" -#include "mojo/services/network/public/interfaces/net_address.mojom.h" -#include "mojo/services/network/public/interfaces/network_service.mojom.h" -#include "mojo/services/network/public/interfaces/web_socket.mojom.h" -#include "mojo/services/network/public/interfaces/web_socket_factory.mojom.h" -#include "mojo/shell/public/cpp/shell_test.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/base/test_completion_callback.h" -#include "net/http/http_response_headers.h" -#include "net/http/http_util.h" -#include "net/socket/tcp_client_socket.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace mojo { -namespace { - -const int kMaxExpectedResponseLength = 2048; - -NetAddressPtr GetLocalHostWithAnyPort() { - NetAddressPtr addr(NetAddress::New()); - addr->family = NetAddressFamily::IPV4; - addr->ipv4 = NetAddressIPv4::New(); - addr->ipv4->port = 0; - addr->ipv4->addr.resize(4); - addr->ipv4->addr[0] = 127; - addr->ipv4->addr[1] = 0; - addr->ipv4->addr[2] = 0; - addr->ipv4->addr[3] = 1; - - return addr; -} - -using TestHeaders = std::vector<std::pair<std::string, std::string>>; - -struct TestRequest { - std::string method; - std::string url; - TestHeaders headers; - scoped_ptr<std::string> body; -}; - -struct TestResponse { - uint32_t status_code; - TestHeaders headers; - scoped_ptr<std::string> body; -}; - -std::string MakeRequestMessage(const TestRequest& data) { - std::string message = data.method + " " + data.url + " HTTP/1.1\r\n"; - for (const auto& item : data.headers) - message += item.first + ": " + item.second + "\r\n"; - message += "\r\n"; - if (data.body) - message += *data.body; - - return message; -} - -HttpResponsePtr MakeResponseStruct(const TestResponse& data) { - HttpResponsePtr response(HttpResponse::New()); - response->status_code = data.status_code; - response->headers.resize(data.headers.size()); - size_t index = 0; - for (const auto& item : data.headers) { - HttpHeaderPtr header(HttpHeader::New()); - header->name = item.first; - header->value = item.second; - response->headers[index++] = std::move(header); - } - - if (data.body) { - uint32_t num_bytes = static_cast<uint32_t>(data.body->size()); - MojoCreateDataPipeOptions options; - options.struct_size = sizeof(MojoCreateDataPipeOptions); - options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; - options.element_num_bytes = 1; - options.capacity_num_bytes = num_bytes; - DataPipe data_pipe(options); - response->body = std::move(data_pipe.consumer_handle); - MojoResult result = - WriteDataRaw(data_pipe.producer_handle.get(), data.body->data(), - &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE); - EXPECT_EQ(MOJO_RESULT_OK, result); - } - - return response; -} - -void CheckHeaders(const TestHeaders& expected, - const Array<HttpHeaderPtr>& headers) { - // The server impl fiddles with Content-Length and Content-Type. So we don't - // do a strict check here. - std::map<std::string, std::string> header_map; - for (size_t i = 0; i < headers.size(); ++i) { - std::string lower_name = - base::ToLowerASCII(headers[i]->name.To<std::string>()); - header_map[lower_name] = headers[i]->value; - } - - for (const auto& item : expected) { - std::string lower_name = base::ToLowerASCII(item.first); - EXPECT_NE(header_map.end(), header_map.find(lower_name)); - EXPECT_EQ(item.second, header_map[lower_name]); - } -} - -void CheckRequest(const TestRequest& expected, HttpRequestPtr request) { - EXPECT_EQ(expected.method, request->method); - EXPECT_EQ(expected.url, request->url); - CheckHeaders(expected.headers, request->headers); - if (expected.body) { - EXPECT_TRUE(request->body.is_valid()); - std::string body; - common::BlockingCopyToString(std::move(request->body), &body); - EXPECT_EQ(*expected.body, body); - } else { - EXPECT_FALSE(request->body.is_valid()); - } -} - -void CheckResponse(const TestResponse& expected, const std::string& response) { - int header_end = - net::HttpUtil::LocateEndOfHeaders(response.c_str(), response.size()); - std::string assembled_headers = - net::HttpUtil::AssembleRawHeaders(response.c_str(), header_end); - scoped_refptr<net::HttpResponseHeaders> parsed_headers( - new net::HttpResponseHeaders(assembled_headers)); - EXPECT_EQ(expected.status_code, - static_cast<uint32_t>(parsed_headers->response_code())); - for (const auto& item : expected.headers) - EXPECT_TRUE(parsed_headers->HasHeaderValue(item.first, item.second)); - - if (expected.body) { - EXPECT_NE(-1, header_end); - std::string body(response, static_cast<size_t>(header_end)); - EXPECT_EQ(*expected.body, body); - } else { - EXPECT_EQ(response.size(), static_cast<size_t>(header_end)); - } -} - -class TestHttpClient { - public: - TestHttpClient() : connect_result_(net::OK) {} - - void Connect(const net::IPEndPoint& address) { - net::AddressList addresses(address); - net::NetLog::Source source; - socket_.reset(new net::TCPClientSocket(addresses, NULL, source)); - - base::RunLoop run_loop; - connect_result_ = socket_->Connect(base::Bind(&TestHttpClient::OnConnect, - base::Unretained(this), - run_loop.QuitClosure())); - if (connect_result_ == net::ERR_IO_PENDING) - run_loop.Run(); - - ASSERT_EQ(net::OK, connect_result_); - } - - void Send(const std::string& data) { - write_buffer_ = new net::DrainableIOBuffer(new net::StringIOBuffer(data), - data.length()); - Write(); - } - - // Note: This method determines the end of the response only by Content-Length - // and connection termination. Besides, it doesn't truncate at the end of the - // response, so |message| may return more data (e.g., part of the next - // response). - void ReadResponse(std::string* message) { - if (!Read(message, 1)) - return; - while (!IsCompleteResponse(*message)) { - std::string chunk; - if (!Read(&chunk, 1)) - return; - message->append(chunk); - } - return; - } - - private: - void OnConnect(const base::Closure& quit_loop, int result) { - connect_result_ = result; - quit_loop.Run(); - } - - void Write() { - int result = socket_->Write( - write_buffer_.get(), write_buffer_->BytesRemaining(), - base::Bind(&TestHttpClient::OnWrite, base::Unretained(this))); - if (result != net::ERR_IO_PENDING) - OnWrite(result); - } - - void OnWrite(int result) { - ASSERT_GT(result, 0); - write_buffer_->DidConsume(result); - if (write_buffer_->BytesRemaining()) - Write(); - } - - bool Read(std::string* message, int expected_bytes) { - int total_bytes_received = 0; - message->clear(); - while (total_bytes_received < expected_bytes) { - net::TestCompletionCallback callback; - ReadInternal(callback.callback()); - int bytes_received = callback.WaitForResult(); - if (bytes_received <= 0) - return false; - - total_bytes_received += bytes_received; - message->append(read_buffer_->data(), bytes_received); - } - return true; - } - - void ReadInternal(const net::CompletionCallback& callback) { - read_buffer_ = new net::IOBufferWithSize(kMaxExpectedResponseLength); - int result = - socket_->Read(read_buffer_.get(), kMaxExpectedResponseLength, callback); - if (result != net::ERR_IO_PENDING) - callback.Run(result); - } - - bool IsCompleteResponse(const std::string& response) { - // Check end of headers first. - int end_of_headers = - net::HttpUtil::LocateEndOfHeaders(response.data(), response.size()); - if (end_of_headers < 0) - return false; - - // Return true if response has data equal to or more than content length. - int64_t body_size = static_cast<int64_t>(response.size()) - end_of_headers; - DCHECK_LE(0, body_size); - scoped_refptr<net::HttpResponseHeaders> headers( - new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( - response.data(), end_of_headers))); - return body_size >= headers->GetContentLength(); - } - - scoped_refptr<net::IOBufferWithSize> read_buffer_; - scoped_refptr<net::DrainableIOBuffer> write_buffer_; - scoped_ptr<net::TCPClientSocket> socket_; - int connect_result_; - - DISALLOW_COPY_AND_ASSIGN(TestHttpClient); -}; - -class WebSocketClientImpl : public WebSocketClient { - public: - explicit WebSocketClientImpl() - : binding_(this, &client_ptr_), - wait_for_message_count_(0), - run_loop_(nullptr) {} - ~WebSocketClientImpl() override {} - - // Establishes a connection from the client side. - void Connect(WebSocketPtr web_socket, const std::string& url) { - web_socket_ = std::move(web_socket); - - DataPipe data_pipe; - send_stream_ = std::move(data_pipe.producer_handle); - write_send_stream_.reset(new WebSocketWriteQueue(send_stream_.get())); - - web_socket_->Connect(url, Array<String>(), "http://example.com", - std::move(data_pipe.consumer_handle), - std::move(client_ptr_)); - } - - // Establishes a connection from the server side. - void AcceptConnectRequest( - const HttpConnectionDelegate::OnReceivedWebSocketRequestCallback& - callback) { - InterfaceRequest<WebSocket> web_socket_request = GetProxy(&web_socket_); - - DataPipe data_pipe; - send_stream_ = std::move(data_pipe.producer_handle); - write_send_stream_.reset(new WebSocketWriteQueue(send_stream_.get())); - - callback.Run(std::move(web_socket_request), - std::move(data_pipe.consumer_handle), std::move(client_ptr_)); - } - - void WaitForConnectCompletion() { - DCHECK(!run_loop_); - - if (receive_stream_.is_valid()) - return; - - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - void Send(const std::string& message) { - DCHECK(!message.empty()); - - uint32_t size = static_cast<uint32_t>(message.size()); - write_send_stream_->Write( - &message[0], size, - base::Bind(&WebSocketClientImpl::OnFinishedWritingSendStream, - base::Unretained(this), size)); - } - - void WaitForMessage(size_t count) { - DCHECK(!run_loop_); - - if (received_messages_.size() >= count) - return; - wait_for_message_count_ = count; - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - std::vector<std::string>& received_messages() { return received_messages_; } - - private: - // WebSocketClient implementation. - void DidConnect(const String& selected_subprotocol, - const String& extensions, - ScopedDataPipeConsumerHandle receive_stream) override { - receive_stream_ = std::move(receive_stream); - read_receive_stream_.reset(new WebSocketReadQueue(receive_stream_.get())); - - web_socket_->FlowControl(2048); - if (run_loop_) - run_loop_->Quit(); - } - - void DidReceiveData(bool fin, - WebSocket::MessageType type, - uint32_t num_bytes) override { - DCHECK(num_bytes > 0); - - read_receive_stream_->Read( - num_bytes, - base::Bind(&WebSocketClientImpl::OnFinishedReadingReceiveStream, - base::Unretained(this), num_bytes)); - } - - void DidReceiveFlowControl(int64_t quota) override {} - - void DidFail(const String& message) override {} - - void DidClose(bool was_clean, uint16_t code, const String& reason) override {} - - void OnFinishedWritingSendStream(uint32_t num_bytes, const char* buffer) { - EXPECT_TRUE(buffer); - - web_socket_->Send(true, WebSocket::MessageType::TEXT, num_bytes); - } - - void OnFinishedReadingReceiveStream(uint32_t num_bytes, const char* data) { - EXPECT_TRUE(data); - - received_messages_.push_back(std::string(data, num_bytes)); - if (run_loop_ && received_messages_.size() >= wait_for_message_count_) { - wait_for_message_count_ = 0; - run_loop_->Quit(); - } - } - - WebSocketClientPtr client_ptr_; - Binding<WebSocketClient> binding_; - WebSocketPtr web_socket_; - - ScopedDataPipeProducerHandle send_stream_; - scoped_ptr<WebSocketWriteQueue> write_send_stream_; - - ScopedDataPipeConsumerHandle receive_stream_; - scoped_ptr<WebSocketReadQueue> read_receive_stream_; - - std::vector<std::string> received_messages_; - size_t wait_for_message_count_; - - // Pointing to a stack-allocated RunLoop instance. - base::RunLoop* run_loop_; - - DISALLOW_COPY_AND_ASSIGN(WebSocketClientImpl); -}; - -class HttpConnectionDelegateImpl : public HttpConnectionDelegate { - public: - struct PendingRequest { - HttpRequestPtr request; - OnReceivedRequestCallback callback; - }; - - HttpConnectionDelegateImpl(HttpConnectionPtr connection, - InterfaceRequest<HttpConnectionDelegate> request) - : connection_(std::move(connection)), - binding_(this, std::move(request)), - wait_for_request_count_(0), - run_loop_(nullptr) {} - ~HttpConnectionDelegateImpl() override {} - - // HttpConnectionDelegate implementation: - void OnReceivedRequest(HttpRequestPtr request, - const OnReceivedRequestCallback& callback) override { - linked_ptr<PendingRequest> pending_request(new PendingRequest); - pending_request->request = std::move(request); - pending_request->callback = callback; - pending_requests_.push_back(pending_request); - if (run_loop_ && pending_requests_.size() >= wait_for_request_count_) { - wait_for_request_count_ = 0; - run_loop_->Quit(); - } - } - - void OnReceivedWebSocketRequest( - HttpRequestPtr request, - const OnReceivedWebSocketRequestCallback& callback) override { - web_socket_.reset(new WebSocketClientImpl()); - - web_socket_->AcceptConnectRequest(callback); - - if (run_loop_) - run_loop_->Quit(); - } - - void SendResponse(HttpResponsePtr response) { - ASSERT_FALSE(pending_requests_.empty()); - linked_ptr<PendingRequest> request = pending_requests_[0]; - pending_requests_.erase(pending_requests_.begin()); - request->callback.Run(std::move(response)); - } - - void WaitForRequest(size_t count) { - DCHECK(!run_loop_); - - if (pending_requests_.size() >= count) - return; - - wait_for_request_count_ = count; - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - void WaitForWebSocketRequest() { - DCHECK(!run_loop_); - - if (web_socket_) - return; - - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - std::vector<linked_ptr<PendingRequest>>& pending_requests() { - return pending_requests_; - } - - WebSocketClientImpl* web_socket() { return web_socket_.get(); } - - private: - HttpConnectionPtr connection_; - Binding<HttpConnectionDelegate> binding_; - std::vector<linked_ptr<PendingRequest>> pending_requests_; - size_t wait_for_request_count_; - scoped_ptr<WebSocketClientImpl> web_socket_; - - // Pointing to a stack-allocated RunLoop instance. - base::RunLoop* run_loop_; - - DISALLOW_COPY_AND_ASSIGN(HttpConnectionDelegateImpl); -}; - -class HttpServerDelegateImpl : public HttpServerDelegate { - public: - explicit HttpServerDelegateImpl(HttpServerDelegatePtr* delegate_ptr) - : binding_(this, delegate_ptr), - wait_for_connection_count_(0), - run_loop_(nullptr) {} - ~HttpServerDelegateImpl() override {} - - // HttpServerDelegate implementation. - void OnConnected(HttpConnectionPtr connection, - InterfaceRequest<HttpConnectionDelegate> delegate) override { - connections_.push_back(make_linked_ptr(new HttpConnectionDelegateImpl( - std::move(connection), std::move(delegate)))); - if (run_loop_ && connections_.size() >= wait_for_connection_count_) { - wait_for_connection_count_ = 0; - run_loop_->Quit(); - } - } - - void WaitForConnection(size_t count) { - DCHECK(!run_loop_); - - if (connections_.size() >= count) - return; - - wait_for_connection_count_ = count; - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - std::vector<linked_ptr<HttpConnectionDelegateImpl>>& connections() { - return connections_; - } - - private: - Binding<HttpServerDelegate> binding_; - std::vector<linked_ptr<HttpConnectionDelegateImpl>> connections_; - size_t wait_for_connection_count_; - // Pointing to a stack-allocated RunLoop instance. - base::RunLoop* run_loop_; - - DISALLOW_COPY_AND_ASSIGN(HttpServerDelegateImpl); -}; - -class HttpServerTest : public test::ShellTest { - public: - HttpServerTest() - : ShellTest("exe:network_service_unittests") {} - ~HttpServerTest() override {} - - protected: - void SetUp() override { - ShellTest::SetUp(); - - scoped_ptr<Connection> connection = - connector()->Connect("mojo:network_service"); - connection->GetInterface(&network_service_); - connection->GetInterface(&web_socket_factory_); - } - - scoped_ptr<base::MessageLoop> CreateMessageLoop() override { - return make_scoped_ptr(new base::MessageLoop(base::MessageLoop::TYPE_IO)); - } - - void CreateHttpServer(HttpServerDelegatePtr delegate, - NetAddressPtr* out_bound_to) { - base::RunLoop loop; - network_service_->CreateHttpServer( - GetLocalHostWithAnyPort(), std::move(delegate), - [out_bound_to, &loop](NetworkErrorPtr result, NetAddressPtr bound_to) { - ASSERT_EQ(net::OK, result->code); - EXPECT_NE(0u, bound_to->ipv4->port); - *out_bound_to = std::move(bound_to); - loop.Quit(); - }); - loop.Run(); - } - - NetworkServicePtr network_service_; - WebSocketFactoryPtr web_socket_factory_; - - private: - DISALLOW_COPY_AND_ASSIGN(HttpServerTest); -}; - -} // namespace - -TEST_F(HttpServerTest, BasicHttpRequestResponse) { - NetAddressPtr bound_to; - HttpServerDelegatePtr server_delegate_ptr; - HttpServerDelegateImpl server_delegate_impl(&server_delegate_ptr); - CreateHttpServer(std::move(server_delegate_ptr), &bound_to); - - TestHttpClient client; - client.Connect(bound_to.To<net::IPEndPoint>()); - - server_delegate_impl.WaitForConnection(1); - HttpConnectionDelegateImpl& connection = - *server_delegate_impl.connections()[0]; - - TestRequest request_data = {"HEAD", "/test", {{"Hello", "World"}}, nullptr}; - client.Send(MakeRequestMessage(request_data)); - - connection.WaitForRequest(1); - - CheckRequest(request_data, - std::move(connection.pending_requests()[0]->request)); - - TestResponse response_data = {200, {{"Content-Length", "4"}}, nullptr}; - connection.SendResponse(MakeResponseStruct(response_data)); - // This causes the underlying TCP connection to be closed. The client can - // determine the end of the response based on that. - server_delegate_impl.connections().clear(); - - std::string response_message; - client.ReadResponse(&response_message); - - CheckResponse(response_data, response_message); -} - -TEST_F(HttpServerTest, HttpRequestResponseWithBody) { - NetAddressPtr bound_to; - HttpServerDelegatePtr server_delegate_ptr; - HttpServerDelegateImpl server_delegate_impl(&server_delegate_ptr); - CreateHttpServer(std::move(server_delegate_ptr), &bound_to); - - TestHttpClient client; - client.Connect(bound_to.To<net::IPEndPoint>()); - - server_delegate_impl.WaitForConnection(1); - HttpConnectionDelegateImpl& connection = - *server_delegate_impl.connections()[0]; - - TestRequest request_data = { - "Post", - "/test", - {{"Hello", "World"}, - {"Content-Length", "23"}, - {"Content-Type", "text/plain"}}, - make_scoped_ptr(new std::string("This is a test request!"))}; - client.Send(MakeRequestMessage(request_data)); - - connection.WaitForRequest(1); - - CheckRequest(request_data, - std::move(connection.pending_requests()[0]->request)); - - TestResponse response_data = { - 200, - {{"Content-Length", "26"}}, - make_scoped_ptr(new std::string("This is a test response..."))}; - connection.SendResponse(MakeResponseStruct(response_data)); - - std::string response_message; - client.ReadResponse(&response_message); - - CheckResponse(response_data, response_message); -} - -TEST_F(HttpServerTest, WebSocket) { - NetAddressPtr bound_to; - HttpServerDelegatePtr server_delegate_ptr; - HttpServerDelegateImpl server_delegate_impl(&server_delegate_ptr); - CreateHttpServer(std::move(server_delegate_ptr), &bound_to); - - WebSocketPtr web_socket_ptr; - web_socket_factory_->CreateWebSocket(GetProxy(&web_socket_ptr)); - WebSocketClientImpl socket_0; - socket_0.Connect( - std::move(web_socket_ptr), - base::StringPrintf("ws://127.0.0.1:%d/hello", bound_to->ipv4->port)); - - server_delegate_impl.WaitForConnection(1); - HttpConnectionDelegateImpl& connection = - *server_delegate_impl.connections()[0]; - - connection.WaitForWebSocketRequest(); - WebSocketClientImpl& socket_1 = *connection.web_socket(); - - socket_1.WaitForConnectCompletion(); - socket_0.WaitForConnectCompletion(); - - socket_0.Send("Hello"); - socket_0.Send("world!"); - - socket_1.WaitForMessage(2); - EXPECT_EQ("Hello", socket_1.received_messages()[0]); - EXPECT_EQ("world!", socket_1.received_messages()[1]); - - socket_1.Send("How do"); - socket_1.Send("you do?"); - - socket_0.WaitForMessage(2); - EXPECT_EQ("How do", socket_0.received_messages()[0]); - EXPECT_EQ("you do?", socket_0.received_messages()[1]); -} - -} // namespace mojo
diff --git a/mojo/services/network/main.cc b/mojo/services/network/main.cc deleted file mode 100644 index 3ae88bc..0000000 --- a/mojo/services/network/main.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/message_loop/message_loop.h" -#include "mojo/public/c/system/main.h" -#include "mojo/services/network/network_service_delegate.h" -#include "mojo/shell/public/cpp/application_runner.h" - -MojoResult MojoMain(MojoHandle shell_handle) { - mojo::ApplicationRunner runner(new mojo::NetworkServiceDelegate); - runner.set_message_loop_type(base::MessageLoop::TYPE_IO); - return runner.Run(shell_handle); -}
diff --git a/mojo/services/network/manifest.json b/mojo/services/network/manifest.json deleted file mode 100644 index d4bf307..0000000 --- a/mojo/services/network/manifest.json +++ /dev/null
@@ -1,5 +0,0 @@ -{ - "name": "mojo:network_service", - "display_name": "Network Service", - "capabilities": { "*": [ "*" ] } -}
diff --git a/mojo/services/network/net_adapters.cc b/mojo/services/network/net_adapters.cc deleted file mode 100644 index 0797525..0000000 --- a/mojo/services/network/net_adapters.cc +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/net_adapters.h" - -#include <stdint.h> - -#include <utility> - -#include "net/base/net_errors.h" - -namespace mojo { - -namespace { - -const uint32_t kMaxBufSize = 64 * 1024; - -} // namespace - -NetToMojoPendingBuffer::NetToMojoPendingBuffer( - ScopedDataPipeProducerHandle handle, - void* buffer) - : handle_(std::move(handle)), buffer_(buffer) {} - -NetToMojoPendingBuffer::~NetToMojoPendingBuffer() { - if (handle_.is_valid()) - EndWriteDataRaw(handle_.get(), 0); -} - -// static -MojoResult NetToMojoPendingBuffer::BeginWrite( - ScopedDataPipeProducerHandle* handle, - scoped_refptr<NetToMojoPendingBuffer>* pending, - uint32_t* num_bytes) { - void* buf; - *num_bytes = 0; - - MojoResult result = BeginWriteDataRaw(handle->get(), &buf, num_bytes, - MOJO_WRITE_DATA_FLAG_NONE); - if (result == MOJO_RESULT_OK) { - if (*num_bytes > kMaxBufSize) - *num_bytes = kMaxBufSize; - *pending = new NetToMojoPendingBuffer(std::move(*handle), buf); - } - return result; -} - -ScopedDataPipeProducerHandle NetToMojoPendingBuffer::Complete( - uint32_t num_bytes) { - EndWriteDataRaw(handle_.get(), num_bytes); - buffer_ = NULL; - return std::move(handle_); -} - -// ----------------------------------------------------------------------------- - -NetToMojoIOBuffer::NetToMojoIOBuffer( - NetToMojoPendingBuffer* pending_buffer) - : net::WrappedIOBuffer(pending_buffer->buffer()), - pending_buffer_(pending_buffer) { -} - -NetToMojoIOBuffer::~NetToMojoIOBuffer() { -} - -// ----------------------------------------------------------------------------- - -MojoToNetPendingBuffer::MojoToNetPendingBuffer( - ScopedDataPipeConsumerHandle handle, - const void* buffer) - : handle_(std::move(handle)), buffer_(buffer) {} - -MojoToNetPendingBuffer::~MojoToNetPendingBuffer() { -} - -// static -MojoResult MojoToNetPendingBuffer::BeginRead( - ScopedDataPipeConsumerHandle* handle, - scoped_refptr<MojoToNetPendingBuffer>* pending, - uint32_t* num_bytes) { - const void* buffer = NULL; - *num_bytes = 0; - MojoResult result = BeginReadDataRaw(handle->get(), &buffer, num_bytes, - MOJO_READ_DATA_FLAG_NONE); - if (result == MOJO_RESULT_OK) - *pending = new MojoToNetPendingBuffer(std::move(*handle), buffer); - return result; -} - -ScopedDataPipeConsumerHandle MojoToNetPendingBuffer::Complete( - uint32_t num_bytes) { - EndReadDataRaw(handle_.get(), num_bytes); - buffer_ = NULL; - return std::move(handle_); -} - -// ----------------------------------------------------------------------------- - -MojoToNetIOBuffer::MojoToNetIOBuffer(MojoToNetPendingBuffer* pending_buffer) - : net::WrappedIOBuffer(pending_buffer->buffer()), - pending_buffer_(pending_buffer) { -} - -MojoToNetIOBuffer::~MojoToNetIOBuffer() { -} - -// ----------------------------------------------------------------------------- - -NetworkErrorPtr MakeNetworkError(int error_code) { - NetworkErrorPtr error = NetworkError::New(); - error->code = error_code; - if (error_code <= 0) - error->description = net::ErrorToString(error_code); - return error; -} - -} // namespace mojo
diff --git a/mojo/services/network/net_adapters.h b/mojo/services/network/net_adapters.h deleted file mode 100644 index e84c5019..0000000 --- a/mojo/services/network/net_adapters.h +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NET_ADAPTERS_H_ -#define MOJO_SERVICES_NETWORK_NET_ADAPTERS_H_ - -#include <stdint.h> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "mojo/services/network/public/interfaces/network_error.mojom.h" -#include "net/base/io_buffer.h" - -namespace mojo { - -// These adapters are used to transfer data between a Mojo pipe and the net -// library. There are four adapters, one for each end in each direction: -// -// Mojo pipe Data flow Network library -// ---------------------------------------------------------- -// MojoToNetPendingBuffer ---> MojoToNetIOBuffer -// NetToMojoPendingBuffer <--- NetToMojoIOBuffer -// -// While the operation is in progress, the Mojo-side objects keep ownership -// of the Mojo pipe, which in turn is kept alive by the IOBuffer. This allows -// the request to potentially outlive the object managing the translation. - -// Mojo side of a Net -> Mojo copy. The buffer is allocated by Mojo. -class NetToMojoPendingBuffer - : public base::RefCountedThreadSafe<NetToMojoPendingBuffer> { - public: - // Begins a two-phase write to the data pipe. - // - // On success, MOJO_RESULT_OK will be returned. The ownership of the given - // producer handle will be transferred to the new NetToMojoPendingBuffer that - // will be placed into *pending, and the size of the buffer will be in - // *num_bytes. - // - // On failure or MOJO_RESULT_SHOULD_WAIT, there will be no change to the - // handle, and *pending and *num_bytes will be unused. - static MojoResult BeginWrite(ScopedDataPipeProducerHandle* handle, - scoped_refptr<NetToMojoPendingBuffer>* pending, - uint32_t* num_bytes); - - // Called to indicate the buffer is done being written to. Passes ownership - // of the pipe back to the caller. - ScopedDataPipeProducerHandle Complete(uint32_t num_bytes); - - char* buffer() { return static_cast<char*>(buffer_); } - - private: - friend class base::RefCountedThreadSafe<NetToMojoPendingBuffer>; - - // Takes ownership of the handle. - NetToMojoPendingBuffer(ScopedDataPipeProducerHandle handle, void* buffer); - ~NetToMojoPendingBuffer(); - - ScopedDataPipeProducerHandle handle_; - void* buffer_; - - DISALLOW_COPY_AND_ASSIGN(NetToMojoPendingBuffer); -}; - -// Net side of a Net -> Mojo copy. The data will be read from the network and -// copied into the buffer associated with the pending mojo write. -class NetToMojoIOBuffer : public net::WrappedIOBuffer { - public: - explicit NetToMojoIOBuffer(NetToMojoPendingBuffer* pending_buffer); - - private: - ~NetToMojoIOBuffer() override; - - scoped_refptr<NetToMojoPendingBuffer> pending_buffer_; -}; - -// Mojo side of a Mojo -> Net copy. -class MojoToNetPendingBuffer - : public base::RefCountedThreadSafe<MojoToNetPendingBuffer> { - public: - // Starts reading from Mojo. - // - // On success, MOJO_RESULT_OK will be returned. The ownership of the given - // consumer handle will be transferred to the new MojoToNetPendingBuffer that - // will be placed into *pending, and the size of the buffer will be in - // *num_bytes. - // - // On failure or MOJO_RESULT_SHOULD_WAIT, there will be no change to the - // handle, and *pending and *num_bytes will be unused. - static MojoResult BeginRead(ScopedDataPipeConsumerHandle* handle, - scoped_refptr<MojoToNetPendingBuffer>* pending, - uint32_t* num_bytes); - - // Indicates the buffer is done being read from. Passes ownership of the pipe - // back to the caller. The argument is the number of bytes actually read, - // since net may do partial writes, which will result in partial reads from - // the Mojo pipe's perspective. - ScopedDataPipeConsumerHandle Complete(uint32_t num_bytes); - - const char* buffer() { return static_cast<const char*>(buffer_); } - - private: - friend class base::RefCountedThreadSafe<MojoToNetPendingBuffer>; - - // Takes ownership of the handle. - explicit MojoToNetPendingBuffer(ScopedDataPipeConsumerHandle handle, - const void* buffer); - ~MojoToNetPendingBuffer(); - - ScopedDataPipeConsumerHandle handle_; - const void* buffer_; - - DISALLOW_COPY_AND_ASSIGN(MojoToNetPendingBuffer); -}; - -// Net side of a Mojo -> Net copy. The data will already be in the -// MojoToNetPendingBuffer's buffer. -class MojoToNetIOBuffer : public net::WrappedIOBuffer { - public: - explicit MojoToNetIOBuffer(MojoToNetPendingBuffer* pending_buffer); - - private: - ~MojoToNetIOBuffer() override; - - scoped_refptr<MojoToNetPendingBuffer> pending_buffer_; -}; - -// Creates a new Mojo network error object from a net error code. -NetworkErrorPtr MakeNetworkError(int error_code); - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NET_ADAPTERS_H_
diff --git a/mojo/services/network/net_address_type_converters.cc b/mojo/services/network/net_address_type_converters.cc deleted file mode 100644 index dcd7d73b1..0000000 --- a/mojo/services/network/net_address_type_converters.cc +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdint.h> - -#include "mojo/services/network/net_address_type_converters.h" - -namespace mojo { - -// static -net::IPEndPoint TypeConverter<net::IPEndPoint, NetAddressPtr>::Convert( - const NetAddressPtr& obj) { - if (!obj) - return net::IPEndPoint(); - - switch (obj->family) { - case NetAddressFamily::IPV4: - if (!obj->ipv4) - break; - return net::IPEndPoint(obj->ipv4->addr.storage(), obj->ipv4->port); - - case NetAddressFamily::IPV6: - if (!obj->ipv6) - break; - return net::IPEndPoint(obj->ipv6->addr.storage(), obj->ipv6->port); - - default: - break; - } - - return net::IPEndPoint(); -} - -// static -NetAddressPtr TypeConverter<NetAddressPtr, net::IPEndPoint>::Convert( - const net::IPEndPoint& obj) { - NetAddressPtr net_address(NetAddress::New()); - - switch (obj.GetFamily()) { - case net::ADDRESS_FAMILY_IPV4: - net_address->family = NetAddressFamily::IPV4; - net_address->ipv4 = NetAddressIPv4::New(); - net_address->ipv4->port = static_cast<uint16_t>(obj.port()); - net_address->ipv4->addr = Array<uint8_t>::From(obj.address().bytes()); - break; - case net::ADDRESS_FAMILY_IPV6: - net_address->ipv6 = NetAddressIPv6::New(); - net_address->family = NetAddressFamily::IPV6; - net_address->ipv6->port = static_cast<uint16_t>(obj.port()); - net_address->ipv6->addr = Array<uint8_t>::From(obj.address().bytes()); - break; - default: - break; - } - - return net_address; -} - -} // namespace mojo
diff --git a/mojo/services/network/net_address_type_converters.h b/mojo/services/network/net_address_type_converters.h deleted file mode 100644 index f9999087..0000000 --- a/mojo/services/network/net_address_type_converters.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NET_ADDRESS_TYPE_CONVERTERS_H_ -#define MOJO_SERVICES_NETWORK_NET_ADDRESS_TYPE_CONVERTERS_H_ - -#include "mojo/public/cpp/bindings/type_converter.h" -#include "mojo/services/network/public/interfaces/net_address.mojom.h" -#include "net/base/ip_endpoint.h" - -namespace mojo { - -template <> -struct TypeConverter<net::IPEndPoint, NetAddressPtr> { - static net::IPEndPoint Convert(const NetAddressPtr& obj); -}; - -template <> -struct TypeConverter<NetAddressPtr, net::IPEndPoint> { - static NetAddressPtr Convert(const net::IPEndPoint& obj); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NET_ADDRESS_TYPE_CONVERTERS_H_
diff --git a/mojo/services/network/network_context.cc b/mojo/services/network/network_context.cc deleted file mode 100644 index 2272238..0000000 --- a/mojo/services/network/network_context.cc +++ /dev/null
@@ -1,199 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/network_context.h" - -#include <stddef.h> -#include <stdint.h> - -#include <algorithm> -#include <utility> -#include <vector> - -#include "base/base_paths.h" -#include "base/bind.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/path_service.h" -#include "base/strings/string_number_conversions.h" -#include "mojo/common/user_agent.h" -#include "mojo/services/network/url_loader_impl.h" -#include "net/cookies/cookie_monster.h" -#include "net/dns/host_resolver.h" -#include "net/dns/mapped_host_resolver.h" -#include "net/log/net_log_util.h" -#include "net/log/write_to_file_net_log_observer.h" -#include "net/proxy/proxy_service.h" -#include "net/ssl/channel_id_service.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_builder.h" - -namespace mojo { - -namespace { -// Applies the specified mapping rules when resolving hosts. Please see the -// comment of net::MappedHostResolver::AddRulesFromString() for rule format. -const char kHostResolverRules[] = "host-resolver-rules"; - -// Ignores certificate-related errors. -const char kIgnoreCertificateErrors[] = "ignore-certificate-errors"; - -// Logs network information to the specified file. -const char kLogNetLog[] = "log-net-log"; - -// Allows for forcing socket connections to HTTP/HTTPS to use fixed ports. -const char kTestingFixedHttpPort[] = "testing-fixed-http-port"; -const char kTestingFixedHttpsPort[] = "testing-fixed-https-port"; - -uint16_t GetPortNumber(const base::CommandLine& command_line, - const base::StringPiece& switch_name) { - std::string port_str = command_line.GetSwitchValueASCII(switch_name); - unsigned port; - if (!base::StringToUint(port_str, &port) || port > 65535) { - LOG(ERROR) << "Invalid value for switch " << switch_name << ": '" - << port_str << "' is not a valid port number."; - return 0; - } - return static_cast<uint16_t>(port); -} - -} // namespace - -class NetworkContext::MojoNetLog : public net::NetLog { - public: - MojoNetLog() { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (!command_line->HasSwitch(kLogNetLog)) - return; - - base::FilePath log_path = command_line->GetSwitchValuePath(kLogNetLog); - base::ScopedFILE file; -#if defined(OS_WIN) - file.reset(_wfopen(log_path.value().c_str(), L"w")); -#elif defined(OS_POSIX) - file.reset(fopen(log_path.value().c_str(), "w")); -#endif - if (!file) { - LOG(ERROR) << "Could not open file " << log_path.value() - << " for net logging"; - } else { - write_to_file_observer_.reset(new net::WriteToFileNetLogObserver()); - write_to_file_observer_->set_capture_mode( - net::NetLogCaptureMode::IncludeCookiesAndCredentials()); - write_to_file_observer_->StartObserving(this, std::move(file), nullptr, - nullptr); - } - } - - ~MojoNetLog() override { - if (write_to_file_observer_) - write_to_file_observer_->StopObserving(nullptr); - } - - private: - scoped_ptr<net::WriteToFileNetLogObserver> write_to_file_observer_; - - DISALLOW_COPY_AND_ASSIGN(MojoNetLog); -}; - -NetworkContext::NetworkContext( - scoped_ptr<net::URLRequestContext> url_request_context) - : net_log_(new MojoNetLog), - url_request_context_(std::move(url_request_context)), - in_shutdown_(false) { - url_request_context_->set_net_log(net_log_.get()); -} - -NetworkContext::NetworkContext( - const base::FilePath& base_path, - NetworkServiceDelegate* delegate) - : NetworkContext(MakeURLRequestContext(base_path, delegate)) { -} - -NetworkContext::~NetworkContext() { - in_shutdown_ = true; - // TODO(darin): Be careful about destruction order of member variables? - - // Call each URLLoaderImpl and ask it to release its net::URLRequest, as the - // corresponding net::URLRequestContext is going away with this - // NetworkContext. The loaders can be deregistering themselves in Cleanup(), - // so iterate over a copy. - for (auto& url_loader : url_loaders_) { - url_loader->Cleanup(); - } -} - -void NetworkContext::RegisterURLLoader(URLLoaderImpl* url_loader) { - DCHECK(url_loaders_.count(url_loader) == 0); - url_loaders_.insert(url_loader); -} - -void NetworkContext::DeregisterURLLoader(URLLoaderImpl* url_loader) { - if (!in_shutdown_) { - size_t removed_count = url_loaders_.erase(url_loader); - DCHECK(removed_count); - } -} - -size_t NetworkContext::GetURLLoaderCountForTesting() { - return url_loaders_.size(); -} - -// static -scoped_ptr<net::URLRequestContext> NetworkContext::MakeURLRequestContext( - const base::FilePath& base_path, - NetworkServiceDelegate* delegate) { - net::URLRequestContextBuilder builder; - net::URLRequestContextBuilder::HttpNetworkSessionParams params; - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(kIgnoreCertificateErrors)) - params.ignore_certificate_errors = true; - if (command_line->HasSwitch(kTestingFixedHttpPort)) { - params.testing_fixed_http_port = - GetPortNumber(*command_line, kTestingFixedHttpPort); - } - if (command_line->HasSwitch(kTestingFixedHttpsPort)) { - params.testing_fixed_https_port = - GetPortNumber(*command_line, kTestingFixedHttpsPort); - } - builder.set_http_network_session_params(params); - - if (command_line->HasSwitch(kHostResolverRules)) { - scoped_ptr<net::HostResolver> host_resolver( - net::HostResolver::CreateDefaultResolver(nullptr)); - scoped_ptr<net::MappedHostResolver> remapped_host_resolver( - new net::MappedHostResolver(std::move(host_resolver))); - remapped_host_resolver->SetRulesFromString( - command_line->GetSwitchValueASCII(kHostResolverRules)); - builder.set_host_resolver(std::move(remapped_host_resolver)); - } - - builder.set_accept_language("en-us,en"); - builder.set_user_agent(mojo::common::GetUserAgent()); - builder.set_proxy_service(net::ProxyService::CreateDirect()); - builder.set_transport_security_persister_path(base_path); - - net::URLRequestContextBuilder::HttpCacheParams cache_params; -#if defined(OS_ANDROID) - // On Android, we store the cache on disk becase we can run only a single - // instance of the shell at a time. - cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::DISK; - cache_params.path = base_path.Append(FILE_PATH_LITERAL("Cache")); -#else - // On desktop, we store the cache in memory so we can run many shells - // in parallel when running tests, otherwise the network services in each - // shell will corrupt the disk cache. - cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::IN_MEMORY; -#endif - - builder.EnableHttpCache(cache_params); - builder.set_file_enabled(true); - - return builder.Build(); -} - -} // namespace mojo
diff --git a/mojo/services/network/network_context.h b/mojo/services/network/network_context.h deleted file mode 100644 index 36da6d9..0000000 --- a/mojo/services/network/network_context.h +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NETWORK_CONTEXT_H_ -#define MOJO_SERVICES_NETWORK_NETWORK_CONTEXT_H_ - -#include <stddef.h> - -#include <set> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/sequenced_task_runner.h" - -namespace base { -class FilePath; -} - -namespace net { -class URLRequestContext; -} - -namespace mojo { -class URLLoader; -class URLLoaderImpl; -class NetworkServiceDelegate; - -class NetworkContext { - public: - explicit NetworkContext( - scoped_ptr<net::URLRequestContext> url_request_context); - NetworkContext( - const base::FilePath& base_path, - NetworkServiceDelegate* delegate); - ~NetworkContext(); - - net::URLRequestContext* url_request_context() { - return url_request_context_.get(); - } - - // These are called by individual url loaders as they are being created and - // destroyed. - void RegisterURLLoader(URLLoaderImpl* url_loader); - void DeregisterURLLoader(URLLoaderImpl* url_loader); - - private: - friend class UrlLoaderImplTest; - size_t GetURLLoaderCountForTesting(); - - static scoped_ptr<net::URLRequestContext> MakeURLRequestContext( - const base::FilePath& base_path, - NetworkServiceDelegate* delegate); - - class MojoNetLog; - scoped_ptr<class MojoNetLog> net_log_; - - scoped_ptr<net::URLRequestContext> url_request_context_; - // URLLoaderImpls register themselves with the NetworkContext so that they can - // be cleaned up when the NetworkContext goes away. This is needed as - // net::URLRequests held by URLLoaderImpls have to be gone when - // net::URLRequestContext (held by NetworkContext) is destroyed. - std::set<URLLoaderImpl*> url_loaders_; - - // Set when entering the destructor, in order to avoid manipulations of the - // |url_loaders_| (as a url_loader might delete itself in Cleanup()). - bool in_shutdown_; - - DISALLOW_COPY_AND_ASSIGN(NetworkContext); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NETWORK_CONTEXT_H_
diff --git a/mojo/services/network/network_service_delegate.cc b/mojo/services/network/network_service_delegate.cc deleted file mode 100644 index b257331..0000000 --- a/mojo/services/network/network_service_delegate.cc +++ /dev/null
@@ -1,115 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/network_service_delegate.h" - -#include <utility> - -#include "base/at_exit.h" -#include "base/base_paths.h" -#include "base/bind.h" -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/message_loop/message_loop.h" -#include "base/path_service.h" -#include "mojo/message_pump/message_pump_mojo.h" -#include "mojo/services/network/cookie_store_impl.h" -#include "mojo/services/network/network_service_delegate_observer.h" -#include "mojo/services/network/network_service_impl.h" -#include "mojo/services/network/url_loader_factory_impl.h" -#include "mojo/services/network/web_socket_factory_impl.h" -#include "mojo/shell/public/cpp/connection.h" -#include "mojo/util/capture_util.h" - -namespace { - -const char kUserDataDir[] = "user-data-dir"; - -} // namespace - -namespace mojo { - -NetworkServiceDelegate::NetworkServiceDelegate() { - ref_factory_.set_quit_closure( - base::Bind(&NetworkServiceDelegate::Quit, base::Unretained(this))); -} -NetworkServiceDelegate::~NetworkServiceDelegate() {} - -void NetworkServiceDelegate::AddObserver( - NetworkServiceDelegateObserver* observer) { - observers_.AddObserver(observer); -} - -void NetworkServiceDelegate::RemoveObserver( - NetworkServiceDelegateObserver* observer) { - observers_.RemoveObserver(observer); -} - -void NetworkServiceDelegate::Initialize(Connector* connector, - const Identity& identity, - uint32_t id) { - // TODO(erg): Find everything else that writes to the filesystem and - // transition it to proxying mojo:filesystem. We shouldn't have any path - // calculation code here, but sadly need it until the transition is done. In - // the mean time, manually handle the user-data-dir switch (which gets set in - // tests) so that tests are writing to a temp dir. - base::FilePath base_path; - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(kUserDataDir)) { - base_path = command_line->GetSwitchValuePath(kUserDataDir); - } else { - CHECK(PathService::Get(base::DIR_TEMP, &base_path)); - base_path = base_path.Append(FILE_PATH_LITERAL("network_service")); - } - - context_.reset(new NetworkContext(base_path, this)); - tracing_.Initialize(connector, identity.name()); -} - -bool NetworkServiceDelegate::AcceptConnection(Connection* connection) { - DCHECK(context_); - connection->AddInterface<CookieStore>(this); - connection->AddInterface<NetworkService>(this); - connection->AddInterface<URLLoaderFactory>(this); - connection->AddInterface<WebSocketFactory>(this); - return true; -} - -void NetworkServiceDelegate::Create(Connection* connection, - InterfaceRequest<NetworkService> request) { - new NetworkServiceImpl(ref_factory_.CreateRef(), std::move(request)); -} - -void NetworkServiceDelegate::Create(Connection* connection, - InterfaceRequest<CookieStore> request) { - // TODO(beng): need to find a way to get content origin. - new CookieStoreImpl( - context_.get(), GURL(), - ref_factory_.CreateRef(), std::move(request)); -} - -void NetworkServiceDelegate::Create( - Connection* connection, - InterfaceRequest<WebSocketFactory> request) { - new WebSocketFactoryImpl(context_.get(), ref_factory_.CreateRef(), - std::move(request)); -} - -void NetworkServiceDelegate::Create( - Connection* connection, - InterfaceRequest<URLLoaderFactory> request) { - new URLLoaderFactoryImpl(context_.get(), ref_factory_.CreateRef(), - std::move(request)); -} - -void NetworkServiceDelegate::Quit() { - // Destroy the NetworkContext now as it requires MessageLoop::current() upon - // destruction and it is the last moment we know for sure that it is - // running. - context_.reset(); -} - -} // namespace mojo
diff --git a/mojo/services/network/network_service_delegate.h b/mojo/services/network/network_service_delegate.h deleted file mode 100644 index 70989395..0000000 --- a/mojo/services/network/network_service_delegate.h +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_H_ -#define MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_H_ - -#include "base/macros.h" -#include "base/observer_list.h" -#include "base/threading/thread.h" -#include "mojo/services/network/network_context.h" -#include "mojo/services/network/public/interfaces/cookie_store.mojom.h" -#include "mojo/services/network/public/interfaces/network_service.mojom.h" -#include "mojo/services/network/public/interfaces/url_loader_factory.mojom.h" -#include "mojo/services/network/public/interfaces/web_socket_factory.mojom.h" -#include "mojo/services/tracing/public/cpp/tracing_impl.h" -#include "mojo/shell/public/cpp/interface_factory.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "mojo/shell/public/cpp/shell_client.h" - -namespace mojo { -class NetworkServiceDelegateObserver; - -class NetworkServiceDelegate : public ShellClient, - public InterfaceFactory<NetworkService>, - public InterfaceFactory<CookieStore>, - public InterfaceFactory<WebSocketFactory>, - public InterfaceFactory<URLLoaderFactory> { - public: - NetworkServiceDelegate(); - ~NetworkServiceDelegate() override; - - void AddObserver(NetworkServiceDelegateObserver* observer); - void RemoveObserver(NetworkServiceDelegateObserver* observer); - - private: - // mojo::ShellClient implementation. - void Initialize(Connector* connector, const Identity& identity, - uint32_t id) override; - bool AcceptConnection(Connection* connection) override; - - // InterfaceFactory<NetworkService> implementation. - void Create(Connection* connection, - InterfaceRequest<NetworkService> request) override; - - // InterfaceFactory<CookieStore> implementation. - void Create(Connection* connection, - InterfaceRequest<CookieStore> request) override; - - // InterfaceFactory<WebSocketFactory> implementation. - void Create(Connection* connection, - InterfaceRequest<WebSocketFactory> request) override; - - // InterfaceFactory<URLLoaderFactory> implementation. - void Create(Connection* connection, - InterfaceRequest<URLLoaderFactory> request) override; - - private: - void Quit(); - - mojo::TracingImpl tracing_; - - // Observers that want notifications that our worker thread is going away. - base::ObserverList<NetworkServiceDelegateObserver> observers_; - - scoped_ptr<NetworkContext> context_; - - mojo::MessageLoopRefFactory ref_factory_; - - DISALLOW_COPY_AND_ASSIGN(NetworkServiceDelegate); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_H_
diff --git a/mojo/services/network/network_service_delegate_observer.h b/mojo/services/network/network_service_delegate_observer.h deleted file mode 100644 index d205b67..0000000 --- a/mojo/services/network/network_service_delegate_observer.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_OBSERVER_H_ -#define MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_OBSERVER_H_ - -namespace mojo { - -// Observer of events on from the NetworkServiceDelegate. -// -// Observers should be registered on the main thread. -class NetworkServiceDelegateObserver { - public: - ~NetworkServiceDelegateObserver() {} - - // Broadcast right before we attempt to shutdown the IO worker thread. This - // is - virtual void OnIOWorkerThreadShutdown() = 0; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NETWORK_SERVICE_DELEGATE_OBSERVER_H_
diff --git a/mojo/services/network/network_service_impl.cc b/mojo/services/network/network_service_impl.cc deleted file mode 100644 index 1557da8..0000000 --- a/mojo/services/network/network_service_impl.cc +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/network_service_impl.h" - -#include <utility> - -#include "mojo/services/network/http_server_impl.h" -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/tcp_bound_socket_impl.h" -#include "mojo/services/network/udp_socket_impl.h" -#include "mojo/services/network/url_loader_impl.h" -#include "net/base/mime_util.h" - -namespace mojo { - -NetworkServiceImpl::NetworkServiceImpl( - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<NetworkService> request) - : app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -NetworkServiceImpl::~NetworkServiceImpl() { -} - -void NetworkServiceImpl::CreateTCPBoundSocket( - NetAddressPtr local_address, - InterfaceRequest<TCPBoundSocket> bound_socket, - const CreateTCPBoundSocketCallback& callback) { - scoped_ptr<TCPBoundSocketImpl> bound( - new TCPBoundSocketImpl(app_refcount_->Clone(), std::move(bound_socket))); - int net_error = bound->Bind(std::move(local_address)); - if (net_error != net::OK) { - callback.Run(MakeNetworkError(net_error), NetAddressPtr()); - return; - } - ignore_result(bound.release()); // Strongly owned by the message pipe. - NetAddressPtr resulting_local_address(bound->GetLocalAddress()); - callback.Run(MakeNetworkError(net::OK), std::move(resulting_local_address)); -} - -void NetworkServiceImpl::CreateTCPConnectedSocket( - NetAddressPtr remote_address, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const CreateTCPConnectedSocketCallback& callback) { - // TODO(brettw) implement this. We need to know what type of socket to use - // so we can create the right one (i.e. to pass to TCPSocket::Open) before - // doing the connect. - callback.Run(MakeNetworkError(net::ERR_NOT_IMPLEMENTED), NetAddressPtr()); -} - -void NetworkServiceImpl::CreateUDPSocket(InterfaceRequest<UDPSocket> request) { - // The lifetime of this UDPSocketImpl is bound to that of the underlying pipe. - new UDPSocketImpl(std::move(request), app_refcount_->Clone()); -} - -void NetworkServiceImpl::CreateHttpServer( - NetAddressPtr local_address, - HttpServerDelegatePtr delegate, - const CreateHttpServerCallback& callback) { - HttpServerImpl::Create(std::move(local_address), std::move(delegate), - app_refcount_->Clone(), callback); -} - -void NetworkServiceImpl::GetMimeTypeFromFile( - const mojo::String& file_path, - const GetMimeTypeFromFileCallback& callback) { - std::string mime; - net::GetMimeTypeFromFile( - base::FilePath::FromUTF8Unsafe(file_path.To<std::string>()), &mime); - callback.Run(mime); -} - -} // namespace mojo
diff --git a/mojo/services/network/network_service_impl.h b/mojo/services/network/network_service_impl.h deleted file mode 100644 index 014ca0f..0000000 --- a/mojo/services/network/network_service_impl.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_NETWORK_SERVICE_IMPL_H_ -#define MOJO_SERVICES_NETWORK_NETWORK_SERVICE_IMPL_H_ - -#include "base/compiler_specific.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/network_service.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "url/gurl.h" - -namespace mojo { - -class NetworkServiceImpl : public NetworkService { - public: - NetworkServiceImpl(scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<NetworkService> request); - ~NetworkServiceImpl() override; - - // NetworkService methods: - void CreateTCPBoundSocket( - NetAddressPtr local_address, - InterfaceRequest<TCPBoundSocket> bound_socket, - const CreateTCPBoundSocketCallback& callback) override; - void CreateTCPConnectedSocket( - NetAddressPtr remote_address, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const CreateTCPConnectedSocketCallback& callback) override; - void CreateUDPSocket(InterfaceRequest<UDPSocket> socket) override; - void CreateHttpServer(NetAddressPtr local_address, - HttpServerDelegatePtr delegate, - const CreateHttpServerCallback& callback) override; - void GetMimeTypeFromFile( - const mojo::String& file_path, - const GetMimeTypeFromFileCallback& callback) override; - - private: - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<NetworkService> binding_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_NETWORK_SERVICE_IMPL_H_
diff --git a/mojo/services/network/public/DEPS b/mojo/services/network/public/DEPS deleted file mode 100644 index 88036f82..0000000 --- a/mojo/services/network/public/DEPS +++ /dev/null
@@ -1,10 +0,0 @@ -include_rules = [ - "-build", - "-mojo", - "-net", - "-services", - "-testing", - "!mojo/message_pump", - "+mojo/public", - "+mojo/services/network/public", -]
diff --git a/mojo/services/network/public/cpp/BUILD.gn b/mojo/services/network/public/cpp/BUILD.gn deleted file mode 100644 index 8c2734e..0000000 --- a/mojo/services/network/public/cpp/BUILD.gn +++ /dev/null
@@ -1,24 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -source_set("cpp") { - public_configs = [ "../../../public/build/config:mojo_services" ] - sources = [ - "udp_socket_wrapper.cc", - "udp_socket_wrapper.h", - "web_socket_read_queue.cc", - "web_socket_read_queue.h", - "web_socket_write_queue.cc", - "web_socket_write_queue.h", - ] - - deps = [ - "../interfaces", - "//base", - "//mojo/message_pump", - "//mojo/public/c/system", - "//mojo/public/cpp/system", - "//mojo/shell/public/cpp", - ] -}
diff --git a/mojo/services/network/public/cpp/DEPS b/mojo/services/network/public/cpp/DEPS deleted file mode 100644 index dfe3bd8..0000000 --- a/mojo/services/network/public/cpp/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+network/public", -]
diff --git a/mojo/services/network/public/cpp/udp_socket_wrapper.cc b/mojo/services/network/public/cpp/udp_socket_wrapper.cc deleted file mode 100644 index ed74627..0000000 --- a/mojo/services/network/public/cpp/udp_socket_wrapper.cc +++ /dev/null
@@ -1,243 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <assert.h> -#include <stdint.h> -#include <utility> - -#include "base/logging.h" -#include "network/public/cpp/udp_socket_wrapper.h" - -namespace mojo { -namespace { - -const uint32_t kDefaultReceiveQueueSlots = 32; - -} // namespace - -UDPSocketWrapper::NegotiateCallbackHandler::NegotiateCallbackHandler( - UDPSocketWrapper* delegate) - : delegate_(delegate) { -} - -UDPSocketWrapper::NegotiateCallbackHandler::~NegotiateCallbackHandler() {} - -void UDPSocketWrapper::NegotiateCallbackHandler::Run( - uint32_t actual_size) const { - delegate_->OnNegotiateMaxPendingSendRequestsCompleted(actual_size); -} - -UDPSocketWrapper::SendCallbackHandler::SendCallbackHandler( - UDPSocketWrapper* delegate, - const ErrorCallback& forward_callback) - : delegate_(delegate), - forward_callback_(forward_callback) { -} - -UDPSocketWrapper::SendCallbackHandler::~SendCallbackHandler() {} - -void UDPSocketWrapper::SendCallbackHandler::Run(NetworkErrorPtr result) const { - delegate_->OnSendToCompleted(std::move(result), forward_callback_); -} - -UDPSocketWrapper::ReceiverBindingCallback::ReceiverBindingCallback( - UDPSocketWrapper* delegate, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& wrapper_callback) - : delegate_(delegate), wrapper_callback_(wrapper_callback) { -} - -UDPSocketWrapper::ReceiverBindingCallback::~ReceiverBindingCallback() { -} - -void UDPSocketWrapper::ReceiverBindingCallback::Run( - NetworkErrorPtr result, - NetAddressPtr addr, - InterfaceRequest<UDPSocketReceiver> request) const { - delegate_->StartReceivingData(std::move(request)); - wrapper_callback_.Run(std::move(result), std::move(addr)); -} - -UDPSocketWrapper::ReceivedData::ReceivedData() {} -UDPSocketWrapper::ReceivedData::~ReceivedData() {} - -UDPSocketWrapper::SendRequest::SendRequest() {} -UDPSocketWrapper::SendRequest::~SendRequest() {} - -UDPSocketWrapper::UDPSocketWrapper(UDPSocketPtr socket) - : binding_(this), - socket_(std::move(socket)), - max_receive_queue_size_(kDefaultReceiveQueueSlots), - max_pending_sends_(1), - current_pending_sends_(0) { - Initialize(0); -} - -UDPSocketWrapper::UDPSocketWrapper(UDPSocketPtr socket, - uint32_t receive_queue_slots, - uint32_t requested_max_pending_sends) - : binding_(this), - socket_(std::move(socket)), - max_receive_queue_size_(receive_queue_slots), - max_pending_sends_(1), - current_pending_sends_(0) { - Initialize(requested_max_pending_sends); -} - -UDPSocketWrapper::~UDPSocketWrapper() { - while (!receive_queue_.empty()) { - delete receive_queue_.front(); - receive_queue_.pop(); - } - while (!send_requests_.empty()) { - delete send_requests_.front(); - send_requests_.pop(); - } -} - -void UDPSocketWrapper::AllowAddressReuse(const ErrorCallback& callback) { - socket_->AllowAddressReuse(callback); -} - -void UDPSocketWrapper::Bind( - NetAddressPtr addr, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback) { - socket_->Bind( - std::move(addr), - BindOrConnectCallback(static_cast<BindOrConnectCallback::Runnable*>( - new ReceiverBindingCallback(this, callback)))); -} - -void UDPSocketWrapper::Connect( - NetAddressPtr remote_addr, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback) { - socket_->Connect( - std::move(remote_addr), - BindOrConnectCallback(static_cast<BindOrConnectCallback::Runnable*>( - new ReceiverBindingCallback(this, callback)))); -} - -void UDPSocketWrapper::SetSendBufferSize(uint32_t size, - const ErrorCallback& callback) { - socket_->SetSendBufferSize(size, callback); -} - -void UDPSocketWrapper::SetReceiveBufferSize(uint32_t size, - const ErrorCallback& callback) { - socket_->SetReceiveBufferSize(size, callback); -} - -bool UDPSocketWrapper::ReceiveFrom(const ReceiveCallback& callback) { - if (receive_queue_.empty()) { - receive_requests_.push(callback); - return false; - } - - ReceivedData* data = receive_queue_.front(); - receive_queue_.pop(); - socket_->ReceiveMore(1); - callback.Run(std::move(data->result), std::move(data->src_addr), - std::move(data->data)); - delete data; - return true; -} - -void UDPSocketWrapper::SendTo(NetAddressPtr dest_addr, - Array<uint8_t> data, - const ErrorCallback& callback) { - if (current_pending_sends_ >= max_pending_sends_) { - SendRequest* request = new SendRequest(); - request->dest_addr = std::move(dest_addr); - request->data = std::move(data); - request->callback = callback; - send_requests_.push(request); - return; - } - - DCHECK(send_requests_.empty()); - current_pending_sends_++; - socket_->SendTo(std::move(dest_addr), std::move(data), - ErrorCallback(static_cast<ErrorCallback::Runnable*>( - new SendCallbackHandler(this, callback)))); -} - -void UDPSocketWrapper::OnReceived(NetworkErrorPtr result, - NetAddressPtr src_addr, - Array<uint8_t> data) { - if (!receive_requests_.empty()) { - // The cache should be empty if there are user requests waiting for data. - DCHECK(receive_queue_.empty()); - - socket_->ReceiveMore(1); - - ReceiveCallback callback = receive_requests_.front(); - receive_requests_.pop(); - - callback.Run(std::move(result), std::move(src_addr), std::move(data)); - return; - } - - DCHECK(receive_queue_.size() < max_receive_queue_size_); - ReceivedData* received_data = new ReceivedData(); - received_data->result = std::move(result); - received_data->src_addr = std::move(src_addr); - received_data->data = std::move(data); - receive_queue_.push(received_data); -} - -void UDPSocketWrapper::Initialize(uint32_t requested_max_pending_sends) { - socket_->NegotiateMaxPendingSendRequests( - requested_max_pending_sends, - Callback<void(uint32_t)>( - static_cast< Callback<void(uint32_t)>::Runnable*>( - new NegotiateCallbackHandler(this)))); -} - -void UDPSocketWrapper::OnNegotiateMaxPendingSendRequestsCompleted( - uint32_t actual_size) { - DCHECK(max_pending_sends_ == 1); - - if (actual_size == 0) { - assert(false); - return; - } - - max_pending_sends_ = actual_size; - - while (ProcessNextSendRequest()); -} - -void UDPSocketWrapper::OnSendToCompleted( - NetworkErrorPtr result, - const ErrorCallback& forward_callback) { - current_pending_sends_--; - ProcessNextSendRequest(); - - forward_callback.Run(std::move(result)); -} - -bool UDPSocketWrapper::ProcessNextSendRequest() { - if (current_pending_sends_ >= max_pending_sends_ || send_requests_.empty()) - return false; - - SendRequest* request = send_requests_.front(); - send_requests_.pop(); - - current_pending_sends_++; - - socket_->SendTo(std::move(request->dest_addr), std::move(request->data), - ErrorCallback(static_cast<ErrorCallback::Runnable*>( - new SendCallbackHandler(this, request->callback)))); - - delete request; - - return true; -} - -void UDPSocketWrapper::StartReceivingData( - InterfaceRequest<UDPSocketReceiver> request) { - binding_.Bind(std::move(request)); - socket_->ReceiveMore(max_receive_queue_size_); -} - -} // namespace mojo
diff --git a/mojo/services/network/public/cpp/udp_socket_wrapper.h b/mojo/services/network/public/cpp/udp_socket_wrapper.h deleted file mode 100644 index cf3266e8..0000000 --- a/mojo/services/network/public/cpp/udp_socket_wrapper.h +++ /dev/null
@@ -1,184 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ -#define MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ - -#include <stdint.h> - -#include <queue> - -#include "mojo/public/cpp/bindings/binding.h" -#include "network/public/interfaces/udp_socket.mojom.h" - -namespace mojo { - -// This class is a wrapper around the UDPSocket interface. It provides local -// cache for received datagrams as well as for (excessive) send requests: -// - You call ReceiveFrom() to retrieve one datagram. If there is already cached -// data, the operation completes synchronously. -// - You don't need to worry about the max-pending-send-requests restriction -// imposed by the service side. If you make many SendTo() calls in a short -// period of time, it caches excessive requests and sends them later. -class UDPSocketWrapper : public UDPSocketReceiver { - public: - using ReceiveCallback = - Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>; - using ErrorCallback = Callback<void(NetworkErrorPtr)>; - using BindOrConnectCallback = - Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>; - - explicit UDPSocketWrapper(UDPSocketPtr socket); - - // |receive_queue_slots| determines the size (in datagrams) of the local - // receive queue, which caches incoming datagrams. - // |requested_max_pending_sends| is used to call - // NegotiateMaxPendingSendRequests() on |socket|. - // The two numbers should be greater than 0. If you would like to use default - // values, please use the other constructor. - UDPSocketWrapper(UDPSocketPtr socket, - uint32_t receive_queue_slots, - uint32_t requested_max_pending_sends); - - ~UDPSocketWrapper() override; - - void AllowAddressReuse(const ErrorCallback& callback); - - void Bind(NetAddressPtr addr, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback); - - void Connect(NetAddressPtr remote_addr, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback); - - void SetSendBufferSize(uint32_t size, const ErrorCallback& callback); - - void SetReceiveBufferSize(uint32_t size, const ErrorCallback& callback); - - // If there are already incoming datagrams cached locally, this method runs - // |callback| before it returns, and the return value is set to true. - // Otherwise, the return value is set to false and the callback will be run - // asynchronously. - // If the socket is connected, the net address pointer passed into the - // callback is set to null. - bool ReceiveFrom(const ReceiveCallback& callback); - - // This method is aware of the max pending send requests allowed by the - // service, and caches send requests locally if necessary. - // |dest_addr| is allowed to be null if the socket is connected. - void SendTo(NetAddressPtr dest_addr, - Array<uint8_t> data, - const ErrorCallback& callback); - - private: - class NegotiateCallbackHandler : public Callback<void(uint32_t)>::Runnable { - public: - explicit NegotiateCallbackHandler(UDPSocketWrapper* delegate); - ~NegotiateCallbackHandler() override; - - // Callback<void(uint32_t)>::Runnable implementation: - void Run(uint32_t actual_size) const override; - - private: - // Because this callback is passed to a method of |socket_|, and |socket_| - // is owned by |delegate_|, it should be safe to assume that |delegate_| is - // valid if/when Run() is called. - UDPSocketWrapper* delegate_; - }; - - class SendCallbackHandler : public ErrorCallback::Runnable { - public: - explicit SendCallbackHandler(UDPSocketWrapper* delegate, - const ErrorCallback& forward_callback); - ~SendCallbackHandler() override; - - // ErrorCallback::Runnable implementation: - void Run(NetworkErrorPtr result) const override; - - private: - // Because this callback is passed to a method of |socket_|, and |socket_| - // is owned by |delegate_|, it should be safe to assume that |delegate_| is - // valid if/when Run() is called. - UDPSocketWrapper* delegate_; - ErrorCallback forward_callback_; - }; - - class ReceiverBindingCallback : public BindOrConnectCallback::Runnable { - public: - ReceiverBindingCallback( - UDPSocketWrapper* delegate, - const Callback<void(NetworkErrorPtr, NetAddressPtr)>& wrapper_callback); - ~ReceiverBindingCallback() override; - - // BindOrConnectCallback::Runnable implementation: - void Run(NetworkErrorPtr result, - NetAddressPtr addr, - InterfaceRequest<UDPSocketReceiver> request) const override; - - private: - // Because this callback is passed to a method of |socket_|, and |socket_| - // is owned by |delegate_|, it should be safe to assume that |delegate_| is - // valid if/when Run() is called. - UDPSocketWrapper* delegate_; - const Callback<void(NetworkErrorPtr, NetAddressPtr)> wrapper_callback_; - }; - - struct ReceivedData { - ReceivedData(); - ~ReceivedData(); - - NetworkErrorPtr result; - NetAddressPtr src_addr; - Array<uint8_t> data; - }; - - struct SendRequest { - SendRequest(); - ~SendRequest(); - - NetAddressPtr dest_addr; - Array<uint8_t> data; - ErrorCallback callback; - }; - - // UDPSocketReceiver implementation: - void OnReceived(NetworkErrorPtr result, - NetAddressPtr src_addr, - Array<uint8_t> data) override; - - void Initialize(uint32_t requested_max_pending_sends); - void OnNegotiateMaxPendingSendRequestsCompleted(uint32_t actual_size); - - void OnSendToCompleted(NetworkErrorPtr result, - const ErrorCallback& forward_callback); - - // Returns true if a send request in |send_requests_| has been processed. - bool ProcessNextSendRequest(); - - // Binds to a UDPSocketReceiver request and notifies |socket_| that we're - // ready to start receiving data. - void StartReceivingData(InterfaceRequest<UDPSocketReceiver> request); - - Binding<UDPSocketReceiver> binding_; - - UDPSocketPtr socket_; - - uint32_t max_receive_queue_size_; - - // Owns all the objects that its elements point to. - std::queue<ReceivedData*> receive_queue_; - - std::queue<ReceiveCallback> receive_requests_; - - uint32_t max_pending_sends_; - uint32_t current_pending_sends_; - - // Owns all the objects that its elements point to. - std::queue<SendRequest*> send_requests_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_
diff --git a/mojo/services/network/public/cpp/web_socket_read_queue.cc b/mojo/services/network/public/cpp/web_socket_read_queue.cc deleted file mode 100644 index 96160c4..0000000 --- a/mojo/services/network/public/cpp/web_socket_read_queue.cc +++ /dev/null
@@ -1,127 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "network/public/cpp/web_socket_read_queue.h" - -#include <stdint.h> - -#include "base/bind.h" -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" - -namespace mojo { - -struct WebSocketReadQueue::Operation { - Operation(uint32_t num_bytes, - const base::Callback<void(const char*)>& callback) - : num_bytes_(num_bytes), callback_(callback), current_num_bytes_(0) {} - - uint32_t num_bytes_; - base::Callback<void(const char*)> callback_; - - // If the initial read doesn't return enough data, this array is used to - // accumulate data from multiple reads. - scoped_ptr<char[]> data_buffer_; - // The number of bytes accumulated so far. - uint32_t current_num_bytes_; -}; - -WebSocketReadQueue::WebSocketReadQueue(DataPipeConsumerHandle handle) - : handle_(handle), is_busy_(false), weak_factory_(this) { -} - -WebSocketReadQueue::~WebSocketReadQueue() { -} - -void WebSocketReadQueue::Read( - uint32_t num_bytes, - const base::Callback<void(const char*)>& callback) { - Operation* op = new Operation(num_bytes, callback); - queue_.push_back(op); - - if (is_busy_) - return; - - is_busy_ = true; - TryToRead(); -} - -void WebSocketReadQueue::TryToRead() { - DCHECK(is_busy_); - DCHECK(!queue_.empty()); - do { - Operation* op = queue_[0]; - const void* buffer = nullptr; - uint32_t buffer_size = 0; - MojoResult result = BeginReadDataRaw(handle_, &buffer, &buffer_size, - MOJO_READ_DATA_FLAG_NONE); - if (result == MOJO_RESULT_SHOULD_WAIT) { - Wait(); - return; - } - - // http://crbug.com/490193 This should run callback as well. May need to - // change the callback signature. - if (result != MOJO_RESULT_OK) - return; - - uint32_t bytes_read = buffer_size < op->num_bytes_ - op->current_num_bytes_ - ? buffer_size - : op->num_bytes_ - op->current_num_bytes_; - - // If this is not the initial read, or this is the initial read but doesn't - // return enough data, copy the data into |op->data_buffer_|. - if (op->data_buffer_ || - bytes_read < op->num_bytes_ - op->current_num_bytes_) { - if (!op->data_buffer_) { - DCHECK_EQ(0u, op->current_num_bytes_); - op->data_buffer_.reset(new char[op->num_bytes_]); - } - - memcpy(op->data_buffer_.get() + op->current_num_bytes_, buffer, - bytes_read); - } - op->current_num_bytes_ += bytes_read; - DataPipeConsumerHandle handle = handle_; - base::WeakPtr<WebSocketReadQueue> self(weak_factory_.GetWeakPtr()); - - if (op->current_num_bytes_ >= op->num_bytes_) { - DCHECK_EQ(op->current_num_bytes_, op->num_bytes_); - const char* returned_buffer = op->data_buffer_ - ? op->data_buffer_.get() - : static_cast<const char*>(buffer); - - // Ensure |op| is deleted, whether or not |this| goes away. - scoped_ptr<Operation> op_deleter(op); - queue_.weak_erase(queue_.begin()); - - // This call may delete |this|. In that case, |self| will be invalidated. - // It may re-enter Read() too. Because |is_busy_| is true during the whole - // process, TryToRead() won't be re-entered. - op->callback_.Run(returned_buffer); - } - - EndReadDataRaw(handle, bytes_read); - - if (!self) - return; - } while (!queue_.empty()); - is_busy_ = false; -} - -void WebSocketReadQueue::Wait() { - DCHECK(is_busy_); - handle_watcher_.Start( - handle_, - MOJO_HANDLE_SIGNAL_READABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&WebSocketReadQueue::OnHandleReady, base::Unretained(this))); -} - -void WebSocketReadQueue::OnHandleReady(MojoResult result) { - DCHECK(is_busy_); - TryToRead(); -} - -} // namespace mojo
diff --git a/mojo/services/network/public/cpp/web_socket_read_queue.h b/mojo/services/network/public/cpp/web_socket_read_queue.h deleted file mode 100644 index 01efe3b..0000000 --- a/mojo/services/network/public/cpp/web_socket_read_queue.h +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_READ_QUEUE_H_ -#define MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_READ_QUEUE_H_ - -#include <stdint.h> - -#include "base/callback.h" -#include "base/memory/scoped_vector.h" -#include "base/memory/weak_ptr.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/public/cpp/system/data_pipe.h" - -namespace mojo { - -// This class simplifies the handling of multiple Reads on a DataPipe. It reads -// the data in the expected chunk size, calling the callback once a full chunk -// is ready. Callbacks are owned by this class, and are guaranteed not to be -// called after this class is destroyed. -// See also: WebSocketWriteQueue -class WebSocketReadQueue { - public: - explicit WebSocketReadQueue(DataPipeConsumerHandle handle); - ~WebSocketReadQueue(); - - void Read(uint32_t num_bytes, - const base::Callback<void(const char*)>& callback); - - private: - struct Operation; - - void TryToRead(); - void Wait(); - void OnHandleReady(MojoResult result); - - DataPipeConsumerHandle handle_; - common::HandleWatcher handle_watcher_; - ScopedVector<Operation> queue_; - bool is_busy_; - base::WeakPtrFactory<WebSocketReadQueue> weak_factory_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_READ_QUEUE_H_
diff --git a/mojo/services/network/public/cpp/web_socket_write_queue.cc b/mojo/services/network/public/cpp/web_socket_write_queue.cc deleted file mode 100644 index e47260a..0000000 --- a/mojo/services/network/public/cpp/web_socket_write_queue.cc +++ /dev/null
@@ -1,104 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "network/public/cpp/web_socket_write_queue.h" - -#include <stdint.h> - -#include "base/bind.h" -#include "base/logging.h" - -namespace mojo { - -struct WebSocketWriteQueue::Operation { - uint32_t num_bytes_; - base::Callback<void(const char*)> callback_; - - const char* data_; - // Only initialized if the initial Write fails. This saves a copy in - // the common case. - std::vector<char> data_copy_; -}; - -WebSocketWriteQueue::WebSocketWriteQueue(DataPipeProducerHandle handle) - : handle_(handle), is_busy_(false), weak_factory_(this) { -} - -WebSocketWriteQueue::~WebSocketWriteQueue() { -} - -void WebSocketWriteQueue::Write(const char* data, - uint32_t num_bytes, - base::Callback<void(const char*)> callback) { - Operation* op = new Operation; - op->num_bytes_ = num_bytes; - op->callback_ = callback; - op->data_ = data; - queue_.push_back(op); - - if (!is_busy_) { - is_busy_ = true; - // This call may reset |is_busy_| to false. - TryToWrite(); - } - - if (is_busy_) { - // If we have to wait, make a local copy of the data so we know it will - // live until we need it. - op->data_copy_.resize(num_bytes); - memcpy(&op->data_copy_[0], data, num_bytes); - op->data_ = &op->data_copy_[0]; - } -} - -void WebSocketWriteQueue::TryToWrite() { - DCHECK(is_busy_); - DCHECK(!queue_.empty()); - do { - Operation* op = queue_[0]; - uint32_t bytes_written = op->num_bytes_; - MojoResult result = WriteDataRaw( - handle_, op->data_, &bytes_written, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE); - if (result == MOJO_RESULT_SHOULD_WAIT) { - Wait(); - return; - } - - // Ensure |op| is deleted, whether or not |this| goes away. - scoped_ptr<Operation> op_deleter(op); - queue_.weak_erase(queue_.begin()); - - // http://crbug.com/490193 This should run callback as well. May need to - // change the callback signature. - if (result != MOJO_RESULT_OK) - return; - - base::WeakPtr<WebSocketWriteQueue> self(weak_factory_.GetWeakPtr()); - - // This call may delete |this|. In that case, |self| will be invalidated. - // It may re-enter Write() too. Because |is_busy_| is true during the whole - // process, TryToWrite() won't be re-entered. - op->callback_.Run(op->data_); - - if (!self) - return; - } while (!queue_.empty()); - is_busy_ = false; -} - -void WebSocketWriteQueue::Wait() { - DCHECK(is_busy_); - handle_watcher_.Start(handle_, - MOJO_HANDLE_SIGNAL_WRITABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&WebSocketWriteQueue::OnHandleReady, - base::Unretained(this))); -} - -void WebSocketWriteQueue::OnHandleReady(MojoResult result) { - DCHECK(is_busy_); - TryToWrite(); -} - -} // namespace mojo
diff --git a/mojo/services/network/public/cpp/web_socket_write_queue.h b/mojo/services/network/public/cpp/web_socket_write_queue.h deleted file mode 100644 index fe513aa..0000000 --- a/mojo/services/network/public/cpp/web_socket_write_queue.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_WRITE_QUEUE_H_ -#define MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_WRITE_QUEUE_H_ - -#include <stdint.h> - -#include "base/callback.h" -#include "base/memory/scoped_vector.h" -#include "base/memory/weak_ptr.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/public/cpp/system/data_pipe.h" - -namespace mojo { - -// This class simplifies the handling of multiple Writes on a DataPipe. It -// writes each chunk all at once (or waits until the pipe is ready before -// writing), calling the callback when finished. Callbacks are owned by this -// class, and are guaranteed not to be called after this class is destroyed. -// See also: WebSocketReadQueue -class WebSocketWriteQueue { - public: - explicit WebSocketWriteQueue(DataPipeProducerHandle handle); - ~WebSocketWriteQueue(); - - void Write(const char* data, - uint32_t num_bytes, - base::Callback<void(const char*)> callback); - - private: - struct Operation; - - void TryToWrite(); - void Wait(); - void OnHandleReady(MojoResult result); - - DataPipeProducerHandle handle_; - common::HandleWatcher handle_watcher_; - ScopedVector<Operation> queue_; - bool is_busy_; - base::WeakPtrFactory<WebSocketWriteQueue> weak_factory_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_PUBLIC_CPP_WEB_SOCKET_WRITE_QUEUE_H_
diff --git a/mojo/services/network/public/interfaces/BUILD.gn b/mojo/services/network/public/interfaces/BUILD.gn deleted file mode 100644 index 64ad3dc..0000000 --- a/mojo/services/network/public/interfaces/BUILD.gn +++ /dev/null
@@ -1,27 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//mojo/public/tools/bindings/mojom.gni") - -mojom("interfaces") { - sources = [ - "cookie_store.mojom", - "http_connection.mojom", - "http_message.mojom", - "http_server.mojom", - "net_address.mojom", - "network_error.mojom", - "network_service.mojom", - "tcp_bound_socket.mojom", - "tcp_connected_socket.mojom", - "tcp_server_socket.mojom", - "udp_socket.mojom", - "url_loader.mojom", - "url_loader_factory.mojom", - "web_socket.mojom", - "web_socket_factory.mojom", - ] - - import_dirs = [ get_path_info("../../../", "abspath") ] -}
diff --git a/mojo/services/network/public/interfaces/cookie_store.mojom b/mojo/services/network/public/interfaces/cookie_store.mojom deleted file mode 100644 index 92a4241..0000000 --- a/mojo/services/network/public/interfaces/cookie_store.mojom +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -interface CookieStore { - Get(string url) => (string cookies); - Set(string url, string cookie) => (bool success); -};
diff --git a/mojo/services/network/public/interfaces/http_connection.mojom b/mojo/services/network/public/interfaces/http_connection.mojom deleted file mode 100644 index 2cb79bd9..0000000 --- a/mojo/services/network/public/interfaces/http_connection.mojom +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/http_message.mojom"; -import "network/public/interfaces/network_error.mojom"; -import "network/public/interfaces/web_socket.mojom"; - -interface HttpConnection { - // Sets the OS send buffer size (in bytes) for the underlying socket. - SetSendBufferSize(uint32 size) => (NetworkError result); - - // Sets the OS receive buffer size (in bytes) for the underlying socket. - SetReceiveBufferSize(uint32 size) => (NetworkError result); -}; - -interface HttpConnectionDelegate { - // Called when an HTTP request is received. - OnReceivedRequest(HttpRequest request) => (HttpResponse response); - - // Called when an WebSocket request is received. - // - // If the delegate decides to accept the request, it should respond with - // non-null arguments in the callback. |send_stream| is a data pipe which - // should remain open for the lifetime of the WebSocket. Data to send over the - // WebSocket should be written to the producer end of the |send_stream|. - // |web_socket| will be already connected. There is no need to call Connect() - // on it. But |client| will still receive a DidConnect() notification. - // - // NOTE: WebSocket server support is not fully implemented. For now the - // following are not supported: - // - negotiating subprotocol or extension; - // - fragmented or non-text messages; - // - failure or close notification; - // - flow control. - OnReceivedWebSocketRequest(HttpRequest request) - => (WebSocket&? web_socket, - handle<data_pipe_consumer>? send_stream, - WebSocketClient? client); -};
diff --git a/mojo/services/network/public/interfaces/http_message.mojom b/mojo/services/network/public/interfaces/http_message.mojom deleted file mode 100644 index b89ba843..0000000 --- a/mojo/services/network/public/interfaces/http_message.mojom +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -struct HttpHeader { - string name; - string value; -}; - -struct HttpRequest { - string method = "GET"; - string url; - array<HttpHeader>? headers; - handle<data_pipe_consumer>? body; -}; - -struct HttpResponse { - uint32 status_code = 200; - array<HttpHeader>? headers; - handle<data_pipe_consumer>? body; -};
diff --git a/mojo/services/network/public/interfaces/http_server.mojom b/mojo/services/network/public/interfaces/http_server.mojom deleted file mode 100644 index dde9c45b..0000000 --- a/mojo/services/network/public/interfaces/http_server.mojom +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/http_connection.mojom"; - -interface HttpServerDelegate { - // Called when a connection is established. - OnConnected(HttpConnection connection, HttpConnectionDelegate& delegate); -};
diff --git a/mojo/services/network/public/interfaces/net_address.mojom b/mojo/services/network/public/interfaces/net_address.mojom deleted file mode 100644 index e91973bd..0000000 --- a/mojo/services/network/public/interfaces/net_address.mojom +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -enum NetAddressFamily { - UNSPECIFIED, - IPV4, - IPV6 -}; - -struct NetAddressIPv4 { - // The port number. This is in the local machine's endianness. - uint16 port; - - // The address is expressed in network byte order, so the most significant - // byte ("127" in the address "127.0.0.1") will be at index 0. - array<uint8, 4> addr; -}; - -// All members are expressed in network byte order. -struct NetAddressIPv6 { - // The port number. This is in the local machine's endianness. - uint16 port; - - // The address is expressed in network byte order, so the most significant - // byte is at index 0. - array<uint8, 16> addr; -}; - -struct NetAddress { - NetAddressFamily family = UNSPECIFIED; - - // At most one of the following fields is non-NULL depending on the value of - // |family|. - NetAddressIPv4? ipv4; - NetAddressIPv6? ipv6; -};
diff --git a/mojo/services/network/public/interfaces/network_error.mojom b/mojo/services/network/public/interfaces/network_error.mojom deleted file mode 100644 index 8c229485..0000000 --- a/mojo/services/network/public/interfaces/network_error.mojom +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -struct NetworkError { - int32 code; - string? description; -};
diff --git a/mojo/services/network/public/interfaces/network_service.mojom b/mojo/services/network/public/interfaces/network_service.mojom deleted file mode 100644 index e0c68249..0000000 --- a/mojo/services/network/public/interfaces/network_service.mojom +++ /dev/null
@@ -1,70 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/cookie_store.mojom"; -import "network/public/interfaces/http_server.mojom"; -import "network/public/interfaces/net_address.mojom"; -import "network/public/interfaces/network_error.mojom"; -import "network/public/interfaces/tcp_bound_socket.mojom"; -import "network/public/interfaces/tcp_connected_socket.mojom"; -import "network/public/interfaces/udp_socket.mojom"; -import "network/public/interfaces/web_socket.mojom"; - -// TODO(beng): consider if this should be further reduced to functionality- -// specific interfaces. -interface NetworkService { - // Creates a TCP socket bound to a given local address. This bound socket - // can be used for creating a client or server socket on that local address. - // - // If you want to create a client socket to connect to a server and are in - // the common case where you don't care about the local address it's bound - // to, use CreateTCPConnectedSocket. - // - // The local address can specify 0 for the port to specify that the OS should - // pick an available port for the given address, or it can pass 0 for the - // address and port for the OS to pick both the local address and port. In - // all success cases, the resulting local address will be passed to the - // callback as bound_to. - CreateTCPBoundSocket(NetAddress? local_address, - TCPBoundSocket& bound_socket) - => (NetworkError result, NetAddress? bound_to); - - // Creates a client socket connected to the given remote address. A local - // address and port will be allocated for the connection and passed to the - // callback on success. - // - // If you want control over the local address and port, instead use - // CreateTCPBoundSocket. - // - // IMPORTANT: This does not work yet! We need to add a new parameter to - // indicate the protocol type (IPv4 or IPv6) actually be able to create the - // right type of socket. We also need to figure out how the client is supposed - // to decide between IPv4 and IPv6 on a given system. - CreateTCPConnectedSocket(NetAddress remote_address, - handle<data_pipe_consumer> send_stream, - handle<data_pipe_producer> receive_stream, - TCPConnectedSocket& client_socket) - => (NetworkError result, - NetAddress? local_address); - - CreateUDPSocket(UDPSocket& socket); - - // Starts an HTTP server running on the given local address. The delegate will - // be notified with incoming connections. - // - // The local address can specify 0 for the port to specify that the OS should - // pick an available port for the given address, or it can pass 0 for the - // address and port for the OS to pick both the local address and port. In - // all success cases, the resulting local address will be passed to the - // callback as bound_to. - CreateHttpServer(NetAddress local_address, - HttpServerDelegate delegate) - => (NetworkError result, - NetAddress? bound_to); - - // Get the mime type (if any) that is associated with the given file. - GetMimeTypeFromFile(string file_path) => (string mime_type); -};
diff --git a/mojo/services/network/public/interfaces/tcp_bound_socket.mojom b/mojo/services/network/public/interfaces/tcp_bound_socket.mojom deleted file mode 100644 index c8747d8..0000000 --- a/mojo/services/network/public/interfaces/tcp_bound_socket.mojom +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/net_address.mojom"; -import "network/public/interfaces/network_error.mojom"; -import "network/public/interfaces/tcp_connected_socket.mojom"; -import "network/public/interfaces/tcp_server_socket.mojom"; - -// Represents a TCP socket that is bound to a local address and port, but -// is not yet in a listening or connected state. -// -// A bound socket can be used to create a server socket listening on the -// local address, or it can be used to create a client socket by connecting to -// a remote host. Once StartListening or Connect is called on the bound socket, -// ownership of the underlying socket will be transferred to the connected or -// server socket, and the bound socket may be closed. -interface TCPBoundSocket { - // Puts the socket into server mode, awaiting incoming connections. - // - // Once this function is called, neither StartListening nor Connect can be - // used on this socket again. - StartListening(TCPServerSocket& server) => (NetworkError result); - - // Puts this socket into client mode by connecting to a remote host. If you - // do not care about the local address or port, you can call - // NetworkService.CreateTCPConnectedSocket to connect directly and skip the - // "bound" state. - // - // Once this function is called, neither StartListening nor Connect can be - // used on this socket again. - Connect(NetAddress remote_address, - handle<data_pipe_consumer> send_stream, - handle<data_pipe_producer> receive_stream, - TCPConnectedSocket& client_socket) - => (NetworkError result); -};
diff --git a/mojo/services/network/public/interfaces/tcp_connected_socket.mojom b/mojo/services/network/public/interfaces/tcp_connected_socket.mojom deleted file mode 100644 index 3f0c160..0000000 --- a/mojo/services/network/public/interfaces/tcp_connected_socket.mojom +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -// Represents a TCP socket connected to a remote system. -// -// Reading and writing over the connection are done via the data pipe supplied -// by the caller when creating the socket. -interface TCPConnectedSocket { - // TODO(brettw) here we put options and what not for controlling the - // connection. -};
diff --git a/mojo/services/network/public/interfaces/tcp_server_socket.mojom b/mojo/services/network/public/interfaces/tcp_server_socket.mojom deleted file mode 100644 index 9305e1b..0000000 --- a/mojo/services/network/public/interfaces/tcp_server_socket.mojom +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/net_address.mojom"; -import "network/public/interfaces/network_error.mojom"; -import "network/public/interfaces/tcp_connected_socket.mojom"; - -// Represents a TCP server socket listening for incoming requests. -interface TCPServerSocket { - // Waits for an incoming connection request and hooks up a TCPConnectedSocket - // for connecting with the remote host. Only one Accept call can be pending - // at a time. - // - // Once a connection has been established (indicated by a successful - // callback), the TCPConnectedSocket may outlive the TCPServerSocket that - // created it. - // - // On success, the address of the remote host will be provided. - Accept(handle<data_pipe_consumer> send_stream, - handle<data_pipe_producer> receive_stream, - TCPConnectedSocket& client_socket) - => (NetworkError result, NetAddress? remote_address); -};
diff --git a/mojo/services/network/public/interfaces/udp_socket.mojom b/mojo/services/network/public/interfaces/udp_socket.mojom deleted file mode 100644 index 5bb40785..0000000 --- a/mojo/services/network/public/interfaces/udp_socket.mojom +++ /dev/null
@@ -1,120 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/net_address.mojom"; -import "network/public/interfaces/network_error.mojom"; - -// UDPSocket and UDPSocketReceiver represent a UDP socket and its client. The -// typical flow of using the interfaces is: -// - Acquire a UDPSocket interface pointer. -// - (optional) Set options which are allowed prior to Bind()/Connect(). -// - Bind or connect the socket. -// - (optional) Bind the UDPSocketReceiver request returned by Bind()/Connect() -// - (optional) Set options which are allowed after Bind()/Connect(). -// - Send / request to receive datagrams. Received datagrams will be delivered -// to the bound receiver's OnReceived() call. -interface UDPSocket { - // Allows the socket to share the local address to which it will be bound with - // other processes. Should be called before Bind(). - // (This is equivalent to SO_REUSEADDR of the POSIX socket API.) - AllowAddressReuse() => (NetworkError result); - - // Binds the socket to the given address. The socket must not be bound or - // connected. - // |bound_addr| is non-null on success. It might not be the same as |addr|. - // For example, if port 0 is used in |addr|, an available port is picked and - // returned in |bound_addr|. The caller may provide an implementation of - // |receiver| to receive datagrams read from the socket. |receiver| is null - // on failure. - Bind(NetAddress addr) => (NetworkError result, NetAddress? bound_addr, - UDPSocketReceiver&? receiver); - - // Connects the socket to the remote address. The socket must not be bound or - // connected. - // |local_addr| is non-null on success. - // The caller may provide an implementation of |receiver| to receive datagrams - // read from the socket. |receiver| is null on failure. - Connect(NetAddress remote_addr) => (NetworkError result, - NetAddress? local_addr, - UDPSocketReceiver&? receiver); - - // Sets the OS send buffer size (in bytes) for the socket. The socket must be - // bound or connected. - SetSendBufferSize(uint32 size) => (NetworkError result); - - // Sets the OS receive buffer size (in bytes) for the socket. The socket must - // be bound or connected. - SetReceiveBufferSize(uint32 size) => (NetworkError result); - - // Negotiates the maximum number of pending SendTo() requests. If - // |requested_size| is set to 0, this method queries the current settings. - // - // The service stores SendTo() requests in a queue while they are waiting to - // be executed (i.e., while they are waiting to be placed in the OS send - // buffer and sent out). This method negotiates how many requests (not bytes) - // this queue is able to store. If the queue is full, the service fails new - // requests directly with error code ERR_INSUFFICIENT_RESOURCES and discards - // those datagrams. If the client wants to avoid such failures, it needs to - // keep track of how many SendTo() calls are pending and make sure the number - // doesn't exceed the result of this method. - NegotiateMaxPendingSendRequests(uint32 requested_size) - => (uint32 actual_size); - - // Notifies that the receiver is ready to accept |number| of datagrams. - // Correspondingly, OnReceived() of the UDPSocketReceiver interface will be - // called |number| times (errors also count), unless the connection is closed - // before that. - // - // It is allowed to call this method again before the previous request is - // completely satisfied. For example: - // service->ReceiveMore(3); - // ... - // // OnReceived() is called. - // // OnReceived() is called. - // ... - // service->ReceiveMore(3); - // // The client expects 4 more calls to OnReceived(). - // - // Please note that how ReceiveMore() is used will affect performance - // significantly. For example: - // // Approach 1: - // service->ReceiveMore(3); - // // OnReceived() is called. - // // OnReceived() is called. - // // OnReceived() is called. - // - // // Approach 2: - // service->ReceiveMore(1); - // // OnReceived() is called. - // service->ReceiveMore(1); - // // OnReceived() is called. - // service->ReceiveMore(1); - // // OnReceived() is called. - // - // It is very likely that approach 1 will perform better than approach 2, - // because in approach 2 getting every datagram takes at least the time of a - // round trip to the service side. - ReceiveMore(uint32 datagram_number); - - // Sends data to the specified destination. The socket must be bound or - // connected. |dest_addr| is allowed to be null if the socket is connected. - // On success, |result.code| is a non-negative number indicating how many - // bytes have been written. Otherwise, it is a network error code, including - // (but not limited to): - // - ERR_INSUFFICIENT_RESOURCES (-12): The service doesn't have sufficient - // resource to complete the operation. One possible cause is that the client - // tries to send too many datagrams in a short period of time. - // TODO(yzshen): Formalize Mojo networking error codes. - SendTo(NetAddress? dest_addr, array<uint8> data) => (NetworkError result); -}; - -interface UDPSocketReceiver { - // On success, |data| is non-null, |src_addr| is non-null if the socket is - // not connected, |result.code| is a non-negative number indicating how many - // bytes have been received. On failure, |result.code| is a network error - // code. - OnReceived(NetworkError result, NetAddress? src_addr, array<uint8>? data); -};
diff --git a/mojo/services/network/public/interfaces/url_loader.mojom b/mojo/services/network/public/interfaces/url_loader.mojom deleted file mode 100644 index f7e12c8..0000000 --- a/mojo/services/network/public/interfaces/url_loader.mojom +++ /dev/null
@@ -1,112 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/http_message.mojom"; -import "network/public/interfaces/network_error.mojom"; - -struct URLRequest { - // The URL to load. - string url; - - // The HTTP method if applicable. - string method = "GET"; - - // Additional HTTP request headers. - array<HttpHeader>? headers; - - // The payload for the request body, represented as a concatenation of data - // streams. For HTTP requests, the method must be set to "POST" or "PUT". - array<handle<data_pipe_consumer>>? body; - - // The buffer size of the data pipe returned in URLResponse's |body| member. - // A value of 0 indicates that the default buffer size should be used. This - // value is just a suggestion. The URLLoader may choose to ignore this value. - uint32 response_body_buffer_size = 0; - - // If set to true, then redirects will be automatically followed. Otherwise, - // when a redirect is encounterd, FollowRedirect must be called to proceed. - bool auto_follow_redirects = false; - - // If set to true, then the HTTP request will bypass the local cache and will - // have a 'Cache-Control: nocache' header added in that causes any proxy - // servers to also not satisfy the request from their cache. This has the - // effect of forcing a full end-to-end fetch. - bool bypass_cache = false; - - // The time when this request originated. 0 indicates that it is not recorded. - int64 originating_time_ticks = 0; -}; - -struct URLResponse { - // If the response resulted in a network level error, this field will be set. - NetworkError? error; - - // The response body stream. Read from this data pipe to receive the bytes of - // response body. - handle<data_pipe_consumer>? body; - - // The final URL of the response, after redirects have been followed. - string? url; - - // The site of the URL. - string? site; - - // The HTTP status code. 0 if not applicable. - uint32 status_code; - - // The HTTP status line. - string? status_line; - - // The HTTP response headers. - array<HttpHeader>? headers; - - // The MIME type of the response body. - string? mime_type; - - // The character set of the response body. - string? charset; - - // These fields are set to non-NULL if this response corresponds to a - // redirect. Call the |FollowRedirect| method on the URLLoader instance to - // follow this redirect. - string? redirect_method; - string? redirect_url; - string? redirect_referrer; -}; - -struct URLLoaderStatus { - // If the loader has failed due to a network level error, this field will be - // set. - NetworkError? error; - - // Set to true if the URLLoader is still working. Set to false once an error - // is encountered or the response body is completely copied to the response - // body stream. - bool is_loading; - - // The length in bytes of the content as reported by the HTTP response header, - // and the number of bytes read by the URLLoader thus far. - int64 content_length; - int64 bytes_read; - - // TODO(darin): Add further details about the stages of loading (e.g., - // "resolving host") that happen prior to receiving bytes. -}; - -interface URLLoader { - // Loads the given |request|, asynchronously producing |response|. Consult - // |response| to determine if the request resulted in an error, was - // redirected, or has a response body to be consumed. - Start(URLRequest request) => (URLResponse response); - - // If the request passed to |Start| had |auto_follow_redirects| set to false, - // then upon receiving an URLResponse with a non-NULL |redirect_url| field, - // |FollowRedirect| may be called to load the URL indicated by the redirect. - FollowRedirect() => (URLResponse response); - - // Query status about the URLLoader. - QueryStatus() => (URLLoaderStatus status); -};
diff --git a/mojo/services/network/public/interfaces/url_loader_factory.mojom b/mojo/services/network/public/interfaces/url_loader_factory.mojom deleted file mode 100644 index f6339df..0000000 --- a/mojo/services/network/public/interfaces/url_loader_factory.mojom +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/url_loader.mojom"; - -interface URLLoaderFactory { - CreateURLLoader(URLLoader& loader); -};
diff --git a/mojo/services/network/public/interfaces/web_socket.mojom b/mojo/services/network/public/interfaces/web_socket.mojom deleted file mode 100644 index 5d309973..0000000 --- a/mojo/services/network/public/interfaces/web_socket.mojom +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/network_error.mojom"; - -interface WebSocket { - enum MessageType { - CONTINUATION, - TEXT, - BINARY - }; - const uint16 kAbnormalCloseCode = 1006; // stolen from websocket_bridge - - // Initiates a WebSocket connection to the given url. |send_stream| is a data - // pipe which should remain open for the lifetime of the WebSocket. Data - // to send over the WebSocket should be written to the producer end of the - // |send_stream|. - Connect(string url, - array<string> protocols, - string origin, - handle<data_pipe_consumer> send_stream, - WebSocketClient client); - - // Called after writing |num_bytes| worth of data to the WebSocket's - // |send_stream|. - Send(bool fin, MessageType type, uint32 num_bytes); - - FlowControl(int64 quota); - - Close(uint16 code, string reason); -}; - -interface WebSocketClient { - // Called in response to a WebSocket.Connect call to indicate success - // |receive_stream| is a data pipe which where incoming data from - // the server is written. - DidConnect(string selected_subprotocol, - string extensions, - handle<data_pipe_consumer> receive_stream); - - // Called when there is |num_bytes| worth of incoming data available on the - // |receive_stream|. - DidReceiveData(bool fin, WebSocket.MessageType type, uint32 num_bytes); - - DidReceiveFlowControl(int64 quota); - - DidFail(string message); - - DidClose(bool was_clean, uint16 code, string reason); - - // Blink has 3 extra methods that we don't implement, because they are used - // for the inspector: - // didStartOpeningHandshake - // didFinishOpeningHandshake - // didStartClosingHandshake -};
diff --git a/mojo/services/network/public/interfaces/web_socket_factory.mojom b/mojo/services/network/public/interfaces/web_socket_factory.mojom deleted file mode 100644 index cbee09b..0000000 --- a/mojo/services/network/public/interfaces/web_socket_factory.mojom +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module mojo; - -import "network/public/interfaces/web_socket.mojom"; - -interface WebSocketFactory { - CreateWebSocket(WebSocket& socket); -};
diff --git a/mojo/services/network/tcp_bound_socket_impl.cc b/mojo/services/network/tcp_bound_socket_impl.cc deleted file mode 100644 index 1d8669f..0000000 --- a/mojo/services/network/tcp_bound_socket_impl.cc +++ /dev/null
@@ -1,126 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/tcp_bound_socket_impl.h" - -#include <utility> - -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/net_address_type_converters.h" -#include "mojo/services/network/tcp_connected_socket_impl.h" -#include "mojo/services/network/tcp_server_socket_impl.h" -#include "net/base/net_errors.h" - -namespace mojo { - -TCPBoundSocketImpl::TCPBoundSocketImpl( - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<TCPBoundSocket> request) - : app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -TCPBoundSocketImpl::~TCPBoundSocketImpl() { -} - -int TCPBoundSocketImpl::Bind(NetAddressPtr local_address) { - net::IPEndPoint end_point = local_address.To<net::IPEndPoint>(); - - socket_.reset(new net::TCPSocket(NULL, net::NetLog::Source())); - int result = socket_->Open(end_point.GetFamily()); - if (result != net::OK) - return result; - - result = socket_->SetDefaultOptionsForServer(); - if (result != net::OK) - return result; - - result = socket_->Bind(end_point); - if (result != net::OK) - return result; - - return net::OK; -} - -NetAddressPtr TCPBoundSocketImpl::GetLocalAddress() const { - net::IPEndPoint resolved_local_address; - if (socket_->GetLocalAddress(&resolved_local_address) != net::OK) - return NetAddressPtr(); - return NetAddress::From(resolved_local_address); -} - -void TCPBoundSocketImpl::StartListening( - InterfaceRequest<TCPServerSocket> server, - const Callback<void(NetworkErrorPtr)>& callback) { - if (!socket_ || pending_connect_socket_.is_pending()) { - // A bound socket will only be returned to the caller after binding - // succeeds, so if the socket doesn't exist, that means ownership was - // already passed to a server socket or client socket. - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - - // TODO(brettw) set the backlog properly. - int result = socket_->Listen(4); - if (result != net::OK) { - callback.Run(MakeNetworkError(result)); - return; - } - - // The server socket object takes ownership of the socket. - new TCPServerSocketImpl(std::move(socket_), app_refcount_->Clone(), - std::move(server)); - callback.Run(MakeNetworkError(net::OK)); -} - -void TCPBoundSocketImpl::Connect( - NetAddressPtr remote_address, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const Callback<void(NetworkErrorPtr)>& callback) { - if (!socket_ || pending_connect_socket_.is_pending()) { - // A bound socket will only be returned to the caller after binding - // succeeds, so if the socket doesn't exist, that means ownership was - // already passed to a server socket or client socket. - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - - net::IPEndPoint end_point = remote_address.To<net::IPEndPoint>(); - - pending_connect_send_stream_ = std::move(send_stream); - pending_connect_receive_stream_ = std::move(receive_stream); - pending_connect_socket_ = std::move(client_socket); - pending_connect_callback_ = callback; - int result = socket_->Connect( - end_point, - base::Bind(&TCPBoundSocketImpl::OnConnected, base::Unretained(this))); - if (result == net::OK) { - OnConnected(result); - } else if (result != net::ERR_IO_PENDING) { - // Error occurred. - pending_connect_send_stream_.reset(); - pending_connect_receive_stream_.reset(); - pending_connect_socket_ = InterfaceRequest<TCPConnectedSocket>(); - pending_connect_callback_ = Callback<void(NetworkErrorPtr)>(); - callback.Run(MakeNetworkError(result)); - } -} - -void TCPBoundSocketImpl::OnConnected(int result) { - if (result == net::OK) { - new TCPConnectedSocketImpl( - std::move(socket_), std::move(pending_connect_send_stream_), - std::move(pending_connect_receive_stream_), - std::move(pending_connect_socket_), app_refcount_->Clone()); - } else { - pending_connect_send_stream_.reset(); - pending_connect_receive_stream_.reset(); - pending_connect_socket_ = InterfaceRequest<TCPConnectedSocket>(); - } - pending_connect_callback_.Run(MakeNetworkError(result)); - pending_connect_callback_ = Callback<void(NetworkErrorPtr)>(); -} - -} // namespace mojo
diff --git a/mojo/services/network/tcp_bound_socket_impl.h b/mojo/services/network/tcp_bound_socket_impl.h deleted file mode 100644 index 8e4b2e8..0000000 --- a/mojo/services/network/tcp_bound_socket_impl.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ -#define MOJO_SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ - -#include "base/memory/scoped_ptr.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/tcp_bound_socket.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/socket/tcp_socket.h" - -namespace mojo { - -class TCPBoundSocketImpl : public TCPBoundSocket { - public: - TCPBoundSocketImpl(scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<TCPBoundSocket> request); - ~TCPBoundSocketImpl() override; - - // Does the actual binding. Returns a net error code. On net::OK, the bound - // socket will be ready to use and send back to the client. On failure, this - // object should be destroyed and no longer used. - int Bind(NetAddressPtr local_address); - - // Returns the local address associated with this socket. This should only - // be called after Bind has succeeded. - NetAddressPtr GetLocalAddress() const; - - // TCPBoundSocket. - void StartListening(InterfaceRequest<TCPServerSocket> server, - const Callback<void(NetworkErrorPtr)>& callback) override; - void Connect(NetAddressPtr remote_address, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const Callback<void(NetworkErrorPtr)>& callback) override; - - private: - void OnConnected(int result); - - scoped_ptr<net::TCPSocket> socket_; - - // Valid when waiting for a connect callback. - ScopedDataPipeConsumerHandle pending_connect_send_stream_; - ScopedDataPipeProducerHandle pending_connect_receive_stream_; - InterfaceRequest<TCPConnectedSocket> pending_connect_socket_; - Callback<void(NetworkErrorPtr)> pending_connect_callback_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<TCPBoundSocket> binding_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_TCP_BOUND_SOCKET_H_
diff --git a/mojo/services/network/tcp_connected_socket_impl.cc b/mojo/services/network/tcp_connected_socket_impl.cc deleted file mode 100644 index 8da9484..0000000 --- a/mojo/services/network/tcp_connected_socket_impl.cc +++ /dev/null
@@ -1,260 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/tcp_connected_socket_impl.h" - -#include <stdint.h> - -#include <utility> - -#include "base/message_loop/message_loop.h" -#include "mojo/services/network/net_adapters.h" -#include "net/base/net_errors.h" - -namespace mojo { - -TCPConnectedSocketImpl::TCPConnectedSocketImpl( - scoped_ptr<net::TCPSocket> socket, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount) - : socket_(std::move(socket)), - send_stream_(std::move(send_stream)), - receive_stream_(std::move(receive_stream)), - binding_(this, std::move(request)), - app_refcount_(std::move(app_refcount)), - weak_ptr_factory_(this) { - // Queue up async communication. - binding_.set_connection_error_handler([this]() { OnConnectionError(); }); - ListenForReceivePeerClosed(); - ListenForSendPeerClosed(); - ReceiveMore(); - SendMore(); -} - -TCPConnectedSocketImpl::~TCPConnectedSocketImpl() { -} - -void TCPConnectedSocketImpl::OnConnectionError() { - binding_.Close(); - DeleteIfNeeded(); -} - -void TCPConnectedSocketImpl::ReceiveMore() { - DCHECK(!pending_receive_.get()); - - uint32_t num_bytes; - MojoResult result = NetToMojoPendingBuffer::BeginWrite( - &receive_stream_, &pending_receive_, &num_bytes); - if (result == MOJO_RESULT_SHOULD_WAIT) { - // The pipe is full. We need to wait for it to have more space. - receive_handle_watcher_.Start( - receive_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&TCPConnectedSocketImpl::OnReceiveStreamReady, - weak_ptr_factory_.GetWeakPtr())); - return; - } - - if (result == MOJO_RESULT_FAILED_PRECONDITION) { - // It's valid that the user of this class consumed the data they care about - // and closed their data pipe handles after writing data. This class should - // still write out all the data. - ShutdownReceive(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - - if (result != MOJO_RESULT_OK) { - // The receive stream is in a bad state. - ShutdownReceive(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - - // Mojo is ready for the receive. - CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); - scoped_refptr<net::IOBuffer> buf( - new NetToMojoIOBuffer(pending_receive_.get())); - int read_result = - socket_->Read(buf.get(), static_cast<int>(num_bytes), - base::Bind(&TCPConnectedSocketImpl::DidReceive, - weak_ptr_factory_.GetWeakPtr(), false)); - if (read_result == net::ERR_IO_PENDING) { - // Pending I/O, wait for result in DidReceive(). - } else if (read_result > 0) { - // Synchronous data ready. - DidReceive(true, read_result); - } else { - // read_result == 0 indicates EOF. - // read_result < 0 indicates error. - ShutdownReceive(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - } -} - -void TCPConnectedSocketImpl::OnReceiveStreamReady(MojoResult result) { - if (result != MOJO_RESULT_OK) { - ShutdownReceive(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - ListenForReceivePeerClosed(); - ReceiveMore(); -} - -void TCPConnectedSocketImpl::DidReceive(bool completed_synchronously, - int result) { - if (!pending_receive_) - return; - - if (result < 0) { - // Error. - ShutdownReceive(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - - receive_stream_ = pending_receive_->Complete(result); - pending_receive_ = nullptr; - - // Schedule more reading. - if (completed_synchronously) { - // Don't recursively call ReceiveMore if this is a sync read. - base::MessageLoop::current()->PostTask( - FROM_HERE, base::Bind(&TCPConnectedSocketImpl::ReceiveMore, - weak_ptr_factory_.GetWeakPtr())); - } else { - ReceiveMore(); - } -} - -void TCPConnectedSocketImpl::ShutdownReceive() { - receive_handle_watcher_.Stop(); - pending_receive_ = nullptr; - receive_stream_.reset(); - DeleteIfNeeded(); -} - -void TCPConnectedSocketImpl::ListenForReceivePeerClosed() { - receive_handle_watcher_.Start( - receive_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&TCPConnectedSocketImpl::OnReceiveDataPipeClosed, - weak_ptr_factory_.GetWeakPtr())); -} - -void TCPConnectedSocketImpl::OnReceiveDataPipeClosed(MojoResult result) { - ShutdownReceive(); -} - -void TCPConnectedSocketImpl::SendMore() { - uint32_t num_bytes = 0; - MojoResult result = MojoToNetPendingBuffer::BeginRead( - &send_stream_, &pending_send_, &num_bytes); - if (result == MOJO_RESULT_SHOULD_WAIT) { - // Data not ready, wait for it. - send_handle_watcher_.Start( - send_stream_.get(), MOJO_HANDLE_SIGNAL_READABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&TCPConnectedSocketImpl::OnSendStreamReady, - weak_ptr_factory_.GetWeakPtr())); - return; - } else if (result != MOJO_RESULT_OK) { - ShutdownSend(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - - // Got a buffer from Mojo, give it to the socket. Note that the sockets may - // do partial writes. - scoped_refptr<net::IOBuffer> buf(new MojoToNetIOBuffer(pending_send_.get())); - int write_result = - socket_->Write(buf.get(), static_cast<int>(num_bytes), - base::Bind(&TCPConnectedSocketImpl::DidSend, - weak_ptr_factory_.GetWeakPtr(), false)); - if (write_result == net::ERR_IO_PENDING) { - // Pending I/O, wait for result in DidSend(). - } else if (write_result >= 0) { - // Synchronous data consumed. - DidSend(true, write_result); - } else { - // write_result < 0 indicates error. - ShutdownSend(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - } -} - -void TCPConnectedSocketImpl::OnSendStreamReady(MojoResult result) { - if (result != MOJO_RESULT_OK) { - ShutdownSend(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - ListenForSendPeerClosed(); - SendMore(); -} - -void TCPConnectedSocketImpl::DidSend(bool completed_synchronously, int result) { - if (!pending_send_) - return; - - if (result < 0) { - ShutdownSend(); - // TODO(johnmccutchan): Notify socket direction is closed along with - // net_result and mojo_result. - return; - } - - // Take back ownership of the stream and free the IOBuffer. - send_stream_ = pending_send_->Complete(result); - pending_send_ = nullptr; - - // Schedule more writing. - if (completed_synchronously) { - // Don't recursively call SendMore if this is a sync read. - base::MessageLoop::current()->PostTask( - FROM_HERE, base::Bind(&TCPConnectedSocketImpl::SendMore, - weak_ptr_factory_.GetWeakPtr())); - } else { - SendMore(); - } -} - -void TCPConnectedSocketImpl::ShutdownSend() { - send_handle_watcher_.Stop(); - pending_send_ = nullptr; - send_stream_.reset(); - DeleteIfNeeded(); -} - -void TCPConnectedSocketImpl::ListenForSendPeerClosed() { - send_handle_watcher_.Start( - send_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&TCPConnectedSocketImpl::OnSendDataPipeClosed, - weak_ptr_factory_.GetWeakPtr())); -} - -void TCPConnectedSocketImpl::OnSendDataPipeClosed(MojoResult result) { - ShutdownSend(); -} - -void TCPConnectedSocketImpl::DeleteIfNeeded() { - bool has_send = pending_send_ || send_stream_.is_valid(); - bool has_receive = pending_receive_ || receive_stream_.is_valid(); - if (!binding_.is_bound() && !has_send && !has_receive) - delete this; -} - -} // namespace mojo
diff --git a/mojo/services/network/tcp_connected_socket_impl.h b/mojo/services/network/tcp_connected_socket_impl.h deleted file mode 100644 index 1131bf6d..0000000 --- a/mojo/services/network/tcp_connected_socket_impl.h +++ /dev/null
@@ -1,79 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_ -#define MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_ - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/services/network/public/interfaces/tcp_connected_socket.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/socket/tcp_socket.h" - -namespace mojo { - -class MojoToNetPendingBuffer; -class NetToMojoPendingBuffer; - -class TCPConnectedSocketImpl : public TCPConnectedSocket { - public: - TCPConnectedSocketImpl(scoped_ptr<net::TCPSocket> socket, - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount); - ~TCPConnectedSocketImpl() override; - - private: - void OnConnectionError(); - - // "Receiving" in this context means reading from TCPSocket and writing to - // the Mojo receive_stream. - void ReceiveMore(); - void OnReceiveStreamReady(MojoResult result); - void DidReceive(bool completed_synchronously, int result); - void ShutdownReceive(); - void ListenForReceivePeerClosed(); - void OnReceiveDataPipeClosed(MojoResult result); - - // "Writing" is reading from the Mojo send_stream and writing to the - // TCPSocket. - void SendMore(); - void OnSendStreamReady(MojoResult result); - void DidSend(bool completed_asynchronously, int result); - void ShutdownSend(); - void ListenForSendPeerClosed(); - void OnSendDataPipeClosed(MojoResult result); - - void DeleteIfNeeded(); - - scoped_ptr<net::TCPSocket> socket_; - - // The *stream handles will be null while there is an in-progress transation - // between net and mojo. During this time, the handle will be owned by the - // *PendingBuffer. - - // For reading from the network and writing to Mojo pipe. - ScopedDataPipeConsumerHandle send_stream_; - scoped_refptr<NetToMojoPendingBuffer> pending_receive_; - common::HandleWatcher receive_handle_watcher_; - - // For reading from the Mojo pipe and writing to the network. - ScopedDataPipeProducerHandle receive_stream_; - scoped_refptr<MojoToNetPendingBuffer> pending_send_; - common::HandleWatcher send_handle_watcher_; - - // To bind to the message pipe. - Binding<TCPConnectedSocket> binding_; - - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - - base::WeakPtrFactory<TCPConnectedSocketImpl> weak_ptr_factory_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_
diff --git a/mojo/services/network/tcp_server_socket_impl.cc b/mojo/services/network/tcp_server_socket_impl.cc deleted file mode 100644 index a01feff..0000000 --- a/mojo/services/network/tcp_server_socket_impl.cc +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/tcp_server_socket_impl.h" - -#include <utility> - -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/net_address_type_converters.h" -#include "mojo/services/network/tcp_connected_socket_impl.h" -#include "net/base/net_errors.h" - -namespace mojo { - -TCPServerSocketImpl::TCPServerSocketImpl( - scoped_ptr<net::TCPSocket> socket, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<TCPServerSocket> request) - : socket_(std::move(socket)), - app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -TCPServerSocketImpl::~TCPServerSocketImpl() { -} - -void TCPServerSocketImpl::Accept( - ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const AcceptCallback& callback) { - // One possible future enhancement would be to enqueue multiple Accept calls - // on this object. This would allow the client to accept some number of - // incoming connections rapidly without doing an IPC round-trip. - if (!pending_callback_.is_null()) { - // Already have a pending accept on this socket. - callback.Run(MakeNetworkError(net::ERR_UNEXPECTED), NetAddressPtr()); - return; - } - - int result = socket_->Accept( - &accepted_socket_, &accepted_address_, - base::Bind(&TCPServerSocketImpl::OnAcceptCompleted, - base::Unretained(this))); - if (result == net::OK || result == net::ERR_IO_PENDING) { - pending_callback_ = callback; - pending_send_stream_ = std::move(send_stream); - pending_receive_stream_ = std::move(receive_stream); - pending_client_socket_ = std::move(client_socket); - if (result == net::OK) - OnAcceptCompleted(net::OK); - } else { - callback.Run(MakeNetworkError(result), NetAddressPtr()); - } -} - -void TCPServerSocketImpl::OnAcceptCompleted(int result) { - if (result != net::OK) { - pending_callback_.Run(MakeNetworkError(result), NetAddressPtr()); - pending_send_stream_.reset(); - pending_receive_stream_.reset(); - pending_client_socket_ = InterfaceRequest<TCPConnectedSocket>(); - } else { - new TCPConnectedSocketImpl( - std::move(accepted_socket_), std::move(pending_send_stream_), - std::move(pending_receive_stream_), std::move(pending_client_socket_), - app_refcount_->Clone()); - pending_callback_.Run(MakeNetworkError(net::OK), - NetAddress::From(accepted_address_)); - } - - pending_callback_ = AcceptCallback(); -} - -} // namespace mojo
diff --git a/mojo/services/network/tcp_server_socket_impl.h b/mojo/services/network/tcp_server_socket_impl.h deleted file mode 100644 index 2078cec..0000000 --- a/mojo/services/network/tcp_server_socket_impl.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_TCP_SERVER_SOCKET_H_ -#define MOJO_SERVICES_NETWORK_TCP_SERVER_SOCKET_H_ - -#include "base/memory/scoped_ptr.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/tcp_server_socket.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/base/ip_endpoint.h" -#include "net/socket/tcp_socket.h" - -namespace mojo { - -class TCPServerSocketImpl : public TCPServerSocket { - public: - typedef Callback<void(NetworkErrorPtr, NetAddressPtr)> AcceptCallback; - - // Passed ownership of a socket already in listening mode. - TCPServerSocketImpl(scoped_ptr<net::TCPSocket> socket, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<TCPServerSocket> request); - ~TCPServerSocketImpl() override; - - // TCPServerSocket. - void Accept(ScopedDataPipeConsumerHandle send_stream, - ScopedDataPipeProducerHandle receive_stream, - InterfaceRequest<TCPConnectedSocket> client_socket, - const AcceptCallback& callback) override; - - private: - void OnAcceptCompleted(int result); - - scoped_ptr<net::TCPSocket> socket_; - - // Non-null when accept is pending. - AcceptCallback pending_callback_; - - // The parameters associated with the pending Accept call. - ScopedDataPipeConsumerHandle pending_send_stream_; - ScopedDataPipeProducerHandle pending_receive_stream_; - InterfaceRequest<TCPConnectedSocket> pending_client_socket_; - - // These are written to by net::TCPSocket when Accept is completed. - scoped_ptr<net::TCPSocket> accepted_socket_; - net::IPEndPoint accepted_address_; - - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<TCPServerSocket> binding_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_TCP_SERVER_SOCKET_H_
diff --git a/mojo/services/network/test_manifest.json b/mojo/services/network/test_manifest.json deleted file mode 100644 index 17a78cc0..0000000 --- a/mojo/services/network/test_manifest.json +++ /dev/null
@@ -1,5 +0,0 @@ -{ - "name": "exe:network_service_unittests", - "display_name": "Network Service Unittests", - "capabilities": { "*": [ "*" ] } -}
diff --git a/mojo/services/network/udp_socket_impl.cc b/mojo/services/network/udp_socket_impl.cc deleted file mode 100644 index c99f66f..0000000 --- a/mojo/services/network/udp_socket_impl.cc +++ /dev/null
@@ -1,380 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/udp_socket_impl.h" - -#include <stddef.h> -#include <stdint.h> -#include <string.h> -#include <algorithm> -#include <limits> -#include <utility> - -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "base/stl_util.h" -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/net_address_type_converters.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/base/rand_callback.h" -#include "net/udp/datagram_socket.h" - -namespace mojo { - -namespace { - -const int kMaxReadSize = 128 * 1024; -const size_t kMaxWriteSize = 128 * 1024; -const size_t kMaxPendingSendRequestsUpperbound = 128; -const size_t kDefaultMaxPendingSendRequests = 32; - -} // namespace - -UDPSocketImpl::PendingSendRequest::PendingSendRequest() {} - -UDPSocketImpl::PendingSendRequest::~PendingSendRequest() {} - -UDPSocketImpl::UDPSocketImpl(InterfaceRequest<UDPSocket> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount) - : binding_(this, std::move(request)), - socket_(net::DatagramSocket::DEFAULT_BIND, - net::RandIntCallback(), - nullptr, - net::NetLog::Source()), - state_(NOT_BOUND_OR_CONNECTED), - allow_address_reuse_(false), - remaining_recv_slots_(0), - max_pending_send_requests_(kDefaultMaxPendingSendRequests), - app_refcount_(std::move(app_refcount)) {} - -UDPSocketImpl::~UDPSocketImpl() { - STLDeleteElements(&pending_send_requests_); -} - -void UDPSocketImpl::AllowAddressReuse( - const Callback<void(NetworkErrorPtr)>& callback) { - if (IsBoundOrConnected()) { - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - - allow_address_reuse_ = true; - callback.Run(MakeNetworkError(net::OK)); -} - -void UDPSocketImpl::Bind( - NetAddressPtr addr, - const Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>& callback) { - int net_result = net::OK; - bool opened = false; - - do { - if (IsBoundOrConnected()) { - net_result = net::ERR_FAILED; - break; - } - - net::IPEndPoint ip_end_point = addr.To<net::IPEndPoint>(); - if (ip_end_point.GetFamily() == net::ADDRESS_FAMILY_UNSPECIFIED) { - net_result = net::ERR_ADDRESS_INVALID; - break; - } - - net_result = socket_.Open(ip_end_point.GetFamily()); - if (net_result != net::OK) - break; - opened = true; - - if (allow_address_reuse_) { - net_result = socket_.AllowAddressReuse(); - if (net_result != net::OK) - break; - } - - net_result = socket_.Bind(ip_end_point); - if (net_result != net::OK) - break; - - net::IPEndPoint bound_ip_end_point; - net_result = socket_.GetLocalAddress(&bound_ip_end_point); - if (net_result != net::OK) - break; - - state_ = BOUND; - callback.Run(MakeNetworkError(net_result), - NetAddress::From(bound_ip_end_point), GetProxy(&receiver_)); - - if (remaining_recv_slots_ > 0) { - DCHECK(!recvfrom_buffer_.get()); - DoRecvFrom(); - } - return; - } while (false); - - DCHECK(net_result != net::OK); - if (opened) - socket_.Close(); - callback.Run(MakeNetworkError(net_result), nullptr, nullptr); -} - -void UDPSocketImpl::Connect( - NetAddressPtr remote_addr, - const Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>& callback) { - int net_result = net::OK; - bool opened = false; - - do { - if (IsBoundOrConnected()) { - net_result = net::ERR_FAILED; - break; - } - - net::IPEndPoint ip_end_point = remote_addr.To<net::IPEndPoint>(); - if (ip_end_point.GetFamily() == net::ADDRESS_FAMILY_UNSPECIFIED) { - net_result = net::ERR_ADDRESS_INVALID; - break; - } - - net_result = socket_.Open(ip_end_point.GetFamily()); - if (net_result != net::OK) - break; - opened = true; - - net_result = socket_.Connect(ip_end_point); - if (net_result != net::OK) - break; - - net::IPEndPoint local_ip_end_point; - net_result = socket_.GetLocalAddress(&local_ip_end_point); - if (net_result != net::OK) - break; - - state_ = CONNECTED; - callback.Run(MakeNetworkError(net_result), - NetAddress::From(local_ip_end_point), GetProxy(&receiver_)); - - if (remaining_recv_slots_ > 0) { - DCHECK(!recvfrom_buffer_.get()); - DoRecvFrom(); - } - return; - } while (false); - - DCHECK(net_result != net::OK); - if (opened) - socket_.Close(); - callback.Run(MakeNetworkError(net_result), nullptr, nullptr); -} - -void UDPSocketImpl::SetSendBufferSize( - uint32_t size, - const Callback<void(NetworkErrorPtr)>& callback) { - if (!IsBoundOrConnected()) { - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - - if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) - size = std::numeric_limits<int32_t>::max(); - - int net_result = socket_.SetSendBufferSize(static_cast<int32_t>(size)); - callback.Run(MakeNetworkError(net_result)); -} - -void UDPSocketImpl::SetReceiveBufferSize( - uint32_t size, - const Callback<void(NetworkErrorPtr)>& callback) { - if (!IsBoundOrConnected()) { - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - - if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) - size = std::numeric_limits<int32_t>::max(); - - int net_result = socket_.SetReceiveBufferSize(static_cast<int32_t>(size)); - callback.Run(MakeNetworkError(net_result)); -} - -void UDPSocketImpl::NegotiateMaxPendingSendRequests( - uint32_t requested_size, - const Callback<void(uint32_t)>& callback) { - if (requested_size != 0) { - max_pending_send_requests_ = - std::min(kMaxPendingSendRequestsUpperbound, - static_cast<size_t>(requested_size)); - } - callback.Run(static_cast<uint32_t>(max_pending_send_requests_)); - - if (pending_send_requests_.size() > max_pending_send_requests_) { - std::deque<PendingSendRequest*> discarded_requests( - pending_send_requests_.begin() + max_pending_send_requests_, - pending_send_requests_.end()); - pending_send_requests_.resize(max_pending_send_requests_); - for (auto& discarded_request : discarded_requests) { - discarded_request->callback.Run( - MakeNetworkError(net::ERR_INSUFFICIENT_RESOURCES)); - delete discarded_request; - } - } -} - -void UDPSocketImpl::ReceiveMore(uint32_t datagram_number) { - if (!receiver_) - return; - if (datagram_number == 0) - return; - if (std::numeric_limits<size_t>::max() - remaining_recv_slots_ < - datagram_number) { - return; - } - - remaining_recv_slots_ += datagram_number; - - if (IsBoundOrConnected() && !recvfrom_buffer_.get()) { - DCHECK_EQ(datagram_number, remaining_recv_slots_); - DoRecvFrom(); - } -} - -void UDPSocketImpl::SendTo(NetAddressPtr dest_addr, - Array<uint8_t> data, - const Callback<void(NetworkErrorPtr)>& callback) { - if (!IsBoundOrConnected()) { - callback.Run(MakeNetworkError(net::ERR_FAILED)); - return; - } - if (state_ == BOUND && !dest_addr) { - callback.Run(MakeNetworkError(net::ERR_INVALID_ARGUMENT)); - return; - } - - if (sendto_buffer_.get()) { - if (pending_send_requests_.size() >= max_pending_send_requests_) { - callback.Run(MakeNetworkError(net::ERR_INSUFFICIENT_RESOURCES)); - return; - } - - PendingSendRequest* request = new PendingSendRequest; - request->addr = std::move(dest_addr); - request->data = std::move(data); - request->callback = callback; - pending_send_requests_.push_back(request); - return; - } - - DCHECK_EQ(0u, pending_send_requests_.size()); - - DoSendTo(std::move(dest_addr), std::move(data), callback); -} - -void UDPSocketImpl::DoRecvFrom() { - DCHECK(IsBoundOrConnected()); - DCHECK(receiver_); - DCHECK(!recvfrom_buffer_.get()); - DCHECK_GT(remaining_recv_slots_, 0u); - - recvfrom_buffer_ = new net::IOBuffer(kMaxReadSize); - - // It is safe to use base::Unretained(this) because |socket_| is owned by this - // object. If this object gets destroyed (and so does |socket_|), the callback - // won't be called. - int net_result = socket_.RecvFrom( - recvfrom_buffer_.get(), - kMaxReadSize, - state_ == BOUND ? &recvfrom_address_ : nullptr, - base::Bind(&UDPSocketImpl::OnRecvFromCompleted, base::Unretained(this))); - if (net_result != net::ERR_IO_PENDING) - OnRecvFromCompleted(net_result); -} - -void UDPSocketImpl::DoSendTo(NetAddressPtr addr, - Array<uint8_t> data, - const Callback<void(NetworkErrorPtr)>& callback) { - DCHECK(IsBoundOrConnected()); - DCHECK(!sendto_buffer_.get()); - - if (data.size() > kMaxWriteSize) { - callback.Run(MakeNetworkError(net::ERR_INVALID_ARGUMENT)); - return; - } - sendto_buffer_ = new net::IOBufferWithSize(static_cast<int>(data.size())); - if (data.size() > 0) - memcpy(sendto_buffer_->data(), &data.storage()[0], data.size()); - - int net_result = net::OK; - if (addr) { - net::IPEndPoint ip_end_point = addr.To<net::IPEndPoint>(); - if (ip_end_point.GetFamily() == net::ADDRESS_FAMILY_UNSPECIFIED) { - callback.Run(MakeNetworkError(net::ERR_ADDRESS_INVALID)); - return; - } - - // It is safe to use base::Unretained(this) because |socket_| is owned by - // this object. If this object gets destroyed (and so does |socket_|), the - // callback won't be called. - net_result = socket_.SendTo(sendto_buffer_.get(), sendto_buffer_->size(), - ip_end_point, - base::Bind(&UDPSocketImpl::OnSendToCompleted, - base::Unretained(this), callback)); - } else { - DCHECK(state_ == CONNECTED); - net_result = socket_.Write(sendto_buffer_.get(), sendto_buffer_->size(), - base::Bind(&UDPSocketImpl::OnSendToCompleted, - base::Unretained(this), callback)); - } - if (net_result != net::ERR_IO_PENDING) - OnSendToCompleted(callback, net_result); -} - -void UDPSocketImpl::OnRecvFromCompleted(int net_result) { - DCHECK(recvfrom_buffer_.get()); - - NetAddressPtr net_address; - Array<uint8_t> array; - if (net_result >= 0) { - if (state_ == BOUND) - net_address = NetAddress::From(recvfrom_address_); - - std::vector<uint8_t> data(net_result); - if (net_result > 0) - memcpy(&data[0], recvfrom_buffer_->data(), net_result); - - array.Swap(&data); - } - recvfrom_buffer_ = nullptr; - - receiver_->OnReceived(MakeNetworkError(net_result), std::move(net_address), - std::move(array)); - DCHECK_GT(remaining_recv_slots_, 0u); - remaining_recv_slots_--; - if (remaining_recv_slots_ > 0) - DoRecvFrom(); -} - -void UDPSocketImpl::OnSendToCompleted( - const Callback<void(NetworkErrorPtr)>& callback, - int net_result) { - DCHECK(sendto_buffer_.get()); - - sendto_buffer_ = nullptr; - - callback.Run(MakeNetworkError(net_result)); - - if (pending_send_requests_.empty()) - return; - - scoped_ptr<PendingSendRequest> request(pending_send_requests_.front()); - pending_send_requests_.pop_front(); - - DoSendTo(std::move(request->addr), std::move(request->data), - request->callback); -} - -} // namespace mojo
diff --git a/mojo/services/network/udp_socket_impl.h b/mojo/services/network/udp_socket_impl.h deleted file mode 100644 index 6ea5770c..0000000 --- a/mojo/services/network/udp_socket_impl.h +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_UDP_SOCKET_IMPL_H_ -#define MOJO_SERVICES_NETWORK_UDP_SOCKET_IMPL_H_ - -#include <stddef.h> -#include <stdint.h> - -#include <deque> - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/udp_socket.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/base/ip_endpoint.h" -#include "net/udp/udp_socket.h" - -namespace net { -class IOBuffer; -class IOBufferWithSize; -} - -namespace mojo { - -class UDPSocketImpl : public UDPSocket { - public: - // The lifetime of a new UDPSocketImpl is bound to the connection associated - // with |request|. - UDPSocketImpl(InterfaceRequest<UDPSocket> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount); - ~UDPSocketImpl() override; - - // UDPSocket implementation. - void AllowAddressReuse( - const Callback<void(NetworkErrorPtr)>& callback) override; - - void Bind(NetAddressPtr addr, - const Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>& callback) - override; - - void Connect(NetAddressPtr remote_addr, - const Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>& - callback) override; - - void SetSendBufferSize( - uint32_t size, - const Callback<void(NetworkErrorPtr)>& callback) override; - - void SetReceiveBufferSize( - uint32_t size, - const Callback<void(NetworkErrorPtr)>& callback) override; - - void NegotiateMaxPendingSendRequests( - uint32_t requested_size, - const Callback<void(uint32_t)>& callback) override; - - void ReceiveMore(uint32_t datagram_number) override; - - void SendTo(NetAddressPtr dest_addr, - Array<uint8_t> data, - const Callback<void(NetworkErrorPtr)>& callback) override; - - private: - enum State { - NOT_BOUND_OR_CONNECTED, - BOUND, - CONNECTED - }; - - struct PendingSendRequest { - PendingSendRequest(); - ~PendingSendRequest(); - - NetAddressPtr addr; - Array<uint8_t> data; - Callback<void(NetworkErrorPtr)> callback; - }; - - void DoRecvFrom(); - void DoSendTo(NetAddressPtr addr, - Array<uint8_t> data, - const Callback<void(NetworkErrorPtr)>& callback); - - void OnRecvFromCompleted(int net_result); - void OnSendToCompleted(const Callback<void(NetworkErrorPtr)>& callback, - int net_result); - - bool IsBoundOrConnected() const { - return state_ == BOUND || state_ == CONNECTED; - } - - StrongBinding<UDPSocket> binding_; - - net::UDPSocket socket_; - - State state_; - - bool allow_address_reuse_; - - // Non-null when there is a pending RecvFrom operation on |socket_|. - scoped_refptr<net::IOBuffer> recvfrom_buffer_; - // Non-null when there is a pending SendTo operation on |socket_|. - scoped_refptr<net::IOBufferWithSize> sendto_buffer_; - - // The address of the pending RecvFrom operation, if any. - net::IPEndPoint recvfrom_address_; - - // The interface which gets data from fulfilled receive requests. - UDPSocketReceiverPtr receiver_; - - // How many more packets the client side expects to receive. - size_t remaining_recv_slots_; - - // The queue owns the PendingSendRequest instances. - std::deque<PendingSendRequest*> pending_send_requests_; - // The maximum size of the |pending_send_requests_| queue. - size_t max_pending_send_requests_; - - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - - DISALLOW_COPY_AND_ASSIGN(UDPSocketImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_UDP_SOCKET_IMPL_H_
diff --git a/mojo/services/network/udp_socket_unittest.cc b/mojo/services/network/udp_socket_unittest.cc deleted file mode 100644 index 9aaf1f20..0000000 --- a/mojo/services/network/udp_socket_unittest.cc +++ /dev/null
@@ -1,652 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stddef.h> -#include <stdint.h> - -#include <utility> - -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "base/run_loop.h" -#include "mojo/public/cpp/bindings/callback.h" -#include "mojo/services/network/public/cpp/udp_socket_wrapper.h" -#include "mojo/services/network/public/interfaces/network_service.mojom.h" -#include "mojo/services/network/public/interfaces/udp_socket.mojom.h" -#include "mojo/shell/public/cpp/shell_test.h" -#include "net/base/net_errors.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace mojo { -namespace service { -namespace { - -NetAddressPtr GetLocalHostWithAnyPort() { - NetAddressPtr addr(NetAddress::New()); - addr->family = NetAddressFamily::IPV4; - addr->ipv4 = NetAddressIPv4::New(); - addr->ipv4->port = 0; - addr->ipv4->addr.resize(4); - addr->ipv4->addr[0] = 127; - addr->ipv4->addr[1] = 0; - addr->ipv4->addr[2] = 0; - addr->ipv4->addr[3] = 1; - - return addr; -} - -Array<uint8_t> CreateTestMessage(uint8_t initial, size_t size) { - Array<uint8_t> array(size); - for (size_t i = 0; i < size; ++i) - array[i] = static_cast<uint8_t>((i + initial) % 256); - return array; -} - -template <typename CallbackType> -class TestCallbackBase { - public: - TestCallbackBase() : state_(nullptr), run_loop_(nullptr), ran_(false) {} - - ~TestCallbackBase() { - state_->set_test_callback(nullptr); - } - - CallbackType callback() const { return callback_; } - - void WaitForResult() { - if (ran_) - return; - - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - protected: - struct StateBase : public CallbackType::Runnable { - StateBase() : test_callback_(nullptr) {} - ~StateBase() override {} - - void set_test_callback(TestCallbackBase* test_callback) { - test_callback_ = test_callback; - } - - protected: - void NotifyRun() const { - if (test_callback_) { - test_callback_->ran_ = true; - if (test_callback_->run_loop_) - test_callback_->run_loop_->Quit(); - } - } - - TestCallbackBase* test_callback_; - - private: - DISALLOW_COPY_AND_ASSIGN(StateBase); - }; - - // Takes ownership of |state|, and guarantees that it lives at least as long - // as this object. - void Initialize(StateBase* state) { - state_ = state; - state_->set_test_callback(this); - callback_ = CallbackType( - static_cast<typename CallbackType::Runnable*>(state_)); - } - - private: - // The lifespan is managed by |callback_| (and its copies). - StateBase* state_; - CallbackType callback_; - base::RunLoop* run_loop_; - bool ran_; - - DISALLOW_COPY_AND_ASSIGN(TestCallbackBase); -}; - -class TestCallback : public TestCallbackBase<Callback<void(NetworkErrorPtr)>> { - public: - TestCallback() { - Initialize(new State()); - } - ~TestCallback() {} - - const NetworkErrorPtr& result() const { return result_; } - - private: - struct State: public StateBase { - ~State() override {} - - void Run(NetworkErrorPtr result) const override { - if (test_callback_) { - TestCallback* callback = static_cast<TestCallback*>(test_callback_); - callback->result_ = std::move(result); - } - NotifyRun(); - } - }; - - NetworkErrorPtr result_; -}; - -class TestCallbackWithAddressAndReceiver - : public TestCallbackBase< - Callback<void(NetworkErrorPtr, - NetAddressPtr, - InterfaceRequest<UDPSocketReceiver>)>> { - public: - TestCallbackWithAddressAndReceiver() { Initialize(new State()); } - ~TestCallbackWithAddressAndReceiver() {} - - const NetworkErrorPtr& result() const { return result_; } - const NetAddressPtr& net_address() const { return net_address_; } - InterfaceRequest<UDPSocketReceiver>& receiver() { return receiver_; } - - private: - struct State : public StateBase { - ~State() override {} - - void Run(NetworkErrorPtr result, - NetAddressPtr net_address, - InterfaceRequest<UDPSocketReceiver> receiver) const override { - if (test_callback_) { - TestCallbackWithAddressAndReceiver* callback = - static_cast<TestCallbackWithAddressAndReceiver*>(test_callback_); - callback->result_ = std::move(result); - callback->net_address_ = std::move(net_address); - callback->receiver_ = std::move(receiver); - } - NotifyRun(); - } - }; - - NetworkErrorPtr result_; - NetAddressPtr net_address_; - InterfaceRequest<UDPSocketReceiver> receiver_; -}; - -class TestCallbackWithAddress - : public TestCallbackBase<Callback<void(NetworkErrorPtr, NetAddressPtr)>> { - public: - TestCallbackWithAddress() { - Initialize(new State()); - } - ~TestCallbackWithAddress() {} - - const NetworkErrorPtr& result() const { return result_; } - const NetAddressPtr& net_address() const { return net_address_; } - - private: - struct State : public StateBase { - ~State() override {} - - void Run(NetworkErrorPtr result, NetAddressPtr net_address) const override { - if (test_callback_) { - TestCallbackWithAddress* callback = - static_cast<TestCallbackWithAddress*>(test_callback_); - callback->result_ = std::move(result); - callback->net_address_ = std::move(net_address); - } - NotifyRun(); - } - }; - - NetworkErrorPtr result_; - NetAddressPtr net_address_; -}; - -class TestCallbackWithUint32 - : public TestCallbackBase<Callback<void(uint32_t)>> { - public: - TestCallbackWithUint32() : result_(0) { - Initialize(new State()); - } - ~TestCallbackWithUint32() {} - - uint32_t result() const { return result_; } - - private: - struct State : public StateBase { - ~State() override {} - - void Run(uint32_t result) const override { - if (test_callback_) { - TestCallbackWithUint32* callback = - static_cast<TestCallbackWithUint32*>(test_callback_); - callback->result_ = result; - } - NotifyRun(); - } - }; - - uint32_t result_; -}; - -class TestReceiveCallback - : public TestCallbackBase< - Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>> { - public: - TestReceiveCallback() { - Initialize(new State()); - } - ~TestReceiveCallback() {} - - const NetworkErrorPtr& result() const { return result_; } - const NetAddressPtr& src_addr() const { return src_addr_; } - const Array<uint8_t>& data() const { return data_; } - - private: - struct State : public StateBase { - ~State() override {} - - void Run(NetworkErrorPtr result, - NetAddressPtr src_addr, - Array<uint8_t> data) const override { - if (test_callback_) { - TestReceiveCallback* callback = - static_cast<TestReceiveCallback*>(test_callback_); - callback->result_ = std::move(result); - callback->src_addr_ = std::move(src_addr); - callback->data_ = std::move(data); - } - NotifyRun(); - } - }; - - NetworkErrorPtr result_; - NetAddressPtr src_addr_; - Array<uint8_t> data_; -}; - -struct ReceiveResult { - NetworkErrorPtr result; - NetAddressPtr addr; - Array<uint8_t> data; -}; - -class UDPSocketReceiverImpl : public UDPSocketReceiver { - public: - UDPSocketReceiverImpl() : run_loop_(nullptr), expected_receive_count_(0) {} - - ~UDPSocketReceiverImpl() override { - while (!results_.empty()) { - delete results_.front(); - results_.pop(); - } - } - - std::queue<ReceiveResult*>* results() { - return &results_; - } - - void WaitForReceiveResults(size_t count) { - if (results_.size() == count) - return; - - expected_receive_count_ = count; - base::RunLoop run_loop; - run_loop_ = &run_loop; - run_loop.Run(); - run_loop_ = nullptr; - } - - private: - void OnReceived(NetworkErrorPtr result, - NetAddressPtr src_addr, - Array<uint8_t> data) override { - ReceiveResult* entry = new ReceiveResult(); - entry->result = std::move(result); - entry->addr = std::move(src_addr); - entry->data = std::move(data); - - results_.push(entry); - - if (results_.size() == expected_receive_count_ && run_loop_) { - expected_receive_count_ = 0; - run_loop_->Quit(); - } - } - - base::RunLoop* run_loop_; - std::queue<ReceiveResult*> results_; - size_t expected_receive_count_; - - DISALLOW_COPY_AND_ASSIGN(UDPSocketReceiverImpl); -}; - -class UDPSocketTest : public test::ShellTest { - public: - UDPSocketTest() : ShellTest("exe:network_service_unittests"), - receiver_binding_(&receiver_) {} - ~UDPSocketTest() override {} - - void SetUp() override { - ShellTest::SetUp(); - connector()->ConnectToInterface("mojo:network_service", &network_service_); - network_service_->CreateUDPSocket(GetProxy(&socket_)); - } - - protected: - NetworkServicePtr network_service_; - UDPSocketPtr socket_; - UDPSocketReceiverImpl receiver_; - Binding<UDPSocketReceiver> receiver_binding_; - - DISALLOW_COPY_AND_ASSIGN(UDPSocketTest); -}; - -} // namespace - -TEST_F(UDPSocketTest, Settings) { - TestCallback callback1; - socket_->AllowAddressReuse(callback1.callback()); - callback1.WaitForResult(); - EXPECT_EQ(net::OK, callback1.result()->code); - - // Should fail because the socket hasn't been bound. - TestCallback callback2; - socket_->SetSendBufferSize(1024, callback2.callback()); - callback2.WaitForResult(); - EXPECT_NE(net::OK, callback2.result()->code); - - // Should fail because the socket hasn't been bound. - TestCallback callback3; - socket_->SetReceiveBufferSize(2048, callback3.callback()); - callback3.WaitForResult(); - EXPECT_NE(net::OK, callback3.result()->code); - - TestCallbackWithAddressAndReceiver callback4; - socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback()); - callback4.WaitForResult(); - EXPECT_EQ(net::OK, callback4.result()->code); - EXPECT_NE(0u, callback4.net_address()->ipv4->port); - - // Should fail because the socket has been bound. - TestCallback callback5; - socket_->AllowAddressReuse(callback5.callback()); - callback5.WaitForResult(); - EXPECT_NE(net::OK, callback5.result()->code); - - TestCallback callback6; - socket_->SetSendBufferSize(1024, callback6.callback()); - callback6.WaitForResult(); - EXPECT_EQ(net::OK, callback6.result()->code); - - TestCallback callback7; - socket_->SetReceiveBufferSize(2048, callback7.callback()); - callback7.WaitForResult(); - EXPECT_EQ(net::OK, callback7.result()->code); - - TestCallbackWithUint32 callback8; - socket_->NegotiateMaxPendingSendRequests(0, callback8.callback()); - callback8.WaitForResult(); - EXPECT_GT(callback8.result(), 0u); - - TestCallbackWithUint32 callback9; - socket_->NegotiateMaxPendingSendRequests(16, callback9.callback()); - callback9.WaitForResult(); - EXPECT_GT(callback9.result(), 0u); -} - -TEST_F(UDPSocketTest, TestReadWrite) { - TestCallbackWithAddressAndReceiver callback1; - socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); - callback1.WaitForResult(); - ASSERT_EQ(net::OK, callback1.result()->code); - ASSERT_NE(0u, callback1.net_address()->ipv4->port); - - receiver_binding_.Bind(std::move(callback1.receiver())); - - NetAddressPtr server_addr = callback1.net_address().Clone(); - - UDPSocketPtr client_socket; - network_service_->CreateUDPSocket(GetProxy(&client_socket)); - - TestCallbackWithAddressAndReceiver callback2; - client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); - callback2.WaitForResult(); - ASSERT_EQ(net::OK, callback2.result()->code); - ASSERT_NE(0u, callback2.net_address()->ipv4->port); - - NetAddressPtr client_addr = callback2.net_address().Clone(); - - const size_t kDatagramCount = 6; - const size_t kDatagramSize = 255; - socket_->ReceiveMore(kDatagramCount); - - for (size_t i = 0; i < kDatagramCount; ++i) { - TestCallback callback; - client_socket->SendTo( - server_addr.Clone(), - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), - callback.callback()); - callback.WaitForResult(); - EXPECT_EQ(255, callback.result()->code); - } - - receiver_.WaitForReceiveResults(kDatagramCount); - for (size_t i = 0; i < kDatagramCount; ++i) { - scoped_ptr<ReceiveResult> result(receiver_.results()->front()); - receiver_.results()->pop(); - - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); - EXPECT_TRUE(result->addr.Equals(client_addr)); - EXPECT_TRUE(result->data.Equals( - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); - } -} - -TEST_F(UDPSocketTest, TestConnectedReadWrite) { - TestCallbackWithAddressAndReceiver callback1; - socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); - callback1.WaitForResult(); - ASSERT_EQ(net::OK, callback1.result()->code); - ASSERT_NE(0u, callback1.net_address()->ipv4->port); - - receiver_binding_.Bind(std::move(callback1.receiver())); - - NetAddressPtr server_addr = callback1.net_address().Clone(); - - UDPSocketPtr client_socket; - network_service_->CreateUDPSocket(GetProxy(&client_socket)); - - TestCallbackWithAddressAndReceiver callback2; - client_socket->Connect(server_addr.Clone(), callback2.callback()); - callback2.WaitForResult(); - ASSERT_EQ(net::OK, callback2.result()->code); - ASSERT_NE(0u, callback2.net_address()->ipv4->port); - - UDPSocketReceiverImpl client_socket_receiver; - Binding<UDPSocketReceiver> client_receiver_binding( - &client_socket_receiver, std::move(callback2.receiver())); - - NetAddressPtr client_addr = callback2.net_address().Clone(); - - const size_t kDatagramCount = 6; - const size_t kDatagramSize = 255; - - // Test send using a connected socket. - socket_->ReceiveMore(kDatagramCount); - - for (size_t i = 0; i < kDatagramCount; ++i) { - TestCallback callback; - client_socket->SendTo( - nullptr, - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), - callback.callback()); - callback.WaitForResult(); - EXPECT_EQ(255, callback.result()->code); - } - - receiver_.WaitForReceiveResults(kDatagramCount); - for (size_t i = 0; i < kDatagramCount; ++i) { - scoped_ptr<ReceiveResult> result(receiver_.results()->front()); - receiver_.results()->pop(); - - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); - EXPECT_TRUE(result->addr.Equals(client_addr)); - EXPECT_TRUE(result->data.Equals( - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); - } - - // Test receive using a connected socket. - client_socket->ReceiveMore(kDatagramCount); - - for (size_t i = 0; i < kDatagramCount; ++i) { - TestCallback callback; - socket_->SendTo( - client_addr.Clone(), - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), - callback.callback()); - callback.WaitForResult(); - EXPECT_EQ(255, callback.result()->code); - } - - client_socket_receiver.WaitForReceiveResults(kDatagramCount); - for (size_t i = 0; i < kDatagramCount; ++i) { - scoped_ptr<ReceiveResult> result(client_socket_receiver.results()->front()); - client_socket_receiver.results()->pop(); - - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); - EXPECT_FALSE(result->addr); - EXPECT_TRUE(result->data.Equals( - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); - } -} - -TEST_F(UDPSocketTest, TestWrapperReadWrite) { - UDPSocketWrapper socket(std::move(socket_), 4, 4); - - TestCallbackWithAddress callback1; - socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); - callback1.WaitForResult(); - ASSERT_EQ(net::OK, callback1.result()->code); - ASSERT_NE(0u, callback1.net_address()->ipv4->port); - - NetAddressPtr server_addr = callback1.net_address().Clone(); - - UDPSocketPtr raw_client_socket; - network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); - UDPSocketWrapper client_socket(std::move(raw_client_socket), 4, 4); - - TestCallbackWithAddress callback2; - client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); - callback2.WaitForResult(); - ASSERT_EQ(net::OK, callback2.result()->code); - ASSERT_NE(0u, callback2.net_address()->ipv4->port); - - NetAddressPtr client_addr = callback2.net_address().Clone(); - - const size_t kDatagramCount = 16; - const size_t kDatagramSize = 255; - - for (size_t i = 1; i < kDatagramCount; ++i) { - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); - scoped_ptr<TestReceiveCallback[]> receive_callbacks( - new TestReceiveCallback[i]); - - for (size_t j = 0; j < i; ++j) { - client_socket.SendTo( - server_addr.Clone(), - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), - send_callbacks[j].callback()); - - socket.ReceiveFrom(receive_callbacks[j].callback()); - } - - receive_callbacks[i - 1].WaitForResult(); - - for (size_t j = 0; j < i; ++j) { - EXPECT_EQ(static_cast<int>(kDatagramSize), - receive_callbacks[j].result()->code); - EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); - EXPECT_TRUE(receive_callbacks[j].data().Equals( - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); - } - } -} - -TEST_F(UDPSocketTest, TestWrapperConnectedReadWrite) { - UDPSocketWrapper socket(std::move(socket_), 4, 4); - - TestCallbackWithAddress callback1; - socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); - callback1.WaitForResult(); - ASSERT_EQ(net::OK, callback1.result()->code); - ASSERT_NE(0u, callback1.net_address()->ipv4->port); - - NetAddressPtr server_addr = callback1.net_address().Clone(); - - UDPSocketPtr raw_client_socket; - network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); - UDPSocketWrapper client_socket(std::move(raw_client_socket), 4, 4); - - TestCallbackWithAddress callback2; - client_socket.Connect(std::move(server_addr), callback2.callback()); - callback2.WaitForResult(); - ASSERT_EQ(net::OK, callback2.result()->code); - ASSERT_NE(0u, callback2.net_address()->ipv4->port); - - NetAddressPtr client_addr = callback2.net_address().Clone(); - - const size_t kDatagramCount = 16; - const size_t kDatagramSize = 255; - - // Test send using a connected socket. - for (size_t i = 1; i < kDatagramCount; ++i) { - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); - scoped_ptr<TestReceiveCallback[]> receive_callbacks( - new TestReceiveCallback[i]); - - for (size_t j = 0; j < i; ++j) { - client_socket.SendTo( - nullptr, - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), - send_callbacks[j].callback()); - - socket.ReceiveFrom(receive_callbacks[j].callback()); - } - - receive_callbacks[i - 1].WaitForResult(); - - for (size_t j = 0; j < i; ++j) { - EXPECT_EQ(static_cast<int>(kDatagramSize), - receive_callbacks[j].result()->code); - EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); - EXPECT_TRUE(receive_callbacks[j].data().Equals( - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); - } - } - - // Test receive using a connected socket. - for (size_t i = 1; i < kDatagramCount; ++i) { - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); - scoped_ptr<TestReceiveCallback[]> receive_callbacks( - new TestReceiveCallback[i]); - - for (size_t j = 0; j < i; ++j) { - socket.SendTo( - client_addr.Clone(), - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), - send_callbacks[j].callback()); - - client_socket.ReceiveFrom(receive_callbacks[j].callback()); - } - - receive_callbacks[i - 1].WaitForResult(); - - for (size_t j = 0; j < i; ++j) { - EXPECT_EQ(static_cast<int>(kDatagramSize), - receive_callbacks[j].result()->code); - EXPECT_FALSE(receive_callbacks[j].src_addr()); - EXPECT_TRUE(receive_callbacks[j].data().Equals( - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); - } - } -} - -} // namespace service -} // namespace mojo
diff --git a/mojo/services/network/url_loader_factory_impl.cc b/mojo/services/network/url_loader_factory_impl.cc deleted file mode 100644 index 2e19d5b..0000000 --- a/mojo/services/network/url_loader_factory_impl.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/url_loader_factory_impl.h" - -#include <utility> - -#include "mojo/services/network/url_loader_impl.h" - -namespace mojo { - -URLLoaderFactoryImpl::URLLoaderFactoryImpl( - NetworkContext* context, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<URLLoaderFactory> request) - : context_(context), - app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -URLLoaderFactoryImpl::~URLLoaderFactoryImpl() { -} - -void URLLoaderFactoryImpl::CreateURLLoader(InterfaceRequest<URLLoader> loader) { - // TODO(darin): Plumb origin. Use for CORS. - // TODO(beng): Figure out how to get origin through to here. - // The loader will delete itself when the pipe is closed, unless a request is - // in progress. In which case, the loader will delete itself when the request - // is finished. - new URLLoaderImpl(context_, std::move(loader), app_refcount_->Clone()); -} - -} // namespace mojo
diff --git a/mojo/services/network/url_loader_factory_impl.h b/mojo/services/network/url_loader_factory_impl.h deleted file mode 100644 index 0b59208..0000000 --- a/mojo/services/network/url_loader_factory_impl.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_URL_LOADER_FACTORY_IMPL_H_ -#define MOJO_SERVICES_NETWORK_URL_LOADER_FACTORY_IMPL_H_ - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/url_loader_factory.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" - -namespace mojo { -class NetworkContext; - -class URLLoaderFactoryImpl : public URLLoaderFactory { - public: - URLLoaderFactoryImpl(NetworkContext* context, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<URLLoaderFactory> request); - ~URLLoaderFactoryImpl() override; - - // URLLoaderFactory methods: - void CreateURLLoader(InterfaceRequest<URLLoader> loader) override; - - private: - NetworkContext* context_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<URLLoaderFactory> binding_; - - DISALLOW_COPY_AND_ASSIGN(URLLoaderFactoryImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_URL_LOADER_FACTORY_IMPL_H_
diff --git a/mojo/services/network/url_loader_impl.cc b/mojo/services/network/url_loader_impl.cc deleted file mode 100644 index b6db54e..0000000 --- a/mojo/services/network/url_loader_impl.cc +++ /dev/null
@@ -1,426 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/url_loader_impl.h" - -#include <stddef.h> -#include <stdint.h> - -#include <utility> -#include <vector> - -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop/message_loop.h" -#include "mojo/common/common_type_converters.h" -#include "mojo/common/url_type_converters.h" -#include "mojo/services/network/net_adapters.h" -#include "mojo/services/network/network_context.h" -#include "net/base/elements_upload_data_stream.h" -#include "net/base/io_buffer.h" -#include "net/base/load_flags.h" -#include "net/base/registry_controlled_domains/registry_controlled_domain.h" -#include "net/base/upload_bytes_element_reader.h" -#include "net/http/http_response_headers.h" -#include "net/url_request/redirect_info.h" -#include "net/url_request/url_request_context.h" - -namespace mojo { -namespace { - -GURL GetSiteForURL(const GURL& url) { - // If the url has a host, then determine the site. - if (url.has_host()) { - // Only keep the scheme and registered domain as given by GetOrigin. This - // may also include a port, which we need to drop. - GURL site = url.GetOrigin(); - - // Remove port, if any. - if (site.has_port()) { - GURL::Replacements rep; - rep.ClearPort(); - site = site.ReplaceComponents(rep); - } - - // If this URL has a registered domain, we only want to remember that part. - std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( - url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); - if (!domain.empty()) { - GURL::Replacements rep; - rep.SetHostStr(domain); - site = site.ReplaceComponents(rep); - } - return site; - } - - // If there is no host but there is a scheme, return the scheme. - // This is useful for cases like file URLs. - if (url.has_scheme()) - return GURL(url.scheme() + ":"); - - // Otherwise the URL should be invalid; return an empty site. - DCHECK(!url.is_valid()); - return GURL(); -} - -// Generates an URLResponsePtr from the response state of a net::URLRequest. -URLResponsePtr MakeURLResponse(const net::URLRequest* url_request) { - URLResponsePtr response(URLResponse::New()); - response->url = String::From(url_request->url()); - response->site = GetSiteForURL(url_request->url()).spec(); - - const net::HttpResponseHeaders* headers = url_request->response_headers(); - if (headers) { - response->status_code = headers->response_code(); - response->status_line = headers->GetStatusLine(); - - response->headers = Array<HttpHeaderPtr>::New(0); - std::vector<String> header_lines; - size_t iter = 0; - std::string name, value; - while (headers->EnumerateHeaderLines(&iter, &name, &value)) { - HttpHeaderPtr header = HttpHeader::New(); - header->name = name; - header->value = value; - response->headers.push_back(std::move(header)); - } - } - - std::string mime_type; - url_request->GetMimeType(&mime_type); - response->mime_type = mime_type; - - std::string charset; - url_request->GetCharset(&charset); - response->charset = charset; - - return response; -} - -// Reads the request body upload data from a DataPipe. -class UploadDataPipeElementReader : public net::UploadElementReader { - public: - UploadDataPipeElementReader(ScopedDataPipeConsumerHandle pipe) - : pipe_(std::move(pipe)), num_bytes_(0) {} - ~UploadDataPipeElementReader() override {} - - // UploadElementReader overrides: - int Init(const net::CompletionCallback& callback) override { - offset_ = 0; - ReadDataRaw(pipe_.get(), nullptr, &num_bytes_, MOJO_READ_DATA_FLAG_QUERY); - return net::OK; - } - uint64_t GetContentLength() const override { return num_bytes_; } - uint64_t BytesRemaining() const override { return num_bytes_ - offset_; } - bool IsInMemory() const override { return false; } - int Read(net::IOBuffer* buf, - int buf_length, - const net::CompletionCallback& callback) override { - uint32_t bytes_read = - std::min(static_cast<uint32_t>(BytesRemaining()), - static_cast<uint32_t>(buf_length)); - if (bytes_read > 0) { - ReadDataRaw(pipe_.get(), buf->data(), &bytes_read, - MOJO_READ_DATA_FLAG_NONE); - } - - offset_ += bytes_read; - return bytes_read; - } - - private: - ScopedDataPipeConsumerHandle pipe_; - uint32_t num_bytes_; - uint32_t offset_; - - DISALLOW_COPY_AND_ASSIGN(UploadDataPipeElementReader); -}; - -} // namespace - -URLLoaderImpl::URLLoaderImpl(NetworkContext* context, - InterfaceRequest<URLLoader> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount) - : context_(context), - response_body_buffer_size_(0), - response_body_bytes_read_(0), - auto_follow_redirects_(true), - connected_(true), - binding_(this, std::move(request)), - app_refcount_(std::move(app_refcount)), - weak_ptr_factory_(this) { - binding_.set_connection_error_handler([this]() { OnConnectionError(); }); - context_->RegisterURLLoader(this); -} - -URLLoaderImpl::~URLLoaderImpl() { - context_->DeregisterURLLoader(this); -} - -void URLLoaderImpl::Cleanup() { - // The associated network context is going away and we have to destroy - // net::URLRequest hold by this loader. - delete this; -} - -void URLLoaderImpl::Start(URLRequestPtr request, - const Callback<void(URLResponsePtr)>& callback) { - if (url_request_) { - SendError(net::ERR_UNEXPECTED, callback); - return; - } - - if (!request) { - SendError(net::ERR_INVALID_ARGUMENT, callback); - return; - } - - url_request_ = context_->url_request_context()->CreateRequest( - GURL(request->url.get()), net::DEFAULT_PRIORITY, this); - url_request_->set_method(request->method); - // TODO(jam): need to specify this policy. - url_request_->set_referrer_policy( - net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE); - if (request->headers) { - net::HttpRequestHeaders headers; - for (size_t i = 0; i < request->headers.size(); ++i) { - base::StringPiece header = - request->headers[i]->name.To<base::StringPiece>(); - base::StringPiece value = - request->headers[i]->value.To<base::StringPiece>(); - if (header == net::HttpRequestHeaders::kReferer) { - url_request_->SetReferrer(value.as_string()); - } else { - headers.SetHeader(header, value); - } - } - url_request_->SetExtraRequestHeaders(headers); - } - if (request->body) { - std::vector<scoped_ptr<net::UploadElementReader>> element_readers; - for (size_t i = 0; i < request->body.size(); ++i) { - element_readers.push_back(make_scoped_ptr( - new UploadDataPipeElementReader(std::move(request->body[i])))); - } - url_request_->set_upload(make_scoped_ptr<net::UploadDataStream>( - new net::ElementsUploadDataStream(std::move(element_readers), 0))); - } - if (request->bypass_cache) - url_request_->SetLoadFlags(net::LOAD_BYPASS_CACHE); - - callback_ = callback; - response_body_buffer_size_ = request->response_body_buffer_size; - auto_follow_redirects_ = request->auto_follow_redirects; - - url_request_->Start(); -} - -void URLLoaderImpl::FollowRedirect( - const Callback<void(URLResponsePtr)>& callback) { - if (!url_request_) { - SendError(net::ERR_UNEXPECTED, callback); - return; - } - - if (auto_follow_redirects_) { - DLOG(ERROR) << "Spurious call to FollowRedirect"; - SendError(net::ERR_UNEXPECTED, callback); - return; - } - - // TODO(darin): Verify that it makes sense to call FollowDeferredRedirect. - url_request_->FollowDeferredRedirect(); - callback_ = callback; -} - -void URLLoaderImpl::QueryStatus( - const Callback<void(URLLoaderStatusPtr)>& callback) { - URLLoaderStatusPtr status(URLLoaderStatus::New()); - status->bytes_read = response_body_bytes_read_; - if (url_request_) { - status->is_loading = url_request_->is_pending(); - if (!url_request_->status().is_success()) - status->error = MakeNetworkError(url_request_->status().error()); - if (url_request_->response_info().headers) { - status->content_length = - url_request_->response_info().headers->GetContentLength(); - } - } else { - status->is_loading = false; - } - // TODO(darin): Populate more status fields. - callback.Run(std::move(status)); -} - -void URLLoaderImpl::OnConnectionError() { - connected_ = false; - DeleteIfNeeded(); -} - -void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* url_request, - const net::RedirectInfo& redirect_info, - bool* defer_redirect) { - DCHECK(url_request == url_request_.get()); - DCHECK(url_request->status().is_success()); - - if (auto_follow_redirects_) - return; - - // Send the redirect response to the client, allowing them to inspect it and - // optionally follow the redirect. - *defer_redirect = true; - - URLResponsePtr response = MakeURLResponse(url_request); - response->redirect_method = redirect_info.new_method; - response->redirect_url = String::From(redirect_info.new_url); - response->redirect_referrer = redirect_info.new_referrer; - - SendResponse(std::move(response)); - - DeleteIfNeeded(); -} - -void URLLoaderImpl::OnResponseStarted(net::URLRequest* url_request) { - DCHECK(url_request == url_request_.get()); - - if (!url_request->status().is_success()) { - SendError(url_request->status().error(), callback_); - callback_ = Callback<void(URLResponsePtr)>(); - DeleteIfNeeded(); - return; - } - - // TODO(darin): Add support for optional MIME sniffing. - - DataPipe data_pipe; - // TODO(darin): Honor given buffer size. - - URLResponsePtr response = MakeURLResponse(url_request); - response->body = std::move(data_pipe.consumer_handle); - response_body_stream_ = std::move(data_pipe.producer_handle); - ListenForPeerClosed(); - - SendResponse(std::move(response)); - - // Start reading... - ReadMore(); -} - -void URLLoaderImpl::OnReadCompleted(net::URLRequest* url_request, - int bytes_read) { - DCHECK(url_request == url_request_.get()); - - if (url_request->status().is_success()) { - DidRead(static_cast<uint32_t>(bytes_read), false); - } else { - handle_watcher_.Stop(); - pending_write_ = nullptr; // This closes the data pipe. - DeleteIfNeeded(); - return; - } -} - -void URLLoaderImpl::SendError( - int error_code, - const Callback<void(URLResponsePtr)>& callback) { - URLResponsePtr response(URLResponse::New()); - if (url_request_) - response->url = String::From(url_request_->url()); - response->error = MakeNetworkError(error_code); - callback.Run(std::move(response)); -} - -void URLLoaderImpl::SendResponse(URLResponsePtr response) { - Callback<void(URLResponsePtr)> callback; - std::swap(callback_, callback); - callback.Run(std::move(response)); -} - -void URLLoaderImpl::OnResponseBodyStreamReady(MojoResult result) { - // TODO(darin): Handle a bad |result| value. - - // Continue watching the handle in case the peer is closed. - ListenForPeerClosed(); - ReadMore(); -} - -void URLLoaderImpl::OnResponseBodyStreamClosed(MojoResult result) { - url_request_.reset(); - response_body_stream_.reset(); - pending_write_ = nullptr; - DeleteIfNeeded(); -} - -void URLLoaderImpl::ReadMore() { - DCHECK(!pending_write_.get()); - - uint32_t num_bytes; - MojoResult result = NetToMojoPendingBuffer::BeginWrite( - &response_body_stream_, &pending_write_, &num_bytes); - - if (result == MOJO_RESULT_SHOULD_WAIT) { - // The pipe is full. We need to wait for it to have more space. - handle_watcher_.Start(response_body_stream_.get(), - MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_DEADLINE_INDEFINITE, - base::Bind(&URLLoaderImpl::OnResponseBodyStreamReady, - base::Unretained(this))); - return; - } else if (result != MOJO_RESULT_OK) { - // The response body stream is in a bad state. Bail. - // TODO(darin): How should this be communicated to our client? - handle_watcher_.Stop(); - response_body_stream_.reset(); - DeleteIfNeeded(); - return; - } - CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); - - scoped_refptr<net::IOBuffer> buf(new NetToMojoIOBuffer(pending_write_.get())); - - int bytes_read; - url_request_->Read(buf.get(), static_cast<int>(num_bytes), &bytes_read); - if (url_request_->status().is_io_pending()) { - // Wait for OnReadCompleted. - } else if (url_request_->status().is_success() && bytes_read > 0) { - DidRead(static_cast<uint32_t>(bytes_read), true); - } else { - handle_watcher_.Stop(); - pending_write_->Complete(0); - pending_write_ = nullptr; // This closes the data pipe. - DeleteIfNeeded(); - return; - } -} - -void URLLoaderImpl::DidRead(uint32_t num_bytes, bool completed_synchronously) { - DCHECK(url_request_->status().is_success()); - - response_body_bytes_read_ += num_bytes; - response_body_stream_ = pending_write_->Complete(num_bytes); - pending_write_ = nullptr; - - if (completed_synchronously) { - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&URLLoaderImpl::ReadMore, weak_ptr_factory_.GetWeakPtr())); - } else { - ReadMore(); - } -} - -void URLLoaderImpl::DeleteIfNeeded() { - bool has_data_pipe = pending_write_.get() || response_body_stream_.is_valid(); - if (!connected_ && !has_data_pipe) - delete this; -} - -void URLLoaderImpl::ListenForPeerClosed() { - handle_watcher_.Start(response_body_stream_.get(), - MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&URLLoaderImpl::OnResponseBodyStreamClosed, - base::Unretained(this))); -} - -} // namespace mojo
diff --git a/mojo/services/network/url_loader_impl.h b/mojo/services/network/url_loader_impl.h deleted file mode 100644 index 833eb864..0000000 --- a/mojo/services/network/url_loader_impl.h +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_ -#define MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_ - -#include <stdint.h> - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/services/network/public/interfaces/url_loader.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "net/base/net_errors.h" -#include "net/url_request/url_request.h" - -namespace mojo { - -class NetworkContext; -class NetToMojoPendingBuffer; - -class URLLoaderImpl : public URLLoader, - public net::URLRequest::Delegate { - public: - URLLoaderImpl(NetworkContext* context, - InterfaceRequest<URLLoader> request, - scoped_ptr<mojo::MessageLoopRef> app_refcount); - ~URLLoaderImpl() override; - - // Called when the associated NetworkContext is going away. - void Cleanup(); - - private: - // URLLoader methods: - void Start(URLRequestPtr request, - const Callback<void(URLResponsePtr)>& callback) override; - void FollowRedirect(const Callback<void(URLResponsePtr)>& callback) override; - void QueryStatus(const Callback<void(URLLoaderStatusPtr)>& callback) override; - - void OnConnectionError(); - - // net::URLRequest::Delegate methods: - void OnReceivedRedirect(net::URLRequest* url_request, - const net::RedirectInfo& redirect_info, - bool* defer_redirect) override; - void OnResponseStarted(net::URLRequest* url_request) override; - void OnReadCompleted(net::URLRequest* url_request, int bytes_read) override; - - void SendError( - int error, - const Callback<void(URLResponsePtr)>& callback); - void SendResponse(URLResponsePtr response); - void OnResponseBodyStreamReady(MojoResult result); - void OnResponseBodyStreamClosed(MojoResult result); - void ReadMore(); - void DidRead(uint32_t num_bytes, bool completed_synchronously); - void ListenForPeerClosed(); - void DeleteIfNeeded(); - - NetworkContext* context_; - scoped_ptr<net::URLRequest> url_request_; - Callback<void(URLResponsePtr)> callback_; - ScopedDataPipeProducerHandle response_body_stream_; - scoped_refptr<NetToMojoPendingBuffer> pending_write_; - common::HandleWatcher handle_watcher_; - uint32_t response_body_buffer_size_; - uint32_t response_body_bytes_read_; - bool auto_follow_redirects_; - bool connected_; - Binding<URLLoader> binding_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - - base::WeakPtrFactory<URLLoaderImpl> weak_ptr_factory_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_
diff --git a/mojo/services/network/url_loader_impl_unittest.cc b/mojo/services/network/url_loader_impl_unittest.cc deleted file mode 100644 index bbabc3e..0000000 --- a/mojo/services/network/url_loader_impl_unittest.cc +++ /dev/null
@@ -1,287 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <utility> - -#include "base/bind.h" -#include "base/lazy_instance.h" -#include "base/memory/weak_ptr.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" -#include "mojo/message_pump/message_pump_mojo.h" -#include "mojo/public/cpp/bindings/interface_request.h" -#include "mojo/services/network/network_context.h" -#include "mojo/services/network/url_loader_impl.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" -#include "mojo/shell/public/cpp/shell_test.h" -#include "net/base/net_errors.h" -#include "net/url_request/url_request_job.h" -#include "net/url_request/url_request_job_factory_impl.h" -#include "net/url_request/url_request_status.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace mojo { - -class TestURLRequestJob; - -TestURLRequestJob* g_current_job = nullptr; - -template <class A> -void PassA(A* destination, A value) { - *destination = std::move(value); -} - -class TestURLRequestJob : public net::URLRequestJob { - public: - enum Status { CREATED, STARTED, READING, COMPLETED }; - - TestURLRequestJob(net::URLRequest* request, - net::NetworkDelegate* network_delegate) - : net::URLRequestJob(request, network_delegate), - status_(CREATED), - buf_size_(0) { - CHECK(!g_current_job); - g_current_job = this; - } - - Status status() { return status_; } - - int buf_size() { return buf_size_; } - - void Start() override { status_ = STARTED; } - - int ReadRawData(net::IOBuffer* buf, int buf_size) override { - status_ = READING; - buf_size_ = buf_size; - return net::ERR_IO_PENDING; - } - - void NotifyHeadersComplete() { net::URLRequestJob::NotifyHeadersComplete(); } - - void NotifyReadComplete(int bytes_read) { - if (bytes_read < 0) { - // Map errors to net::ERR_FAILED. - ReadRawDataComplete(net::ERR_FAILED); - // Set this after calling ReadRawDataComplete since that ends up calling - // ReadRawData. - status_ = COMPLETED; - } else if (bytes_read == 0) { - ReadRawDataComplete(bytes_read); - // Set this after calling ReadRawDataComplete since that ends up calling - // ReadRawData. - status_ = COMPLETED; - } else { - ReadRawDataComplete(bytes_read); - // Set this after calling ReadRawDataComplete since that ends up calling - // ReadRawData. - status_ = STARTED; - } - } - - private: - ~TestURLRequestJob() override { - CHECK(g_current_job == this); - g_current_job = nullptr; - } - - Status status_; - int buf_size_; -}; - -class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { - public: - explicit TestProtocolHandler(const base::Closure& quit_closure) - : quit_closure_(quit_closure) {} - net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const override { - quit_closure_.Run(); - return new TestURLRequestJob(request, network_delegate); - } - - ~TestProtocolHandler() override {} - - private: - base::Closure quit_closure_; -}; - -class UrlLoaderImplTest : public test::ShellTest { - public: - UrlLoaderImplTest() : ShellTest("exe:network_service_unittests") {} - - protected: - void SetUp() override { - ShellTest::SetUp(); - - wait_for_request_.reset(new base::RunLoop); - - scoped_ptr<net::TestURLRequestContext> url_request_context( - new net::TestURLRequestContext(true)); - ASSERT_TRUE(url_request_job_factory_.SetProtocolHandler( - "http", make_scoped_ptr(new TestProtocolHandler( - wait_for_request_->QuitClosure())))); - url_request_context->set_job_factory(&url_request_job_factory_); - url_request_context->Init(); - network_context_.reset(new NetworkContext(std::move(url_request_context))); - MessagePipe pipe; - new URLLoaderImpl(network_context_.get(), - GetProxy(&url_loader_proxy_), - make_scoped_ptr<mojo::MessageLoopRef>(nullptr)); - EXPECT_TRUE(IsUrlLoaderValid()); - } - - bool IsUrlLoaderValid() { - return network_context_->GetURLLoaderCountForTesting() > 0u; - } - - net::TestJobInterceptor* job_interceptor_; - net::URLRequestJobFactoryImpl url_request_job_factory_; - scoped_ptr<NetworkContext> network_context_; - URLLoaderPtr url_loader_proxy_; - scoped_ptr<base::RunLoop> wait_for_request_; -}; - -TEST_F(UrlLoaderImplTest, ClosedBeforeAnyCall) { - url_loader_proxy_.reset(); - - while (IsUrlLoaderValid()) - base::RunLoop().RunUntilIdle(); -} - -TEST_F(UrlLoaderImplTest, ClosedWhileWaitingOnTheNetwork) { - URLRequestPtr request(URLRequest::New()); - request->url = "http://example.com"; - - URLResponsePtr response; - url_loader_proxy_->Start(std::move(request), - base::Bind(&PassA<URLResponsePtr>, &response)); - wait_for_request_->Run(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_FALSE(response); - ASSERT_TRUE(g_current_job); - - g_current_job->NotifyHeadersComplete(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_TRUE(response); - EXPECT_EQ(TestURLRequestJob::READING, g_current_job->status()); - - url_loader_proxy_.reset(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - - response.reset(); - - while (IsUrlLoaderValid()) - base::RunLoop().RunUntilIdle(); -} - -TEST_F(UrlLoaderImplTest, ClosedWhileWaitingOnThePipeToBeWriteable) { - URLRequestPtr request(URLRequest::New()); - request->url = "http://example.com"; - - URLResponsePtr response; - url_loader_proxy_->Start(std::move(request), - base::Bind(&PassA<URLResponsePtr>, &response)); - wait_for_request_->Run(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_FALSE(response); - ASSERT_TRUE(g_current_job); - - g_current_job->NotifyHeadersComplete(); - while (g_current_job->status() != TestURLRequestJob::READING) - base::RunLoop().RunUntilIdle(); - - while (!response) - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_EQ(TestURLRequestJob::READING, g_current_job->status()); - - while (g_current_job->status() != TestURLRequestJob::STARTED) { - g_current_job->NotifyReadComplete(g_current_job->buf_size()); - base::RunLoop().RunUntilIdle(); - } - - EXPECT_EQ(TestURLRequestJob::STARTED, g_current_job->status()); - - url_loader_proxy_.reset(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - - response.reset(); - - while (IsUrlLoaderValid()) - base::RunLoop().RunUntilIdle(); -} - -TEST_F(UrlLoaderImplTest, RequestCompleted) { - URLRequestPtr request(URLRequest::New()); - request->url = "http://example.com"; - - URLResponsePtr response; - url_loader_proxy_->Start(std::move(request), - base::Bind(&PassA<URLResponsePtr>, &response)); - wait_for_request_->Run(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_FALSE(response); - ASSERT_TRUE(g_current_job); - - g_current_job->NotifyHeadersComplete(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_TRUE(response); - EXPECT_EQ(TestURLRequestJob::READING, g_current_job->status()); - - url_loader_proxy_.reset(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - - g_current_job->NotifyReadComplete(0); - - while (IsUrlLoaderValid()) - base::RunLoop().RunUntilIdle(); -} - -TEST_F(UrlLoaderImplTest, RequestFailed) { - URLRequestPtr request(URLRequest::New()); - request->url = "http://example.com"; - - URLResponsePtr response; - url_loader_proxy_->Start(std::move(request), - base::Bind(&PassA<URLResponsePtr>, &response)); - wait_for_request_->Run(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_FALSE(response); - ASSERT_TRUE(g_current_job); - - g_current_job->NotifyHeadersComplete(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - EXPECT_TRUE(response); - EXPECT_EQ(TestURLRequestJob::READING, g_current_job->status()); - - url_loader_proxy_.reset(); - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(IsUrlLoaderValid()); - - g_current_job->NotifyReadComplete(-1); - - while (IsUrlLoaderValid()) - base::RunLoop().RunUntilIdle(); -} - -} // namespace mojo
diff --git a/mojo/services/network/web_socket_factory_impl.cc b/mojo/services/network/web_socket_factory_impl.cc deleted file mode 100644 index 6adde55..0000000 --- a/mojo/services/network/web_socket_factory_impl.cc +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/web_socket_factory_impl.h" - -#include <utility> - -#include "mojo/services/network/web_socket_impl.h" - -namespace mojo { - -WebSocketFactoryImpl::WebSocketFactoryImpl( - NetworkContext* context, - scoped_ptr<MessageLoopRef> app_refcount, - InterfaceRequest<WebSocketFactory> request) - : context_(context), - app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -WebSocketFactoryImpl::~WebSocketFactoryImpl() { -} - -void WebSocketFactoryImpl::CreateWebSocket(InterfaceRequest<WebSocket> socket) { - new WebSocketImpl(context_, app_refcount_->Clone(), std::move(socket)); -} - -} // namespace mojo
diff --git a/mojo/services/network/web_socket_factory_impl.h b/mojo/services/network/web_socket_factory_impl.h deleted file mode 100644 index ca254ca..0000000 --- a/mojo/services/network/web_socket_factory_impl.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_WEB_SOCKET_FACTORY_IMPL_H_ -#define MOJO_SERVICES_NETWORK_WEB_SOCKET_FACTORY_IMPL_H_ - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/web_socket_factory.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" - -namespace mojo { -class NetworkContext; - -class WebSocketFactoryImpl : public WebSocketFactory { - public: - WebSocketFactoryImpl(NetworkContext* context, - scoped_ptr<MessageLoopRef> app_refcount, - InterfaceRequest<WebSocketFactory> request); - ~WebSocketFactoryImpl() override; - - // WebSocketFactory methods: - void CreateWebSocket(InterfaceRequest<WebSocket> socket) override; - - private: - NetworkContext* context_; - scoped_ptr<MessageLoopRef> app_refcount_; - StrongBinding<WebSocketFactory> binding_; - - DISALLOW_COPY_AND_ASSIGN(WebSocketFactoryImpl); -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_WEB_SOCKET_FACTORY_IMPL_H_
diff --git a/mojo/services/network/web_socket_impl.cc b/mojo/services/network/web_socket_impl.cc deleted file mode 100644 index 2d89149d..0000000 --- a/mojo/services/network/web_socket_impl.cc +++ /dev/null
@@ -1,242 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/services/network/web_socket_impl.h" - -#include <stdint.h> - -#include <utility> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/message_loop/message_loop.h" -#include "mojo/message_pump/handle_watcher.h" -#include "mojo/services/network/network_context.h" -#include "mojo/services/network/public/cpp/web_socket_read_queue.h" -#include "mojo/services/network/public/cpp/web_socket_write_queue.h" -#include "net/websockets/websocket_channel.h" -#include "net/websockets/websocket_errors.h" -#include "net/websockets/websocket_event_interface.h" -#include "net/websockets/websocket_frame.h" // for WebSocketFrameHeader::OpCode -#include "net/websockets/websocket_handshake_request_info.h" -#include "net/websockets/websocket_handshake_response_info.h" -#include "url/origin.h" - -namespace mojo { - -template <> -struct TypeConverter<net::WebSocketFrameHeader::OpCode, - WebSocket::MessageType> { - static net::WebSocketFrameHeader::OpCode Convert( - WebSocket::MessageType type) { - DCHECK(type == WebSocket::MessageType::CONTINUATION || - type == WebSocket::MessageType::TEXT || - type == WebSocket::MessageType::BINARY); - typedef net::WebSocketFrameHeader::OpCode OpCode; - // These compile asserts verify that the same underlying values are used for - // both types, so we can simply cast between them. - static_assert(static_cast<OpCode>(WebSocket::MessageType::CONTINUATION) == - net::WebSocketFrameHeader::kOpCodeContinuation, - "enum values must match for opcode continuation"); - static_assert(static_cast<OpCode>(WebSocket::MessageType::TEXT) == - net::WebSocketFrameHeader::kOpCodeText, - "enum values must match for opcode text"); - static_assert(static_cast<OpCode>(WebSocket::MessageType::BINARY) == - net::WebSocketFrameHeader::kOpCodeBinary, - "enum values must match for opcode binary"); - return static_cast<OpCode>(type); - } -}; - -template <> -struct TypeConverter<WebSocket::MessageType, - net::WebSocketFrameHeader::OpCode> { - static WebSocket::MessageType Convert( - net::WebSocketFrameHeader::OpCode type) { - DCHECK(type == net::WebSocketFrameHeader::kOpCodeContinuation || - type == net::WebSocketFrameHeader::kOpCodeText || - type == net::WebSocketFrameHeader::kOpCodeBinary); - return static_cast<WebSocket::MessageType>(type); - } -}; - -namespace { - -typedef net::WebSocketEventInterface::ChannelState ChannelState; - -struct WebSocketEventHandler : public net::WebSocketEventInterface { - public: - WebSocketEventHandler(WebSocketClientPtr client) - : client_(std::move(client)) {} - ~WebSocketEventHandler() override {} - - private: - // net::WebSocketEventInterface methods: - ChannelState OnAddChannelResponse(const std::string& selected_subprotocol, - const std::string& extensions) override; - ChannelState OnDataFrame(bool fin, - WebSocketMessageType type, - const std::vector<char>& data) override; - ChannelState OnClosingHandshake() override; - ChannelState OnFlowControl(int64_t quota) override; - ChannelState OnDropChannel(bool was_clean, - uint16_t code, - const std::string& reason) override; - ChannelState OnFailChannel(const std::string& message) override; - ChannelState OnStartOpeningHandshake( - scoped_ptr<net::WebSocketHandshakeRequestInfo> request) override; - ChannelState OnFinishOpeningHandshake( - scoped_ptr<net::WebSocketHandshakeResponseInfo> response) override; - ChannelState OnSSLCertificateError( - scoped_ptr<net::WebSocketEventInterface::SSLErrorCallbacks> callbacks, - const GURL& url, - const net::SSLInfo& ssl_info, - bool fatal) override; - - // Called once we've written to |receive_stream_|. - void DidWriteToReceiveStream(bool fin, - net::WebSocketFrameHeader::OpCode type, - uint32_t num_bytes, - const char* buffer); - WebSocketClientPtr client_; - ScopedDataPipeProducerHandle receive_stream_; - scoped_ptr<WebSocketWriteQueue> write_queue_; - - DISALLOW_COPY_AND_ASSIGN(WebSocketEventHandler); -}; - -ChannelState WebSocketEventHandler::OnAddChannelResponse( - const std::string& selected_protocol, - const std::string& extensions) { - DataPipe data_pipe; - receive_stream_ = std::move(data_pipe.producer_handle); - write_queue_.reset(new WebSocketWriteQueue(receive_stream_.get())); - client_->DidConnect(selected_protocol, extensions, - std::move(data_pipe.consumer_handle)); - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnDataFrame( - bool fin, - net::WebSocketFrameHeader::OpCode type, - const std::vector<char>& data) { - uint32_t size = static_cast<uint32_t>(data.size()); - write_queue_->Write( - &data[0], size, - base::Bind(&WebSocketEventHandler::DidWriteToReceiveStream, - base::Unretained(this), - fin, type, size)); - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnClosingHandshake() { - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnFlowControl(int64_t quota) { - client_->DidReceiveFlowControl(quota); - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnDropChannel(bool was_clean, - uint16_t code, - const std::string& reason) { - client_->DidClose(was_clean, code, reason); - return WebSocketEventInterface::CHANNEL_DELETED; -} - -ChannelState WebSocketEventHandler::OnFailChannel(const std::string& message) { - client_->DidFail(message); - return WebSocketEventInterface::CHANNEL_DELETED; -} - -ChannelState WebSocketEventHandler::OnStartOpeningHandshake( - scoped_ptr<net::WebSocketHandshakeRequestInfo> request) { - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnFinishOpeningHandshake( - scoped_ptr<net::WebSocketHandshakeResponseInfo> response) { - return WebSocketEventInterface::CHANNEL_ALIVE; -} - -ChannelState WebSocketEventHandler::OnSSLCertificateError( - scoped_ptr<net::WebSocketEventInterface::SSLErrorCallbacks> callbacks, - const GURL& url, - const net::SSLInfo& ssl_info, - bool fatal) { - client_->DidFail("SSL Error"); - return WebSocketEventInterface::CHANNEL_DELETED; -} - -void WebSocketEventHandler::DidWriteToReceiveStream( - bool fin, - net::WebSocketFrameHeader::OpCode type, - uint32_t num_bytes, - const char* buffer) { - client_->DidReceiveData( - fin, ConvertTo<WebSocket::MessageType>(type), num_bytes); -} - -} // namespace mojo - -WebSocketImpl::WebSocketImpl(NetworkContext* context, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<WebSocket> request) - : context_(context), - app_refcount_(std::move(app_refcount)), - binding_(this, std::move(request)) {} - -WebSocketImpl::~WebSocketImpl() { -} - -void WebSocketImpl::Connect(const String& url, - Array<String> protocols, - const String& origin, - ScopedDataPipeConsumerHandle send_stream, - WebSocketClientPtr client) { - DCHECK(!channel_); - send_stream_ = std::move(send_stream); - read_queue_.reset(new WebSocketReadQueue(send_stream_.get())); - scoped_ptr<net::WebSocketEventInterface> event_interface( - new WebSocketEventHandler(std::move(client))); - channel_.reset(new net::WebSocketChannel(std::move(event_interface), - context_->url_request_context())); - channel_->SendAddChannelRequest(GURL(url.get()), - protocols.To<std::vector<std::string>>(), - url::Origin(GURL(origin.get()))); -} - -void WebSocketImpl::Send(bool fin, - WebSocket::MessageType type, - uint32_t num_bytes) { - DCHECK(channel_); - read_queue_->Read(num_bytes, - base::Bind(&WebSocketImpl::DidReadFromSendStream, - base::Unretained(this), - fin, type, num_bytes)); -} - -void WebSocketImpl::FlowControl(int64_t quota) { - DCHECK(channel_); - channel_->SendFlowControl(quota); -} - -void WebSocketImpl::Close(uint16_t code, const String& reason) { - DCHECK(channel_); - channel_->StartClosingHandshake(code, reason); -} - -void WebSocketImpl::DidReadFromSendStream(bool fin, - WebSocket::MessageType type, - uint32_t num_bytes, - const char* data) { - std::vector<char> buffer(num_bytes); - memcpy(&buffer[0], data, num_bytes); - DCHECK(channel_); - channel_->SendFrame( - fin, ConvertTo<net::WebSocketFrameHeader::OpCode>(type), buffer); -} - -} // namespace mojo
diff --git a/mojo/services/network/web_socket_impl.h b/mojo/services/network/web_socket_impl.h deleted file mode 100644 index 06fd3ca..0000000 --- a/mojo/services/network/web_socket_impl.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_SERVICES_NETWORK_WEB_SOCKET_IMPL_H_ -#define MOJO_SERVICES_NETWORK_WEB_SOCKET_IMPL_H_ - -#include <stdint.h> - -#include "base/memory/scoped_ptr.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "mojo/services/network/public/interfaces/web_socket.mojom.h" -#include "mojo/shell/public/cpp/message_loop_ref.h" - -namespace net { -class WebSocketChannel; -} // namespace net - -namespace mojo { -class NetworkContext; -class WebSocketReadQueue; - -// Forms a bridge between the WebSocket mojo interface and the net::WebSocket -// implementation. -class WebSocketImpl : public WebSocket { - public: - WebSocketImpl(NetworkContext* context, - scoped_ptr<mojo::MessageLoopRef> app_refcount, - InterfaceRequest<WebSocket> request); - ~WebSocketImpl() override; - - private: - // WebSocket methods: - void Connect(const String& url, - Array<String> protocols, - const String& origin, - ScopedDataPipeConsumerHandle send_stream, - WebSocketClientPtr client) override; - void Send(bool fin, WebSocket::MessageType type, uint32_t num_bytes) override; - void FlowControl(int64_t quota) override; - void Close(uint16_t code, const String& reason) override; - - // Called with the data to send once it has been read from |send_stream_|. - void DidReadFromSendStream(bool fin, - WebSocket::MessageType type, - uint32_t num_bytes, - const char* data); - - // The channel we use to send events to the network. - scoped_ptr<net::WebSocketChannel> channel_; - ScopedDataPipeConsumerHandle send_stream_; - scoped_ptr<WebSocketReadQueue> read_queue_; - NetworkContext* context_; - scoped_ptr<mojo::MessageLoopRef> app_refcount_; - StrongBinding<WebSocket> binding_; -}; - -} // namespace mojo - -#endif // MOJO_SERVICES_NETWORK_WEB_SOCKET_IMPL_H_
diff --git a/mojo/shell/shell.cc b/mojo/shell/shell.cc index ed3f6e4..2e39000 100644 --- a/mojo/shell/shell.cc +++ b/mojo/shell/shell.cc
@@ -296,10 +296,10 @@ const ConnectCallback& callback) { if (!client_process_connection->is_null()) { if (!HasClass(capability_spec_, kCapabilityClass_ClientProcess)) { - LOG(WARNING) << "Instance: " << identity_.name() << " attempting " - << "to register an instance for a process it created for " - << "target: " << target.name() << " without the " - << "mojo:shell{client_process} capability class."; + LOG(ERROR) << "Instance: " << identity_.name() << " attempting " + << "to register an instance for a process it created for " + << "target: " << target.name() << " without the " + << "mojo:shell{client_process} capability class."; callback.Run(mojom::ConnectResult::ACCESS_DENIED, mojom::kInheritUserID, mojom::kInvalidInstanceID); return false; @@ -307,17 +307,17 @@ if (!(*client_process_connection)->shell_client.is_valid() || !(*client_process_connection)->pid_receiver_request.is_valid()) { - LOG(WARNING) << "Must supply both shell_client AND " - << "pid_receiver_request when sending " - << "client_process_connection."; + LOG(ERROR) << "Must supply both shell_client AND " + << "pid_receiver_request when sending " + << "client_process_connection."; callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, mojom::kInheritUserID, mojom::kInvalidInstanceID); return false; } if (shell_->GetExistingInstance(target)) { - LOG(WARNING) << "Cannot client process matching existing identity:" - << "Name: " << target.name() << " User: " - << target.user_id() << " Instance: " << target.instance(); + LOG(ERROR) << "Cannot client process matching existing identity:" + << "Name: " << target.name() << " User: " + << target.user_id() << " Instance: " << target.instance(); callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, mojom::kInheritUserID, mojom::kInvalidInstanceID); return false;
diff --git a/mojo/shell/standalone/context.cc b/mojo/shell/standalone/context.cc index c036694e..4a5512e976 100644 --- a/mojo/shell/standalone/context.cc +++ b/mojo/shell/standalone/context.cc
@@ -166,7 +166,8 @@ scoped_ptr<catalog::Store> store; if (init_params) store = std::move(init_params->catalog_store); - catalog_.reset(new catalog::Factory(blocking_pool_.get(), std::move(store))); + catalog_.reset( + new catalog::Factory(blocking_pool_.get(), std::move(store), nullptr)); shell_.reset(new Shell(std::move(runner_factory), catalog_->TakeShellClient()));
diff --git a/mojo/shell/tests/loader_unittest.cc b/mojo/shell/tests/loader_unittest.cc index 773bc95..b9c9f27 100644 --- a/mojo/shell/tests/loader_unittest.cc +++ b/mojo/shell/tests/loader_unittest.cc
@@ -402,7 +402,8 @@ void SetUp() override { blocking_pool_ = new base::SequencedWorkerPool(3, "blocking_pool"); - catalog_.reset(new catalog::Factory(blocking_pool_.get(), nullptr)); + catalog_.reset( + new catalog::Factory(blocking_pool_.get(), nullptr, nullptr)); shell_.reset(new Shell(nullptr, catalog_->TakeShellClient())); test_loader_ = new TestLoader(&context_); shell_->set_default_loader(scoped_ptr<Loader>(test_loader_)); @@ -478,7 +479,7 @@ TEST_F(LoaderTest, Deletes) { { - catalog::Factory catalog(blocking_pool_.get(), nullptr); + catalog::Factory catalog(blocking_pool_.get(), nullptr, nullptr); Shell shell(nullptr, catalog.TakeShellClient()); TestLoader* default_loader = new TestLoader(&context_); TestLoader* name_loader1 = new TestLoader(&context_);
diff --git a/net/base/network_quality_estimator.cc b/net/base/network_quality_estimator.cc index 8ba2d03..9a6d8d6 100644 --- a/net/base/network_quality_estimator.cc +++ b/net/base/network_quality_estimator.cc
@@ -15,11 +15,13 @@ #include "base/metrics/histogram.h" #include "base/metrics/histogram_base.h" #include "base/strings/string_number_conversions.h" +#include "base/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "net/base/load_flags.h" #include "net/base/load_timing_info.h" #include "net/base/network_interfaces.h" +#include "net/base/socket_performance_watcher.h" #include "net/base/url_util.h" #include "net/url_request/url_request.h" #include "url/gurl.h" @@ -118,6 +120,81 @@ namespace net { +// SocketWatcher implements SocketPerformanceWatcher, and notifies +// NetworkQualityEstimator of various socket performance events. SocketWatcher +// is not thread-safe. +class NetworkQualityEstimator::SocketWatcher : public SocketPerformanceWatcher { + public: + SocketWatcher( + SocketPerformanceWatcherFactory::Protocol protocol, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::WeakPtr<NetworkQualityEstimator>& network_quality_estimator) + : protocol_(protocol), + task_runner_(std::move(task_runner)), + network_quality_estimator_(network_quality_estimator) {} + + ~SocketWatcher() override {} + + // SocketPerformanceWatcher implementation: + bool ShouldNotifyUpdatedRTT() const override { + DCHECK(thread_checker_.CalledOnValidThread()); + + return true; + } + + void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override { + DCHECK(thread_checker_.CalledOnValidThread()); + + task_runner_->PostTask( + FROM_HERE, base::Bind(&NetworkQualityEstimator::OnUpdatedRTTAvailable, + network_quality_estimator_, protocol_, rtt)); + } + + void OnConnectionChanged() override { + DCHECK(thread_checker_.CalledOnValidThread()); + } + + private: + // Transport layer protocol used by the socket that |this| is watching. + const SocketPerformanceWatcherFactory::Protocol protocol_; + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + base::WeakPtr<NetworkQualityEstimator> network_quality_estimator_; + + base::ThreadChecker thread_checker_; + + DISALLOW_COPY_AND_ASSIGN(SocketWatcher); +}; + +// SocketWatcherFactory implements SocketPerformanceWatcherFactory, and is +// owned by NetworkQualityEstimator. SocketWatcherFactory is thread safe. +class NetworkQualityEstimator::SocketWatcherFactory + : public SocketPerformanceWatcherFactory { + public: + SocketWatcherFactory( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::WeakPtr<NetworkQualityEstimator>& network_quality_estimator) + : task_runner_(std::move(task_runner)), + network_quality_estimator_(network_quality_estimator) {} + + ~SocketWatcherFactory() override {} + + // SocketPerformanceWatcherFactory implementation: + scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( + const Protocol protocol) override { + return scoped_ptr<SocketPerformanceWatcher>( + new SocketWatcher(protocol, task_runner_, network_quality_estimator_)); + } + + private: + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + base::WeakPtr<NetworkQualityEstimator> network_quality_estimator_; + + DISALLOW_COPY_AND_ASSIGN(SocketWatcherFactory); +}; + const int32_t NetworkQualityEstimator::kInvalidThroughput = 0; NetworkQualityEstimator::NetworkQualityEstimator( @@ -142,7 +219,8 @@ downstream_throughput_kbps_observations_( GetWeightMultiplierPerSecond(variation_params)), rtt_observations_(GetWeightMultiplierPerSecond(variation_params)), - external_estimate_provider_(std::move(external_estimates_provider)) { + external_estimate_provider_(std::move(external_estimates_provider)), + weak_ptr_factory_(this) { static_assert(kMinRequestDurationMicroseconds > 0, "Minimum request duration must be > 0"); static_assert(kDefaultHalfLifeSeconds > 0, @@ -167,6 +245,9 @@ } current_network_id_ = GetCurrentNetworkID(); AddDefaultEstimates(); + + watcher_factory_.reset(new SocketWatcherFactory( + base::ThreadTaskRunnerHandle::Get(), weak_ptr_factory_.GetWeakPtr())); } // static @@ -381,6 +462,13 @@ throughput_observer_list_.RemoveObserver(throughput_observer); } +SocketPerformanceWatcherFactory* +NetworkQualityEstimator::GetSocketPerformanceWatcherFactory() { + DCHECK(thread_checker_.CalledOnValidThread()); + + return watcher_factory_.get(); +} + void NetworkQualityEstimator::RecordRTTUMA(int32_t estimated_value_msec, int32_t actual_value_msec) const { DCHECK(thread_checker_.CalledOnValidThread()); @@ -909,25 +997,16 @@ static_cast<size_t>(kMaximumNetworkQualityCacheSize)); } -scoped_ptr<SocketPerformanceWatcher> -NetworkQualityEstimator::CreateSocketPerformanceWatcher( - const Protocol protocol) { - DCHECK(thread_checker_.CalledOnValidThread()); - - return scoped_ptr<SocketPerformanceWatcher>( - new SocketPerformanceWatcher(protocol, this)); -} - void NetworkQualityEstimator::OnUpdatedRTTAvailable( - const Protocol protocol, + SocketPerformanceWatcherFactory::Protocol protocol, const base::TimeDelta& rtt) { DCHECK(thread_checker_.CalledOnValidThread()); switch (protocol) { - case PROTOCOL_TCP: + case SocketPerformanceWatcherFactory::PROTOCOL_TCP: NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), TCP)); return; - case PROTOCOL_QUIC: + case SocketPerformanceWatcherFactory::PROTOCOL_QUIC: NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), QUIC)); return; default:
diff --git a/net/base/network_quality_estimator.h b/net/base/network_quality_estimator.h index 32e1a3e..5ff9bd7 100644 --- a/net/base/network_quality_estimator.h +++ b/net/base/network_quality_estimator.h
@@ -17,15 +17,19 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "net/base/external_estimate_provider.h" #include "net/base/net_export.h" #include "net/base/network_change_notifier.h" -#include "net/base/socket_performance_watcher.h" #include "net/base/socket_performance_watcher_factory.h" +namespace base { +class SingleThreadTaskRunner; +} // namespace base + namespace net { class URLRequest; @@ -40,8 +44,7 @@ // observed traffic characteristics. class NET_EXPORT_PRIVATE NetworkQualityEstimator : public NetworkChangeNotifier::ConnectionTypeObserver, - public ExternalEstimateProvider::UpdatedEstimateDelegate, - public SocketPerformanceWatcherFactory { + public ExternalEstimateProvider::UpdatedEstimateDelegate { public: // On Android, a Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net @@ -168,12 +171,6 @@ const base::TimeTicks& begin_timestamp, int32_t* kbps) const; - // SocketPerformanceWatcherFactory implementation: - scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( - const Protocol protocol) override; - void OnUpdatedRTTAvailable(const Protocol protocol, - const base::TimeDelta& rtt) override; - // Adds |rtt_observer| to the list of round trip time observers. Must be // called on the IO thread. void AddRTTObserver(RTTObserver* rtt_observer); @@ -190,6 +187,8 @@ // is on the list of observers. Must be called on the IO thread. void RemoveThroughputObserver(ThroughputObserver* throughput_observer); + SocketPerformanceWatcherFactory* GetSocketPerformanceWatcherFactory(); + protected: // NetworkID is used to uniquely identify a network. // For the purpose of network quality estimation and caching, a network is @@ -258,7 +257,9 @@ TestExternalEstimateProvider); FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestExternalEstimateProviderMergeEstimates); - FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestObservers); + + class SocketWatcher; + class SocketWatcherFactory; // NetworkQuality is used to cache the quality of a network connection. class NET_EXPORT_PRIVATE NetworkQuality { @@ -498,6 +499,10 @@ // should discard RTT if it is set to the value returned by |InvalidRTT()|. static const base::TimeDelta InvalidRTT(); + // Notifies |this| of a new transport layer RTT. + void OnUpdatedRTTAvailable(SocketPerformanceWatcherFactory::Protocol protocol, + const base::TimeDelta& rtt); + // Queries the external estimate provider for the latest network quality // estimates, and adds those estimates to the current observation buffer. void QueryExternalEstimateProvider(); @@ -610,8 +615,12 @@ base::ObserverList<RTTObserver> rtt_observer_list_; base::ObserverList<ThroughputObserver> throughput_observer_list_; + scoped_ptr<SocketPerformanceWatcherFactory> watcher_factory_; + base::ThreadChecker thread_checker_; + base::WeakPtrFactory<NetworkQualityEstimator> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(NetworkQualityEstimator); };
diff --git a/net/base/network_quality_estimator_unittest.cc b/net/base/network_quality_estimator_unittest.cc index 0c5fabc..13d35b1b 100644 --- a/net/base/network_quality_estimator_unittest.cc +++ b/net/base/network_quality_estimator_unittest.cc
@@ -5,8 +5,10 @@ #include "net/base/network_quality_estimator.h" #include <stdint.h> + #include <limits> #include <map> +#include <string> #include <utility> #include <vector> @@ -23,10 +25,13 @@ #include "net/base/external_estimate_provider.h" #include "net/base/load_flags.h" #include "net/base/network_change_notifier.h" +#include "net/base/socket_performance_watcher.h" +#include "net/base/socket_performance_watcher_factory.h" #include "net/http/http_status_code.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" +#include "net/url_request/url_request.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -1071,11 +1076,11 @@ base::RunLoop().Run(); // Both RTT and downstream throughput should be updated. - EXPECT_NE(NetworkQualityEstimator::InvalidRTT(), - estimator.GetURLRequestRTTEstimateInternal(base::TimeTicks(), 100)); - EXPECT_NE(NetworkQualityEstimator::kInvalidThroughput, - estimator.GetDownlinkThroughputKbpsEstimateInternal( - base::TimeTicks(), 100)); + base::TimeDelta rtt; + EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt)); + + int32_t throughput; + EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&throughput)); EXPECT_EQ(2U, rtt_observer.observations().size()); EXPECT_EQ(2U, throughput_observer.observations().size()); @@ -1095,14 +1100,20 @@ base::TimeDelta quic_rtt(base::TimeDelta::FromMilliseconds(2)); scoped_ptr<SocketPerformanceWatcher> tcp_watcher = - estimator.CreateSocketPerformanceWatcher( - SocketPerformanceWatcherFactory::PROTOCOL_TCP); + estimator.GetSocketPerformanceWatcherFactory() + ->CreateSocketPerformanceWatcher( + SocketPerformanceWatcherFactory::PROTOCOL_TCP); + scoped_ptr<SocketPerformanceWatcher> quic_watcher = - estimator.CreateSocketPerformanceWatcher( - SocketPerformanceWatcherFactory::PROTOCOL_QUIC); + estimator.GetSocketPerformanceWatcherFactory() + ->CreateSocketPerformanceWatcher( + SocketPerformanceWatcherFactory::PROTOCOL_QUIC); + tcp_watcher->OnUpdatedRTTAvailable(tcp_rtt); quic_watcher->OnUpdatedRTTAvailable(quic_rtt); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(4U, rtt_observer.observations().size()); EXPECT_EQ(2U, throughput_observer.observations().size());
diff --git a/net/base/socket_performance_watcher.cc b/net/base/socket_performance_watcher.cc deleted file mode 100644 index aa0dab3..0000000 --- a/net/base/socket_performance_watcher.cc +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/base/socket_performance_watcher.h" - -#include "base/logging.h" - -namespace net { - -SocketPerformanceWatcher::SocketPerformanceWatcher( - const SocketPerformanceWatcherFactory::Protocol protocol, - SocketPerformanceWatcherFactory* socket_performance_watcher_factory) - : protocol_(protocol), - socket_performance_watcher_factory_(socket_performance_watcher_factory) { - DCHECK(socket_performance_watcher_factory_); - - switch (protocol) { - case SocketPerformanceWatcherFactory::PROTOCOL_TCP: - case SocketPerformanceWatcherFactory::PROTOCOL_QUIC: - return; - default: - NOTREACHED(); - } -} - -SocketPerformanceWatcher::~SocketPerformanceWatcher() {} - -void SocketPerformanceWatcher::OnUpdatedRTTAvailable( - const base::TimeDelta& rtt) const { - socket_performance_watcher_factory_->OnUpdatedRTTAvailable(protocol_, rtt); -} - -} // namespace net
diff --git a/net/base/socket_performance_watcher.h b/net/base/socket_performance_watcher.h index e0e7632..74413679 100644 --- a/net/base/socket_performance_watcher.h +++ b/net/base/socket_performance_watcher.h
@@ -5,9 +5,7 @@ #ifndef NET_BASE_SOCKET_PERFORMANCE_WATCHER_H_ #define NET_BASE_SOCKET_PERFORMANCE_WATCHER_H_ -#include "base/macros.h" #include "net/base/net_export.h" -#include "net/base/socket_performance_watcher_factory.h" namespace base { class TimeDelta; @@ -16,32 +14,28 @@ namespace net { // SocketPerformanceWatcher is the base class for recording and aggregating -// socket statistics. +// per-socket statistics. SocketPerformanceWatcher must be used on a single +// thread. class NET_EXPORT_PRIVATE SocketPerformanceWatcher { public: - // |socket_performance_watcher_factory| is the factory that constructed - // |this| watcher. - SocketPerformanceWatcher( - const SocketPerformanceWatcherFactory::Protocol protocol, - SocketPerformanceWatcherFactory* socket_performance_watcher_factory); + virtual ~SocketPerformanceWatcher() {} - virtual ~SocketPerformanceWatcher(); + // Returns true if |this| SocketPerformanceWatcher is interested in receiving + // an updated RTT estimate (via OnUpdatedRTTAvailable). + virtual bool ShouldNotifyUpdatedRTT() const = 0; - // Called when updated transport layer RTT information is available. This - // must be the transport layer RTT from this device to the remote transport - // layer endpoint. This method is called immediately after the observation is - // made, hence no timestamp. - void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) const; + // Notifies |this| SocketPerformanceWatcher of updated transport layer RTT + // from this device to the remote transport layer endpoint. This method is + // called immediately after the observation is made, hence no timestamp. + // There is no guarantee that OnUpdatedRTTAvailable will be called every time + // an updated RTT is available as the socket may throttle the + // OnUpdatedRTTAvailable call for various reasons, including performance. + virtual void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) = 0; - private: - // Transport layer protocol used by the socket that |this| is watching. - const SocketPerformanceWatcherFactory::Protocol protocol_; - - // |socket_performance_watcher_factory_| is the factory that created - // |this| watcher. - SocketPerformanceWatcherFactory* socket_performance_watcher_factory_; - - DISALLOW_COPY_AND_ASSIGN(SocketPerformanceWatcher); + // Notifies that |this| watcher will be reused to watch a socket that belongs + // to a different transport layer connection. Note: The new connection shares + // the same protocol as the previously watched socket. + virtual void OnConnectionChanged() = 0; }; } // namespace net
diff --git a/net/base/socket_performance_watcher_factory.h b/net/base/socket_performance_watcher_factory.h index cbd607ab..df54e59 100644 --- a/net/base/socket_performance_watcher_factory.h +++ b/net/base/socket_performance_watcher_factory.h
@@ -9,10 +9,6 @@ #include "base/memory/scoped_ptr.h" #include "net/base/net_export.h" -namespace base { -class TimeDelta; -} // namespace base - namespace net { class SocketPerformanceWatcher; @@ -34,14 +30,6 @@ virtual scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( const Protocol protocol) = 0; - // Called when updated transport layer RTT information is available from one - // of the watchers created by |this|. |protocol| is the protocol that was used - // by the watcher. |rtt| must be the transport layer RTT from this device to - // the remote transport layer endpoint. These methods are called immediately - // after the observation is made, hence no timestamp. - virtual void OnUpdatedRTTAvailable(const Protocol protocol, - const base::TimeDelta& rtt) = 0; - protected: SocketPerformanceWatcherFactory() {}
diff --git a/net/cert/sth_distributor.cc b/net/cert/sth_distributor.cc new file mode 100644 index 0000000..aa7d5c4 --- /dev/null +++ b/net/cert/sth_distributor.cc
@@ -0,0 +1,32 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/cert/sth_distributor.h" + +#include "net/cert/signed_tree_head.h" + +namespace net { + +namespace ct { + +STHDistributor::STHDistributor() + : observer_list_(base::ObserverList<STHObserver>::NOTIFY_EXISTING_ONLY) {} + +STHDistributor::~STHDistributor() {} + +void STHDistributor::NewSTHObserved(const SignedTreeHead& sth) { + FOR_EACH_OBSERVER(STHObserver, observer_list_, NewSTHObserved(sth)); +} + +void STHDistributor::RegisterObserver(STHObserver* observer) { + observer_list_.AddObserver(observer); +} + +void STHDistributor::UnregisterObserver(STHObserver* observer) { + observer_list_.RemoveObserver(observer); +} + +} // namespace ct + +} // namespace net
diff --git a/net/cert/sth_distributor.h b/net/cert/sth_distributor.h new file mode 100644 index 0000000..3d9691c --- /dev/null +++ b/net/cert/sth_distributor.h
@@ -0,0 +1,42 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_CERT_STH_DISTRIBUTOR_H_ +#define NET_CERT_STH_DISTRIBUTOR_H_ + +#include "base/observer_list.h" +#include "net/base/net_export.h" +#include "net/cert/sth_observer.h" +#include "net/cert/sth_reporter.h" + +namespace net { + +namespace ct { + +// A proxy for delegating new STH notifications to all registered +// observers. +// For each |observer| registered with RegisterObserver, the +// NewSTHObserved method will be called whenever the STHDistributor's +// NewSTHObserved method is invoked. +class NET_EXPORT STHDistributor : public STHObserver, public STHReporter { + public: + STHDistributor(); + ~STHDistributor() override; + + // STHObserver implementation. + void NewSTHObserved(const SignedTreeHead& sth) override; + + // STHReporter implementation + void RegisterObserver(STHObserver* observer) override; + void UnregisterObserver(STHObserver* observer) override; + + private: + base::ObserverList<STHObserver> observer_list_; +}; + +} // namespace ct + +} // namespace net + +#endif // NET_CERT_STH_DISTRIBUTOR_H_
diff --git a/net/cert/sth_observer.h b/net/cert/sth_observer.h new file mode 100644 index 0000000..ad65a6b --- /dev/null +++ b/net/cert/sth_observer.h
@@ -0,0 +1,31 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_CERT_STH_OBSERVER_H_ +#define NET_CERT_STH_OBSERVER_H_ + +#include <set> + +#include "net/base/net_export.h" + +namespace net { + +namespace ct { + +struct SignedTreeHead; + +// Interface for receiving notifications of new STHs observed. +class NET_EXPORT STHObserver { + public: + virtual ~STHObserver() {} + + // Called with a new |sth| when one is observed. + virtual void NewSTHObserved(const SignedTreeHead& sth) = 0; +}; + +} // namespace ct + +} // namespace net + +#endif // NET_CERT_STH_OBSERVER_H_
diff --git a/net/cert/sth_reporter.h b/net/cert/sth_reporter.h new file mode 100644 index 0000000..a62ad65 --- /dev/null +++ b/net/cert/sth_reporter.h
@@ -0,0 +1,31 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_CERT_STH_REPORTER_H_ +#define NET_CERT_STH_REPORTER_H_ + +#include <set> + +#include "net/base/net_export.h" + +namespace net { + +namespace ct { + +class STHObserver; + +// Interface for registering/unregistering observers. +class NET_EXPORT STHReporter { + public: + virtual ~STHReporter() {} + + virtual void RegisterObserver(STHObserver* observer) = 0; + virtual void UnregisterObserver(STHObserver* observer) = 0; +}; + +} // namespace ct + +} // namespace net + +#endif // NET_CERT_STH_REPORTER_H_
diff --git a/net/docs/README.txt b/net/docs/README.txt new file mode 100644 index 0000000..cf6c202 --- /dev/null +++ b/net/docs/README.txt
@@ -0,0 +1,20 @@ +To generate the output HTML from an input markdown file on Unix +machines, execute the command: + + PYTHONPATH=../../third_party python -m markdown -f <output>.html <input>.md + +On Windows machines, execute: + + set PYTHONPATH=..\..\third_party + python -m markdown -f <output>.html <input>.md + +(This command line assumes that the net/docs directory is the current +directory; if that's not the case, adjust the path to src/third_party +to be accurate from whatever directory the command is executed from.) + +The diagrams included in the network stack documentation were +generated with Graphviz, and both source (.dot) and output (.svg) are +included in the repository. If graphviz is installed, the output may +be regenerated from the source via: + + dot dot -Tsvg <name>.dot > <name>.svg
diff --git a/net/docs/life-of-a-url-request.md b/net/docs/life-of-a-url-request.md index 63f55f69..4de3567f 100644 --- a/net/docs/life-of-a-url-request.md +++ b/net/docs/life-of-a-url-request.md
@@ -293,6 +293,24 @@ socket pool, either for reuse or so the socket pool knows it has another free socket slot. +### Object Relationships and Ownership + +A sample of the object relationships involved in the above process is +diagramed here: + + + +There are a couple of points in the above diagram that do not come +clear visually: + +* The method that generates the filter chain that is hung off the + URLRequestJob is declared on URLRequestJob, but the only current + implementation of it is on URLRequestHttpJob, so the generation is + shown as happening from that class. +* HttpTransactions of different types are layered; i.e. a + HttpCache::Transaction contains a pointer to an HttpTransaction, but + that pointed-to HttpTransaction generally is an + HttpNetworkTransaction. # Additional Topics @@ -418,6 +436,33 @@ instance, SSL and HTTP connections won't be grouped together in the TcpClientSocketPool, which the SSLClientSocketPool sits on top of. +### Socket Pool Class Relationships + +The relationships between the important classes in the socket pools is +shown diagrammatically for the lowest layer socket pool +(TransportSocketPool) below. + + + +The ClientSocketPoolBase is a template class templatized on the class +containing the parameters for the appropriate type of socket (in this +case TransportSocketParams). It contains a pointer to the +ClientSocketPoolBaseHelper, which contains all the type-independent +machinery of the socket pool. + +When socket pools are initialized, they in turn initialize their +templatized ClientSocketPoolBase member with an object with which it +should create connect jobs. That object must derive from +ClientSocketPoolBase::ConnectJobFactory templatized by the same type +as the ClientSocketPoolBase. (In the case of the diagram above, that +object is a TransportConnectJobFactory, which derives from +ClientSocketPoolBase::ConnectJobFactory<TransportSocketParams>.) +Internally, that object is wrapped in a type-unsafe wrapper +(ClientSocketPoolBase::ConnectJobFactoryAdaptor) so that it can be +passed to the initialization of the ClientSocketPoolBaseHelper. This +allows the helper to create connect jobs while preserving a type-safe +API to the initialization of the socket pool. + ### SSL When an SSL connection is needed, the ClientSocketPoolManager assembles the
diff --git a/net/docs/pools.dot b/net/docs/pools.dot new file mode 100644 index 0000000..271d98d --- /dev/null +++ b/net/docs/pools.dot
@@ -0,0 +1,101 @@ +digraph SocketPools { + subgraph cluster_legend { + label="Legend"; + + ## The following legend is an attempt to match UML notation, + ## except for template_class and Factory->object, which are + ## invented for this diagram. + BaseClass; + SubClass [label="Derived Class"]; + Whole; + Part; + A; + B; + Interface [label="Interface / ABC", style=dashed]; + template_class [shape=diamond]; # Link will name parameter(s) + + SubClass -> BaseClass [arrowhead="empty"]; + SubClass -> Interface [arrowhead="empty", style=dashed]; + Part -> Whole [arrowhead="diamond", label="ownership"]; + Part -> Whole [arrowhead="odiamond", label="pointer"]; + RefCountedPart -> Whole [arrowhead="diamond", color=red, + label="partial\nownership"]; + A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", + label="association"]; + // Often a "subgraph { rank=same; .. }" is used to wrap the + // below to make the generative relationship distinctive + // from the other class relationships. + Factory -> object [arrowhead=veevee]; + }; + + ClientSocketPoolBase [shape=diamond]; + ClientSocketPoolBaseHelper; + + ClientSocketPoolBaseHelper_ConnectJobFactory + [style=dotted, label="ClientSocketPoolBaseHelper::\nConnectJobFactory"]; + ClientSocketPoolBase_ConnectJobFactory + [style=dotted, shape=diamond, + label="ClientSocketPoolBase::\nConnectJobFactory"]; + ClientSocketPoolBase_ConnectJobFactoryAdaptor + [shape=diamond, + label="ClientSocketPoolBase::\nConnectJobFactoryAdaptor"]; + + HigherLayeredPool [style=dotted]; + LowerLayeredPool [style=dotted]; + ClientSocketPool [style=dotted]; + + ConnectJob [style=dashed]; + ConnectJob_Delegate [style=dotted, label="ConnectJob::Delegate"]; + + ClientSocketFactory [style=dotted]; + DefaultClientSocketFactory; + TCPClientSocket; + StreamSocket [style=dotted] + Socket; + + TransportSocketParams; + TransportConnectJobHelper; + TransportConnectJobFactory; + TransportConnectJob; + + TransportClientSocketPool -> ClientSocketPool [arrowhead=empty]; + ClientSocketPool -> LowerLayeredPool [arrowhead=empty]; + ClientSocketPoolBaseHelper -> ConnectJob_Delegate [arrowhead=empty]; + TransportConnectJobFactory -> ClientSocketPoolBase_ConnectJobFactory + [arrowhead=empty, label="TransportSocketParams"]; + ClientSocketPoolBase_ConnectJobFactoryAdaptor -> + ClientSocketPoolBaseHelper_ConnectJobFactory + [arrowhead=empty, arrowtail=none]; + TransportConnectJob -> ConnectJob [arrowhead=empty]; + DefaultClientSocketFactory -> ClientSocketFactory [arrowhead=empty]; + StreamSocket -> Socket [arrowhead=empty] + TCPClientSocket -> StreamSocket [arrowhead=empty] + + ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; + ClientSocketPoolBase -> TransportClientSocketPool + [arrowhead=diamond, label="TransportSocketParams"]; + ClientSocketPoolBase_ConnectJobFactory -> + ClientSocketPoolBase_ConnectJobFactoryAdaptor [arrowhead=diamond]; + ClientSocketPoolBaseHelper_ConnectJobFactory -> + ClientSocketPoolBaseHelper [arrowhead=diamond]; + TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; + TransportSocketParams -> TransportConnectJobHelper + [arrowhead=diamond, color=red]; + + ConnectJob -> ConnectJob_Delegate + [dir=back, arrowhead=none, arrowtail=odiamond]; + HigherLayeredPool -> ClientSocketPoolBaseHelper + [arrowhead=odiamond, taillabel="*"]; + LowerLayeredPool -> ClientSocketPoolBaseHelper + [arrowhead=odiamond, taillabel="*"]; + ClientSocketFactory -> ClientSocketPoolBaseHelper [arrowhead=odiamond]; + + subgraph { + rank=same; + ClientSocketPoolBaseHelper_ConnectJobFactory -> ConnectJob + [arrowhead=veevee]; + } + ClientSocketPoolBase_ConnectJobFactory -> ConnectJob [arrowhead=veevee]; + ClientSocketFactory -> TCPClientSocket [arrowhead=veevee] +} +
diff --git a/net/docs/pools.svg b/net/docs/pools.svg new file mode 100644 index 0000000..fb4efb6 --- /dev/null +++ b/net/docs/pools.svg
@@ -0,0 +1,335 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.34.0 (20130907.0228) + --> +<!-- Title: SocketPools Pages: 1 --> +<svg width="1612pt" height="653pt" + viewBox="0.00 0.00 1612.00 653.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 649)"> +<title>SocketPools</title> +<polygon fill="white" stroke="white" points="-4,4 -4,-649 1608,-649 1608,4 -4,4"/> +<g id="clust1" class="cluster"><title>cluster_legend</title> +<polygon fill="none" stroke="black" points="8,-440 8,-637 743,-637 743,-440 8,-440"/> +<text text-anchor="middle" x="375.5" y="-621.8" font-family="Times,serif" font-size="14.00">Legend</text> +</g> +<!-- BaseClass --> +<g id="node1" class="node"><title>BaseClass</title> +<ellipse fill="none" stroke="black" cx="687" cy="-466" rx="48.1437" ry="18"/> +<text text-anchor="middle" x="687" y="-462.3" font-family="Times,serif" font-size="14.00">BaseClass</text> +</g> +<!-- SubClass --> +<g id="node2" class="node"><title>SubClass</title> +<ellipse fill="none" stroke="black" cx="673" cy="-588" rx="61.6163" ry="18"/> +<text text-anchor="middle" x="673" y="-584.3" font-family="Times,serif" font-size="14.00">Derived Class</text> +</g> +<!-- SubClass->BaseClass --> +<g id="edge1" class="edge"><title>SubClass->BaseClass</title> +<path fill="none" stroke="black" d="M675.006,-569.807C677.303,-550.114 681.099,-517.583 683.805,-494.39"/> +<polygon fill="none" stroke="black" points="687.315,-494.499 684.998,-484.161 680.363,-493.688 687.315,-494.499"/> +</g> +<!-- Interface --> +<g id="node7" class="node"><title>Interface</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="552" cy="-466" rx="68.3417" ry="18"/> +<text text-anchor="middle" x="552" y="-462.3" font-family="Times,serif" font-size="14.00">Interface / ABC</text> +</g> +<!-- SubClass->Interface --> +<g id="edge2" class="edge"><title>SubClass->Interface</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M656.175,-570.315C635.316,-549.627 599.623,-514.23 575.922,-490.724"/> +<polygon fill="none" stroke="black" points="578.247,-488.1 568.682,-483.544 573.317,-493.071 578.247,-488.1"/> +</g> +<!-- Whole --> +<g id="node3" class="node"><title>Whole</title> +<ellipse fill="none" stroke="black" cx="430" cy="-466" rx="35.1455" ry="18"/> +<text text-anchor="middle" x="430" y="-462.3" font-family="Times,serif" font-size="14.00">Whole</text> +</g> +<!-- Part --> +<g id="node4" class="node"><title>Part</title> +<ellipse fill="none" stroke="black" cx="409" cy="-588" rx="27" ry="18"/> +<text text-anchor="middle" x="409" y="-584.3" font-family="Times,serif" font-size="14.00">Part</text> +</g> +<!-- Part->Whole --> +<g id="edge3" class="edge"><title>Part->Whole</title> +<path fill="none" stroke="black" d="M411.964,-570.061C415.322,-550.874 420.853,-519.267 424.906,-496.107"/> +<polygon fill="black" stroke="black" points="424.914,-496.061 422.008,-489.462 426.983,-484.241 429.889,-490.841 424.914,-496.061"/> +<text text-anchor="middle" x="450.5" y="-533.3" font-family="Times,serif" font-size="14.00">ownership</text> +</g> +<!-- Part->Whole --> +<g id="edge4" class="edge"><title>Part->Whole</title> +<path fill="none" stroke="black" d="M390.377,-574.55C383.219,-568.652 375.847,-560.934 372,-552 366.727,-539.754 366.735,-534.25 372,-522 377.706,-508.725 388.366,-497.15 399.005,-488.088"/> +<polygon fill="none" stroke="black" points="399.207,-487.929 401.44,-481.072 408.628,-480.496 406.395,-487.353 399.207,-487.929"/> +<text text-anchor="middle" x="392" y="-533.3" font-family="Times,serif" font-size="14.00">pointer</text> +</g> +<!-- A --> +<g id="node5" class="node"><title>A</title> +<ellipse fill="none" stroke="black" cx="137" cy="-588" rx="27" ry="18"/> +<text text-anchor="middle" x="137" y="-584.3" font-family="Times,serif" font-size="14.00">A</text> +</g> +<!-- B --> +<g id="node6" class="node"><title>B</title> +<ellipse fill="none" stroke="black" cx="137" cy="-466" rx="27" ry="18"/> +<text text-anchor="middle" x="137" y="-462.3" font-family="Times,serif" font-size="14.00">B</text> +</g> +<!-- A->B --> +<g id="edge6" class="edge"><title>A->B</title> +<path fill="none" stroke="black" d="M137,-569.807C137,-548.599 137,-512.502 137,-489.213"/> +<polyline fill="none" stroke="black" points="137,-484.161 137,-489.161 "/> +<text text-anchor="middle" x="168.5" y="-533.3" font-family="Times,serif" font-size="14.00">association</text> +<text text-anchor="middle" x="127" y="-487.961" font-family="Times,serif" font-size="14.00">?..?</text> +<text text-anchor="middle" x="127" y="-558.607" font-family="Times,serif" font-size="14.00">?..?</text> +</g> +<!-- template_class --> +<g id="node8" class="node"><title>template_class</title> +<polygon fill="none" stroke="black" points="273,-606 182.505,-588 273,-570 363.495,-588 273,-606"/> +<text text-anchor="middle" x="273" y="-584.3" font-family="Times,serif" font-size="14.00">template_class</text> +</g> +<!-- RefCountedPart --> +<g id="node9" class="node"><title>RefCountedPart</title> +<ellipse fill="none" stroke="black" cx="524" cy="-588" rx="69.3156" ry="18"/> +<text text-anchor="middle" x="524" y="-584.3" font-family="Times,serif" font-size="14.00">RefCountedPart</text> +</g> +<!-- RefCountedPart->Whole --> +<g id="edge5" class="edge"><title>RefCountedPart->Whole</title> +<path fill="none" stroke="red" d="M514.948,-570.026C507.41,-556.495 496.003,-537.34 484,-522 475.376,-510.979 464.787,-499.783 455.277,-490.396"/> +<polygon fill="red" stroke="red" points="455.225,-490.346 448.13,-489.058 446.589,-482.014 453.684,-483.301 455.225,-490.346"/> +<text text-anchor="middle" x="534.5" y="-540.8" font-family="Times,serif" font-size="14.00">partial</text> +<text text-anchor="middle" x="534.5" y="-525.8" font-family="Times,serif" font-size="14.00">ownership</text> +</g> +<!-- Factory --> +<g id="node10" class="node"><title>Factory</title> +<ellipse fill="none" stroke="black" cx="54" cy="-588" rx="38.0212" ry="18"/> +<text text-anchor="middle" x="54" y="-584.3" font-family="Times,serif" font-size="14.00">Factory</text> +</g> +<!-- object --> +<g id="node11" class="node"><title>object</title> +<ellipse fill="none" stroke="black" cx="54" cy="-466" rx="33.2209" ry="18"/> +<text text-anchor="middle" x="54" y="-462.3" font-family="Times,serif" font-size="14.00">object</text> +</g> +<!-- Factory->object --> +<g id="edge7" class="edge"><title>Factory->object</title> +<path fill="none" stroke="black" d="M54,-569.807C54,-552.787 54,-526.178 54,-504.296"/> +<polygon fill="black" stroke="black" points="54,-484.161 58.5,-494.161 54,-489.161 54,-494.161 54,-494.161 54,-494.161 54,-489.161 49.5,-494.161 54,-484.161 54,-484.161"/> +<polygon fill="black" stroke="black" points="54,-494.161 58.5001,-504.161 54.0001,-499.161 54.0001,-504.161 54.0001,-504.161 54.0001,-504.161 54.0001,-499.161 49.5001,-504.161 54,-494.161 54,-494.161"/> +</g> +<!-- ClientSocketPoolBase --> +<g id="node12" class="node"><title>ClientSocketPoolBase</title> +<polygon fill="none" stroke="black" points="888,-606 757.72,-588 888,-570 1018.28,-588 888,-606"/> +<text text-anchor="middle" x="888" y="-584.3" font-family="Times,serif" font-size="14.00">ClientSocketPoolBase</text> +</g> +<!-- TransportClientSocketPool --> +<g id="node31" class="node"><title>TransportClientSocketPool</title> +<ellipse fill="none" stroke="black" cx="901" cy="-466" rx="109.261" ry="18"/> +<text text-anchor="middle" x="901" y="-462.3" font-family="Times,serif" font-size="14.00">TransportClientSocketPool</text> +</g> +<!-- ClientSocketPoolBase->TransportClientSocketPool --> +<g id="edge18" class="edge"><title>ClientSocketPoolBase->TransportClientSocketPool</title> +<path fill="none" stroke="black" d="M889.835,-570.061C891.904,-550.962 895.306,-519.56 897.812,-496.429"/> +<polygon fill="black" stroke="black" points="897.84,-496.171 894.509,-489.775 899.132,-484.241 902.463,-490.637 897.84,-496.171"/> +<text text-anchor="middle" x="961" y="-533.3" font-family="Times,serif" font-size="14.00">TransportSocketParams</text> +</g> +<!-- ClientSocketPoolBaseHelper --> +<g id="node13" class="node"><title>ClientSocketPoolBaseHelper</title> +<ellipse fill="none" stroke="black" cx="930" cy="-166" rx="116.484" ry="18"/> +<text text-anchor="middle" x="930" y="-162.3" font-family="Times,serif" font-size="14.00">ClientSocketPoolBaseHelper</text> +</g> +<!-- ClientSocketPoolBaseHelper->ClientSocketPoolBase --> +<g id="edge17" class="edge"><title>ClientSocketPoolBaseHelper->ClientSocketPoolBase</title> +<path fill="none" stroke="black" d="M841.61,-177.778C801.552,-188.118 763,-208.365 763,-248 763,-467 763,-467 763,-467 763,-514.437 810.427,-548.965 846.854,-568.488"/> +<polygon fill="black" stroke="black" points="847.06,-568.593 854.224,-567.768 857.741,-574.063 850.577,-574.888 847.06,-568.593"/> +</g> +<!-- ConnectJob_Delegate --> +<g id="node21" class="node"><title>ConnectJob_Delegate</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="1302" cy="-92" rx="90.4879" ry="18"/> +<text text-anchor="middle" x="1302" y="-88.3" font-family="Times,serif" font-size="14.00">ConnectJob::Delegate</text> +</g> +<!-- ClientSocketPoolBaseHelper->ConnectJob_Delegate --> +<g id="edge10" class="edge"><title>ClientSocketPoolBaseHelper->ConnectJob_Delegate</title> +<path fill="none" stroke="black" d="M999.534,-151.542C1065.14,-138.843 1163.1,-119.884 1229.62,-107.008"/> +<polygon fill="none" stroke="black" points="1230.46,-110.412 1239.61,-105.075 1229.13,-103.539 1230.46,-110.412"/> +</g> +<!-- ClientSocketPoolBaseHelper_ConnectJobFactory --> +<g id="node14" class="node"><title>ClientSocketPoolBaseHelper_ConnectJobFactory</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="1104" cy="-249" rx="132.404" ry="26.7407"/> +<text text-anchor="middle" x="1104" y="-252.8" font-family="Times,serif" font-size="14.00">ClientSocketPoolBaseHelper::</text> +<text text-anchor="middle" x="1104" y="-237.8" font-family="Times,serif" font-size="14.00">ConnectJobFactory</text> +</g> +<!-- ClientSocketPoolBaseHelper_ConnectJobFactory->ClientSocketPoolBaseHelper --> +<g id="edge20" class="edge"><title>ClientSocketPoolBaseHelper_ConnectJobFactory->ClientSocketPoolBaseHelper</title> +<path fill="none" stroke="black" d="M1052.74,-224.135C1028.44,-212.826 999.648,-199.422 976.057,-188.44"/> +<polygon fill="black" stroke="black" points="975.816,-188.328 968.688,-189.422 964.937,-183.264 972.064,-182.17 975.816,-188.328"/> +</g> +<!-- ConnectJob --> +<g id="node20" class="node"><title>ConnectJob</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1491" cy="-249" rx="53.4184" ry="18"/> +<text text-anchor="middle" x="1491" y="-245.3" font-family="Times,serif" font-size="14.00">ConnectJob</text> +</g> +<!-- ClientSocketPoolBaseHelper_ConnectJobFactory->ConnectJob --> +<g id="edge27" class="edge"><title>ClientSocketPoolBaseHelper_ConnectJobFactory->ConnectJob</title> +<path fill="none" stroke="black" d="M1164.57,-272.905C1228.79,-294.786 1332.66,-320.226 1419,-295 1431.5,-291.349 1443.89,-284.795 1454.78,-277.757"/> +<polygon fill="black" stroke="black" points="1471.44,-265.884 1465.9,-275.352 1467.36,-268.786 1463.29,-271.687 1463.29,-271.687 1463.29,-271.687 1467.36,-268.786 1460.68,-268.023 1471.44,-265.884 1471.44,-265.884"/> +<polygon fill="black" stroke="black" points="1463.29,-271.687 1457.76,-281.156 1459.22,-274.589 1455.15,-277.491 1455.15,-277.491 1455.15,-277.491 1459.22,-274.589 1452.54,-273.827 1463.29,-271.687 1463.29,-271.687"/> +</g> +<!-- ClientSocketPoolBase_ConnectJobFactory --> +<g id="node15" class="node"><title>ClientSocketPoolBase_ConnectJobFactory</title> +<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="1194,-504 1045,-466 1194,-428 1343,-466 1194,-504"/> +<text text-anchor="middle" x="1194" y="-469.8" font-family="Times,serif" font-size="14.00">ClientSocketPoolBase::</text> +<text text-anchor="middle" x="1194" y="-454.8" font-family="Times,serif" font-size="14.00">ConnectJobFactory</text> +</g> +<!-- ClientSocketPoolBase_ConnectJobFactoryAdaptor --> +<g id="node16" class="node"><title>ClientSocketPoolBase_ConnectJobFactoryAdaptor</title> +<polygon fill="none" stroke="black" points="1146,-390 975,-352 1146,-314 1317,-352 1146,-390"/> +<text text-anchor="middle" x="1146" y="-355.8" font-family="Times,serif" font-size="14.00">ClientSocketPoolBase::</text> +<text text-anchor="middle" x="1146" y="-340.8" font-family="Times,serif" font-size="14.00">ConnectJobFactoryAdaptor</text> +</g> +<!-- ClientSocketPoolBase_ConnectJobFactory->ClientSocketPoolBase_ConnectJobFactoryAdaptor --> +<g id="edge19" class="edge"><title>ClientSocketPoolBase_ConnectJobFactory->ClientSocketPoolBase_ConnectJobFactoryAdaptor</title> +<path fill="none" stroke="black" d="M1179.6,-431.396C1175.13,-420.971 1170.13,-409.306 1165.38,-398.226"/> +<polygon fill="black" stroke="black" points="1165.28,-397.997 1159.24,-394.058 1160.56,-386.967 1166.6,-390.906 1165.28,-397.997"/> +</g> +<!-- ClientSocketPoolBase_ConnectJobFactory->ConnectJob --> +<g id="edge28" class="edge"><title>ClientSocketPoolBase_ConnectJobFactory->ConnectJob</title> +<path fill="none" stroke="black" d="M1245.4,-440.879C1270.92,-427.675 1301.46,-409.949 1326,-390 1360.94,-361.599 1358.95,-343.467 1393,-314 1409.54,-299.689 1429.49,-286.1 1447.06,-275.155"/> +<polygon fill="black" stroke="black" points="1464.27,-264.787 1458.03,-273.802 1459.99,-267.368 1455.7,-269.948 1455.7,-269.948 1455.7,-269.948 1459.99,-267.368 1453.38,-266.093 1464.27,-264.787 1464.27,-264.787"/> +<polygon fill="black" stroke="black" points="1455.7,-269.948 1449.46,-278.963 1451.42,-272.528 1447.14,-275.108 1447.14,-275.108 1447.14,-275.108 1451.42,-272.528 1444.82,-271.254 1455.7,-269.948 1455.7,-269.948"/> +</g> +<!-- ClientSocketPoolBase_ConnectJobFactoryAdaptor->ClientSocketPoolBaseHelper_ConnectJobFactory --> +<g id="edge12" class="edge"><title>ClientSocketPoolBase_ConnectJobFactoryAdaptor->ClientSocketPoolBaseHelper_ConnectJobFactory</title> +<path fill="none" stroke="black" d="M1131.9,-317.087C1127.67,-306.925 1123.03,-295.755 1118.76,-285.494"/> +<polygon fill="none" stroke="black" points="1121.88,-283.886 1114.81,-275.997 1115.42,-286.574 1121.88,-283.886"/> +</g> +<!-- HigherLayeredPool --> +<g id="node17" class="node"><title>HigherLayeredPool</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="1337" cy="-249" rx="82.3139" ry="18"/> +<text text-anchor="middle" x="1337" y="-245.3" font-family="Times,serif" font-size="14.00">HigherLayeredPool</text> +</g> +<!-- HigherLayeredPool->ClientSocketPoolBaseHelper --> +<g id="edge24" class="edge"><title>HigherLayeredPool->ClientSocketPoolBaseHelper</title> +<path fill="none" stroke="black" d="M1290.91,-233.974C1276.31,-229.8 1260.05,-225.431 1245,-222 1171.14,-205.162 1086.52,-190.648 1023.6,-180.764"/> +<polygon fill="none" stroke="black" points="1023.57,-180.759 1017.02,-183.788 1011.71,-178.911 1018.26,-175.883 1023.57,-180.759"/> +<text text-anchor="middle" x="1286.91" y="-222.774" font-family="Times,serif" font-size="14.00">*</text> +</g> +<!-- LowerLayeredPool --> +<g id="node18" class="node"><title>LowerLayeredPool</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="872" cy="-249" rx="81.3646" ry="18"/> +<text text-anchor="middle" x="872" y="-245.3" font-family="Times,serif" font-size="14.00">LowerLayeredPool</text> +</g> +<!-- LowerLayeredPool->ClientSocketPoolBaseHelper --> +<g id="edge25" class="edge"><title>LowerLayeredPool->ClientSocketPoolBaseHelper</title> +<path fill="none" stroke="black" d="M884.3,-230.822C891.913,-220.19 901.855,-206.306 910.521,-194.204"/> +<polygon fill="none" stroke="black" points="910.731,-193.91 910.972,-186.703 917.717,-184.153 917.477,-191.36 910.731,-193.91"/> +<text text-anchor="middle" x="880.3" y="-219.622" font-family="Times,serif" font-size="14.00">*</text> +</g> +<!-- ClientSocketPool --> +<g id="node19" class="node"><title>ClientSocketPool</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="879" cy="-352" rx="74.6146" ry="18"/> +<text text-anchor="middle" x="879" y="-348.3" font-family="Times,serif" font-size="14.00">ClientSocketPool</text> +</g> +<!-- ClientSocketPool->LowerLayeredPool --> +<g id="edge9" class="edge"><title>ClientSocketPool->LowerLayeredPool</title> +<path fill="none" stroke="black" d="M877.813,-333.867C876.742,-318.414 875.148,-295.416 873.9,-277.409"/> +<polygon fill="none" stroke="black" points="877.376,-276.951 873.193,-267.217 870.393,-277.435 877.376,-276.951"/> +</g> +<!-- ConnectJob->ConnectJob_Delegate --> +<g id="edge23" class="edge"><title>ConnectJob->ConnectJob_Delegate</title> +<path fill="none" stroke="black" d="M1461.84,-224.089C1423.16,-192.362 1355.84,-137.158 1322.26,-109.618"/> +<polygon fill="none" stroke="black" points="1462.21,-224.387 1469.38,-225.098 1471.49,-231.996 1464.31,-231.284 1462.21,-224.387"/> +</g> +<!-- ClientSocketFactory --> +<g id="node22" class="node"><title>ClientSocketFactory</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="636" cy="-249" rx="85.19" ry="18"/> +<text text-anchor="middle" x="636" y="-245.3" font-family="Times,serif" font-size="14.00">ClientSocketFactory</text> +</g> +<!-- ClientSocketFactory->ClientSocketPoolBaseHelper --> +<g id="edge26" class="edge"><title>ClientSocketFactory->ClientSocketPoolBaseHelper</title> +<path fill="none" stroke="black" d="M669.499,-232.343C691.664,-222.491 721.59,-210.144 749,-202 777.322,-193.585 808.753,-186.688 837.369,-181.308"/> +<polygon fill="none" stroke="black" points="837.64,-181.259 842.821,-176.243 849.444,-179.096 844.263,-184.112 837.64,-181.259"/> +</g> +<!-- TCPClientSocket --> +<g id="node24" class="node"><title>TCPClientSocket</title> +<ellipse fill="none" stroke="black" cx="636" cy="-166" rx="74.6146" ry="18"/> +<text text-anchor="middle" x="636" y="-162.3" font-family="Times,serif" font-size="14.00">TCPClientSocket</text> +</g> +<!-- ClientSocketFactory->TCPClientSocket --> +<g id="edge29" class="edge"><title>ClientSocketFactory->TCPClientSocket</title> +<path fill="none" stroke="black" d="M636,-230.822C636,-223.09 636,-213.637 636,-204.401"/> +<polygon fill="black" stroke="black" points="636,-184.153 640.5,-194.153 636,-189.153 636,-194.153 636,-194.153 636,-194.153 636,-189.153 631.5,-194.153 636,-184.153 636,-184.153"/> +<polygon fill="black" stroke="black" points="636,-194.153 640.5,-204.153 636,-199.153 636,-204.153 636,-204.153 636,-204.153 636,-199.153 631.5,-204.153 636,-194.153 636,-194.153"/> +</g> +<!-- DefaultClientSocketFactory --> +<g id="node23" class="node"><title>DefaultClientSocketFactory</title> +<ellipse fill="none" stroke="black" cx="622" cy="-352" rx="113.135" ry="18"/> +<text text-anchor="middle" x="622" y="-348.3" font-family="Times,serif" font-size="14.00">DefaultClientSocketFactory</text> +</g> +<!-- DefaultClientSocketFactory->ClientSocketFactory --> +<g id="edge14" class="edge"><title>DefaultClientSocketFactory->ClientSocketFactory</title> +<path fill="none" stroke="black" d="M624.375,-333.867C626.527,-318.341 629.735,-295.2 632.236,-277.156"/> +<polygon fill="none" stroke="black" points="635.707,-277.603 633.613,-267.217 628.773,-276.642 635.707,-277.603"/> +</g> +<!-- StreamSocket --> +<g id="node25" class="node"><title>StreamSocket</title> +<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="636" cy="-92" rx="61.1419" ry="18"/> +<text text-anchor="middle" x="636" y="-88.3" font-family="Times,serif" font-size="14.00">StreamSocket</text> +</g> +<!-- TCPClientSocket->StreamSocket --> +<g id="edge16" class="edge"><title>TCPClientSocket->StreamSocket</title> +<path fill="none" stroke="black" d="M636,-147.937C636,-139.807 636,-129.876 636,-120.705"/> +<polygon fill="none" stroke="black" points="639.5,-120.441 636,-110.441 632.5,-120.441 639.5,-120.441"/> +</g> +<!-- Socket --> +<g id="node26" class="node"><title>Socket</title> +<ellipse fill="none" stroke="black" cx="636" cy="-18" rx="35.6194" ry="18"/> +<text text-anchor="middle" x="636" y="-14.3" font-family="Times,serif" font-size="14.00">Socket</text> +</g> +<!-- StreamSocket->Socket --> +<g id="edge15" class="edge"><title>StreamSocket->Socket</title> +<path fill="none" stroke="black" d="M636,-73.937C636,-65.8072 636,-55.8761 636,-46.7047"/> +<polygon fill="none" stroke="black" points="639.5,-46.4406 636,-36.4407 632.5,-46.4407 639.5,-46.4406"/> +</g> +<!-- TransportSocketParams --> +<g id="node27" class="node"><title>TransportSocketParams</title> +<ellipse fill="none" stroke="black" cx="1491" cy="-588" rx="97.237" ry="18"/> +<text text-anchor="middle" x="1491" y="-584.3" font-family="Times,serif" font-size="14.00">TransportSocketParams</text> +</g> +<!-- TransportConnectJobHelper --> +<g id="node28" class="node"><title>TransportConnectJobHelper</title> +<ellipse fill="none" stroke="black" cx="1491" cy="-466" rx="113.61" ry="18"/> +<text text-anchor="middle" x="1491" y="-462.3" font-family="Times,serif" font-size="14.00">TransportConnectJobHelper</text> +</g> +<!-- TransportSocketParams->TransportConnectJobHelper --> +<g id="edge22" class="edge"><title>TransportSocketParams->TransportConnectJobHelper</title> +<path fill="none" stroke="red" d="M1491,-569.807C1491,-550.648 1491,-519.34 1491,-496.299"/> +<polygon fill="red" stroke="red" points="1491,-496.161 1487,-490.161 1491,-484.161 1495,-490.161 1491,-496.161"/> +</g> +<!-- TransportConnectJob --> +<g id="node30" class="node"><title>TransportConnectJob</title> +<ellipse fill="none" stroke="black" cx="1491" cy="-352" rx="89.0632" ry="18"/> +<text text-anchor="middle" x="1491" y="-348.3" font-family="Times,serif" font-size="14.00">TransportConnectJob</text> +</g> +<!-- TransportConnectJobHelper->TransportConnectJob --> +<g id="edge21" class="edge"><title>TransportConnectJobHelper->TransportConnectJob</title> +<path fill="none" stroke="black" d="M1491,-447.99C1491,-430.557 1491,-403.116 1491,-382.202"/> +<polygon fill="black" stroke="black" points="1491,-382.17 1487,-376.171 1491,-370.17 1495,-376.17 1491,-382.17"/> +</g> +<!-- TransportConnectJobFactory --> +<g id="node29" class="node"><title>TransportConnectJobFactory</title> +<ellipse fill="none" stroke="black" cx="1194" cy="-588" rx="116.484" ry="18"/> +<text text-anchor="middle" x="1194" y="-584.3" font-family="Times,serif" font-size="14.00">TransportConnectJobFactory</text> +</g> +<!-- TransportConnectJobFactory->ClientSocketPoolBase_ConnectJobFactory --> +<g id="edge11" class="edge"><title>TransportConnectJobFactory->ClientSocketPoolBase_ConnectJobFactory</title> +<path fill="none" stroke="black" d="M1194,-569.807C1194,-555.293 1194,-533.805 1194,-514.222"/> +<polygon fill="none" stroke="black" points="1197.5,-514.202 1194,-504.202 1190.5,-514.202 1197.5,-514.202"/> +<text text-anchor="middle" x="1261" y="-533.3" font-family="Times,serif" font-size="14.00">TransportSocketParams</text> +</g> +<!-- TransportConnectJob->ConnectJob --> +<g id="edge13" class="edge"><title>TransportConnectJob->ConnectJob</title> +<path fill="none" stroke="black" d="M1491,-333.867C1491,-318.414 1491,-295.416 1491,-277.409"/> +<polygon fill="none" stroke="black" points="1494.5,-277.217 1491,-267.217 1487.5,-277.217 1494.5,-277.217"/> +</g> +<!-- TransportClientSocketPool->ClientSocketPool --> +<g id="edge8" class="edge"><title>TransportClientSocketPool->ClientSocketPool</title> +<path fill="none" stroke="black" d="M897.659,-447.99C894.121,-429.981 888.486,-401.293 884.333,-380.152"/> +<polygon fill="none" stroke="black" points="887.735,-379.308 882.373,-370.17 880.866,-380.658 887.735,-379.308"/> +</g> +</g> +</svg>
diff --git a/net/docs/url_request.dot b/net/docs/url_request.dot new file mode 100644 index 0000000..2203934 --- /dev/null +++ b/net/docs/url_request.dot
@@ -0,0 +1,186 @@ +digraph URLRequestRoot { + subgraph cluster_legend { + label="Legend"; + + ## The following legend is an attempt to match UML notation, + ## except for template_class and Factory->object, which are + ## invented for this diagram. + BaseClass; + SubClass [label="Derived Class"]; + Whole; + Part; + A; + B; + Interface [label="Interface / ABC", style=dashed]; + template_class [shape=diamond]; # Link will name parameter(s) + + SubClass -> BaseClass [arrowhead="empty"]; + SubClass -> Interface [arrowhead="empty", style=dashed]; + Part -> Whole [arrowhead="diamond", label="ownership"]; + Part -> Whole [arrowhead="odiamond", label="pointer"]; + A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", + label="association"]; + // Often a "subgraph { rank=same; .. }" is used to wrap the + // below to make the generative relationship distinctive + // from the other class relationships. + Factory -> object [arrowhead=veevee]; + }; + + ## URLRequest, URLRequestJob, and subclasses + URLRequestContext; + URLRequest; + URLRequestJob [style=dashed]; + URLRequestJob_Others [label="...other job types..."]; + URLRequestHttpJob; + Filter; + + {URLRequestHttpJob, URLRequestJob_Others} -> URLRequestJob + [arrowhead="empty"]; + + URLRequestJob -> URLRequest [arrowhead="diamond"]; + Filter -> URLRequestJob [arrowhead="diamond"]; + Filter -> Filter [arrowhead="diamond", taillabel="0..1"]; + + subgraph { + rank=same; + URLRequestContext -> URLRequest [arrowhead=veevee]; + } + subgraph { + rank=same; + URLRequestHttpJob -> Filter [arrowhead=veevee]; + } + + + ## HttpTransaction, subclasses, and generative classes. + HttpTransactionFactory; + HttpCache; + HttpNetworkLayer; + HttpTransaction [style=dashed]; + HttpCache_Transaction [label="HttpCache::Transaction"]; + HttpNetworkTransaction; + + { HttpNetworkTransaction, HttpCache_Transaction } -> HttpTransaction + [style=dashed, arrowhead="empty"]; + { HttpNetworkLayer, HttpCache } -> HttpTransactionFactory + [arrowhead=empty, style=dashed]; + + HttpTransaction -> HttpCache_Transaction [arrowhead=diamond]; + HttpTransaction -> URLRequestHttpJob [arrowhead="diamond"] + + subgraph { + rank=same; + HttpCache -> HttpCache_Transaction [arrowhead=veevee]; + } + subgraph { + rank=same; + HttpTransactionFactory -> HttpTransaction [arrowhead=veevee]; + } + subgraph { + rank=same; + HttpNetworkLayer -> HttpNetworkTransaction [arrowhead=veevee]; + } + + ## HttpStreamFactory and related. + HttpStreamFactoryImpl; + HttpStreamRequest [style=dashed]; + HttpStream [style=dashed]; + HttpStreamFactoryImpl_Request [label="HttpStreamFactoryImpl::Request"]; + HttpStreamFactoryImpl_Job [label="HttpStreamFactoryImpl::Job"]; + HttpStreamRequest_Delegate + [label="HttpStreamRequest::Delegate",style=dashed]; + HttpBasicStream; + QuicHttpStream; + SpdyHttpStream; + HttpBasicState; + + HttpNetworkTransaction -> HttpStreamRequest_Delegate + [style=dashed, arrowhead="empty"]; + HttpStreamFactoryImpl_Request -> HttpStreamRequest + [style=dashed, arrowhead="empty"]; + { HttpBasicStream, QuicHttpStream, SpdyHttpStream } -> HttpStream + [style=dashed, arrowhead="empty"]; + + HttpStreamRequest -> HttpNetworkTransaction [arrowhead="diamond"]; + HttpStream -> HttpNetworkTransaction [arrowhead="diamond"]; + HttpBasicState -> HttpBasicStream [arrowhead=diamond]; + HttpStreamFactoryImpl_Job -> HttpStreamFactoryImpl_Request + [arrowhead="diamond",taillabel="1..*"]; + + HttpStreamRequest_Delegate -> HttpStreamFactoryImpl_Request + [arrowhead=odiamond]; + HttpStreamFactoryImpl_Job -> HttpStreamFactoryImpl_Job + [arrowhead=odiamond, label="blocking_job_\nwaiting_job_"]; + + subgraph { + rank=same; + HttpStreamFactoryImpl -> HttpStreamRequest [arrowhead=veevee]; + } + subgraph { + rank=same; + HttpStreamRequest -> HttpStream [arrowhead=veevee]; + } + + ## ClientSocketHandle and socket pools. + ClientSocketPool [style=dashed]; + TransportClientSocketPool; + SSLClientSocketPool; + ClientSocketPool_Others [label="...others..."]; + ClientSocketPoolBase [label="ClientSocketPoolBase", shape=diamond]; + ClientSocketPoolBaseHelper; + + ConnectJobFactory; + ConnectJob [style=dashed]; + TransportConnectJob; + SSLConnectJob; + ConnectJob_Others [label="...other connect job types..."]; + ConnectJob_Delegate [label="ConnectJob::Delegate",style=dashed]; + + StreamSocket [style=dashed]; + TCPClientSocket; + StreamSocket_Others [label="...other socket types..."]; + + TransportConnectJobHelper; + SingleRequestHostResolver; + + { SSLClientSocketPool, TransportClientSocketPool, + ClientSocketPool_Others} -> ClientSocketPool + [style=dashed, arrowhead=empty]; + ClientSocketPoolBaseHelper -> ConnectJob_Delegate + [arrowhead=empty, style=dashed]; + StreamSocket -> Socket [arrowhead=empty, style=dashed]; + { TCPClientSocket, StreamSocket_Others } -> StreamSocket + [arrowhead=empty, style=dashed]; + {SSLConnectJob, TransportConnectJob, ConnectJob_Others} -> ConnectJob + [style=dashed, arrowhead=empty]; + + ClientSocketHandle -> HttpStreamFactoryImpl_Job [arrowhead="diamond"]; + ClientSocketHandle -> HttpBasicState [arrowhead="diamond"]; + ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; + ClientSocketPoolBase -> TransportClientSocketPool + [arrowhead=diamond, label=TransportSocketParams]; + ClientSocketPoolBase -> SSLClientSocketPool + [arrowhead=diamond, label=SSLSocketParams]; + + StreamSocket -> ClientSocketHandle [arrowhead=diamond]; + ConnectJobFactory -> ClientSocketPoolBase [arrowhead=diamond]; + StreamSocket -> ConnectJob [arrowhead=diamond]; + SingleRequestHostResolver -> TransportConnectJobHelper + [arrowhead=diamond]; + TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; + + ClientSocketPool -> ClientSocketHandle [arrowhead=odiamond]; + ConnectJob_Delegate -> ConnectJob [arrowhead=odiamond]; + + subgraph { + rank=same; + ConnectJobFactory -> ConnectJob [arrowhead=veevee]; + } + subgraph { + rank=same; + HttpStreamFactoryImpl_Job -> ClientSocketHandle [arrowhead=veevee]; + } + subgraph { + rank=same; + TransportConnectJob -> StreamSocket [arrowhead=veevee]; + } +}
diff --git a/net/docs/url_request.svg b/net/docs/url_request.svg new file mode 100644 index 0000000..6bd00e7 --- /dev/null +++ b/net/docs/url_request.svg
@@ -0,0 +1,594 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.34.0 (20130907.0228) + --> +<!-- Title: URLRequestRoot Pages: 1 --> +<svg width="1788pt" height="925pt" + viewBox="0.00 0.00 1788.00 925.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 921)"> +<title>URLRequestRoot</title> +<polygon fill="white" stroke="white" points="-4,4 -4,-921 1784,-921 1784,4 -4,4"/> +<g id="clust1" class="cluster"><title>cluster_legend</title> +<polygon fill="none" stroke="black" points="107,-746 107,-909 685,-909 685,-746 107,-746"/> +<text text-anchor="middle" x="396" y="-893.8" font-family="Times,serif" font-size="14.00">Legend</text> +</g> +<!-- BaseClass --> +<g id="node1" class="node"><title>BaseClass</title> +<ellipse fill="none" stroke="black" cx="473" cy="-772" rx="48.1437" ry="18"/> +<text text-anchor="middle" x="473" y="-768.3" font-family="Times,serif" font-size="14.00">BaseClass</text> +</g> +<!-- SubClass --> +<g id="node2" class="node"><title>SubClass</title> +<ellipse fill="none" stroke="black" cx="615" cy="-860" rx="61.6163" ry="18"/> +<text text-anchor="middle" x="615" y="-856.3" font-family="Times,serif" font-size="14.00">Derived Class</text> +</g> +<!-- SubClass->BaseClass --> +<g id="edge1" class="edge"><title>SubClass->BaseClass</title> +<path fill="none" stroke="black" d="M589.285,-843.426C565.835,-829.224 531.074,-808.172 505.666,-792.784"/> +<polygon fill="none" stroke="black" points="507.47,-789.784 497.103,-787.598 503.844,-795.772 507.47,-789.784"/> +</g> +<!-- Interface --> +<g id="node7" class="node"><title>Interface</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="608" cy="-772" rx="68.3417" ry="18"/> +<text text-anchor="middle" x="608" y="-768.3" font-family="Times,serif" font-size="14.00">Interface / ABC</text> +</g> +<!-- SubClass->Interface --> +<g id="edge2" class="edge"><title>SubClass->Interface</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M613.583,-841.597C612.619,-829.746 611.322,-813.817 610.221,-800.292"/> +<polygon fill="none" stroke="black" points="613.69,-799.767 609.391,-790.084 606.713,-800.335 613.69,-799.767"/> +</g> +<!-- Whole --> +<g id="node3" class="node"><title>Whole</title> +<ellipse fill="none" stroke="black" cx="372" cy="-772" rx="35.1455" ry="18"/> +<text text-anchor="middle" x="372" y="-768.3" font-family="Times,serif" font-size="14.00">Whole</text> +</g> +<!-- Part --> +<g id="node4" class="node"><title>Part</title> +<ellipse fill="none" stroke="black" cx="508" cy="-860" rx="27" ry="18"/> +<text text-anchor="middle" x="508" y="-856.3" font-family="Times,serif" font-size="14.00">Part</text> +</g> +<!-- Part->Whole --> +<g id="edge3" class="edge"><title>Part->Whole</title> +<path fill="none" stroke="black" d="M486.958,-848.263C482.117,-846.019 476.938,-843.792 472,-842 442.209,-831.187 428.423,-842.925 403,-824 395.025,-818.063 388.673,-809.412 383.848,-800.915"/> +<polygon fill="black" stroke="black" points="383.784,-800.788 377.509,-797.234 378.376,-790.076 384.651,-793.629 383.784,-800.788"/> +<text text-anchor="middle" x="432.5" y="-812.3" font-family="Times,serif" font-size="14.00">ownership</text> +</g> +<!-- Part->Whole --> +<g id="edge4" class="edge"><title>Part->Whole</title> +<path fill="none" stroke="black" d="M497.05,-843.387C488.566,-832.255 475.937,-817.615 462,-808 461.698,-807.792 434.867,-797.366 410.582,-787.948"/> +<polygon fill="none" stroke="black" points="410.539,-787.932 403.499,-789.492 399.351,-783.594 406.391,-782.033 410.539,-787.932"/> +<text text-anchor="middle" x="500" y="-812.3" font-family="Times,serif" font-size="14.00">pointer</text> +</g> +<!-- A --> +<g id="node5" class="node"><title>A</title> +<ellipse fill="none" stroke="black" cx="436" cy="-860" rx="27" ry="18"/> +<text text-anchor="middle" x="436" y="-856.3" font-family="Times,serif" font-size="14.00">A</text> +</g> +<!-- B --> +<g id="node6" class="node"><title>B</title> +<ellipse fill="none" stroke="black" cx="292" cy="-772" rx="27" ry="18"/> +<text text-anchor="middle" x="292" y="-768.3" font-family="Times,serif" font-size="14.00">B</text> +</g> +<!-- A->B --> +<g id="edge5" class="edge"><title>A->B</title> +<path fill="none" stroke="black" d="M415.171,-848.532C409.973,-846.171 404.352,-843.826 399,-842 365.327,-830.513 349.531,-845.255 321,-824 311.083,-816.612 304.05,-804.762 299.396,-794.342"/> +<polyline fill="none" stroke="black" points="297.423,-789.677 299.371,-794.282 "/> +<text text-anchor="middle" x="352.5" y="-812.3" font-family="Times,serif" font-size="14.00">association</text> +<text text-anchor="middle" x="287.423" y="-793.477" font-family="Times,serif" font-size="14.00">?..?</text> +<text text-anchor="middle" x="405.171" y="-837.332" font-family="Times,serif" font-size="14.00">?..?</text> +</g> +<!-- template_class --> +<g id="node8" class="node"><title>template_class</title> +<polygon fill="none" stroke="black" points="300,-878 209.505,-860 300,-842 390.495,-860 300,-878"/> +<text text-anchor="middle" x="300" y="-856.3" font-family="Times,serif" font-size="14.00">template_class</text> +</g> +<!-- Factory --> +<g id="node9" class="node"><title>Factory</title> +<ellipse fill="none" stroke="black" cx="153" cy="-860" rx="38.0212" ry="18"/> +<text text-anchor="middle" x="153" y="-856.3" font-family="Times,serif" font-size="14.00">Factory</text> +</g> +<!-- object --> +<g id="node10" class="node"><title>object</title> +<ellipse fill="none" stroke="black" cx="153" cy="-772" rx="33.2209" ry="18"/> +<text text-anchor="middle" x="153" y="-768.3" font-family="Times,serif" font-size="14.00">object</text> +</g> +<!-- Factory->object --> +<g id="edge6" class="edge"><title>Factory->object</title> +<path fill="none" stroke="black" d="M153,-841.597C153,-832.562 153,-821.157 153,-810.254"/> +<polygon fill="black" stroke="black" points="153,-790.084 157.5,-800.084 153,-795.084 153,-800.084 153,-800.084 153,-800.084 153,-795.084 148.5,-800.084 153,-790.084 153,-790.084"/> +<polygon fill="black" stroke="black" points="153,-800.084 157.5,-810.084 153,-805.084 153,-810.084 153,-810.084 153,-810.084 153,-805.084 148.5,-810.084 153,-800.084 153,-800.084"/> +</g> +<!-- URLRequestContext --> +<g id="node11" class="node"><title>URLRequestContext</title> +<ellipse fill="none" stroke="black" cx="198" cy="-18" rx="87.1385" ry="18"/> +<text text-anchor="middle" x="198" y="-14.3" font-family="Times,serif" font-size="14.00">URLRequestContext</text> +</g> +<!-- URLRequest --> +<g id="node12" class="node"><title>URLRequest</title> +<ellipse fill="none" stroke="black" cx="379" cy="-18" rx="58.2422" ry="18"/> +<text text-anchor="middle" x="379" y="-14.3" font-family="Times,serif" font-size="14.00">URLRequest</text> +</g> +<!-- URLRequestContext->URLRequest --> +<g id="edge12" class="edge"><title>URLRequestContext->URLRequest</title> +<path fill="none" stroke="black" d="M285.318,-18C290.35,-18 295.382,-18 300.414,-18"/> +<polygon fill="black" stroke="black" points="320.449,-18 310.449,-22.5 315.449,-18 310.449,-18 310.449,-18 310.449,-18 315.449,-18 310.449,-13.5 320.449,-18 320.449,-18"/> +<polygon fill="black" stroke="black" points="310.449,-18 300.449,-22.5001 305.449,-18.0001 300.449,-18.0001 300.449,-18.0001 300.449,-18.0001 305.449,-18.0001 300.449,-13.5001 310.449,-18 310.449,-18"/> +</g> +<!-- URLRequestJob --> +<g id="node13" class="node"><title>URLRequestJob</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="379" cy="-92" rx="70.2668" ry="18"/> +<text text-anchor="middle" x="379" y="-88.3" font-family="Times,serif" font-size="14.00">URLRequestJob</text> +</g> +<!-- URLRequestJob->URLRequest --> +<g id="edge9" class="edge"><title>URLRequestJob->URLRequest</title> +<path fill="none" stroke="black" d="M379,-73.937C379,-66.3374 379,-57.1638 379,-48.5081"/> +<polygon fill="black" stroke="black" points="379,-48.4407 375,-42.4407 379,-36.4407 383,-42.4406 379,-48.4407"/> +</g> +<!-- URLRequestJob_Others --> +<g id="node14" class="node"><title>URLRequestJob_Others</title> +<ellipse fill="none" stroke="black" cx="79" cy="-166" rx="78.4642" ry="18"/> +<text text-anchor="middle" x="79" y="-162.3" font-family="Times,serif" font-size="14.00">...other job types...</text> +</g> +<!-- URLRequestJob_Others->URLRequestJob --> +<g id="edge7" class="edge"><title>URLRequestJob_Others->URLRequestJob</title> +<path fill="none" stroke="black" d="M131.256,-152.459C183.725,-139.866 264.455,-120.491 319.39,-107.306"/> +<polygon fill="none" stroke="black" points="320.428,-110.657 329.335,-104.92 318.794,-103.85 320.428,-110.657"/> +</g> +<!-- URLRequestHttpJob --> +<g id="node15" class="node"><title>URLRequestHttpJob</title> +<ellipse fill="none" stroke="black" cx="379" cy="-166" rx="87.1385" ry="18"/> +<text text-anchor="middle" x="379" y="-162.3" font-family="Times,serif" font-size="14.00">URLRequestHttpJob</text> +</g> +<!-- URLRequestHttpJob->URLRequestJob --> +<g id="edge8" class="edge"><title>URLRequestHttpJob->URLRequestJob</title> +<path fill="none" stroke="black" d="M379,-147.937C379,-139.807 379,-129.876 379,-120.705"/> +<polygon fill="none" stroke="black" points="382.5,-120.441 379,-110.441 375.5,-120.441 382.5,-120.441"/> +</g> +<!-- Filter --> +<g id="node16" class="node"><title>Filter</title> +<ellipse fill="none" stroke="black" cx="532" cy="-166" rx="30.3206" ry="18"/> +<text text-anchor="middle" x="532" y="-162.3" font-family="Times,serif" font-size="14.00">Filter</text> +</g> +<!-- URLRequestHttpJob->Filter --> +<g id="edge13" class="edge"><title>URLRequestHttpJob->Filter</title> +<path fill="none" stroke="black" d="M466.258,-166C471.334,-166 476.41,-166 481.486,-166"/> +<polygon fill="black" stroke="black" points="501.697,-166 491.697,-170.5 496.697,-166 491.697,-166 491.697,-166 491.697,-166 496.697,-166 491.697,-161.5 501.697,-166 501.697,-166"/> +<polygon fill="black" stroke="black" points="491.697,-166 481.697,-170.5 486.697,-166 481.697,-166 481.697,-166 481.697,-166 486.697,-166 481.697,-161.5 491.697,-166 491.697,-166"/> +</g> +<!-- Filter->URLRequestJob --> +<g id="edge10" class="edge"><title>Filter->URLRequestJob</title> +<path fill="none" stroke="black" d="M509.094,-154.221C486.235,-143.463 450.544,-126.668 422.324,-113.388"/> +<polygon fill="black" stroke="black" points="421.996,-113.233 414.864,-114.298 411.138,-108.124 418.27,-107.059 421.996,-113.233"/> +</g> +<!-- Filter->Filter --> +<g id="edge11" class="edge"><title>Filter->Filter</title> +<path fill="none" stroke="black" d="M560.103,-172.724C570.969,-173.022 580,-170.781 580,-166 580,-163.236 576.981,-161.321 572.335,-160.254"/> +<polygon fill="black" stroke="black" points="572.065,-160.233 565.765,-163.742 560.103,-159.276 566.403,-155.767 572.065,-160.233"/> +<text text-anchor="middle" x="571.103" y="-176.524" font-family="Times,serif" font-size="14.00">0..1</text> +</g> +<!-- HttpTransactionFactory --> +<g id="node17" class="node"><title>HttpTransactionFactory</title> +<ellipse fill="none" stroke="black" cx="419" cy="-240" rx="97.237" ry="18"/> +<text text-anchor="middle" x="419" y="-236.3" font-family="Times,serif" font-size="14.00">HttpTransactionFactory</text> +</g> +<!-- HttpTransaction --> +<g id="node20" class="node"><title>HttpTransaction</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="734" cy="-240" rx="69.3156" ry="18"/> +<text text-anchor="middle" x="734" y="-236.3" font-family="Times,serif" font-size="14.00">HttpTransaction</text> +</g> +<!-- HttpTransactionFactory->HttpTransaction --> +<g id="edge21" class="edge"><title>HttpTransactionFactory->HttpTransaction</title> +<path fill="none" stroke="black" d="M516.515,-240C559.052,-240 601.589,-240 644.127,-240"/> +<polygon fill="black" stroke="black" points="664.337,-240 654.337,-244.5 659.337,-240 654.337,-240 654.337,-240 654.337,-240 659.337,-240 654.337,-235.5 664.337,-240 664.337,-240"/> +<polygon fill="black" stroke="black" points="654.337,-240 644.337,-244.5 649.337,-240 644.337,-240 644.337,-240 644.337,-240 649.337,-240 644.337,-235.5 654.337,-240 654.337,-240"/> +</g> +<!-- HttpCache --> +<g id="node18" class="node"><title>HttpCache</title> +<ellipse fill="none" stroke="black" cx="225" cy="-166" rx="49.0941" ry="18"/> +<text text-anchor="middle" x="225" y="-162.3" font-family="Times,serif" font-size="14.00">HttpCache</text> +</g> +<!-- HttpCache->HttpTransactionFactory --> +<g id="edge16" class="edge"><title>HttpCache->HttpTransactionFactory</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M258.184,-179.316C288.306,-190.495 333.185,-207.151 367.886,-220.03"/> +<polygon fill="none" stroke="black" points="366.789,-223.356 377.382,-223.554 369.225,-216.793 366.789,-223.356"/> +</g> +<!-- HttpCache_Transaction --> +<g id="node21" class="node"><title>HttpCache_Transaction</title> +<ellipse fill="none" stroke="black" cx="734" cy="-166" rx="97.237" ry="18"/> +<text text-anchor="middle" x="734" y="-162.3" font-family="Times,serif" font-size="14.00">HttpCache::Transaction</text> +</g> +<!-- HttpCache->HttpCache_Transaction --> +<g id="edge20" class="edge"><title>HttpCache->HttpCache_Transaction</title> +<path fill="none" stroke="black" d="M247.344,-182.086C259.827,-190.078 276.045,-198.887 292,-203 361.291,-220.861 543.243,-213.661 614,-203 633.473,-200.066 654.144,-194.596 672.743,-188.745"/> +<polygon fill="black" stroke="black" points="691.957,-182.348 683.891,-189.777 687.213,-183.928 682.469,-185.507 682.469,-185.507 682.469,-185.507 687.213,-183.928 681.048,-181.238 691.957,-182.348 691.957,-182.348"/> +<polygon fill="black" stroke="black" points="682.469,-185.507 674.403,-192.935 677.725,-187.086 672.981,-188.666 672.981,-188.666 672.981,-188.666 677.725,-187.086 671.56,-184.396 682.469,-185.507 682.469,-185.507"/> +</g> +<!-- HttpNetworkLayer --> +<g id="node19" class="node"><title>HttpNetworkLayer</title> +<ellipse fill="none" stroke="black" cx="419" cy="-314" rx="79.4147" ry="18"/> +<text text-anchor="middle" x="419" y="-310.3" font-family="Times,serif" font-size="14.00">HttpNetworkLayer</text> +</g> +<!-- HttpNetworkLayer->HttpTransactionFactory --> +<g id="edge17" class="edge"><title>HttpNetworkLayer->HttpTransactionFactory</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M419,-295.937C419,-287.807 419,-277.876 419,-268.705"/> +<polygon fill="none" stroke="black" points="422.5,-268.441 419,-258.441 415.5,-268.441 422.5,-268.441"/> +</g> +<!-- HttpNetworkTransaction --> +<g id="node22" class="node"><title>HttpNetworkTransaction</title> +<ellipse fill="none" stroke="black" cx="828" cy="-314" rx="101.087" ry="18"/> +<text text-anchor="middle" x="828" y="-310.3" font-family="Times,serif" font-size="14.00">HttpNetworkTransaction</text> +</g> +<!-- HttpNetworkLayer->HttpNetworkTransaction --> +<g id="edge22" class="edge"><title>HttpNetworkLayer->HttpNetworkTransaction</title> +<path fill="none" stroke="black" d="M498.483,-314C567.85,-314 637.216,-314 706.583,-314"/> +<polygon fill="black" stroke="black" points="726.635,-314 716.635,-318.5 721.635,-314 716.635,-314 716.635,-314 716.635,-314 721.635,-314 716.635,-309.5 726.635,-314 726.635,-314"/> +<polygon fill="black" stroke="black" points="716.635,-314 706.635,-318.5 711.635,-314 706.635,-314 706.635,-314 706.635,-314 711.635,-314 706.635,-309.5 716.635,-314 716.635,-314"/> +</g> +<!-- HttpTransaction->URLRequestHttpJob --> +<g id="edge19" class="edge"><title>HttpTransaction->URLRequestHttpJob</title> +<path fill="none" stroke="black" d="M681.236,-228.299C620.105,-215.9 519.061,-195.407 450.808,-181.564"/> +<polygon fill="black" stroke="black" points="450.645,-181.531 443.97,-184.259 438.885,-179.146 445.56,-176.418 450.645,-181.531"/> +</g> +<!-- HttpTransaction->HttpCache_Transaction --> +<g id="edge18" class="edge"><title>HttpTransaction->HttpCache_Transaction</title> +<path fill="none" stroke="black" d="M728.16,-221.937C727.354,-214.337 727.083,-205.164 727.349,-196.508"/> +<polygon fill="black" stroke="black" points="727.354,-196.416 723.746,-190.173 728.121,-184.441 731.729,-190.684 727.354,-196.416"/> +</g> +<!-- HttpCache_Transaction->HttpTransaction --> +<g id="edge14" class="edge"><title>HttpCache_Transaction->HttpTransaction</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M739.879,-184.441C740.723,-192.625 740.954,-202.572 740.571,-211.719"/> +<polygon fill="none" stroke="black" points="737.062,-211.713 739.84,-221.937 744.045,-212.212 737.062,-211.713"/> +</g> +<!-- HttpNetworkTransaction->HttpTransaction --> +<g id="edge15" class="edge"><title>HttpNetworkTransaction->HttpTransaction</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M806.198,-296.301C793.533,-286.599 777.401,-274.243 763.6,-263.672"/> +<polygon fill="none" stroke="black" points="765.427,-260.663 755.359,-257.36 761.17,-266.22 765.427,-260.663"/> +</g> +<!-- HttpStreamRequest_Delegate --> +<g id="node28" class="node"><title>HttpStreamRequest_Delegate</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="951" cy="-240" rx="119.384" ry="18"/> +<text text-anchor="middle" x="951" y="-236.3" font-family="Times,serif" font-size="14.00">HttpStreamRequest::Delegate</text> +</g> +<!-- HttpNetworkTransaction->HttpStreamRequest_Delegate --> +<g id="edge23" class="edge"><title>HttpNetworkTransaction->HttpStreamRequest_Delegate</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M855.911,-296.662C873.088,-286.607 895.308,-273.6 913.948,-262.689"/> +<polygon fill="none" stroke="black" points="915.912,-265.595 922.774,-257.522 912.376,-259.554 915.912,-265.595"/> +</g> +<!-- HttpStreamFactoryImpl --> +<g id="node23" class="node"><title>HttpStreamFactoryImpl</title> +<ellipse fill="none" stroke="black" cx="591" cy="-92" rx="97.237" ry="18"/> +<text text-anchor="middle" x="591" y="-88.3" font-family="Times,serif" font-size="14.00">HttpStreamFactoryImpl</text> +</g> +<!-- HttpStreamRequest --> +<g id="node24" class="node"><title>HttpStreamRequest</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="831" cy="-92" rx="81.3398" ry="18"/> +<text text-anchor="middle" x="831" y="-88.3" font-family="Times,serif" font-size="14.00">HttpStreamRequest</text> +</g> +<!-- HttpStreamFactoryImpl->HttpStreamRequest --> +<g id="edge34" class="edge"><title>HttpStreamFactoryImpl->HttpStreamRequest</title> +<path fill="none" stroke="black" d="M688.5,-92C701.992,-92 715.484,-92 728.976,-92"/> +<polygon fill="black" stroke="black" points="749.452,-92 739.452,-96.5 744.452,-92 739.452,-92 739.452,-92 739.452,-92 744.452,-92 739.452,-87.5 749.452,-92 749.452,-92"/> +<polygon fill="black" stroke="black" points="739.452,-92 729.452,-96.5001 734.452,-92.0001 729.452,-92.0001 729.452,-92.0001 729.452,-92.0001 734.452,-92.0001 729.452,-87.5001 739.452,-92 739.452,-92"/> +</g> +<!-- HttpStreamRequest->HttpNetworkTransaction --> +<g id="edge28" class="edge"><title>HttpStreamRequest->HttpNetworkTransaction</title> +<path fill="none" stroke="black" d="M763.969,-102.293C711.475,-111.106 644.641,-126.251 628,-148 597.411,-187.98 618.664,-223.16 655,-258 676.893,-278.992 706.776,-291.973 735.546,-300.001"/> +<polygon fill="black" stroke="black" points="735.731,-300.048 742.539,-297.673 747.351,-303.045 740.542,-305.42 735.731,-300.048"/> +</g> +<!-- HttpStream --> +<g id="node25" class="node"><title>HttpStream</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1319" cy="-92" rx="52.4675" ry="18"/> +<text text-anchor="middle" x="1319" y="-88.3" font-family="Times,serif" font-size="14.00">HttpStream</text> +</g> +<!-- HttpStreamRequest->HttpStream --> +<g id="edge35" class="edge"><title>HttpStreamRequest->HttpStream</title> +<path fill="none" stroke="black" d="M912.492,-92C1023.84,-92 1135.19,-92 1246.54,-92"/> +<polygon fill="black" stroke="black" points="1266.6,-92 1256.6,-96.5 1261.6,-92 1256.6,-92 1256.6,-92 1256.6,-92 1261.6,-92 1256.6,-87.5 1266.6,-92 1266.6,-92"/> +<polygon fill="black" stroke="black" points="1256.6,-92 1246.6,-96.5001 1251.6,-92.0001 1246.6,-92.0001 1246.6,-92.0001 1246.6,-92.0001 1251.6,-92.0001 1246.6,-87.5001 1256.6,-92 1256.6,-92"/> +</g> +<!-- HttpStream->HttpNetworkTransaction --> +<g id="edge29" class="edge"><title>HttpStream->HttpNetworkTransaction</title> +<path fill="none" stroke="black" d="M1273.43,-101.133C1239.63,-108.879 1193.76,-123.152 1160,-148 1111.11,-183.992 1129.92,-224.936 1079,-258 1036.66,-285.489 982.719,-299.423 935.696,-306.414"/> +<polygon fill="black" stroke="black" points="935.473,-306.444 930.076,-311.228 923.585,-308.086 928.982,-303.303 935.473,-306.444"/> +</g> +<!-- HttpStreamFactoryImpl_Request --> +<g id="node26" class="node"><title>HttpStreamFactoryImpl_Request</title> +<ellipse fill="none" stroke="black" cx="981" cy="-166" rx="131.408" ry="18"/> +<text text-anchor="middle" x="981" y="-162.3" font-family="Times,serif" font-size="14.00">HttpStreamFactoryImpl::Request</text> +</g> +<!-- HttpStreamFactoryImpl_Request->HttpStreamRequest --> +<g id="edge24" class="edge"><title>HttpStreamFactoryImpl_Request->HttpStreamRequest</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M946.587,-148.482C924.617,-137.936 895.998,-124.199 872.734,-113.032"/> +<polygon fill="none" stroke="black" points="873.984,-109.75 863.455,-108.578 870.955,-116.061 873.984,-109.75"/> +</g> +<!-- HttpStreamFactoryImpl_Job --> +<g id="node27" class="node"><title>HttpStreamFactoryImpl_Job</title> +<ellipse fill="none" stroke="black" cx="1566" cy="-314" rx="115.06" ry="18"/> +<text text-anchor="middle" x="1566" y="-310.3" font-family="Times,serif" font-size="14.00">HttpStreamFactoryImpl::Job</text> +</g> +<!-- HttpStreamFactoryImpl_Job->HttpStreamFactoryImpl_Request --> +<g id="edge31" class="edge"><title>HttpStreamFactoryImpl_Job->HttpStreamFactoryImpl_Request</title> +<path fill="none" stroke="black" d="M1553.63,-295.789C1537.2,-274.422 1506.02,-238.754 1470,-222 1453.28,-214.222 1236.53,-191.904 1097.28,-178.206"/> +<polygon fill="black" stroke="black" points="1097.25,-178.203 1090.89,-181.598 1085.31,-177.031 1091.67,-173.636 1097.25,-178.203"/> +<text text-anchor="middle" x="1542.63" y="-284.589" font-family="Times,serif" font-size="14.00">1..*</text> +</g> +<!-- HttpStreamFactoryImpl_Job->HttpStreamFactoryImpl_Job --> +<g id="edge33" class="edge"><title>HttpStreamFactoryImpl_Job->HttpStreamFactoryImpl_Job</title> +<path fill="none" stroke="black" d="M1674.54,-319.988C1689.22,-318.984 1699,-316.988 1699,-314 1699,-311.946 1694.38,-310.36 1686.72,-309.244"/> +<polygon fill="none" stroke="black" points="1686.48,-309.22 1680.11,-312.595 1674.54,-308.012 1680.92,-304.636 1686.48,-309.22"/> +<text text-anchor="middle" x="1739.5" y="-317.8" font-family="Times,serif" font-size="14.00">blocking_job_</text> +<text text-anchor="middle" x="1739.5" y="-302.8" font-family="Times,serif" font-size="14.00">waiting_job_</text> +</g> +<!-- ClientSocketHandle --> +<g id="node51" class="node"><title>ClientSocketHandle</title> +<ellipse fill="none" stroke="black" cx="1332" cy="-314" rx="83.2649" ry="18"/> +<text text-anchor="middle" x="1332" y="-310.3" font-family="Times,serif" font-size="14.00">ClientSocketHandle</text> +</g> +<!-- HttpStreamFactoryImpl_Job->ClientSocketHandle --> +<g id="edge59" class="edge"><title>HttpStreamFactoryImpl_Job->ClientSocketHandle</title> +<path fill="none" stroke="black" d="M1482.46,-326.396C1461.09,-327.807 1439.71,-327.866 1418.33,-326.572"/> +<polygon fill="black" stroke="black" points="1398.27,-324.962 1408.6,-321.277 1403.25,-325.362 1408.24,-325.762 1408.24,-325.762 1408.24,-325.762 1403.25,-325.362 1407.88,-330.248 1398.27,-324.962 1398.27,-324.962"/> +<polygon fill="black" stroke="black" points="1408.24,-325.762 1418.57,-322.077 1413.22,-326.162 1418.21,-326.562 1418.21,-326.562 1418.21,-326.562 1413.22,-326.162 1417.85,-331.048 1408.24,-325.762 1408.24,-325.762"/> +</g> +<!-- HttpStreamRequest_Delegate->HttpStreamFactoryImpl_Request --> +<g id="edge32" class="edge"><title>HttpStreamRequest_Delegate->HttpStreamFactoryImpl_Request</title> +<path fill="none" stroke="black" d="M958.11,-221.937C961.387,-214.072 965.366,-204.522 969.082,-195.604"/> +<polygon fill="none" stroke="black" points="969.118,-195.518 967.733,-188.441 973.733,-184.441 975.118,-191.518 969.118,-195.518"/> +</g> +<!-- HttpBasicStream --> +<g id="node29" class="node"><title>HttpBasicStream</title> +<ellipse fill="none" stroke="black" cx="1561" cy="-166" rx="72.192" ry="18"/> +<text text-anchor="middle" x="1561" y="-162.3" font-family="Times,serif" font-size="14.00">HttpBasicStream</text> +</g> +<!-- HttpBasicStream->HttpStream --> +<g id="edge25" class="edge"><title>HttpBasicStream->HttpStream</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1516.33,-151.71C1474.01,-139.12 1410.64,-120.265 1367.2,-107.34"/> +<polygon fill="none" stroke="black" points="1368.01,-103.93 1357.43,-104.433 1366.01,-110.64 1368.01,-103.93"/> +</g> +<!-- QuicHttpStream --> +<g id="node30" class="node"><title>QuicHttpStream</title> +<ellipse fill="none" stroke="black" cx="1239" cy="-166" rx="70.2909" ry="18"/> +<text text-anchor="middle" x="1239" y="-162.3" font-family="Times,serif" font-size="14.00">QuicHttpStream</text> +</g> +<!-- QuicHttpStream->HttpStream --> +<g id="edge26" class="edge"><title>QuicHttpStream->HttpStream</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1257.55,-148.301C1268.21,-138.715 1281.74,-126.537 1293.39,-116.05"/> +<polygon fill="none" stroke="black" points="1296,-118.405 1301.1,-109.113 1291.32,-113.202 1296,-118.405"/> +</g> +<!-- SpdyHttpStream --> +<g id="node31" class="node"><title>SpdyHttpStream</title> +<ellipse fill="none" stroke="black" cx="1399" cy="-166" rx="71.2405" ry="18"/> +<text text-anchor="middle" x="1399" y="-162.3" font-family="Times,serif" font-size="14.00">SpdyHttpStream</text> +</g> +<!-- SpdyHttpStream->HttpStream --> +<g id="edge27" class="edge"><title>SpdyHttpStream->HttpStream</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1380.45,-148.301C1369.79,-138.715 1356.26,-126.537 1344.61,-116.05"/> +<polygon fill="none" stroke="black" points="1346.68,-113.202 1336.9,-109.113 1342,-118.405 1346.68,-113.202"/> +</g> +<!-- HttpBasicState --> +<g id="node32" class="node"><title>HttpBasicState</title> +<ellipse fill="none" stroke="black" cx="1397" cy="-240" rx="64.4914" ry="18"/> +<text text-anchor="middle" x="1397" y="-236.3" font-family="Times,serif" font-size="14.00">HttpBasicState</text> +</g> +<!-- HttpBasicState->HttpBasicStream --> +<g id="edge30" class="edge"><title>HttpBasicState->HttpBasicStream</title> +<path fill="none" stroke="black" d="M1430.19,-224.43C1454.84,-213.607 1488.74,-198.723 1515.86,-186.819"/> +<polygon fill="black" stroke="black" points="1516.03,-186.744 1519.91,-180.669 1527.02,-181.92 1523.13,-187.994 1516.03,-186.744"/> +</g> +<!-- ClientSocketPool --> +<g id="node33" class="node"><title>ClientSocketPool</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1015" cy="-388" rx="74.6146" ry="18"/> +<text text-anchor="middle" x="1015" y="-384.3" font-family="Times,serif" font-size="14.00">ClientSocketPool</text> +</g> +<!-- ClientSocketPool->ClientSocketHandle --> +<g id="edge56" class="edge"><title>ClientSocketPool->ClientSocketHandle</title> +<path fill="none" stroke="black" d="M1067.35,-375.111C1121.39,-362.836 1205.91,-343.639 1264.85,-330.253"/> +<polygon fill="none" stroke="black" points="1264.94,-330.231 1269.91,-325.001 1276.64,-327.573 1271.68,-332.803 1264.94,-330.231"/> +</g> +<!-- TransportClientSocketPool --> +<g id="node34" class="node"><title>TransportClientSocketPool</title> +<ellipse fill="none" stroke="black" cx="906" cy="-462" rx="109.261" ry="18"/> +<text text-anchor="middle" x="906" y="-458.3" font-family="Times,serif" font-size="14.00">TransportClientSocketPool</text> +</g> +<!-- TransportClientSocketPool->ClientSocketPool --> +<g id="edge36" class="edge"><title>TransportClientSocketPool->ClientSocketPool</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M931.281,-444.301C946.351,-434.346 965.653,-421.596 981.924,-410.848"/> +<polygon fill="none" stroke="black" points="984.191,-413.545 990.606,-405.113 980.333,-407.705 984.191,-413.545"/> +</g> +<!-- SSLClientSocketPool --> +<g id="node35" class="node"><title>SSLClientSocketPool</title> +<ellipse fill="none" stroke="black" cx="1124" cy="-462" rx="90.0136" ry="18"/> +<text text-anchor="middle" x="1124" y="-458.3" font-family="Times,serif" font-size="14.00">SSLClientSocketPool</text> +</g> +<!-- SSLClientSocketPool->ClientSocketPool --> +<g id="edge37" class="edge"><title>SSLClientSocketPool->ClientSocketPool</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1099.27,-444.662C1084.11,-434.65 1064.52,-421.711 1048.05,-410.828"/> +<polygon fill="none" stroke="black" points="1049.53,-407.617 1039.26,-405.025 1045.68,-413.457 1049.53,-407.617"/> +</g> +<!-- ClientSocketPool_Others --> +<g id="node36" class="node"><title>ClientSocketPool_Others</title> +<ellipse fill="none" stroke="black" cx="731" cy="-462" rx="46.1964" ry="18"/> +<text text-anchor="middle" x="731" y="-458.3" font-family="Times,serif" font-size="14.00">...others...</text> +</g> +<!-- ClientSocketPool_Others->ClientSocketPool --> +<g id="edge38" class="edge"><title>ClientSocketPool_Others->ClientSocketPool</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M765.861,-450.076C772.841,-447.985 780.137,-445.868 787,-444 842.638,-428.858 906.487,-413.639 952.44,-403.061"/> +<polygon fill="none" stroke="black" points="953.291,-406.456 962.255,-400.809 951.726,-399.634 953.291,-406.456"/> +</g> +<!-- ClientSocketPoolBase --> +<g id="node37" class="node"><title>ClientSocketPoolBase</title> +<polygon fill="none" stroke="black" points="906,-568 775.72,-550 906,-532 1036.28,-550 906,-568"/> +<text text-anchor="middle" x="906" y="-546.3" font-family="Times,serif" font-size="14.00">ClientSocketPoolBase</text> +</g> +<!-- ClientSocketPoolBase->TransportClientSocketPool --> +<g id="edge49" class="edge"><title>ClientSocketPoolBase->TransportClientSocketPool</title> +<path fill="none" stroke="black" d="M906,-531.597C906,-520.333 906,-505.384 906,-492.317"/> +<polygon fill="black" stroke="black" points="906,-492.084 902,-486.084 906,-480.084 910,-486.084 906,-492.084"/> +<text text-anchor="middle" x="973" y="-502.3" font-family="Times,serif" font-size="14.00">TransportSocketParams</text> +</g> +<!-- ClientSocketPoolBase->SSLClientSocketPool --> +<g id="edge50" class="edge"><title>ClientSocketPoolBase->SSLClientSocketPool</title> +<path fill="none" stroke="black" d="M960.062,-539.469C986.082,-533.841 1017.34,-525.522 1044,-514 1060.75,-506.762 1077.98,-496.239 1092.14,-486.63"/> +<polygon fill="black" stroke="black" points="1092.47,-486.398 1095.1,-479.684 1102.31,-479.529 1099.68,-486.243 1092.47,-486.398"/> +<text text-anchor="middle" x="1125" y="-502.3" font-family="Times,serif" font-size="14.00">SSLSocketParams</text> +</g> +<!-- ClientSocketPoolBaseHelper --> +<g id="node38" class="node"><title>ClientSocketPoolBaseHelper</title> +<ellipse fill="none" stroke="black" cx="812" cy="-772" rx="116.484" ry="18"/> +<text text-anchor="middle" x="812" y="-768.3" font-family="Times,serif" font-size="14.00">ClientSocketPoolBaseHelper</text> +</g> +<!-- ClientSocketPoolBaseHelper->ClientSocketPoolBase --> +<g id="edge48" class="edge"><title>ClientSocketPoolBaseHelper->ClientSocketPoolBase</title> +<path fill="none" stroke="black" d="M739.499,-757.76C716.22,-749.708 692.888,-736.772 679,-716 670.107,-702.699 670.953,-693.829 679,-680 715.426,-617.402 794.808,-582.693 849.336,-565.443"/> +<polygon fill="black" stroke="black" points="849.43,-565.415 854.007,-559.843 860.911,-561.924 856.334,-567.497 849.43,-565.415"/> +</g> +<!-- ConnectJob_Delegate --> +<g id="node44" class="node"><title>ConnectJob_Delegate</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1015" cy="-698" rx="90.4879" ry="18"/> +<text text-anchor="middle" x="1015" y="-694.3" font-family="Times,serif" font-size="14.00">ConnectJob::Delegate</text> +</g> +<!-- ClientSocketPoolBaseHelper->ConnectJob_Delegate --> +<g id="edge39" class="edge"><title>ClientSocketPoolBaseHelper->ConnectJob_Delegate</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M856.298,-755.288C887.834,-744.103 930.307,-729.039 963.379,-717.309"/> +<polygon fill="none" stroke="black" points="964.623,-720.581 972.878,-713.94 962.283,-713.984 964.623,-720.581"/> +</g> +<!-- ConnectJobFactory --> +<g id="node39" class="node"><title>ConnectJobFactory</title> +<ellipse fill="none" stroke="black" cx="906" cy="-624" rx="81.3646" ry="18"/> +<text text-anchor="middle" x="906" y="-620.3" font-family="Times,serif" font-size="14.00">ConnectJobFactory</text> +</g> +<!-- ConnectJobFactory->ClientSocketPoolBase --> +<g id="edge52" class="edge"><title>ConnectJobFactory->ClientSocketPoolBase</title> +<path fill="none" stroke="black" d="M906,-605.937C906,-598.337 906,-589.164 906,-580.508"/> +<polygon fill="black" stroke="black" points="906,-580.441 902,-574.441 906,-568.441 910,-574.441 906,-580.441"/> +</g> +<!-- ConnectJob --> +<g id="node40" class="node"><title>ConnectJob</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1213" cy="-624" rx="53.4184" ry="18"/> +<text text-anchor="middle" x="1213" y="-620.3" font-family="Times,serif" font-size="14.00">ConnectJob</text> +</g> +<!-- ConnectJobFactory->ConnectJob --> +<g id="edge58" class="edge"><title>ConnectJobFactory->ConnectJob</title> +<path fill="none" stroke="black" d="M987.247,-624C1037.85,-624 1088.45,-624 1139.06,-624"/> +<polygon fill="black" stroke="black" points="1159.21,-624 1149.21,-628.5 1154.21,-624 1149.21,-624 1149.21,-624 1149.21,-624 1154.21,-624 1149.21,-619.5 1159.21,-624 1159.21,-624"/> +<polygon fill="black" stroke="black" points="1149.21,-624 1139.21,-628.5 1144.21,-624 1139.21,-624 1139.21,-624 1139.21,-624 1144.21,-624 1139.21,-619.5 1149.21,-624 1149.21,-624"/> +</g> +<!-- TransportConnectJob --> +<g id="node41" class="node"><title>TransportConnectJob</title> +<ellipse fill="none" stroke="black" cx="1213" cy="-698" rx="89.0632" ry="18"/> +<text text-anchor="middle" x="1213" y="-694.3" font-family="Times,serif" font-size="14.00">TransportConnectJob</text> +</g> +<!-- TransportConnectJob->ConnectJob --> +<g id="edge43" class="edge"><title>TransportConnectJob->ConnectJob</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1213,-679.937C1213,-671.807 1213,-661.876 1213,-652.705"/> +<polygon fill="none" stroke="black" points="1216.5,-652.441 1213,-642.441 1209.5,-652.441 1216.5,-652.441"/> +</g> +<!-- StreamSocket --> +<g id="node45" class="node"><title>StreamSocket</title> +<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1539" cy="-698" rx="61.1419" ry="18"/> +<text text-anchor="middle" x="1539" y="-694.3" font-family="Times,serif" font-size="14.00">StreamSocket</text> +</g> +<!-- TransportConnectJob->StreamSocket --> +<g id="edge60" class="edge"><title>TransportConnectJob->StreamSocket</title> +<path fill="none" stroke="black" d="M1254.5,-713.973C1274.06,-720.671 1297.89,-727.669 1320,-731 1381.09,-740.206 1398.4,-743.008 1459,-731 1469.42,-728.936 1480.18,-725.495 1490.31,-721.596"/> +<polygon fill="black" stroke="black" points="1508.73,-713.774 1501.28,-721.824 1504.13,-715.728 1499.53,-717.682 1499.53,-717.682 1499.53,-717.682 1504.13,-715.728 1497.77,-713.54 1508.73,-713.774 1508.73,-713.774"/> +<polygon fill="black" stroke="black" points="1499.53,-717.682 1492.08,-725.733 1494.92,-719.636 1490.32,-721.59 1490.32,-721.59 1490.32,-721.59 1494.92,-719.636 1488.56,-717.448 1499.53,-717.682 1499.53,-717.682"/> +</g> +<!-- SSLConnectJob --> +<g id="node42" class="node"><title>SSLConnectJob</title> +<ellipse fill="none" stroke="black" cx="1390" cy="-698" rx="69.3156" ry="18"/> +<text text-anchor="middle" x="1390" y="-694.3" font-family="Times,serif" font-size="14.00">SSLConnectJob</text> +</g> +<!-- SSLConnectJob->ConnectJob --> +<g id="edge44" class="edge"><title>SSLConnectJob->ConnectJob</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1354.18,-682.43C1325.56,-670.787 1285.38,-654.443 1255.2,-642.166"/> +<polygon fill="none" stroke="black" points="1256.36,-638.86 1245.78,-638.334 1253.72,-645.345 1256.36,-638.86"/> +</g> +<!-- ConnectJob_Others --> +<g id="node43" class="node"><title>ConnectJob_Others</title> +<ellipse fill="none" stroke="black" cx="797" cy="-698" rx="109.286" ry="18"/> +<text text-anchor="middle" x="797" y="-694.3" font-family="Times,serif" font-size="14.00">...other connect job types...</text> +</g> +<!-- ConnectJob_Others->ConnectJob --> +<g id="edge45" class="edge"><title>ConnectJob_Others->ConnectJob</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M869.462,-684.459C951.057,-670.336 1081.94,-647.684 1156.38,-634.799"/> +<polygon fill="none" stroke="black" points="1157.25,-638.202 1166.5,-633.048 1156.05,-631.304 1157.25,-638.202"/> +</g> +<!-- ConnectJob_Delegate->ConnectJob --> +<g id="edge57" class="edge"><title>ConnectJob_Delegate->ConnectJob</title> +<path fill="none" stroke="black" d="M1056.51,-681.906C1088.76,-670.176 1133.48,-653.915 1166.86,-641.778"/> +<polygon fill="none" stroke="black" points="1166.88,-641.772 1171.15,-635.962 1178.16,-637.671 1173.88,-643.481 1166.88,-641.772"/> +</g> +<!-- StreamSocket->ConnectJob --> +<g id="edge53" class="edge"><title>StreamSocket->ConnectJob</title> +<path fill="none" stroke="black" d="M1493.58,-685.965C1485.09,-683.946 1476.28,-681.884 1468,-680 1399.73,-664.466 1320.91,-647.634 1269.19,-636.739"/> +<polygon fill="black" stroke="black" points="1269.03,-636.706 1262.34,-639.386 1257.29,-634.236 1263.99,-631.557 1269.03,-636.706"/> +</g> +<!-- Socket --> +<g id="node50" class="node"><title>Socket</title> +<ellipse fill="none" stroke="black" cx="1539" cy="-624" rx="35.6194" ry="18"/> +<text text-anchor="middle" x="1539" y="-620.3" font-family="Times,serif" font-size="14.00">Socket</text> +</g> +<!-- StreamSocket->Socket --> +<g id="edge40" class="edge"><title>StreamSocket->Socket</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1539,-679.937C1539,-671.807 1539,-661.876 1539,-652.705"/> +<polygon fill="none" stroke="black" points="1542.5,-652.441 1539,-642.441 1535.5,-652.441 1542.5,-652.441"/> +</g> +<!-- StreamSocket->ClientSocketHandle --> +<g id="edge51" class="edge"><title>StreamSocket->ClientSocketHandle</title> +<path fill="none" stroke="black" d="M1508.89,-682.178C1488.78,-669.938 1466,-650.455 1466,-625 1466,-625 1466,-625 1466,-387 1466,-356.557 1438.83,-338.931 1408.96,-328.753"/> +<polygon fill="black" stroke="black" points="1408.9,-328.735 1401.99,-330.793 1397.43,-325.205 1404.34,-323.147 1408.9,-328.735"/> +</g> +<!-- TCPClientSocket --> +<g id="node46" class="node"><title>TCPClientSocket</title> +<ellipse fill="none" stroke="black" cx="1670" cy="-772" rx="74.6146" ry="18"/> +<text text-anchor="middle" x="1670" y="-768.3" font-family="Times,serif" font-size="14.00">TCPClientSocket</text> +</g> +<!-- TCPClientSocket->StreamSocket --> +<g id="edge41" class="edge"><title>TCPClientSocket->StreamSocket</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1641.25,-755.199C1621.96,-744.598 1596.39,-730.541 1575.64,-719.138"/> +<polygon fill="none" stroke="black" points="1577.23,-716.019 1566.78,-714.27 1573.86,-722.154 1577.23,-716.019"/> +</g> +<!-- StreamSocket_Others --> +<g id="node47" class="node"><title>StreamSocket_Others</title> +<ellipse fill="none" stroke="black" cx="1487" cy="-772" rx="90.0136" ry="18"/> +<text text-anchor="middle" x="1487" y="-768.3" font-family="Times,serif" font-size="14.00">...other socket types...</text> +</g> +<!-- StreamSocket_Others->StreamSocket --> +<g id="edge42" class="edge"><title>StreamSocket_Others->StreamSocket</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1499.32,-753.937C1505.73,-745.06 1513.7,-734.035 1520.8,-724.197"/> +<polygon fill="none" stroke="black" points="1523.75,-726.097 1526.77,-715.941 1518.07,-721.998 1523.75,-726.097"/> +</g> +<!-- TransportConnectJobHelper --> +<g id="node48" class="node"><title>TransportConnectJobHelper</title> +<ellipse fill="none" stroke="black" cx="1213" cy="-772" rx="113.61" ry="18"/> +<text text-anchor="middle" x="1213" y="-768.3" font-family="Times,serif" font-size="14.00">TransportConnectJobHelper</text> +</g> +<!-- TransportConnectJobHelper->TransportConnectJob --> +<g id="edge55" class="edge"><title>TransportConnectJobHelper->TransportConnectJob</title> +<path fill="none" stroke="black" d="M1213,-753.937C1213,-746.337 1213,-737.164 1213,-728.508"/> +<polygon fill="black" stroke="black" points="1213,-728.441 1209,-722.441 1213,-716.441 1217,-722.441 1213,-728.441"/> +</g> +<!-- SingleRequestHostResolver --> +<g id="node49" class="node"><title>SingleRequestHostResolver</title> +<ellipse fill="none" stroke="black" cx="1213" cy="-860" rx="113.135" ry="18"/> +<text text-anchor="middle" x="1213" y="-856.3" font-family="Times,serif" font-size="14.00">SingleRequestHostResolver</text> +</g> +<!-- SingleRequestHostResolver->TransportConnectJobHelper --> +<g id="edge54" class="edge"><title>SingleRequestHostResolver->TransportConnectJobHelper</title> +<path fill="none" stroke="black" d="M1213,-841.597C1213,-830.333 1213,-815.384 1213,-802.317"/> +<polygon fill="black" stroke="black" points="1213,-802.084 1209,-796.084 1213,-790.084 1217,-796.084 1213,-802.084"/> +</g> +<!-- ClientSocketHandle->HttpStreamFactoryImpl_Job --> +<g id="edge46" class="edge"><title>ClientSocketHandle->HttpStreamFactoryImpl_Job</title> +<path fill="none" stroke="black" d="M1398.27,-303.038C1422.28,-300.636 1446.29,-299.939 1470.29,-300.947"/> +<polygon fill="black" stroke="black" points="1470.48,-300.957 1476.69,-297.287 1482.46,-301.604 1476.26,-305.275 1470.48,-300.957"/> +</g> +<!-- ClientSocketHandle->HttpBasicState --> +<g id="edge47" class="edge"><title>ClientSocketHandle->HttpBasicState</title> +<path fill="none" stroke="black" d="M1347.4,-295.937C1355.18,-287.329 1364.77,-276.702 1373.44,-267.095"/> +<polygon fill="black" stroke="black" points="1373.67,-266.848 1374.72,-259.714 1381.71,-257.941 1380.65,-265.075 1373.67,-266.848"/> +</g> +</g> +</svg>
diff --git a/net/http/http_stream_factory_impl.cc b/net/http/http_stream_factory_impl.cc index a8d9515..d160c31 100644 --- a/net/http/http_stream_factory_impl.cc +++ b/net/http/http_stream_factory_impl.cc
@@ -244,6 +244,9 @@ if (!session_->params().enable_quic) continue; + if (!IsQuicWhitelistedForHost(origin.host())) + continue; + if (stream_type == HttpStreamRequest::BIDIRECTIONAL_STREAM && session_->params().quic_disable_bidirectional_streams) { continue; @@ -264,9 +267,6 @@ server_id, request_info.privacy_mode, origin_host)) return alternative_service; - if (!IsQuicWhitelistedForHost(destination.host())) - continue; - // Cache this entry if we don't have a non-broken Alt-Svc yet. if (first_alternative_service.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) first_alternative_service = alternative_service;
diff --git a/net/http/http_stream_factory_impl.h b/net/http/http_stream_factory_impl.h index 756d3b8..97a9a6c9 100644 --- a/net/http/http_stream_factory_impl.h +++ b/net/http/http_stream_factory_impl.h
@@ -121,8 +121,7 @@ // Called when the Preconnect completes. Used for testing. virtual void OnPreconnectsCompleteInternal() {} - // Returns true if QUIC is whitelisted for |host|, which should be - // the result of calling ApplyHostMappingRules(). + // Returns true if QUIC is whitelisted for |host|. bool IsQuicWhitelistedForHost(const std::string& host); HttpNetworkSession* const session_;
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index 1a5c1e24..3c42d8d 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -740,6364 +740,8386 @@ // uint8_t value has the MSB set then it represents a literal leaf value. // Otherwise it's a pointer to the n'th element of the array. static const uint8_t kHSTSHuffmanTree[] = { - 0xe7, 0xf5, 0xf9, 0xf7, 0x01, 0xe4, 0x00, 0x02, 0xf2, 0xe9, 0x03, 0x04, - 0xb0, 0xb2, 0xa0, 0xb7, 0x07, 0xb5, 0xb8, 0x08, 0x09, 0xf1, 0x06, 0x0a, - 0x0b, 0xae, 0xe6, 0x0c, 0x0d, 0xed, 0x0e, 0xef, 0x80, 0x0f, 0x05, 0x10, - 0xb9, 0xb6, 0x12, 0xb3, 0xb1, 0xb4, 0x13, 0x14, 0x15, 0xf8, 0xad, 0x16, - 0xeb, 0x17, 0xe3, 0x18, 0xe1, 0x19, 0x1a, 0xff, 0xfa, 0xea, 0x1c, 0xf6, - 0xe2, 0x1d, 0xec, 0x1e, 0xe5, 0x1f, 0xf3, 0xf4, 0xe8, 0xf0, 0xee, 0x22, - 0x21, 0x23, 0x20, 0x24, 0x1b, 0x25, 0x11, 0x26, + 0xf0, 0xf5, 0xb4, 0xb2, 0xb7, 0xb9, 0xb6, 0x02, 0x03, 0xf1, 0x01, 0x04, + 0x05, 0xae, 0xf9, 0x06, 0x07, 0xe4, 0x00, 0x08, 0xf7, 0xe6, 0x0a, 0xed, + 0xf2, 0x0b, 0x09, 0x0c, 0xe9, 0xef, 0x80, 0x0e, 0x0d, 0x0f, 0xeb, 0xe2, + 0xe3, 0x11, 0xe1, 0x12, 0x13, 0xff, 0xb5, 0xb8, 0xb3, 0x15, 0xb1, 0xb0, + 0x16, 0x17, 0x18, 0xf8, 0xad, 0x19, 0xea, 0xfa, 0x1b, 0xf6, 0x1a, 0x1c, + 0xec, 0x1d, 0xe5, 0x1e, 0xe8, 0xe7, 0xf3, 0x20, 0xee, 0xf4, 0x21, 0x22, + 0x1f, 0x23, 0x14, 0x24, 0x10, 0x25, }; static const uint8_t kPreloadedHSTSData[] = { - 0xff, 0xff, 0xff, 0xcd, 0x79, 0x33, 0xd4, 0x77, 0xd9, 0xe3, 0xef, 0x9e, - 0x4c, 0xf3, 0xcf, 0xf7, 0xfd, 0x28, 0x6f, 0x16, 0x5f, 0xb4, 0x07, 0x70, - 0x2a, 0x22, 0x55, 0xef, 0x1e, 0x96, 0x5f, 0xf1, 0x8f, 0x0a, 0x47, 0xe0, - 0xac, 0xb3, 0x3c, 0x44, 0x3c, 0xc6, 0x9d, 0x1c, 0xb9, 0x90, 0xc2, 0xcb, - 0xbf, 0x0a, 0xcb, 0xd2, 0x2d, 0xd5, 0x97, 0x7d, 0xd5, 0x97, 0xff, 0xd1, - 0xe8, 0x91, 0x3b, 0x1f, 0x4a, 0x33, 0xab, 0x2f, 0xfb, 0x1b, 0xf7, 0x4f, - 0xd9, 0xb8, 0xb2, 0xdc, 0x59, 0x43, 0x3c, 0xd7, 0x3c, 0xa9, 0x23, 0x54, - 0x63, 0x07, 0x09, 0xcb, 0xfd, 0x82, 0x94, 0x77, 0xc6, 0xb2, 0xf4, 0x7e, - 0xd5, 0x97, 0xff, 0xd0, 0x16, 0x5f, 0x01, 0xe3, 0xf4, 0x66, 0xa4, 0xb2, - 0xff, 0x9e, 0x45, 0x9b, 0xcb, 0x38, 0xb2, 0xff, 0xe0, 0xb7, 0xc5, 0x9f, - 0x74, 0x9f, 0xcb, 0x2f, 0xff, 0xd2, 0x27, 0xeb, 0xb7, 0x90, 0x38, 0xf4, - 0x49, 0x65, 0x71, 0x12, 0xe2, 0x22, 0x5d, 0x9c, 0x59, 0x79, 0xdc, 0x0a, - 0x88, 0xb5, 0x52, 0x3e, 0x2c, 0x24, 0x00, 0xb5, 0xf7, 0x49, 0xd8, 0x59, - 0x7e, 0x8d, 0x67, 0xdd, 0x59, 0x63, 0xf1, 0xe5, 0x7e, 0x45, 0x7e, 0x36, - 0x3b, 0xa8, 0x59, 0x76, 0xb8, 0xb2, 0xff, 0x8f, 0xae, 0xd7, 0x93, 0xe9, - 0x65, 0x0d, 0x52, 0x3e, 0xa3, 0x31, 0xf3, 0xc1, 0x14, 0x70, 0xa3, 0x78, - 0xbd, 0xdd, 0xea, 0xcb, 0xff, 0xe7, 0xf6, 0x16, 0xb5, 0x9f, 0x4b, 0xa6, - 0xd5, 0x95, 0x23, 0xe6, 0x08, 0xbd, 0xc0, 0x85, 0x97, 0xe6, 0xb4, 0xc5, - 0xe2, 0xcb, 0xfe, 0x71, 0x0b, 0x26, 0xd4, 0x0a, 0xb2, 0x8c, 0xf8, 0xc2, - 0x53, 0x71, 0x0a, 0xb2, 0xb1, 0x16, 0x3e, 0x79, 0x14, 0x86, 0xff, 0xf4, - 0xa3, 0x0b, 0xa1, 0x71, 0xf2, 0x18, 0x59, 0x73, 0xef, 0x59, 0x7d, 0x00, - 0x68, 0x56, 0x58, 0x66, 0x6e, 0x88, 0x62, 0xfd, 0xf0, 0xf4, 0xf2, 0x59, - 0x7f, 0x83, 0xf9, 0x66, 0xc2, 0x49, 0x65, 0x41, 0xef, 0xf8, 0xa6, 0xf1, - 0x0e, 0x16, 0x5c, 0x31, 0xac, 0xbf, 0xb5, 0x0d, 0xc2, 0x6a, 0xcb, 0xfc, - 0x47, 0xc3, 0x2f, 0xa4, 0xb2, 0xb4, 0x7b, 0xc2, 0x96, 0x5c, 0x7b, 0x2c, - 0xbf, 0xee, 0x87, 0x4f, 0xc7, 0xcf, 0x2c, 0xba, 0x37, 0x56, 0x50, 0xcf, - 0xa0, 0xc5, 0xda, 0x71, 0x58, 0x99, 0x71, 0xba, 0xbc, 0x22, 0xef, 0xfe, - 0x06, 0xa1, 0x88, 0x2e, 0xb2, 0x8c, 0xa4, 0xf4, 0xb2, 0xff, 0xbd, 0x1a, - 0xcf, 0x1f, 0xc4, 0xb2, 0xfe, 0xf1, 0x05, 0xd8, 0x02, 0xcb, 0xfa, 0x35, - 0x83, 0x79, 0x2c, 0xa1, 0xa2, 0x48, 0xce, 0x04, 0x2e, 0xb8, 0xb8, 0xb2, - 0xa1, 0x32, 0xcc, 0x87, 0x31, 0x18, 0x5f, 0xf0, 0x04, 0xe9, 0xc8, 0x5c, - 0xf2, 0xcb, 0xff, 0xdd, 0xe6, 0x4c, 0x50, 0xdd, 0x6a, 0x3e, 0x59, 0x7f, - 0xc1, 0x65, 0x8f, 0x3b, 0xcc, 0xf2, 0xcb, 0x76, 0x11, 0x10, 0xe9, 0x77, - 0xfc, 0x0c, 0x2c, 0xdb, 0x60, 0x92, 0xcb, 0x6e, 0xac, 0xbe, 0xd7, 0x30, - 0x55, 0x97, 0xe2, 0x28, 0xf8, 0x48, 0x36, 0xf8, 0x29, 0x7f, 0x80, 0x7c, - 0xd6, 0xa2, 0x4b, 0x2f, 0xff, 0xd9, 0xff, 0x0f, 0xe1, 0x70, 0x10, 0x41, - 0x79, 0x2c, 0xbf, 0xe2, 0xef, 0x3b, 0x98, 0x2f, 0x16, 0x5c, 0xfe, 0x59, - 0x68, 0xc3, 0xcf, 0xf8, 0xe6, 0xfd, 0x9e, 0x64, 0x4f, 0x19, 0xe0, 0xb2, - 0xa1, 0x56, 0x6e, 0x43, 0x0c, 0x04, 0xe6, 0xe1, 0xe3, 0xc2, 0x33, 0xec, - 0x29, 0x45, 0x27, 0xbc, 0xc6, 0x6e, 0x2c, 0xbb, 0x73, 0x71, 0x65, 0xd9, - 0xf2, 0x4b, 0x42, 0x4b, 0x7f, 0xa3, 0x4f, 0xf8, 0xbd, 0xfe, 0xee, 0x6b, - 0xf6, 0x9f, 0x12, 0x33, 0x35, 0x37, 0xf4, 0xbc, 0x7b, 0xf2, 0x65, 0x95, - 0x07, 0xec, 0xe8, 0xd7, 0xf7, 0x8c, 0x10, 0xd3, 0x59, 0x7f, 0xa3, 0xfd, - 0x9e, 0x51, 0xba, 0xb2, 0xa0, 0xf8, 0xc8, 0xb2, 0xff, 0xfc, 0x59, 0xfb, - 0x97, 0xe2, 0x37, 0xa1, 0x7d, 0xa1, 0x65, 0x11, 0xfb, 0xf4, 0x82, 0xcc, - 0xd9, 0x0c, 0xf7, 0x69, 0xe8, 0x72, 0x78, 0x0c, 0x44, 0x3d, 0x36, 0x34, - 0x91, 0x90, 0xc7, 0x72, 0x54, 0xd3, 0x10, 0xc6, 0x04, 0x34, 0xfe, 0x30, - 0x38, 0x41, 0xcd, 0x08, 0x4d, 0x10, 0xfa, 0x34, 0x92, 0x8d, 0x7f, 0x92, - 0xc0, 0x02, 0xf4, 0x29, 0x04, 0xfc, 0x38, 0xc4, 0x87, 0xd5, 0xff, 0xff, - 0xce, 0xd6, 0x67, 0xad, 0x07, 0x5a, 0x82, 0xc6, 0x0f, 0xde, 0xc1, 0x16, - 0x5f, 0x68, 0x3d, 0xc5, 0x97, 0xff, 0x99, 0x46, 0x05, 0xdd, 0xd8, 0x73, - 0xdc, 0xe9, 0xde, 0x9f, 0x59, 0x7f, 0xb3, 0xfe, 0x60, 0x1c, 0x6b, 0x2f, - 0xc4, 0xe2, 0xf3, 0x8b, 0x2b, 0x0f, 0x6f, 0x46, 0x77, 0xc0, 0x77, 0x02, - 0xa2, 0xa2, 0x5e, 0x62, 0x38, 0xb2, 0xf8, 0xa4, 0x6d, 0x59, 0x7e, 0x96, - 0x11, 0x8d, 0x65, 0x61, 0xf2, 0x38, 0xef, 0x48, 0x6b, 0x48, 0xbf, 0x6c, - 0x24, 0xaf, 0xbd, 0x9a, 0xc5, 0x97, 0x8e, 0x6d, 0xc5, 0x95, 0x07, 0x83, - 0xe2, 0x1b, 0xf0, 0x1f, 0xd1, 0xe5, 0x97, 0xff, 0xf0, 0x49, 0xd8, 0x9d, - 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, 0xb8, 0x22, 0x2c, 0xbe, 0x18, 0xe1, - 0xab, 0x2f, 0xff, 0xa5, 0xb3, 0x29, 0x13, 0xce, 0xc0, 0xd4, 0xe9, 0xde, - 0x9f, 0x59, 0x50, 0x89, 0xf3, 0x18, 0xfc, 0x8a, 0xfd, 0x83, 0x8c, 0x25, - 0x97, 0xff, 0xf0, 0x49, 0xd8, 0x9d, 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, - 0xbe, 0xd6, 0xb2, 0x7d, 0x65, 0x35, 0x10, 0x4e, 0xbb, 0x7f, 0xfe, 0x79, - 0x14, 0x73, 0x3e, 0x01, 0x3e, 0x7c, 0x05, 0x97, 0xe8, 0x17, 0x3c, 0xeb, - 0x2c, 0xce, 0x17, 0x38, 0x64, 0x44, 0x38, 0x5f, 0xe4, 0x38, 0x00, 0xd2, - 0x64, 0x2d, 0x27, 0xf4, 0x3f, 0x08, 0xbf, 0x90, 0xa7, 0xde, 0x44, 0x22, - 0xa5, 0xff, 0x63, 0x59, 0xcf, 0xe1, 0x1f, 0x56, 0x5f, 0xfa, 0x19, 0xf8, - 0xde, 0x5d, 0x3d, 0x96, 0x50, 0xcf, 0xf3, 0x87, 0x97, 0xb0, 0x5c, 0x59, - 0x78, 0x31, 0xb2, 0xcb, 0xf9, 0xe5, 0xf7, 0x23, 0x65, 0x97, 0xfc, 0xff, - 0x16, 0x6f, 0xd1, 0xf1, 0x65, 0xf8, 0xe2, 0x4f, 0x25, 0x94, 0x34, 0x47, - 0xb4, 0xbf, 0xc7, 0x57, 0xf6, 0x6c, 0x38, 0xc1, 0xac, 0xbe, 0x1f, 0x8e, - 0x65, 0x95, 0x87, 0xa0, 0xe5, 0xb7, 0xe2, 0x7d, 0xcc, 0xd9, 0x65, 0xe1, - 0x5f, 0xcb, 0x2e, 0x81, 0xac, 0xa8, 0x36, 0x7e, 0x1d, 0xbf, 0xe7, 0x2e, - 0xf3, 0x59, 0x0d, 0x59, 0x7e, 0x32, 0x20, 0xee, 0xac, 0xbf, 0xee, 0x60, - 0xf3, 0x52, 0x8d, 0x2c, 0xa8, 0x3e, 0x1d, 0x14, 0xdb, 0x65, 0x95, 0x06, - 0xcf, 0x08, 0x6f, 0x81, 0x1a, 0x61, 0x65, 0xf8, 0xa3, 0xff, 0xe1, 0x65, - 0xce, 0x15, 0x96, 0x25, 0x97, 0xed, 0xb4, 0xef, 0xd5, 0x94, 0x66, 0xe1, - 0xc4, 0x2f, 0xbc, 0x7e, 0x66, 0xc9, 0x57, 0x0e, 0x31, 0xcc, 0x85, 0x63, - 0x10, 0x80, 0x01, 0x04, 0xcb, 0xad, 0x20, 0xf4, 0x32, 0xf8, 0x3f, 0xd2, - 0x31, 0x4a, 0x27, 0xd3, 0xaf, 0xda, 0x03, 0xb8, 0x15, 0x15, 0xea, 0xfc, - 0x7b, 0x80, 0x0e, 0xcb, 0x2e, 0x89, 0x2c, 0xba, 0x3f, 0x59, 0x7f, 0x6c, - 0x24, 0xfb, 0x97, 0xeb, 0x2f, 0xfc, 0xe5, 0xfe, 0x76, 0x08, 0xff, 0x59, - 0x50, 0x7e, 0x13, 0xe6, 0x76, 0x67, 0x89, 0x90, 0xe8, 0xd1, 0xcb, 0x3f, - 0x16, 0x12, 0x10, 0xf7, 0xff, 0x33, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, - 0x89, 0x19, 0x7f, 0xf9, 0x9b, 0x5e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, - 0x78, 0x5f, 0xfe, 0x66, 0xd7, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x9f, - 0xd7, 0xff, 0x99, 0xb5, 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x28, 0x65, - 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x88, 0x5f, 0xce, 0x06, - 0x7f, 0x9e, 0xcb, 0x29, 0xa7, 0xfb, 0xbd, 0x32, 0xff, 0xd2, 0x66, 0x1e, - 0x4e, 0x8e, 0x44, 0x96, 0x53, 0x33, 0xe7, 0x82, 0x4b, 0xff, 0x4c, 0x7e, - 0xfb, 0x3a, 0x3c, 0x6a, 0xcb, 0xff, 0xce, 0xcc, 0x6e, 0x4e, 0x09, 0xc2, - 0x3b, 0x56, 0x5f, 0xc7, 0xd3, 0xd3, 0xfe, 0xb2, 0xfb, 0x3b, 0x9f, 0xac, - 0xbf, 0x10, 0x5e, 0x5c, 0x59, 0x78, 0x9d, 0x9c, 0x8f, 0xd8, 0x8b, 0x7a, - 0x45, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0xa4, 0x57, 0xff, 0x7b, 0x7b, 0xeb, - 0x8f, 0xee, 0x46, 0xcb, 0x2f, 0xfe, 0x7f, 0xb9, 0xe1, 0x63, 0xf9, 0xc2, - 0x35, 0x65, 0xff, 0x44, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7f, 0x9f, 0xad, - 0x3e, 0xf8, 0xd6, 0x5e, 0x79, 0x33, 0xc4, 0xcc, 0x9c, 0xd3, 0xf4, 0x72, - 0x4b, 0x10, 0xea, 0xff, 0xfe, 0xde, 0xcc, 0x40, 0x67, 0x60, 0xbb, 0xc7, - 0x20, 0xe2, 0xcb, 0xff, 0xd2, 0x67, 0xa7, 0xfd, 0xfa, 0x7a, 0xc6, 0xac, - 0xbf, 0xe3, 0x04, 0x37, 0x9d, 0x89, 0x2c, 0xbb, 0xd8, 0xb2, 0xe8, 0x15, - 0x65, 0xfc, 0x1d, 0x7f, 0x38, 0x73, 0x2c, 0xbb, 0xf6, 0x72, 0x44, 0xc0, - 0xce, 0x3c, 0x2d, 0xc1, 0x7b, 0xfa, 0x59, 0xef, 0x3c, 0x96, 0x5f, 0xff, - 0xd8, 0x3f, 0x40, 0x8c, 0xfa, 0x4f, 0xff, 0x39, 0x1f, 0xa4, 0xb3, 0x38, - 0x5c, 0xec, 0x1a, 0x00, 0x21, 0x86, 0xd8, 0xdc, 0xbc, 0xba, 0xeb, 0xdf, - 0xc3, 0x93, 0xa9, 0x93, 0xe5, 0xb7, 0xff, 0xde, 0x8f, 0x1b, 0x1c, 0xe6, - 0x17, 0xf3, 0xf8, 0xb2, 0xf8, 0x0e, 0xe0, 0x54, 0x4a, 0x0b, 0xff, 0x47, - 0xed, 0x79, 0x7a, 0x1f, 0x4b, 0x2a, 0x48, 0xbf, 0xd2, 0x99, 0x17, 0x5f, - 0xf7, 0x30, 0x78, 0x38, 0x2e, 0xac, 0xbf, 0xfc, 0x4f, 0xde, 0x08, 0x41, - 0x91, 0x63, 0x56, 0x5f, 0xf4, 0x4b, 0x81, 0xfd, 0xaf, 0x25, 0x97, 0x87, - 0xa8, 0x59, 0x79, 0xc7, 0x8b, 0x2b, 0x0d, 0xbf, 0x07, 0x2f, 0xff, 0x3e, - 0xc7, 0xad, 0x1f, 0xd2, 0xeb, 0xfc, 0xb2, 0xf7, 0xba, 0xd5, 0x97, 0xcc, - 0xde, 0x4c, 0xf1, 0x3a, 0x99, 0x8b, 0xda, 0x6f, 0xe4, 0x9e, 0x38, 0xcf, - 0x90, 0x6e, 0x26, 0x56, 0xce, 0xa2, 0x46, 0x54, 0xfa, 0xe1, 0xc6, 0xee, - 0x09, 0xd5, 0x53, 0x8c, 0xff, 0x76, 0x5d, 0x4e, 0xa3, 0xf9, 0x6a, 0xc7, - 0x95, 0x3f, 0x5a, 0x65, 0xad, 0x72, 0x33, 0xe0, 0xce, 0x87, 0xee, 0x4b, - 0x03, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x39, - 0xaf, 0xff, 0x33, 0x6b, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x51, 0x2b, - 0xfe, 0x0b, 0xea, 0x53, 0xc7, 0x7f, 0xe6, 0xb2, 0xf1, 0xfd, 0xc5, 0x97, - 0x8a, 0x1a, 0xb2, 0xff, 0x89, 0xfe, 0xeb, 0xf6, 0x4e, 0xb2, 0xfe, 0xf6, - 0x67, 0x7d, 0x8b, 0x2b, 0x64, 0x4e, 0x18, 0xef, 0xe3, 0x7d, 0x38, 0xbf, - 0x87, 0xa8, 0xde, 0x7b, 0xd6, 0x5f, 0xc7, 0xc9, 0xa4, 0x7f, 0xac, 0xbf, - 0xb0, 0x62, 0x0d, 0xda, 0xb2, 0xff, 0x46, 0xc2, 0x4f, 0xb9, 0x7e, 0xb2, - 0xe9, 0x33, 0x1a, 0x7c, 0x59, 0x0d, 0xe3, 0x3e, 0xf1, 0x8e, 0xf2, 0xf1, - 0x0b, 0xaf, 0xee, 0x14, 0xe6, 0x40, 0xcd, 0x65, 0xff, 0x8b, 0x3f, 0x8f, - 0xf5, 0xa8, 0x15, 0x65, 0x99, 0xc1, 0xf9, 0xf0, 0xce, 0xb4, 0x98, 0x47, - 0xf0, 0xdf, 0xad, 0x2b, 0xc8, 0xe2, 0xd0, 0x65, 0xa2, 0x5f, 0xb4, 0x07, - 0x70, 0x2a, 0x21, 0xc5, 0xfc, 0x10, 0x68, 0xe0, 0x96, 0x5f, 0x8c, 0xbb, - 0x0d, 0x59, 0x66, 0x78, 0x88, 0x6f, 0x1a, 0x4f, 0x96, 0x5f, 0xf8, 0xc7, - 0x8d, 0x2c, 0xfb, 0xae, 0xb2, 0xff, 0x6b, 0x01, 0xe8, 0xfa, 0x4b, 0x2c, - 0x2a, 0xca, 0x83, 0xc6, 0xc3, 0x4a, 0x59, 0x7f, 0xf1, 0x3b, 0x00, 0xf1, - 0xeb, 0x50, 0x2a, 0xcb, 0x88, 0x96, 0x5f, 0x01, 0xdc, 0x0a, 0x88, 0xbd, - 0x7f, 0xb3, 0xef, 0xf8, 0xe7, 0xb2, 0xcb, 0xf1, 0x3f, 0xef, 0xc5, 0x97, - 0xec, 0x9a, 0x4f, 0xc5, 0x95, 0x32, 0x31, 0xf4, 0x2a, 0x45, 0xdd, 0x35, - 0x10, 0x9e, 0xf9, 0xbe, 0x3d, 0x2c, 0xbe, 0xdc, 0x32, 0x99, 0x65, 0xfd, - 0x83, 0xf6, 0x7e, 0xeb, 0x2f, 0xa0, 0x2c, 0xbe, 0x2c, 0xac, 0x3f, 0x8e, - 0x12, 0x8a, 0x5b, 0x70, 0x9c, 0x59, 0x69, 0x2c, 0xa8, 0x35, 0x2e, 0x31, - 0x71, 0x6c, 0xb2, 0xff, 0xba, 0x50, 0xd1, 0x07, 0xe8, 0x59, 0x7e, 0x79, - 0x36, 0x24, 0xb2, 0xa0, 0xfd, 0xcc, 0x5f, 0xc7, 0x37, 0xd3, 0x49, 0xe4, - 0xb2, 0xee, 0x7c, 0xb2, 0xfb, 0xb2, 0x86, 0x12, 0x5f, 0x60, 0xfb, 0xc5, - 0x95, 0x88, 0x80, 0x69, 0x1b, 0x8c, 0x11, 0x1d, 0xfe, 0x2c, 0xfa, 0x5c, - 0x36, 0x16, 0x5f, 0xbd, 0x80, 0x79, 0x2c, 0xbf, 0x3f, 0xc1, 0x7e, 0xac, - 0xba, 0x7c, 0x96, 0x5f, 0x9f, 0x6e, 0xe7, 0x96, 0x59, 0x9c, 0x2e, 0x9c, - 0x6d, 0x08, 0x39, 0x10, 0x0c, 0x2f, 0x23, 0x0c, 0x34, 0xb9, 0xa1, 0x34, - 0xd5, 0x8f, 0x42, 0x58, 0xa1, 0x5b, 0xc3, 0xae, 0x9a, 0x04, 0x9f, 0x79, - 0x44, 0xf8, 0xcd, 0xff, 0x38, 0x19, 0xcb, 0x35, 0x92, 0x59, 0x7f, 0xff, - 0xfc, 0x4e, 0xcf, 0x02, 0xcb, 0x36, 0x0f, 0xbe, 0xc3, 0x97, 0x27, 0x63, - 0x11, 0x25, 0x97, 0xec, 0xe3, 0x47, 0x0b, 0x2f, 0xfc, 0xf2, 0x67, 0x9a, - 0x03, 0xb8, 0x15, 0x13, 0x22, 0xcc, 0xf6, 0x4c, 0xc4, 0x07, 0x5a, 0x84, - 0x23, 0x49, 0xef, 0x77, 0x1a, 0xb2, 0xef, 0x35, 0x65, 0xfb, 0x40, 0x77, - 0x02, 0xa2, 0xde, 0x59, 0x9c, 0x1f, 0x38, 0xc7, 0x30, 0x5e, 0xe7, 0xdc, - 0x59, 0x7f, 0xbf, 0x81, 0x85, 0xf5, 0x25, 0x97, 0xfe, 0x79, 0x33, 0xcd, - 0x01, 0xdc, 0x0a, 0x8a, 0x4d, 0x66, 0x78, 0x89, 0x93, 0x19, 0x69, 0xa5, - 0xcc, 0x89, 0xe5, 0x65, 0xff, 0xb8, 0x17, 0xfb, 0x5a, 0x0c, 0xdc, 0x59, - 0x73, 0x7e, 0x59, 0x7f, 0x67, 0x4a, 0x21, 0xab, 0x2f, 0xef, 0xbf, 0x13, - 0x4f, 0xfa, 0xcb, 0xbc, 0xcd, 0x92, 0x8d, 0x7c, 0x20, 0x6a, 0x17, 0x86, - 0x1c, 0xae, 0xa1, 0x94, 0xff, 0x29, 0xd7, 0x2c, 0x94, 0x4b, 0xc8, 0x59, - 0xef, 0x86, 0x70, 0x91, 0x86, 0xdf, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, - 0x0e, 0xaf, 0xda, 0x03, 0xb8, 0x15, 0x12, 0xc2, 0xfb, 0x3f, 0x69, 0xac, - 0xbf, 0x33, 0x6b, 0xc9, 0x9e, 0x1e, 0xb4, 0xf9, 0xa5, 0xfe, 0x67, 0x9a, - 0x03, 0xb8, 0x15, 0x11, 0x82, 0xf0, 0xb0, 0xd5, 0x97, 0xa4, 0x63, 0x59, - 0x7e, 0x96, 0x71, 0xf8, 0xb2, 0xcc, 0xf0, 0xf8, 0x26, 0x1d, 0x08, 0xe5, - 0xff, 0xf9, 0xff, 0x9f, 0xc6, 0x64, 0xfd, 0x96, 0x77, 0x06, 0xb2, 0xff, - 0xfc, 0x6d, 0x3d, 0x33, 0xec, 0xfe, 0x7b, 0xb1, 0xf0, 0xab, 0x28, 0x91, - 0xd9, 0xc3, 0x7e, 0xac, 0xdf, 0x33, 0x96, 0x71, 0x65, 0xff, 0xff, 0x4b, - 0x8c, 0xc1, 0xe7, 0x98, 0x1e, 0xcd, 0x4f, 0x5e, 0x99, 0xbc, 0x59, 0x7e, - 0xce, 0xff, 0x00, 0x59, 0x7f, 0xfa, 0x3a, 0x7f, 0xc4, 0x87, 0xe8, 0x20, - 0x2c, 0xbe, 0x32, 0xfc, 0xd6, 0x5f, 0x01, 0xdc, 0x0a, 0x88, 0xf5, 0x52, - 0x3c, 0xfd, 0x10, 0xdf, 0x71, 0xfe, 0xde, 0xb2, 0xe9, 0x33, 0xc3, 0xc7, - 0xe9, 0x15, 0xff, 0xfc, 0xec, 0xc8, 0x39, 0xec, 0x2f, 0xf0, 0xbb, 0xec, - 0x59, 0x66, 0x7f, 0x2a, 0x02, 0x99, 0xcb, 0x45, 0x0f, 0x0d, 0xf2, 0x2f, - 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x58, 0x6b, 0xfd, 0x22, 0x8c, 0xe6, 0x12, - 0xcb, 0x8e, 0x4b, 0x2c, 0xcf, 0x0f, 0xeb, 0xe3, 0x4f, 0xcc, 0x2f, 0x99, - 0xfe, 0x58, 0xb2, 0xff, 0x10, 0x76, 0x32, 0x0b, 0x56, 0x5e, 0x82, 0xd9, - 0x65, 0xf8, 0xa3, 0xf9, 0x35, 0x65, 0x19, 0xfb, 0xf8, 0xcf, 0xa3, 0x97, - 0xff, 0xfd, 0x11, 0xc6, 0x7d, 0x19, 0xb7, 0xe9, 0x73, 0xe9, 0x66, 0xb6, - 0x59, 0x4c, 0xd1, 0x34, 0x45, 0xd6, 0x8d, 0x93, 0x59, 0xd4, 0x66, 0xb7, - 0xf9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x5c, 0xeb, 0xff, 0xff, 0xff, 0xa1, - 0x95, 0xcb, 0x60, 0x7a, 0x74, 0xef, 0x4f, 0xb3, 0xd8, 0x2c, 0x4f, 0x08, - 0x64, 0xfd, 0xb6, 0xc0, 0x6c, 0xe9, 0xde, 0x9f, 0x59, 0x50, 0xc8, 0x5e, - 0xda, 0x12, 0xf2, 0x45, 0xc8, 0xe3, 0x40, 0x5e, 0x72, 0x89, 0x9b, 0x0d, - 0x3f, 0x47, 0x23, 0xd3, 0x0d, 0xc4, 0x1b, 0xf6, 0x80, 0xee, 0x05, 0x44, - 0x3c, 0xbf, 0xfd, 0xe3, 0x86, 0xb8, 0xc4, 0xdc, 0x82, 0x92, 0xcb, 0x33, - 0xc4, 0x40, 0x70, 0xd2, 0xff, 0xed, 0xfa, 0x3e, 0x40, 0xdc, 0x8d, 0xab, - 0x2f, 0xff, 0xff, 0xbd, 0x9a, 0xd4, 0x7d, 0x21, 0x3a, 0x64, 0x19, 0x67, - 0x0b, 0x36, 0x12, 0x4b, 0x2f, 0x80, 0xee, 0x05, 0x44, 0x4c, 0xbf, 0xff, - 0xda, 0x2c, 0xdb, 0x07, 0x82, 0x87, 0x58, 0x0f, 0x46, 0xf5, 0x97, 0xc1, - 0x6e, 0x0d, 0x65, 0x42, 0x21, 0x77, 0x18, 0xef, 0xdd, 0xe6, 0xd8, 0x2a, - 0xca, 0xc3, 0xcf, 0x72, 0x5b, 0x05, 0x65, 0xfe, 0xe8, 0x5f, 0xef, 0x46, - 0xf5, 0x94, 0x04, 0xfa, 0x75, 0x08, 0x02, 0x8c, 0x0b, 0x84, 0x1d, 0x11, - 0xbf, 0xe7, 0x72, 0xff, 0x47, 0x0c, 0x2c, 0xb8, 0x3b, 0x2c, 0xb8, 0xd9, - 0x6b, 0x28, 0x8d, 0x90, 0xa3, 0x17, 0xf8, 0xb0, 0x5d, 0x67, 0xb8, 0xb2, - 0xfd, 0xff, 0x27, 0x60, 0xd6, 0x5f, 0xe3, 0x17, 0x0b, 0x3e, 0xea, 0xca, - 0x33, 0xde, 0xd1, 0x5d, 0xff, 0x47, 0xa3, 0x7b, 0x60, 0xb6, 0x59, 0x7f, - 0xf0, 0x7b, 0xc2, 0x08, 0x7b, 0x28, 0x61, 0x65, 0xee, 0x39, 0x2c, 0xbf, - 0xff, 0x46, 0xbf, 0xf4, 0x6f, 0x9a, 0x21, 0xbc, 0xc1, 0xac, 0xbf, 0xef, - 0x7a, 0x37, 0xcb, 0x35, 0x0b, 0x2b, 0xc8, 0x92, 0x75, 0x8a, 0x99, 0x34, - 0xf2, 0x3a, 0xe2, 0x37, 0x61, 0x5b, 0x7f, 0xc7, 0xd3, 0xee, 0x7f, 0x1a, - 0x59, 0x7d, 0xb7, 0x83, 0xb2, 0xca, 0xc4, 0x50, 0x3a, 0x18, 0x4e, 0x2f, - 0xcf, 0xb3, 0x63, 0x4b, 0x2f, 0xfc, 0xff, 0x72, 0x6d, 0xd3, 0x2e, 0xf1, - 0x65, 0xc3, 0xf2, 0xcb, 0xff, 0xdd, 0x96, 0x6b, 0x4f, 0x2c, 0x6c, 0x01, - 0x65, 0x61, 0xf0, 0x38, 0xbd, 0xff, 0x74, 0x3e, 0x81, 0xf8, 0xff, 0x59, - 0x7f, 0xd1, 0x2c, 0x32, 0xc8, 0x61, 0x65, 0xff, 0xfb, 0xd1, 0xaf, 0xf9, - 0x83, 0xe8, 0x5c, 0x19, 0xa5, 0x95, 0xba, 0x8c, 0x69, 0x8e, 0xba, 0x6d, - 0x77, 0x5a, 0xb2, 0xff, 0xc2, 0x6d, 0xc8, 0x3f, 0xbb, 0x0d, 0x59, 0x7f, - 0xf7, 0x1d, 0xc1, 0x80, 0x82, 0x80, 0x2c, 0xb6, 0x79, 0x10, 0x5c, 0x41, - 0xbd, 0x1a, 0xe2, 0xcb, 0xff, 0xd9, 0xbc, 0xb3, 0x80, 0xf1, 0xee, 0x1f, - 0x16, 0x5f, 0xf4, 0x48, 0x4c, 0xd7, 0x30, 0x55, 0x97, 0xfa, 0x50, 0xc1, - 0xf9, 0xf6, 0x59, 0x5b, 0x1f, 0x71, 0x9d, 0x5e, 0x20, 0x8d, 0x65, 0x62, - 0xa0, 0xaf, 0x8d, 0x3d, 0x09, 0x9f, 0xca, 0x08, 0x70, 0x30, 0xbb, 0x10, - 0x8a, 0xff, 0x87, 0x9b, 0xf4, 0xfb, 0xfc, 0x6b, 0x2f, 0xc2, 0x86, 0x35, - 0xb2, 0xca, 0x9c, 0x7c, 0xc2, 0x9e, 0x5f, 0xfc, 0x6f, 0xfe, 0xa0, 0xbb, - 0xec, 0x92, 0xca, 0x33, 0xe8, 0xf1, 0x2d, 0xc6, 0xd5, 0x97, 0xd2, 0xf0, - 0x9c, 0x59, 0x73, 0x88, 0xa8, 0x85, 0xd5, 0xf1, 0xe4, 0x04, 0x92, 0xa6, - 0x44, 0x0f, 0x57, 0xaf, 0xde, 0xcd, 0x82, 0x4b, 0x2f, 0x9f, 0x51, 0xbd, - 0x65, 0x0c, 0xf2, 0xff, 0x28, 0xbf, 0x4d, 0x2c, 0x72, 0x59, 0x7c, 0x44, - 0x16, 0x16, 0x59, 0x9c, 0x33, 0x14, 0xf2, 0x51, 0x6b, 0x0a, 0xa6, 0xd5, - 0x31, 0x0e, 0xa1, 0x23, 0xe9, 0x42, 0x0e, 0x5d, 0xf9, 0x41, 0x42, 0x8f, - 0x92, 0xbc, 0x3b, 0x19, 0xf8, 0x61, 0x45, 0xbd, 0xbe, 0x7c, 0x8c, 0x42, - 0x7b, 0xff, 0x68, 0x3b, 0x67, 0xa6, 0x28, 0x1a, 0xcb, 0xe2, 0x8c, 0x61, - 0x65, 0xfe, 0xef, 0xb3, 0x3b, 0xec, 0x59, 0x7f, 0xb5, 0x05, 0x83, 0x1c, - 0x2c, 0xbe, 0x18, 0x90, 0x4b, 0x2f, 0xff, 0xe3, 0xe8, 0x74, 0xfc, 0xc2, - 0xf6, 0x61, 0x4b, 0x8b, 0x2a, 0x0f, 0xe9, 0xc8, 0xaf, 0xc1, 0xd7, 0xf3, - 0xa1, 0x65, 0xde, 0x75, 0x97, 0x1b, 0x0b, 0x2c, 0x15, 0x95, 0x86, 0xfa, - 0x61, 0x6e, 0x0b, 0xdd, 0xde, 0xac, 0xbd, 0xff, 0x19, 0xc2, 0xa0, 0xc1, - 0xa0, 0x61, 0x0e, 0x8c, 0xbd, 0x0a, 0xbe, 0x10, 0x75, 0xa4, 0x42, 0xeb, - 0xf0, 0xd9, 0xe1, 0xee, 0xac, 0xbf, 0xfc, 0x72, 0xe3, 0x3c, 0xfa, 0x4f, - 0xb0, 0x80, 0x59, 0x50, 0x7f, 0x78, 0x59, 0x50, 0x99, 0x3f, 0xa3, 0x07, - 0xbf, 0xe6, 0x43, 0x27, 0x59, 0xd3, 0xf0, 0x56, 0x5f, 0x70, 0xf6, 0x64, - 0xac, 0xbf, 0x04, 0x88, 0xe4, 0xb2, 0x99, 0x08, 0x8e, 0x9e, 0x90, 0x78, - 0x4f, 0x7f, 0xe6, 0x43, 0x24, 0xf6, 0x89, 0xc0, 0xe6, 0x2c, 0xb9, 0x94, - 0x25, 0x97, 0xbd, 0x9a, 0x59, 0x4c, 0x84, 0x40, 0x4f, 0x49, 0x3e, 0x1b, - 0xbf, 0x67, 0x4f, 0x58, 0xb2, 0xff, 0xb3, 0xa2, 0x6c, 0xfa, 0x39, 0x96, - 0x5f, 0xd2, 0x65, 0x36, 0x64, 0xcf, 0x09, 0xe2, 0xb2, 0xf1, 0x67, 0x96, - 0x5f, 0xc6, 0xdc, 0x8d, 0x30, 0xb2, 0x86, 0x79, 0x00, 0x1b, 0xbc, 0xca, - 0xac, 0xae, 0x79, 0x59, 0x7f, 0xb3, 0x9c, 0xc3, 0x20, 0x2c, 0xa9, 0xe9, - 0x37, 0x06, 0x49, 0x34, 0xf2, 0x77, 0x3d, 0xc2, 0x36, 0x78, 0x11, 0x11, - 0x7d, 0xfc, 0xc8, 0x13, 0xde, 0xcd, 0x96, 0x5d, 0x3f, 0xf2, 0xcb, 0x79, - 0x65, 0x32, 0x0f, 0x81, 0x95, 0x9a, 0x04, 0x6e, 0xf8, 0x78, 0x53, 0x2c, - 0xb8, 0xfa, 0xb2, 0xdd, 0x33, 0x71, 0xe2, 0x2b, 0xfd, 0xf7, 0x7e, 0x90, - 0x49, 0x85, 0x97, 0xfe, 0x89, 0x8b, 0x37, 0xbb, 0x5a, 0x6b, 0x29, 0xcf, - 0xd8, 0x26, 0xf7, 0xff, 0xff, 0x78, 0x23, 0x3c, 0xd4, 0xc5, 0x9b, 0xfd, - 0x83, 0x8e, 0x72, 0x18, 0x59, 0x7f, 0xf8, 0xe6, 0x96, 0x7d, 0x29, 0xcd, - 0x77, 0x25, 0x97, 0x3e, 0xe2, 0xcb, 0xff, 0xfd, 0xcc, 0xec, 0xef, 0x60, - 0x20, 0x52, 0xc1, 0xf8, 0xe6, 0x59, 0x66, 0x4e, 0x27, 0xf2, 0xc4, 0x27, - 0x00, 0x43, 0xe7, 0x47, 0x4c, 0xe8, 0xcd, 0xd3, 0xec, 0x2c, 0xbf, 0xff, - 0x0e, 0x76, 0x70, 0xb6, 0xd9, 0xf7, 0x67, 0x4e, 0xf4, 0xfa, 0xcb, 0xe7, - 0x94, 0x7e, 0xb2, 0xfd, 0xe7, 0xeb, 0xc9, 0x65, 0xfc, 0x7a, 0x2c, 0xcd, - 0x2c, 0xbc, 0x0d, 0xbc, 0xb2, 0xfd, 0x1c, 0x65, 0x56, 0x43, 0x21, 0x65, - 0xcd, 0x6a, 0xca, 0xe1, 0xe7, 0x04, 0xde, 0xfd, 0x1c, 0x0f, 0x8d, 0x65, - 0x4e, 0x45, 0xac, 0x9b, 0x38, 0x45, 0x7f, 0x44, 0x9f, 0x4e, 0x05, 0x97, - 0xf8, 0xb3, 0xe9, 0x13, 0xec, 0xb2, 0xb4, 0x7b, 0xfc, 0x2c, 0xbf, 0x70, - 0x2e, 0x5f, 0xac, 0xb3, 0x67, 0x1e, 0x57, 0x48, 0xaf, 0x70, 0xff, 0x59, - 0x58, 0x78, 0xe6, 0x55, 0x78, 0x51, 0x45, 0x49, 0x7e, 0x72, 0xef, 0xb1, - 0x23, 0x33, 0x41, 0x7f, 0xff, 0xf4, 0x6d, 0x3b, 0x81, 0x8f, 0xbb, 0xec, - 0x6e, 0x74, 0xa3, 0xff, 0xe1, 0x65, 0xd3, 0xf8, 0xb2, 0xfb, 0xb3, 0x67, - 0x56, 0x58, 0x6b, 0x28, 0x68, 0xc3, 0xc7, 0x67, 0x19, 0x09, 0x1d, 0x0d, - 0x37, 0x6f, 0xd0, 0x0a, 0x1f, 0x77, 0xef, 0x14, 0xf1, 0x9f, 0xdc, 0x59, - 0x73, 0xba, 0xcb, 0x78, 0xcf, 0x25, 0xcd, 0x2f, 0xff, 0xef, 0xf5, 0x13, - 0xb5, 0x1d, 0xfa, 0x50, 0xc6, 0x9c, 0x55, 0x97, 0xc2, 0x71, 0xff, 0x59, - 0x78, 0xe6, 0xf2, 0xcb, 0xff, 0x1c, 0xd3, 0xbd, 0x07, 0xa0, 0xee, 0xac, - 0xa8, 0x47, 0x36, 0x98, 0x7c, 0x49, 0xf8, 0xed, 0xfd, 0xa3, 0xdc, 0xd7, - 0x38, 0xb2, 0xfe, 0x20, 0xf4, 0xf6, 0x85, 0x97, 0xfa, 0x0a, 0x39, 0x06, - 0xd5, 0x97, 0x9f, 0xbc, 0x59, 0x63, 0x60, 0xf3, 0x34, 0x61, 0x7e, 0xde, - 0x19, 0x67, 0x16, 0x5f, 0x7e, 0x64, 0x15, 0x95, 0x87, 0x98, 0x12, 0xab, - 0xec, 0x1e, 0x6c, 0xb2, 0xfb, 0x76, 0x74, 0x4f, 0x4b, 0x2f, 0xf1, 0x44, - 0xfe, 0x11, 0xb0, 0xb2, 0xff, 0x75, 0xfe, 0xe3, 0xfc, 0x2a, 0xcb, 0xb5, - 0x0b, 0x2a, 0x7a, 0x5f, 0xfa, 0x1b, 0x26, 0x11, 0x00, 0x9f, 0xe8, 0x70, - 0x1c, 0xa9, 0x8d, 0xd7, 0xf9, 0xa3, 0x0c, 0xd1, 0xeb, 0x4c, 0x7c, 0xf2, - 0x4e, 0x9d, 0x21, 0xde, 0x45, 0x3e, 0x58, 0x21, 0xa6, 0xe1, 0xb5, 0xe2, - 0xce, 0xac, 0xbf, 0xfd, 0xf4, 0xb9, 0xc8, 0x3f, 0xbb, 0xd8, 0x6a, 0xca, - 0x23, 0xe7, 0x14, 0x6e, 0xff, 0xdb, 0x61, 0x40, 0xbd, 0x61, 0xf8, 0xb2, - 0xff, 0x66, 0xf7, 0x30, 0x61, 0x2c, 0xb8, 0xbb, 0x87, 0xe4, 0x48, 0x17, - 0xd1, 0x83, 0x35, 0x94, 0x67, 0x96, 0x29, 0x5d, 0xe0, 0xf7, 0x8b, 0x2f, - 0xfb, 0x75, 0xfb, 0x34, 0x8f, 0x53, 0x2c, 0xbf, 0xe8, 0x90, 0xaf, 0xae, - 0xc6, 0x2c, 0xbf, 0xff, 0xff, 0xee, 0x4e, 0xf6, 0x6d, 0x02, 0xfd, 0x2e, - 0x4e, 0x08, 0x35, 0xa8, 0x9d, 0x33, 0x1f, 0x4e, 0x9d, 0xe9, 0xf5, 0x97, - 0xf7, 0xd3, 0xa6, 0xcc, 0x02, 0xca, 0x85, 0x4e, 0x19, 0x0d, 0xf0, 0x11, - 0x38, 0xe9, 0x1f, 0x74, 0xe0, 0x30, 0xab, 0xbf, 0x7a, 0x3f, 0x8d, 0xd5, - 0x96, 0x15, 0x65, 0xfd, 0x29, 0x36, 0x68, 0xdc, 0x59, 0x6f, 0xd6, 0x51, - 0xa2, 0x07, 0xf2, 0xb2, 0x12, 0x09, 0x95, 0xd3, 0xf0, 0xb2, 0xe8, 0x6a, - 0xcb, 0xa3, 0xe5, 0x94, 0x33, 0x5b, 0x30, 0xb5, 0x11, 0xf4, 0x75, 0x1a, - 0xe9, 0xf6, 0x42, 0xcb, 0xff, 0xdf, 0xc1, 0x02, 0x76, 0x10, 0x65, 0x9c, - 0x59, 0x7f, 0x9f, 0xef, 0xf4, 0x7f, 0x7e, 0xb2, 0xff, 0xc1, 0x6c, 0x67, - 0x0b, 0x37, 0xba, 0xcb, 0xfd, 0xfb, 0x96, 0x6c, 0x24, 0x96, 0x57, 0xc8, - 0xf5, 0xf2, 0x5f, 0x0d, 0xfa, 0x7d, 0x7a, 0x74, 0x80, 0xb2, 0xa1, 0x51, - 0xae, 0x42, 0x91, 0x82, 0x13, 0x8c, 0x4d, 0xa7, 0xd7, 0xff, 0xf6, 0xa7, - 0x16, 0x6f, 0xcd, 0x4a, 0x74, 0x0d, 0xe6, 0xe2, 0xcb, 0xff, 0xb0, 0x5d, - 0xc6, 0x84, 0xdb, 0x85, 0xfa, 0xcb, 0xff, 0xff, 0x7d, 0x0c, 0x16, 0x0f, - 0xc7, 0x34, 0xee, 0x67, 0xd2, 0xd6, 0x0a, 0xb2, 0x8d, 0x17, 0x44, 0x91, - 0x58, 0x99, 0xe1, 0x46, 0x37, 0x7d, 0xd0, 0xc6, 0xcb, 0x2f, 0xe9, 0x3e, - 0xb8, 0x63, 0x59, 0x7f, 0x67, 0xb1, 0xb0, 0x05, 0x95, 0x07, 0xb3, 0x22, - 0xdb, 0xf1, 0xe8, 0xf7, 0xe2, 0xca, 0x34, 0x62, 0xf5, 0xf3, 0x70, 0x86, - 0xfa, 0x7f, 0x35, 0x0b, 0x2f, 0xff, 0xef, 0xa5, 0xc6, 0xe1, 0x4e, 0xdc, - 0x3f, 0x6c, 0x79, 0xa5, 0x96, 0xdd, 0x59, 0x58, 0x7e, 0xa0, 0x61, 0xbf, - 0xff, 0xc5, 0x80, 0xf1, 0x96, 0x07, 0xee, 0xce, 0x71, 0x71, 0x85, 0x97, - 0xfe, 0xc0, 0x3e, 0xde, 0xc0, 0x61, 0x2c, 0xb0, 0xb3, 0x91, 0x41, 0xe6, - 0x3b, 0xfc, 0xc0, 0xc3, 0x1e, 0x28, 0x59, 0x7f, 0x4b, 0x8c, 0x06, 0x3e, - 0x59, 0x7d, 0x83, 0x79, 0x2c, 0xaf, 0x8f, 0x44, 0x53, 0x0b, 0xed, 0x44, - 0x6c, 0xb2, 0xfa, 0x68, 0xeb, 0xac, 0xb9, 0xc5, 0xe1, 0xe2, 0x04, 0x8a, - 0xf6, 0xfe, 0x88, 0xb2, 0xa1, 0x36, 0x6c, 0x2c, 0x38, 0x42, 0x13, 0x40, - 0xa5, 0xd7, 0xff, 0xe2, 0xc1, 0xf8, 0x22, 0xf0, 0xfb, 0xe3, 0x7f, 0xd6, - 0x5f, 0xe2, 0xcd, 0xf3, 0xa4, 0xd9, 0x2c, 0xad, 0x22, 0x37, 0x8a, 0xd7, - 0x73, 0x7a, 0xca, 0x83, 0x78, 0x12, 0x3b, 0xef, 0xfa, 0x7b, 0x2c, 0xbf, - 0xdd, 0xf1, 0x97, 0xe2, 0x35, 0x65, 0xff, 0xfd, 0xe3, 0xc2, 0xc3, 0x1e, - 0x47, 0xee, 0x07, 0xd2, 0xcb, 0xfd, 0xb4, 0x34, 0xa3, 0xef, 0xd6, 0x54, - 0x91, 0x83, 0xf1, 0xab, 0xab, 0xdf, 0xbd, 0x39, 0xf3, 0x8b, 0x2a, 0x0f, - 0x67, 0x0c, 0x2c, 0x15, 0x97, 0xf7, 0x4a, 0x25, 0x9d, 0x59, 0x78, 0x57, - 0xe2, 0xcb, 0xcf, 0xa9, 0x4e, 0x3c, 0x9f, 0x16, 0x54, 0x2f, 0x81, 0x64, - 0x3b, 0x7e, 0x32, 0x38, 0x4c, 0xea, 0x51, 0x3f, 0xa3, 0x16, 0x72, 0x02, - 0x8c, 0xfb, 0x84, 0x01, 0x5a, 0xb6, 0xea, 0xcb, 0x75, 0x65, 0xd1, 0xfa, - 0xcb, 0xff, 0xc6, 0x16, 0x5c, 0x4e, 0xe0, 0x7f, 0x6e, 0x75, 0x65, 0x7c, - 0x7d, 0x1a, 0x17, 0xbf, 0xf4, 0x03, 0x90, 0x7f, 0x76, 0x1a, 0xb2, 0x96, - 0x5e, 0xd0, 0x77, 0x56, 0x54, 0x8d, 0x5f, 0x42, 0xe8, 0x91, 0x14, 0x16, - 0x9b, 0xef, 0xf9, 0xb7, 0x56, 0x5f, 0xf9, 0xd8, 0x9d, 0xd7, 0x72, 0x9d, - 0xb2, 0xca, 0x83, 0xe8, 0x22, 0x5b, 0xcf, 0xde, 0x2c, 0xb8, 0x3b, 0x2c, - 0xa9, 0x1b, 0x4d, 0x0e, 0x5f, 0xb2, 0x5e, 0x79, 0x2c, 0xb8, 0xbb, 0x31, - 0xe4, 0x78, 0x86, 0xff, 0x39, 0x09, 0xef, 0x40, 0xd6, 0x5f, 0xc1, 0x04, - 0xe1, 0xfc, 0x2a, 0xcb, 0xfc, 0x2f, 0xb0, 0xbe, 0x86, 0x16, 0x5f, 0xe0, - 0x7b, 0x3b, 0xac, 0x15, 0x65, 0x41, 0xf4, 0x99, 0xad, 0xda, 0x92, 0xcb, - 0xfc, 0xc3, 0xf3, 0x3a, 0x26, 0xcb, 0x2f, 0xa7, 0x00, 0x58, 0x59, 0x52, - 0x3d, 0xb6, 0x9b, 0x54, 0x27, 0x63, 0xf1, 0x71, 0x99, 0xea, 0x13, 0x8d, - 0x20, 0x77, 0x2b, 0xfb, 0x83, 0x27, 0x7f, 0x2c, 0xbf, 0xda, 0x81, 0xc7, - 0xa2, 0x4b, 0x2f, 0xff, 0xfc, 0x7f, 0x75, 0xfc, 0x58, 0x3f, 0x1c, 0xdc, - 0x06, 0x19, 0x4c, 0xb2, 0xff, 0xfa, 0x3b, 0x38, 0x83, 0xb9, 0x3b, 0x3b, - 0x3f, 0x9d, 0x59, 0x46, 0x8f, 0x7d, 0x19, 0x05, 0xb2, 0xe7, 0xea, 0xcb, - 0xff, 0xbd, 0x0c, 0x4e, 0xe9, 0x3f, 0x63, 0xab, 0x2f, 0xf4, 0xef, 0xa4, - 0x7e, 0x0b, 0x56, 0x57, 0x91, 0x27, 0xf8, 0xb1, 0x23, 0x5f, 0x85, 0x7f, - 0x4c, 0xc8, 0x59, 0x7f, 0xd8, 0x39, 0xdd, 0x60, 0xc5, 0xe2, 0xcb, 0x66, - 0x8f, 0xaf, 0x79, 0x75, 0xfc, 0xfe, 0x62, 0x34, 0xeb, 0x2f, 0xfd, 0xa9, - 0xa7, 0x72, 0x0f, 0x67, 0xea, 0xca, 0x84, 0xcc, 0xc7, 0x09, 0xb2, 0x29, - 0x09, 0x6d, 0xcf, 0xfa, 0xcb, 0xff, 0xe9, 0xc5, 0x1c, 0x8d, 0x8b, 0x07, - 0xe3, 0x99, 0x65, 0xff, 0xff, 0xdc, 0xd1, 0x44, 0xd3, 0x84, 0xe9, 0xcb, - 0x3e, 0xee, 0x6f, 0x2c, 0xe2, 0xca, 0xd2, 0x32, 0x09, 0x46, 0xba, 0x98, - 0x08, 0x61, 0xbf, 0x4b, 0x2f, 0x76, 0x73, 0x0b, 0x2e, 0x9a, 0x4b, 0x2a, - 0x0f, 0x0f, 0xe0, 0xbd, 0x10, 0x5f, 0xfc, 0x5d, 0xe6, 0xf3, 0xec, 0x61, - 0x4c, 0xb2, 0xfd, 0xa3, 0xe4, 0x7c, 0xb2, 0xb0, 0xfb, 0x5d, 0x16, 0xfe, - 0x64, 0xcd, 0x23, 0xef, 0x16, 0x5e, 0xe0, 0x9c, 0x59, 0x5b, 0x1e, 0x8b, - 0x4c, 0xee, 0x8f, 0xd6, 0x5f, 0x8b, 0xbe, 0xcd, 0xc5, 0x97, 0xe9, 0xb8, - 0xfa, 0x61, 0x65, 0xe7, 0x17, 0x50, 0x7a, 0x98, 0x55, 0x7f, 0xc4, 0xc4, - 0x4c, 0x65, 0x0d, 0x59, 0x7f, 0x30, 0xf2, 0x28, 0x6a, 0xca, 0x83, 0xe5, - 0x33, 0x8a, 0x92, 0x76, 0xc6, 0xe3, 0x31, 0x1e, 0x9a, 0xfd, 0x09, 0x7b, - 0xe3, 0x03, 0xe9, 0x65, 0xe6, 0xb8, 0xab, 0x2d, 0xc9, 0x1b, 0xe7, 0x21, - 0xbf, 0xc6, 0x3c, 0x29, 0x7b, 0x16, 0x5f, 0xf7, 0x8f, 0x53, 0x79, 0xf3, - 0x4b, 0x2f, 0xff, 0xff, 0xef, 0xf8, 0x58, 0xff, 0x4e, 0x1f, 0x83, 0x38, - 0xb3, 0xe9, 0x60, 0x76, 0x2c, 0x7f, 0x96, 0x50, 0x11, 0x90, 0x67, 0x37, - 0x38, 0x15, 0x14, 0xc2, 0xcc, 0x2c, 0xa7, 0x36, 0xa1, 0x23, 0xa8, 0x4e, - 0x5b, 0x62, 0x6c, 0x87, 0xc8, 0x15, 0xef, 0xfd, 0x85, 0xf4, 0xb9, 0xd8, - 0xd4, 0xcb, 0x2f, 0xfc, 0xff, 0x61, 0xe8, 0xdb, 0x0c, 0x2c, 0xbd, 0x87, - 0xfa, 0xcb, 0x62, 0xcb, 0x67, 0xe6, 0xb3, 0x78, 0xe5, 0x2c, 0xb7, 0xc4, - 0x6d, 0x38, 0x53, 0x46, 0x98, 0x2e, 0x90, 0x1e, 0x13, 0xd7, 0xb0, 0x3a, - 0x59, 0x69, 0x96, 0x5f, 0x07, 0x3e, 0x25, 0x95, 0xb1, 0xb4, 0x68, 0x95, - 0x85, 0x59, 0x71, 0x8d, 0x65, 0x6e, 0x9a, 0x8e, 0x09, 0x5c, 0x39, 0x96, - 0x5f, 0xf6, 0xb0, 0x7e, 0x81, 0x5a, 0x15, 0x97, 0x31, 0xb2, 0xca, 0x84, - 0x6c, 0xe2, 0x53, 0x49, 0x3c, 0x30, 0x29, 0xd5, 0xfb, 0x1a, 0xd7, 0x6a, - 0xcb, 0x9b, 0xfa, 0xcb, 0xbc, 0xf3, 0x91, 0x11, 0xa4, 0x9f, 0xc9, 0xef, - 0xed, 0x47, 0x49, 0xff, 0x59, 0x5a, 0x3e, 0xbd, 0xc3, 0xeb, 0xfd, 0x3b, - 0xe9, 0x14, 0x67, 0x16, 0x57, 0xca, 0x9d, 0x8e, 0x50, 0xe3, 0x92, 0xdf, - 0xff, 0xbf, 0x3e, 0x4e, 0xf3, 0xf3, 0xb1, 0x37, 0x3d, 0x8b, 0x29, 0x65, - 0xfc, 0x13, 0x19, 0x91, 0xac, 0xb3, 0x06, 0x6d, 0x9a, 0x17, 0x7e, 0x7e, - 0x79, 0xe4, 0xb2, 0xf9, 0xe4, 0x6d, 0x59, 0x7e, 0x03, 0xeb, 0x00, 0xb2, - 0xfe, 0x2e, 0xcb, 0x3f, 0xe2, 0xcb, 0xcc, 0x3f, 0x27, 0x1e, 0xab, 0x93, - 0xd7, 0x91, 0x57, 0xd7, 0x6a, 0xd2, 0x63, 0x9e, 0x27, 0x16, 0x1a, 0x57, - 0xf1, 0xf9, 0xcf, 0x68, 0x59, 0x7a, 0x51, 0xf2, 0xcb, 0xff, 0xf1, 0x67, - 0xdd, 0x9d, 0xe7, 0xdf, 0x38, 0x7e, 0x0e, 0xcb, 0x2f, 0xde, 0x8d, 0xb0, - 0x55, 0x96, 0x6c, 0x22, 0x1c, 0x6b, 0xd7, 0xdd, 0x96, 0x75, 0x65, 0x42, - 0x6a, 0x38, 0x6f, 0xf1, 0x63, 0xc2, 0x90, 0x25, 0x17, 0xef, 0x1f, 0x23, - 0xe5, 0x97, 0xef, 0x80, 0x51, 0xbd, 0x65, 0xfc, 0xfa, 0x9a, 0x47, 0xe5, - 0x97, 0xf8, 0x3b, 0x78, 0xf7, 0xe4, 0xcb, 0x2f, 0xfc, 0xff, 0x70, 0x4f, - 0x7a, 0x08, 0x0b, 0x2a, 0x11, 0xef, 0x85, 0x0e, 0x55, 0xc2, 0xe0, 0x9b, - 0xdd, 0xce, 0x2c, 0xb6, 0x2c, 0xbf, 0xf4, 0xc6, 0xc1, 0xf4, 0xb3, 0x72, - 0x76, 0x8d, 0x3e, 0xf1, 0x7b, 0xff, 0xfc, 0x58, 0x0e, 0xf6, 0x3b, 0xc9, - 0x8b, 0x05, 0x9d, 0x13, 0xd2, 0xcb, 0xff, 0x02, 0x1b, 0xec, 0xe6, 0x19, - 0x2c, 0xa8, 0x45, 0x27, 0x9a, 0x2f, 0xda, 0x8d, 0xf1, 0xa5, 0x97, 0xfe, - 0x3d, 0x4e, 0xce, 0x70, 0xf0, 0x55, 0x97, 0xf3, 0x94, 0xe1, 0xc1, 0x2c, - 0xa8, 0x4e, 0xe3, 0x23, 0x00, 0x32, 0x2e, 0x14, 0x85, 0x02, 0xff, 0xa0, - 0x50, 0x1e, 0xd9, 0xf7, 0x56, 0x5e, 0x8d, 0x49, 0x65, 0xff, 0xfe, 0xd0, - 0x7e, 0x97, 0x27, 0x41, 0x0f, 0xd1, 0x3f, 0x9a, 0x85, 0x95, 0x3c, 0xb7, - 0x28, 0x6c, 0xaa, 0x29, 0x0f, 0x3b, 0x42, 0xb6, 0x50, 0x8a, 0x1c, 0xa4, - 0xdc, 0x5b, 0x62, 0x32, 0x30, 0x47, 0xeb, 0xf4, 0x68, 0x46, 0xd9, 0x34, - 0xa5, 0x2d, 0x4a, 0x24, 0x6c, 0x68, 0xfe, 0x95, 0x55, 0xf9, 0xc1, 0x4a, - 0xfc, 0xe4, 0x68, 0xbd, 0x94, 0x4d, 0xbd, 0x38, 0x53, 0xbd, 0xc1, 0xcb, - 0xfe, 0xd3, 0x8b, 0x39, 0xc6, 0xfb, 0x2c, 0xbf, 0x9c, 0x59, 0x88, 0xc6, - 0xb2, 0xf1, 0xec, 0xd5, 0x97, 0xfb, 0xef, 0x67, 0xed, 0x80, 0x2c, 0xbf, - 0xff, 0xb3, 0x67, 0x2e, 0xf2, 0x01, 0x39, 0xad, 0x32, 0x02, 0xcb, 0xfa, - 0x5c, 0x9a, 0x51, 0x32, 0xca, 0x1a, 0x23, 0x3e, 0x5c, 0xbf, 0x87, 0xc7, - 0x8f, 0xa4, 0xb2, 0xa0, 0xf4, 0x9c, 0x92, 0xff, 0x4d, 0xe3, 0x86, 0xb8, - 0xd6, 0x5f, 0xe9, 0xda, 0xc3, 0xf4, 0x0d, 0x65, 0x41, 0xf3, 0x91, 0x9d, - 0x30, 0xa9, 0x07, 0x47, 0x9e, 0x2e, 0x71, 0xd2, 0x8c, 0x4c, 0x30, 0x87, - 0xbe, 0xc2, 0x63, 0x75, 0x65, 0xff, 0xff, 0xfb, 0xc7, 0xdf, 0x66, 0xa3, - 0x7c, 0xe6, 0x87, 0x72, 0x76, 0x7d, 0x2c, 0x09, 0x7f, 0xc5, 0x96, 0xe9, - 0xa2, 0xcf, 0x84, 0xb7, 0xa6, 0x36, 0xac, 0xbf, 0xf3, 0x5a, 0x73, 0x79, - 0xca, 0x21, 0x65, 0xfe, 0x79, 0x4d, 0xe3, 0xfb, 0xab, 0x2f, 0xfa, 0x41, - 0x2e, 0xc6, 0xf7, 0xf2, 0xcb, 0xff, 0x40, 0x27, 0x13, 0xf1, 0xb0, 0x4b, - 0x2f, 0xe0, 0xf6, 0x77, 0xff, 0x7e, 0xb2, 0xff, 0xf7, 0x8c, 0x1e, 0xc9, - 0xdc, 0x0f, 0xa3, 0x75, 0x65, 0xfc, 0x51, 0xf4, 0x8c, 0x96, 0x52, 0xcb, - 0xfd, 0x9e, 0x2c, 0xef, 0x8d, 0x65, 0x0c, 0xfa, 0x08, 0xb3, 0xa1, 0x77, - 0xfd, 0xd8, 0x97, 0x26, 0x94, 0x6c, 0xb2, 0xd9, 0x89, 0x90, 0x7d, 0x0b, - 0x7e, 0x97, 0x5f, 0xff, 0x77, 0xd9, 0xfc, 0xe6, 0xc6, 0x74, 0x78, 0x4b, - 0x2c, 0x2a, 0xcb, 0xf9, 0xc7, 0xad, 0x07, 0x65, 0x97, 0xe8, 0xc2, 0xec, - 0xfa, 0xcb, 0x4f, 0x2b, 0x29, 0x84, 0x40, 0x00, 0x49, 0xa5, 0xfc, 0x29, - 0xbe, 0xe9, 0xeb, 0x16, 0x5b, 0xe9, 0xc7, 0xbf, 0x87, 0xd6, 0xe6, 0x26, - 0xb4, 0xf1, 0x98, 0x50, 0xd5, 0xe2, 0x4c, 0x6a, 0xd3, 0xaf, 0x1f, 0x14, - 0x6a, 0x9d, 0x8e, 0x56, 0xff, 0xff, 0xe9, 0x1f, 0x0b, 0x37, 0xfb, 0x26, - 0xf4, 0x14, 0xd3, 0x9c, 0x07, 0xbd, 0x65, 0xff, 0xe3, 0xc1, 0x4b, 0x39, - 0x9e, 0xf1, 0xf1, 0x65, 0xb3, 0xe4, 0x5f, 0xf5, 0xde, 0xff, 0xfe, 0x3c, - 0x14, 0xb3, 0x6c, 0x0f, 0x49, 0xd8, 0x7e, 0x2c, 0xbf, 0xf6, 0x6b, 0xd1, - 0x39, 0xfa, 0x18, 0x59, 0x7f, 0xff, 0xfa, 0x05, 0x2c, 0xdf, 0xec, 0xd6, - 0xb3, 0xbc, 0xdc, 0xec, 0x73, 0xc7, 0x8b, 0x28, 0xd1, 0x75, 0xa3, 0xfb, - 0xff, 0xfe, 0xc2, 0x62, 0x76, 0xa3, 0x79, 0xf7, 0x98, 0xc1, 0xe9, 0xfe, - 0x59, 0x44, 0x9e, 0x57, 0x0a, 0x7b, 0x18, 0xa0, 0x84, 0x54, 0x6a, 0xcc, - 0x83, 0x2b, 0xba, 0xff, 0xf1, 0x8e, 0x73, 0x4e, 0x74, 0x0d, 0xe6, 0xe2, - 0xcb, 0xf7, 0x8f, 0xb8, 0xd5, 0x96, 0x92, 0xca, 0x64, 0x9b, 0x89, 0x13, - 0xdb, 0x50, 0x8a, 0xbd, 0xa1, 0x0d, 0x7e, 0x94, 0x7d, 0x2e, 0x2c, 0xbf, - 0xff, 0xff, 0xf6, 0x13, 0x13, 0x8f, 0xc1, 0x67, 0x31, 0xf6, 0x1a, 0x4e, - 0xc7, 0x8d, 0x9e, 0x7b, 0xef, 0xe0, 0x69, 0x2f, 0xff, 0xfe, 0x01, 0x8a, - 0x30, 0xea, 0x70, 0x63, 0x6e, 0x03, 0xc1, 0xf7, 0xce, 0x2a, 0xcb, 0x83, - 0xb7, 0xc9, 0xa2, 0x99, 0x4f, 0x21, 0x45, 0x7f, 0x30, 0x59, 0xdf, 0x1a, - 0xcb, 0x87, 0x8b, 0x2a, 0x19, 0x48, 0xf8, 0x50, 0x63, 0xbe, 0x9f, 0x33, - 0x78, 0x6b, 0x14, 0x6e, 0x61, 0x43, 0x9f, 0x2d, 0xb6, 0xe2, 0xcb, 0x35, - 0x65, 0xfe, 0x79, 0x63, 0x5c, 0xbf, 0x59, 0x7d, 0x9e, 0x89, 0x96, 0x5e, - 0x68, 0x27, 0x4f, 0x27, 0xcb, 0xe1, 0x17, 0x32, 0xbf, 0xff, 0xfd, 0xa0, - 0x16, 0x6f, 0x9d, 0xc3, 0xc2, 0xfe, 0x71, 0x66, 0xf2, 0xce, 0x6f, 0x59, - 0x7f, 0xfb, 0xc1, 0xc2, 0x62, 0x77, 0x7e, 0x96, 0x12, 0xcb, 0xfd, 0x8e, - 0xd9, 0xd3, 0xf0, 0xd5, 0x97, 0xff, 0xa5, 0x1c, 0xf0, 0x75, 0x9d, 0xe9, - 0xb5, 0x65, 0x0d, 0x19, 0xc0, 0x4d, 0xf8, 0xde, 0xff, 0xfc, 0x18, 0x9c, - 0x58, 0x3f, 0x1b, 0x03, 0x86, 0x3f, 0x59, 0x58, 0x9e, 0xbe, 0xa3, 0x4d, - 0x23, 0x1b, 0xff, 0xdd, 0xf6, 0x6e, 0x76, 0x6c, 0xdd, 0x72, 0xfd, 0x65, - 0xfe, 0x86, 0xb9, 0x7d, 0x28, 0x59, 0x63, 0x24, 0x41, 0xf5, 0x46, 0xf8, - 0x59, 0xdc, 0x99, 0x65, 0xba, 0xb2, 0xa0, 0xdc, 0x39, 0x3d, 0xff, 0x8b, - 0x62, 0xcd, 0xfc, 0x0c, 0x7c, 0xb2, 0xff, 0xbd, 0x1f, 0x4e, 0x9e, 0x3b, - 0xff, 0x35, 0x97, 0xee, 0xfd, 0x23, 0x9f, 0x59, 0x43, 0x3f, 0x1e, 0x22, - 0xd4, 0x23, 0x53, 0x68, 0x59, 0x51, 0xaa, 0x32, 0xe4, 0x2e, 0x3a, 0xbe, - 0x18, 0x79, 0xdf, 0xb7, 0xee, 0x77, 0x3c, 0xb2, 0xff, 0xd9, 0xc0, 0xc3, - 0x1c, 0x8d, 0x4c, 0xb2, 0x8c, 0xfb, 0x45, 0x2d, 0xbe, 0xd4, 0x9c, 0x6b, - 0x2e, 0x70, 0x2c, 0xbf, 0x6b, 0x27, 0xcf, 0xf5, 0x97, 0xf8, 0x1e, 0x3f, - 0x10, 0x76, 0x59, 0x7e, 0x8f, 0xbf, 0xd4, 0x2c, 0xa9, 0x1e, 0xef, 0x4d, - 0x2b, 0x64, 0x55, 0x14, 0x22, 0x2f, 0x77, 0x19, 0x6b, 0x29, 0x92, 0x98, - 0x44, 0x43, 0x03, 0x0a, 0x2f, 0xf4, 0x67, 0x7f, 0x10, 0xa4, 0xb2, 0xec, - 0xf2, 0xca, 0x23, 0xca, 0x9f, 0x34, 0xb9, 0x88, 0x59, 0x76, 0x0d, 0x65, - 0x4f, 0x4b, 0xf3, 0xbb, 0x3c, 0xca, 0x71, 0x43, 0x21, 0x6a, 0xe4, 0x5c, - 0x8c, 0xab, 0xb0, 0x82, 0x09, 0x26, 0xf1, 0x7b, 0xf1, 0xf7, 0x99, 0xfa, - 0xcb, 0xf7, 0xb3, 0x79, 0xef, 0x59, 0x7f, 0xff, 0xe2, 0x7e, 0xfa, 0x26, - 0x9c, 0x59, 0xe3, 0xef, 0x02, 0x00, 0xc2, 0xcb, 0xb3, 0xf5, 0x97, 0xff, - 0x17, 0xe5, 0x87, 0x37, 0xa0, 0x98, 0x59, 0x46, 0x7b, 0x6e, 0x2f, 0x7f, - 0x4b, 0x9d, 0x38, 0xf9, 0x65, 0xfa, 0x0b, 0xcf, 0x25, 0x97, 0xa0, 0x70, - 0xb2, 0x86, 0x78, 0x2d, 0x26, 0xa5, 0x97, 0xa0, 0x70, 0xb2, 0xfd, 0x9d, - 0xe3, 0xcd, 0x38, 0xf2, 0x20, 0x89, 0xa1, 0x77, 0xd3, 0xcb, 0x2a, 0xcf, - 0x73, 0xca, 0xcb, 0xe3, 0x72, 0x1a, 0xcb, 0x0b, 0x38, 0xf6, 0x46, 0x73, - 0x7f, 0x7f, 0x8f, 0xf4, 0xb8, 0xb2, 0xa4, 0x98, 0x01, 0xc2, 0x9b, 0x85, - 0x77, 0xc1, 0xf4, 0x35, 0x65, 0xff, 0xf0, 0x75, 0xa8, 0x2c, 0x60, 0xfd, - 0xec, 0x11, 0x65, 0x61, 0xf9, 0x68, 0x8a, 0xfb, 0xd0, 0x12, 0x59, 0x7c, - 0x17, 0xfb, 0xab, 0x2f, 0xff, 0xfe, 0x63, 0x35, 0xa3, 0x6c, 0xe9, 0xa4, - 0x16, 0xfd, 0x2e, 0x72, 0x34, 0x05, 0x97, 0x79, 0xd6, 0x59, 0xcd, 0x11, - 0xfb, 0xde, 0x6f, 0x68, 0xfe, 0x59, 0x52, 0x5c, 0xd3, 0x19, 0x46, 0x15, - 0xb1, 0x0c, 0x8f, 0x88, 0x26, 0x8e, 0xdf, 0x50, 0xa7, 0x69, 0x0f, 0x88, - 0x4a, 0x16, 0x5d, 0x29, 0xb6, 0xe2, 0xca, 0x59, 0x7f, 0x63, 0x47, 0xec, - 0xe2, 0xcb, 0xfb, 0x80, 0x03, 0x93, 0x0b, 0x29, 0x94, 0x3e, 0x6d, 0x82, - 0xfa, 0x5b, 0x7f, 0x8a, 0x76, 0xff, 0xa5, 0xc9, 0x96, 0x5f, 0xff, 0xe1, - 0xfb, 0x3b, 0xd7, 0x20, 0x61, 0xe8, 0xdb, 0x0c, 0x2c, 0xbb, 0x6f, 0x96, - 0x5f, 0xbc, 0xfb, 0xb1, 0xfa, 0xca, 0x1a, 0x37, 0x4c, 0xe9, 0xd7, 0xf7, - 0x06, 0x6f, 0xd3, 0x84, 0xda, 0x36, 0x59, 0x7e, 0x2c, 0xf3, 0xf5, 0x65, - 0x48, 0xf4, 0xe6, 0x2d, 0xbf, 0x98, 0x3f, 0xb8, 0x1e, 0x2c, 0xad, 0x1e, - 0x99, 0x11, 0xd4, 0x2a, 0x17, 0xc8, 0xc4, 0x8e, 0x1c, 0x97, 0xfc, 0x12, - 0x9d, 0x31, 0xec, 0x19, 0x96, 0x5f, 0xd8, 0x39, 0xa5, 0x1b, 0xab, 0x2b, - 0x63, 0xef, 0xd1, 0xf5, 0xf6, 0x87, 0x84, 0xb2, 0xfb, 0xfe, 0x6e, 0x81, - 0x65, 0x19, 0xe4, 0x04, 0x86, 0xfd, 0xfe, 0x74, 0x4d, 0x96, 0x5f, 0xfc, - 0x2f, 0x79, 0xe0, 0xcd, 0x38, 0x5d, 0xdf, 0x96, 0x5b, 0xab, 0x2d, 0xc5, - 0x97, 0xe1, 0x7b, 0x9e, 0x9c, 0xc1, 0xa2, 0xf8, 0x46, 0xa1, 0x1c, 0x18, - 0x56, 0xee, 0x55, 0x3d, 0xae, 0x69, 0xca, 0x54, 0x89, 0xc2, 0xa7, 0xcd, - 0x65, 0x18, 0x0d, 0xff, 0xd2, 0x7e, 0x66, 0xcf, 0xdd, 0xb0, 0x55, 0x97, - 0xf7, 0xb0, 0x12, 0x86, 0xac, 0xbf, 0xde, 0xc9, 0x39, 0x67, 0xcb, 0x2b, - 0x0f, 0x7f, 0xa5, 0xb7, 0xff, 0xfe, 0x94, 0x6d, 0xf4, 0xb8, 0x6c, 0x4e, - 0xe6, 0x00, 0xda, 0x1d, 0x6c, 0xb2, 0xff, 0xff, 0x3f, 0xfc, 0xdb, 0x0c, - 0xba, 0x59, 0xbe, 0x77, 0x05, 0x25, 0x95, 0xf2, 0x36, 0x09, 0xce, 0xfe, - 0xf6, 0x17, 0xd0, 0xc2, 0xcb, 0xf9, 0xcb, 0xa1, 0xd6, 0xcb, 0x28, 0xd5, - 0x0e, 0x94, 0x29, 0x7b, 0x0f, 0x91, 0x48, 0xc4, 0x2e, 0xb8, 0x7b, 0x8b, - 0x2f, 0x61, 0xcc, 0xb2, 0xff, 0xc7, 0x93, 0x4e, 0xe4, 0x79, 0xf7, 0x56, - 0x5f, 0xf6, 0x3f, 0xde, 0xce, 0xfe, 0xeb, 0x2f, 0xff, 0xa5, 0xc0, 0xe1, - 0x4e, 0x2c, 0xf7, 0x9c, 0x6b, 0x2f, 0xfb, 0xec, 0x8f, 0xa6, 0x28, 0x6a, - 0xcb, 0xfb, 0xee, 0x7b, 0x1f, 0x4b, 0x2f, 0xff, 0xfc, 0x6d, 0xd1, 0xe7, - 0xc4, 0x1e, 0xc7, 0xa7, 0x6f, 0x3e, 0xcd, 0x0b, 0x29, 0xd1, 0x3d, 0xd2, - 0xea, 0xd9, 0x3e, 0x21, 0x8e, 0x30, 0x87, 0xf1, 0xcf, 0x94, 0x3b, 0x0d, - 0x8b, 0xff, 0xec, 0x7d, 0xbd, 0x07, 0xde, 0x46, 0xd9, 0xc5, 0x97, 0xfd, - 0x9a, 0xda, 0x0f, 0x58, 0x4b, 0x2c, 0xd5, 0x93, 0x8d, 0xbd, 0xe2, 0xc1, - 0xac, 0xa8, 0x37, 0xdf, 0x11, 0xdf, 0x8a, 0x30, 0x5d, 0x96, 0x5e, 0x9f, - 0x0f, 0x56, 0x54, 0xf6, 0x79, 0x12, 0x28, 0xbf, 0xbe, 0xe6, 0x61, 0x30, - 0xb2, 0xf9, 0xa2, 0x47, 0xeb, 0x2f, 0xff, 0x6c, 0x3d, 0x38, 0x0b, 0x37, - 0xe8, 0xf8, 0xb2, 0xa1, 0x18, 0xb8, 0x4e, 0x65, 0xc1, 0x24, 0xbb, 0xbc, - 0x59, 0x7f, 0x77, 0xcf, 0x30, 0x8d, 0x59, 0x73, 0xf9, 0x65, 0xd9, 0xc5, - 0x97, 0x3e, 0x96, 0x5b, 0xf9, 0x1a, 0xcd, 0x0b, 0x5f, 0x3c, 0x84, 0x1a, - 0xcb, 0x76, 0x0f, 0x2f, 0xc5, 0x14, 0xe8, 0xe4, 0xfc, 0xc0, 0xa1, 0x1b, - 0x74, 0x0d, 0x65, 0xdc, 0x35, 0x97, 0x7d, 0xfa, 0xca, 0xf1, 0xe2, 0xb2, - 0xc5, 0x82, 0x2d, 0x7f, 0x72, 0x3e, 0xff, 0x50, 0xb2, 0xe1, 0x9a, 0xca, - 0x85, 0xec, 0xad, 0x95, 0xb2, 0x3f, 0xc0, 0x30, 0x1c, 0x31, 0x35, 0x19, - 0x77, 0x8e, 0x9e, 0x1f, 0x64, 0xf3, 0xc3, 0x3d, 0xe5, 0xf7, 0xb7, 0xfb, - 0x16, 0x5f, 0x1b, 0x63, 0xcb, 0x2f, 0xcf, 0xe9, 0xc3, 0x85, 0x94, 0x67, - 0xd1, 0xe1, 0xee, 0x90, 0xdf, 0xdd, 0x28, 0x96, 0x75, 0x65, 0xf6, 0x13, - 0xc9, 0x65, 0xf7, 0x78, 0x27, 0x27, 0x1e, 0x64, 0xf6, 0x59, 0x7f, 0xba, - 0x7b, 0x67, 0x83, 0xd5, 0x97, 0xdd, 0xe4, 0x30, 0xb2, 0xd3, 0x2c, 0xbf, - 0xb0, 0x39, 0xe0, 0x6c, 0xb2, 0xdf, 0x41, 0xe0, 0x70, 0x4a, 0xf7, 0xa0, - 0x6b, 0x2a, 0x11, 0x4f, 0x8c, 0x73, 0x14, 0x5f, 0xd9, 0xaf, 0xcc, 0xba, - 0xb2, 0xef, 0xbe, 0x59, 0x66, 0xce, 0x3c, 0x66, 0x96, 0xdf, 0xba, 0x7b, - 0x13, 0xac, 0xbf, 0xfb, 0xbc, 0x9d, 0xb9, 0xdc, 0xf7, 0x4d, 0xab, 0x2a, - 0x47, 0xe2, 0x44, 0xf7, 0xf7, 0x9e, 0x4d, 0xd1, 0xac, 0xbf, 0xf9, 0x86, - 0x1f, 0xbc, 0xe9, 0x47, 0xd2, 0x59, 0x7f, 0x74, 0xa2, 0x59, 0xd5, 0x95, - 0x07, 0xe7, 0x24, 0x7b, 0x8f, 0x8b, 0x2c, 0xd5, 0x97, 0xb5, 0x9f, 0x2c, - 0xbd, 0x87, 0xb2, 0xcb, 0xe8, 0x6b, 0x4d, 0x65, 0xb3, 0x63, 0x7b, 0xd1, - 0xca, 0x1a, 0x2a, 0x3c, 0x2d, 0xf8, 0x89, 0x2d, 0x5f, 0x6c, 0x1d, 0x01, - 0x65, 0xff, 0x31, 0x05, 0x2c, 0xf1, 0xb5, 0x65, 0xce, 0xc6, 0xc7, 0xb9, - 0xd2, 0x4b, 0xf1, 0xf3, 0x90, 0xd5, 0x94, 0x68, 0xef, 0x28, 0x4c, 0xef, - 0x2f, 0xa8, 0x5d, 0x55, 0xc7, 0xa6, 0x10, 0x8e, 0x1b, 0x6d, 0x75, 0x78, - 0x4d, 0xfe, 0x42, 0x50, 0xa0, 0x0c, 0x77, 0x17, 0xe1, 0x99, 0x38, 0xd6, - 0x5e, 0xe0, 0xfe, 0x59, 0x77, 0xe0, 0x59, 0x7f, 0xfb, 0x26, 0xf4, 0x13, - 0x05, 0x9d, 0xf0, 0x56, 0x53, 0x07, 0xc5, 0xe1, 0x8b, 0xe0, 0x05, 0xe4, - 0xb2, 0xa7, 0x23, 0x16, 0x50, 0x80, 0xf8, 0x8e, 0x8d, 0x32, 0x3d, 0x43, - 0xae, 0xfe, 0xd7, 0xb3, 0x41, 0xc5, 0x97, 0xff, 0xf6, 0x7d, 0x2e, 0x77, - 0xd0, 0xd8, 0x31, 0xce, 0x89, 0xe9, 0x65, 0x62, 0x23, 0xcc, 0xb6, 0xff, - 0x39, 0x4e, 0x07, 0x3f, 0x1a, 0xcb, 0xff, 0x07, 0x93, 0x9a, 0x27, 0x9f, - 0xd0, 0xb2, 0xfd, 0x9d, 0x0e, 0x7c, 0xb2, 0xf3, 0x19, 0xf2, 0xcb, 0xa2, - 0x69, 0xc7, 0x8d, 0xd2, 0x8a, 0x24, 0x5c, 0x06, 0x11, 0x17, 0xff, 0xff, - 0xe0, 0x94, 0xe1, 0x5f, 0xe9, 0x69, 0xff, 0x9d, 0xc0, 0xc7, 0xde, 0xc3, - 0x2c, 0x61, 0x65, 0xff, 0xff, 0xfe, 0x06, 0x00, 0xb3, 0xbe, 0x0f, 0x9f, - 0xe9, 0x73, 0xba, 0xc1, 0x70, 0xc7, 0xde, 0x1a, 0xcb, 0xff, 0xfd, 0xd0, - 0xe1, 0x4e, 0x3c, 0xe9, 0x47, 0xf3, 0xb0, 0xc6, 0xb2, 0xff, 0x9b, 0x8d, - 0x9c, 0xdd, 0xdd, 0xf2, 0x59, 0x5a, 0x45, 0x1b, 0x58, 0xaf, 0xff, 0xb5, - 0xac, 0xef, 0x3c, 0x79, 0x3b, 0xdf, 0xc2, 0xca, 0x84, 0xe9, 0xce, 0x33, - 0x20, 0x91, 0xdf, 0xff, 0xd1, 0xec, 0x1b, 0x01, 0x8f, 0x67, 0x61, 0xaf, - 0xd5, 0x95, 0x8a, 0xb0, 0x3d, 0x28, 0xc4, 0x26, 0xb7, 0xff, 0xff, 0xc7, - 0x37, 0xb3, 0x9a, 0xc0, 0x4e, 0xf1, 0xe1, 0x66, 0xf2, 0xc1, 0x84, 0x96, - 0x5f, 0xb0, 0x80, 0x23, 0x56, 0x5f, 0xfd, 0xec, 0x82, 0x98, 0xb3, 0xbc, - 0x75, 0x96, 0x91, 0x23, 0xa3, 0xaf, 0xdb, 0x85, 0x17, 0xff, 0xd8, 0xd9, - 0xdb, 0x9d, 0x8e, 0x4d, 0x27, 0xd6, 0xcb, 0x2f, 0xfe, 0x3d, 0x9d, 0xad, - 0x39, 0xc3, 0x3d, 0xeb, 0x28, 0x68, 0x9f, 0xd2, 0xbd, 0xe9, 0x8f, 0x75, - 0x65, 0xff, 0xfd, 0xd3, 0xdb, 0x07, 0x39, 0xaf, 0x2d, 0x1e, 0xce, 0xd5, - 0x97, 0xfb, 0x67, 0x69, 0x46, 0xa6, 0x59, 0x7f, 0xdf, 0x63, 0x1f, 0xb7, - 0x27, 0x6b, 0x11, 0x24, 0x6b, 0xd7, 0xdf, 0xbb, 0xcc, 0xb2, 0xd0, 0xb2, - 0xf6, 0x16, 0xd3, 0x8d, 0x98, 0x08, 0xef, 0xff, 0xb0, 0x3a, 0x9d, 0x37, - 0x82, 0xc1, 0xe1, 0x30, 0xb2, 0xff, 0xf9, 0xfb, 0x1a, 0x0b, 0x4f, 0x93, - 0xb9, 0x2e, 0x2c, 0xbf, 0xed, 0x6d, 0x1b, 0x6c, 0x1d, 0x6c, 0xb2, 0xff, - 0xd3, 0xa6, 0xf0, 0x58, 0x3c, 0x26, 0x16, 0x5f, 0xe2, 0x9d, 0xc0, 0xcf, - 0x87, 0x4b, 0x2b, 0x0f, 0xf0, 0x28, 0x75, 0x08, 0xdb, 0xe4, 0x2e, 0xaf, - 0xc3, 0xcf, 0x9c, 0x96, 0x5f, 0xfe, 0xda, 0x77, 0x3c, 0x19, 0xdd, 0xe7, - 0x23, 0x4b, 0x2f, 0xfd, 0x28, 0xe8, 0x41, 0x3b, 0x9d, 0x35, 0x97, 0xff, - 0xde, 0x8d, 0xa7, 0x16, 0x6f, 0x7f, 0x7a, 0x3e, 0x59, 0x7f, 0xff, 0xdf, - 0x70, 0xf0, 0x59, 0xde, 0xce, 0xf3, 0x36, 0x9d, 0x86, 0x35, 0x94, 0x34, - 0x60, 0x62, 0xa5, 0xff, 0xd9, 0xd3, 0xfa, 0x45, 0x13, 0xb7, 0x00, 0xb2, - 0xff, 0x8b, 0x35, 0x80, 0xc3, 0x1a, 0xcb, 0xfb, 0x6e, 0xcc, 0x50, 0xd5, - 0x97, 0xe7, 0x89, 0xa2, 0x65, 0x97, 0xec, 0x1f, 0x82, 0x2a, 0xcb, 0xa2, - 0x69, 0xc7, 0xa2, 0x45, 0x17, 0xff, 0xf6, 0x6d, 0x86, 0x32, 0x0f, 0xa7, - 0x40, 0xde, 0x6e, 0x2c, 0xbf, 0xec, 0x17, 0x3c, 0x7a, 0xf3, 0xac, 0xa8, - 0x56, 0xbd, 0x84, 0xff, 0x28, 0x9c, 0x60, 0x33, 0x11, 0x79, 0x25, 0xcd, - 0x8a, 0x10, 0x1c, 0x2f, 0xea, 0xed, 0x6c, 0xcd, 0x18, 0x19, 0x0b, 0x10, - 0xee, 0x04, 0xae, 0x7f, 0xa3, 0x20, 0x38, 0x6b, 0xcc, 0x47, 0xa8, 0x59, - 0x36, 0x10, 0xfe, 0x34, 0x25, 0x4e, 0x46, 0x5b, 0xd9, 0x70, 0xb7, 0xfb, - 0xa5, 0x9d, 0xf6, 0x6c, 0xb2, 0xff, 0x85, 0x9d, 0xac, 0xfa, 0x46, 0xd5, - 0x97, 0xfe, 0x7d, 0x7b, 0x3b, 0x04, 0x7f, 0xac, 0xbf, 0xfe, 0x2c, 0xda, - 0x77, 0xe1, 0xee, 0x63, 0x7f, 0x15, 0x65, 0xf4, 0xba, 0x7b, 0x2c, 0xbf, - 0xc0, 0x3e, 0x60, 0xe7, 0x0d, 0x65, 0xfd, 0xf4, 0xb9, 0x3b, 0xa6, 0xb2, - 0xd9, 0xe3, 0xe6, 0x14, 0xd6, 0xff, 0xd2, 0x8c, 0xff, 0xd9, 0x84, 0x05, - 0x97, 0xff, 0xbc, 0x64, 0x39, 0xc2, 0x00, 0xb3, 0xd8, 0xb2, 0xff, 0x9f, - 0xbc, 0x9a, 0x41, 0x2e, 0xac, 0xac, 0x46, 0x14, 0xc7, 0xbf, 0xa5, 0xdf, - 0xf7, 0x8d, 0xb1, 0x85, 0xde, 0x2c, 0xbf, 0xff, 0xc1, 0xee, 0x83, 0x34, - 0xee, 0xcd, 0xe0, 0xff, 0xd3, 0xcd, 0xc5, 0x97, 0xd0, 0x08, 0x6c, 0xe4, - 0x69, 0x80, 0xc4, 0x8d, 0xea, 0x15, 0xc7, 0xe1, 0x98, 0x0f, 0x74, 0x7a, - 0xea, 0xa5, 0x08, 0x9d, 0xc8, 0xef, 0x6f, 0xff, 0xed, 0x63, 0xb6, 0x73, - 0x0f, 0xf7, 0xb3, 0xde, 0x8e, 0xac, 0xbe, 0xcd, 0x4d, 0x25, 0x97, 0xff, - 0x1f, 0xd2, 0xe4, 0xe1, 0x9e, 0xf8, 0x1a, 0xcb, 0xdf, 0x46, 0xea, 0xca, - 0x60, 0xfa, 0x5d, 0x26, 0xfb, 0x3c, 0xfb, 0xd6, 0x5f, 0xd2, 0xcf, 0x66, - 0xfe, 0x2c, 0xb6, 0x0c, 0xf4, 0xa6, 0x23, 0xbf, 0xff, 0x0f, 0xc1, 0xe4, - 0xef, 0x1f, 0x7d, 0x9a, 0x8d, 0xeb, 0x2f, 0xec, 0xf8, 0xb3, 0x3f, 0x59, - 0x58, 0x88, 0x72, 0x5a, 0xbf, 0x8a, 0x3e, 0xf6, 0x6c, 0xb2, 0xe8, 0x6e, - 0x27, 0xfc, 0xc4, 0x23, 0x34, 0xe8, 0x50, 0xaf, 0xe9, 0x0d, 0xff, 0xda, - 0x81, 0x77, 0x0a, 0x05, 0xfa, 0x5c, 0x59, 0x68, 0x59, 0x7c, 0x7a, 0x7f, - 0x96, 0x5b, 0xa6, 0x6c, 0xb8, 0x21, 0x43, 0x45, 0x11, 0xbe, 0x5f, 0xf3, - 0x90, 0x3c, 0x6d, 0x28, 0x59, 0x7f, 0xf0, 0xc9, 0xe6, 0x9a, 0x3b, 0xfe, - 0x71, 0x65, 0xff, 0xf1, 0x46, 0xde, 0x83, 0xef, 0x0c, 0xbe, 0x92, 0xcb, - 0x9a, 0x22, 0xcb, 0xa2, 0x65, 0x95, 0x06, 0xbc, 0xc6, 0x2f, 0xfe, 0x3d, - 0xe6, 0x39, 0xd1, 0x30, 0xdc, 0x55, 0x97, 0xff, 0xff, 0x88, 0xd8, 0xf3, - 0xcd, 0x38, 0x83, 0xb9, 0x3b, 0x3e, 0x96, 0x04, 0xbf, 0xe2, 0xcb, 0xf7, - 0x8e, 0x0b, 0x65, 0x94, 0xd4, 0x54, 0x6f, 0x84, 0x0d, 0xf3, 0x4c, 0xc5, - 0x59, 0x50, 0x79, 0x8e, 0x55, 0x44, 0x9b, 0xe7, 0x07, 0xfb, 0x19, 0xed, - 0xfe, 0xd4, 0x6d, 0xe3, 0xc1, 0xac, 0xbe, 0x89, 0xb8, 0x6b, 0x2a, 0x4a, - 0xc8, 0xc6, 0x45, 0x86, 0xc0, 0x46, 0x38, 0xfe, 0xb4, 0x6c, 0x46, 0x77, - 0xff, 0xfd, 0x93, 0x4a, 0x34, 0xc3, 0x48, 0xfe, 0x97, 0x07, 0xa3, 0xd9, - 0x65, 0xe8, 0x9b, 0x8b, 0x2e, 0x08, 0xd6, 0x5f, 0xdc, 0x22, 0xcf, 0xf8, - 0xb2, 0xa6, 0x3c, 0x4e, 0x8b, 0xd4, 0x37, 0x51, 0x79, 0x4d, 0xcf, 0x39, - 0xc7, 0x5d, 0x38, 0x7a, 0x52, 0xe3, 0xce, 0x12, 0x13, 0x4f, 0x5a, 0x82, - 0xc3, 0x7f, 0x44, 0x8c, 0x78, 0x4b, 0x2f, 0x8b, 0xa7, 0xbd, 0x65, 0xf4, - 0x82, 0xfd, 0x59, 0x78, 0x11, 0xba, 0xb2, 0xa0, 0xf9, 0x30, 0x8c, 0xc8, - 0xaf, 0xbb, 0xc7, 0xfd, 0x65, 0xff, 0xde, 0x39, 0xc7, 0xa0, 0xec, 0xfa, - 0x02, 0xcb, 0xe3, 0xf3, 0xec, 0xb2, 0xff, 0x1f, 0x0c, 0x2c, 0xb1, 0xc2, - 0xcb, 0xd1, 0xd8, 0x59, 0x5d, 0x3d, 0x1d, 0xe6, 0xd7, 0xef, 0x34, 0xc8, - 0x0b, 0x2f, 0xb3, 0xa7, 0xc5, 0x95, 0x87, 0x91, 0xc2, 0x7b, 0xdc, 0x71, - 0x16, 0x5f, 0xfb, 0xbe, 0x3c, 0xc1, 0x96, 0x0a, 0xb2, 0xb0, 0xf6, 0x8c, - 0x76, 0xff, 0xdc, 0x89, 0xb3, 0xc7, 0xaf, 0x3a, 0xcb, 0xb3, 0xcb, 0x28, - 0xcf, 0x51, 0xa7, 0xd7, 0xb4, 0x6c, 0x2c, 0xbf, 0xfe, 0x0e, 0x1f, 0xb0, - 0x1e, 0x39, 0xc2, 0xb4, 0x0b, 0x2f, 0x77, 0x05, 0x59, 0x7b, 0x03, 0xb1, - 0x1f, 0x7f, 0x54, 0xaf, 0xc1, 0x65, 0x93, 0xf5, 0x65, 0xfb, 0x67, 0x2e, - 0xf1, 0x65, 0xfd, 0xe7, 0xda, 0x74, 0xba, 0xb2, 0xfc, 0x5f, 0xc1, 0xef, - 0x59, 0x7e, 0x98, 0x4e, 0x46, 0x2c, 0xa3, 0x3d, 0x27, 0x29, 0xbf, 0x3e, - 0x8b, 0xe3, 0x59, 0x7a, 0x68, 0xea, 0xca, 0x84, 0xce, 0xb0, 0xac, 0xca, - 0x3d, 0x08, 0x3e, 0x90, 0x04, 0x9e, 0xf7, 0x9c, 0x96, 0x56, 0xcb, 0xb0, - 0x43, 0x84, 0x7e, 0x16, 0x30, 0x46, 0x04, 0x73, 0x73, 0x99, 0xb1, 0xaf, - 0x7e, 0x74, 0x72, 0x12, 0x84, 0x67, 0x63, 0x6d, 0x15, 0x6a, 0xf8, 0xbb, - 0x0d, 0x59, 0x74, 0xb6, 0x59, 0x7e, 0xcf, 0x87, 0xf3, 0x0b, 0x2f, 0xfe, - 0xef, 0xa0, 0xa0, 0x1a, 0x8c, 0x25, 0x97, 0xf6, 0x6d, 0x0c, 0x3f, 0x16, - 0x5f, 0xff, 0x9f, 0xe1, 0xe8, 0x9c, 0x52, 0xcf, 0xff, 0xcf, 0xd6, 0x5d, - 0xf7, 0x27, 0x23, 0x1c, 0x68, 0x3d, 0x2e, 0xbf, 0xde, 0x83, 0x27, 0xd3, - 0x0b, 0x2f, 0xe8, 0x32, 0x7d, 0x30, 0xb2, 0xfe, 0x7f, 0xf5, 0xa3, 0xd4, - 0xe3, 0xde, 0xf1, 0x95, 0xe2, 0xc6, 0xac, 0xb7, 0xcb, 0x2e, 0x79, 0x48, - 0xd6, 0xf0, 0x6e, 0xff, 0xff, 0xf4, 0xe6, 0xc6, 0x76, 0x76, 0x48, 0xf7, - 0x96, 0x72, 0x74, 0x0d, 0xe6, 0xe2, 0xcb, 0xf8, 0x81, 0x38, 0x5e, 0x7e, - 0xb2, 0xa4, 0x8b, 0x07, 0x7e, 0xa3, 0x56, 0x75, 0x31, 0x0e, 0x86, 0x1e, - 0x1e, 0x5f, 0xc2, 0x74, 0x9d, 0x03, 0x0d, 0xcb, 0xdc, 0xe9, 0xac, 0xbd, - 0x37, 0xff, 0x2c, 0xbd, 0x0c, 0x4e, 0x01, 0xbc, 0xfc, 0x72, 0xfb, 0xff, - 0xc3, 0xba, 0xb2, 0xdf, 0xac, 0xbf, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7a, - 0x5c, 0xc5, 0x97, 0xe6, 0x49, 0x46, 0x7e, 0xb2, 0xb4, 0x78, 0xff, 0x8e, - 0x5f, 0xf8, 0xf0, 0x5e, 0x06, 0x62, 0x86, 0xac, 0xbc, 0x17, 0xe2, 0xca, - 0x92, 0x3d, 0x31, 0xd9, 0xa4, 0x62, 0x1f, 0xdf, 0xe1, 0x5b, 0x07, 0xa0, - 0xee, 0xac, 0xb8, 0x82, 0xb2, 0x96, 0x5d, 0x1a, 0x9c, 0x68, 0x78, 0x2d, - 0x58, 0x88, 0x60, 0xac, 0x5f, 0xff, 0xc7, 0xa9, 0xd8, 0x78, 0x4c, 0x78, - 0xf1, 0xb8, 0x05, 0x97, 0xfd, 0x9f, 0x4b, 0x9f, 0x48, 0x3a, 0x59, 0x7f, - 0xff, 0xe6, 0xf0, 0x1e, 0x80, 0x7d, 0x22, 0x08, 0xe7, 0x1b, 0x0e, 0x5f, - 0xac, 0xbf, 0xff, 0xdb, 0x6a, 0x1b, 0xc0, 0xc4, 0xe8, 0xd4, 0x0f, 0xd0, - 0xd5, 0x95, 0x88, 0xd4, 0x37, 0x1a, 0xc4, 0xe2, 0xcd, 0x6b, 0x51, 0x88, - 0x5f, 0xbf, 0xe1, 0xfc, 0x2a, 0xcb, 0xf7, 0xd0, 0xdd, 0xa1, 0x65, 0xf7, - 0xd2, 0x3f, 0x2c, 0xbd, 0xac, 0xfb, 0xc7, 0x99, 0xd2, 0x9b, 0xfb, 0xe7, - 0x91, 0x43, 0x56, 0x5f, 0xf8, 0x25, 0x37, 0x4b, 0x36, 0x72, 0x59, 0x7f, - 0xff, 0xfb, 0x5a, 0x3d, 0xa7, 0x7b, 0x3a, 0x51, 0x37, 0xb3, 0x68, 0xfb, - 0xa1, 0x02, 0xcb, 0xff, 0xff, 0xa1, 0x8f, 0x44, 0xe2, 0xc0, 0xb1, 0x3b, - 0xe9, 0x70, 0xc8, 0x48, 0xd9, 0x65, 0xfb, 0xee, 0x1e, 0x12, 0xca, 0xc4, - 0x50, 0x05, 0xe6, 0xa1, 0x3a, 0xac, 0x2d, 0x33, 0xef, 0x46, 0x3b, 0x7f, - 0xee, 0xb5, 0xaf, 0x34, 0xe2, 0xc1, 0x56, 0x5f, 0xfd, 0xa2, 0xfb, 0x38, - 0x19, 0x8a, 0x1a, 0xb2, 0xff, 0x8d, 0x8f, 0x41, 0xed, 0x0c, 0x2c, 0xa3, - 0x3f, 0xfe, 0x22, 0xd4, 0xe4, 0x71, 0x4a, 0x18, 0x37, 0xfc, 0x41, 0x98, - 0xb3, 0xcf, 0xd5, 0x97, 0xff, 0x48, 0x3f, 0xf0, 0xb3, 0x9c, 0x81, 0x56, - 0x5f, 0xef, 0x40, 0xa3, 0xf3, 0xb5, 0x65, 0xff, 0x37, 0x39, 0x3a, 0x62, - 0x86, 0xac, 0xbf, 0xff, 0x73, 0x67, 0x9c, 0x3f, 0x46, 0xb5, 0x9b, 0xe3, - 0xe5, 0x94, 0x34, 0x65, 0x34, 0xd3, 0xa7, 0x77, 0xff, 0xe8, 0xcd, 0xa7, - 0x0f, 0x47, 0xb7, 0x4f, 0x0b, 0x65, 0x97, 0xdb, 0xf0, 0x20, 0x59, 0x7f, - 0xff, 0xcf, 0xaf, 0x67, 0x4f, 0x0b, 0x6e, 0x46, 0x10, 0xfd, 0x0b, 0x2f, - 0xbb, 0x3b, 0x6d, 0x2c, 0xac, 0x45, 0x6f, 0xc4, 0x8e, 0xc7, 0x7f, 0xff, - 0xef, 0xb3, 0x60, 0xee, 0x4e, 0xfa, 0x5d, 0x81, 0x67, 0x66, 0xbf, 0xfe, - 0x16, 0x5f, 0xf6, 0x4d, 0x3e, 0x1e, 0xe7, 0xdd, 0x59, 0x7b, 0x34, 0x35, - 0x97, 0x44, 0x96, 0x56, 0x1f, 0x83, 0x4f, 0xbf, 0x1c, 0xbf, 0xfb, 0x67, - 0x2c, 0xf6, 0x77, 0x58, 0x2a, 0xcb, 0xff, 0xff, 0xf6, 0x05, 0x82, 0x0f, - 0x66, 0xce, 0x9f, 0xd2, 0x28, 0x2c, 0xf1, 0xe6, 0xa6, 0x59, 0x58, 0x8c, - 0x7f, 0x91, 0x2f, 0xfb, 0x05, 0xf4, 0x31, 0x9d, 0xe2, 0xcb, 0xff, 0x9c, - 0xb6, 0x68, 0x4c, 0x66, 0x46, 0xb2, 0x8c, 0xff, 0x05, 0x3a, 0xbf, 0xa6, - 0xfa, 0x41, 0x8e, 0xac, 0xbf, 0xe0, 0xfd, 0xec, 0xee, 0xb0, 0x55, 0x97, - 0xff, 0xf4, 0xa3, 0x5f, 0x4b, 0x93, 0xbd, 0x06, 0x4f, 0xa6, 0x16, 0x5f, - 0xa5, 0xd2, 0xc9, 0x2c, 0xbf, 0xf7, 0xc3, 0xf0, 0x5f, 0x85, 0x83, 0x59, - 0x58, 0x7c, 0xc1, 0x27, 0xbf, 0xef, 0x3b, 0x4b, 0x3c, 0xfd, 0x59, 0x77, - 0xe2, 0xac, 0xbe, 0x9f, 0xcd, 0x42, 0xcb, 0x66, 0x8d, 0xee, 0xf1, 0x9a, - 0x84, 0xfb, 0x30, 0xc3, 0xe3, 0xbf, 0x43, 0x13, 0x84, 0x3d, 0x74, 0xbf, - 0xfb, 0x3b, 0xc9, 0xda, 0xc3, 0xf4, 0x0d, 0x65, 0xff, 0x7b, 0xd1, 0xf4, - 0xe1, 0x5a, 0x05, 0x97, 0xf6, 0x77, 0x5a, 0xc9, 0x2c, 0xa5, 0x97, 0xec, - 0xf1, 0x60, 0x16, 0x57, 0xe6, 0xc4, 0x82, 0xea, 0x63, 0xff, 0xea, 0xf5, - 0xec, 0xfb, 0xab, 0x2f, 0xf6, 0x0c, 0xf7, 0xf4, 0xf4, 0xb2, 0xec, 0xe4, - 0xe3, 0xf4, 0xdd, 0x23, 0x71, 0xda, 0x74, 0xdb, 0xca, 0x33, 0x1b, 0xfe, - 0xc6, 0xfa, 0x0f, 0x41, 0xdd, 0x59, 0x7f, 0x74, 0xf6, 0x27, 0x6a, 0xca, - 0xd9, 0x9e, 0xba, 0x38, 0xeb, 0x70, 0xd5, 0x87, 0x70, 0x47, 0xbd, 0xf4, - 0x64, 0x66, 0x55, 0x31, 0xc6, 0xa3, 0x10, 0x69, 0x87, 0xa3, 0x05, 0x72, - 0xff, 0xe1, 0xd4, 0x50, 0xf6, 0xe4, 0x27, 0xfb, 0x28, 0x38, 0x2b, 0x9b, - 0xe3, 0xb4, 0x10, 0xa3, 0x70, 0xee, 0xff, 0xa1, 0xa5, 0x83, 0xd1, 0xec, - 0xb2, 0xff, 0xff, 0x0b, 0xe0, 0xc7, 0xd3, 0xb5, 0xa8, 0xd8, 0x9d, 0xf4, - 0xc2, 0xcb, 0xfc, 0x58, 0x1c, 0x62, 0x5f, 0xac, 0xa7, 0x44, 0xd0, 0xac, - 0xd5, 0x24, 0x7a, 0xe4, 0x34, 0xaf, 0x31, 0x1a, 0x59, 0x7f, 0xfd, 0x13, - 0xbc, 0xfb, 0xe7, 0x63, 0x5b, 0x1a, 0x61, 0x65, 0xfb, 0xf6, 0xe6, 0x75, - 0x65, 0xff, 0x64, 0xed, 0x67, 0x8b, 0x26, 0x59, 0x58, 0x7c, 0x44, 0x51, - 0x7f, 0xff, 0xbc, 0xff, 0xf2, 0x71, 0x66, 0xf2, 0xce, 0x63, 0x60, 0x0b, - 0x2f, 0xe0, 0xf6, 0x70, 0x3a, 0xd5, 0x95, 0x32, 0x71, 0x3e, 0x1d, 0x28, - 0x5c, 0x70, 0x83, 0xac, 0x77, 0xf0, 0x5a, 0xc4, 0x10, 0x16, 0x53, 0x21, - 0xb5, 0xc3, 0x65, 0x0a, 0x22, 0x30, 0x6c, 0xac, 0x08, 0x3e, 0x94, 0x8e, - 0xf1, 0xd8, 0x12, 0x85, 0xfb, 0xc2, 0x17, 0xdf, 0xac, 0xbf, 0xfb, 0x67, - 0xee, 0xb3, 0x67, 0x2e, 0xf1, 0x65, 0x61, 0xf8, 0x19, 0x5d, 0xff, 0xff, - 0x6b, 0x25, 0xec, 0x39, 0x73, 0x08, 0x3d, 0x2c, 0xfe, 0x16, 0x5f, 0xd1, - 0x84, 0x01, 0x1a, 0xb2, 0xff, 0x74, 0x31, 0x9b, 0x08, 0xd5, 0x97, 0xfe, - 0xf4, 0x10, 0x66, 0xce, 0x72, 0x16, 0x5b, 0x77, 0xa8, 0xa0, 0x10, 0xb7, - 0x70, 0xd6, 0xa1, 0x34, 0x17, 0x8c, 0x12, 0xfe, 0xf6, 0x17, 0x7f, 0x0a, - 0xcb, 0xfe, 0x18, 0xe3, 0xf9, 0xd9, 0xf7, 0x56, 0x5f, 0xcf, 0xba, 0x32, - 0xcf, 0x2c, 0xb9, 0xbc, 0x59, 0x79, 0xf8, 0x6b, 0x2a, 0x0d, 0x97, 0xe2, - 0xf7, 0xfc, 0x26, 0xd8, 0x4e, 0xd7, 0xf2, 0xcb, 0xe3, 0xd1, 0x3a, 0xca, - 0x34, 0xc6, 0x26, 0x3d, 0x26, 0x1e, 0x90, 0xef, 0x39, 0xbf, 0xdc, 0xe4, - 0x1e, 0xcf, 0xd5, 0x97, 0xfd, 0xc7, 0x17, 0x70, 0xf0, 0x86, 0xb2, 0xfe, - 0xce, 0xe3, 0x94, 0xcb, 0x2f, 0xb3, 0x91, 0xa5, 0x96, 0x63, 0xc7, 0x9a, - 0x45, 0x96, 0x94, 0x23, 0x8f, 0x0c, 0xc3, 0x08, 0x8b, 0x49, 0x65, 0xff, - 0x8b, 0xfd, 0xc3, 0xcf, 0xbc, 0x78, 0xb2, 0xfa, 0x1a, 0xe3, 0x59, 0x50, - 0x7e, 0x78, 0x22, 0x48, 0x37, 0xfb, 0x26, 0xf6, 0x76, 0x06, 0xb2, 0xfc, - 0x70, 0xde, 0x35, 0x65, 0xfc, 0x5d, 0x76, 0x9f, 0x56, 0x5e, 0x19, 0x8d, - 0x65, 0xef, 0xdf, 0x75, 0x65, 0xfb, 0x85, 0x13, 0x75, 0x65, 0x0c, 0xf9, - 0x38, 0x39, 0xd2, 0x0b, 0xb8, 0xca, 0xab, 0x2d, 0x25, 0x95, 0x08, 0xee, - 0xc8, 0x48, 0x39, 0x7f, 0x47, 0xaf, 0x10, 0x21, 0x65, 0xff, 0xff, 0xf7, - 0xb3, 0xbc, 0x79, 0xa7, 0x16, 0x7d, 0x2c, 0x0e, 0xc5, 0x83, 0xf1, 0xcc, - 0xb2, 0xff, 0xf8, 0xf9, 0x12, 0xee, 0x78, 0xb3, 0xbe, 0x35, 0x97, 0x05, - 0x85, 0x94, 0x69, 0x80, 0xe8, 0x6f, 0xd0, 0x81, 0xea, 0x6d, 0xff, 0xec, - 0x7f, 0xe6, 0xf1, 0xfe, 0x4f, 0xf4, 0x96, 0x5e, 0xf3, 0x1d, 0x59, 0x7e, - 0xef, 0x7b, 0x82, 0xac, 0xa8, 0x3c, 0x73, 0x1e, 0xa6, 0xa2, 0xcf, 0xf8, - 0x49, 0xde, 0x6c, 0x01, 0x65, 0xda, 0xc5, 0x97, 0xb0, 0xc6, 0xb2, 0xdc, - 0x59, 0x71, 0x60, 0x0d, 0x67, 0xc3, 0x77, 0x8e, 0x26, 0x59, 0x7f, 0xf6, - 0x7f, 0x3b, 0xc7, 0xde, 0x11, 0xcc, 0xb2, 0xb6, 0x44, 0x7f, 0x0b, 0x3a, - 0x39, 0x53, 0xca, 0x63, 0xd0, 0x39, 0x90, 0xd1, 0xbf, 0xf8, 0xbf, 0x9f, - 0xcf, 0x1c, 0x35, 0xc6, 0xb2, 0xff, 0x8b, 0xfd, 0x64, 0x8a, 0x1a, 0xb2, - 0xff, 0xff, 0xfd, 0x2e, 0x70, 0x31, 0xd3, 0x1e, 0x14, 0xd3, 0x8b, 0x35, - 0x05, 0xdf, 0x66, 0xe2, 0xcb, 0xff, 0xbe, 0x97, 0x31, 0xbf, 0x47, 0xbd, - 0x0b, 0x2b, 0x13, 0x04, 0xf8, 0xe3, 0x50, 0x86, 0xb7, 0x16, 0x56, 0x27, - 0x22, 0x18, 0xd2, 0x84, 0x36, 0xb6, 0xcb, 0x2f, 0xdb, 0x47, 0x73, 0xf5, - 0x97, 0xed, 0x67, 0xd2, 0xe2, 0xcb, 0xc0, 0xf6, 0x2c, 0xb6, 0x6c, 0x78, - 0xba, 0x29, 0xbf, 0xef, 0xa3, 0x5b, 0x4e, 0xc3, 0x1a, 0xcb, 0xa6, 0x35, - 0x95, 0x88, 0xfb, 0x31, 0x22, 0x6e, 0x09, 0x46, 0xf3, 0xcb, 0xfb, 0x3e, - 0x94, 0x7f, 0x0b, 0x2f, 0xc5, 0x9e, 0x7e, 0xac, 0xaf, 0x8f, 0x51, 0xa5, - 0xd7, 0xda, 0xc9, 0xa1, 0x65, 0xf1, 0xef, 0xcd, 0x2c, 0xa8, 0x3e, 0x83, - 0x23, 0xf1, 0x15, 0xf4, 0xe0, 0x6c, 0x2a, 0xcb, 0xf6, 0xd3, 0x83, 0x13, - 0x2c, 0xbf, 0xff, 0xe2, 0x8f, 0xfe, 0x97, 0x03, 0x1d, 0x2c, 0x19, 0xe6, - 0xa6, 0x59, 0x4e, 0x89, 0x3e, 0x96, 0x54, 0x33, 0xa9, 0x36, 0x8d, 0x84, - 0x65, 0x19, 0x1a, 0x37, 0xd1, 0x97, 0x9c, 0x2b, 0x26, 0x2c, 0xd1, 0x9f, - 0xa3, 0x15, 0x78, 0xd0, 0x3f, 0x87, 0xa9, 0x46, 0x8f, 0xc8, 0xf2, 0xbb, - 0x19, 0x90, 0x63, 0x05, 0xde, 0x5a, 0x24, 0x2e, 0xaf, 0xd2, 0x3d, 0x67, - 0xcb, 0x2f, 0x73, 0xd8, 0xb2, 0xfd, 0x9c, 0xdb, 0x05, 0x59, 0x7f, 0xf7, - 0x82, 0x3f, 0x07, 0xbc, 0xf0, 0x66, 0x59, 0x5f, 0x22, 0xd6, 0x62, 0x8f, - 0x0e, 0x11, 0x4d, 0xff, 0xfe, 0xef, 0x3d, 0x9f, 0x63, 0xfd, 0x38, 0x71, - 0xb4, 0xe6, 0x18, 0x59, 0x7f, 0xfe, 0x6f, 0xd2, 0xe6, 0xbe, 0x8e, 0xf2, - 0x3c, 0x7d, 0x59, 0x7f, 0xd8, 0xc1, 0x67, 0x7c, 0x62, 0xac, 0xbf, 0xfd, - 0x1f, 0x78, 0xf0, 0x86, 0x7b, 0xe0, 0x6b, 0x2a, 0x13, 0x45, 0x36, 0xad, - 0x2c, 0x11, 0xcd, 0xdb, 0xa3, 0x59, 0x7f, 0xfd, 0xb6, 0x00, 0x7e, 0x3c, - 0x62, 0x73, 0x01, 0x85, 0x97, 0xf6, 0x6b, 0x59, 0xde, 0x2c, 0xbf, 0x89, - 0xd8, 0x6b, 0xc9, 0x65, 0xe9, 0x1f, 0x7c, 0x7b, 0x5d, 0x2d, 0xbf, 0xc2, - 0x74, 0xf7, 0xc1, 0x01, 0x65, 0xfa, 0x1a, 0x7e, 0x85, 0x97, 0xfb, 0x3b, - 0xe3, 0xee, 0x01, 0x65, 0xf4, 0x61, 0x01, 0x65, 0x4e, 0x45, 0x6e, 0x8d, - 0x48, 0x9b, 0xa6, 0x55, 0x3d, 0xa7, 0xcc, 0x63, 0x53, 0x42, 0xbb, 0xd0, - 0xe0, 0xbf, 0xf4, 0xb9, 0xd7, 0xdb, 0x70, 0xb3, 0xe5, 0x97, 0xf7, 0xa2, - 0x41, 0x71, 0x16, 0x5f, 0x87, 0xec, 0x2e, 0xac, 0xa9, 0x1e, 0xac, 0xc5, - 0xd5, 0xf2, 0x2e, 0xca, 0x13, 0x17, 0xe3, 0xf8, 0x7f, 0x30, 0xb2, 0xa0, - 0xf4, 0xf4, 0x51, 0x7f, 0xe7, 0xde, 0x59, 0xdc, 0xfc, 0x86, 0xb2, 0xdf, - 0xac, 0xa3, 0x3d, 0x19, 0x8f, 0xef, 0xfb, 0xdb, 0x1e, 0x17, 0xd2, 0xe2, - 0xcb, 0xfe, 0xfb, 0xd8, 0x02, 0xc0, 0xee, 0xac, 0xbf, 0xfe, 0x17, 0x01, - 0xcc, 0xec, 0xd8, 0xc1, 0x67, 0xeb, 0x2d, 0x28, 0x46, 0x46, 0x1d, 0x19, - 0xe5, 0xfc, 0x7f, 0x7f, 0xa7, 0x1a, 0xcb, 0xd9, 0xaf, 0xd6, 0x5f, 0xb8, - 0x78, 0x5f, 0xac, 0xb6, 0x19, 0xe2, 0x70, 0x76, 0xfc, 0x7f, 0xff, 0x9a, - 0x59, 0x5e, 0x46, 0x11, 0x39, 0xf0, 0x9a, 0xd3, 0xd2, 0xcb, 0xf3, 0xe1, - 0x1b, 0x0b, 0x2f, 0x77, 0x3c, 0xb2, 0x88, 0xf0, 0xb7, 0x09, 0xae, 0x36, - 0xac, 0xbf, 0xff, 0xf7, 0xd2, 0x7f, 0xa7, 0x10, 0x77, 0x27, 0x67, 0xd2, - 0xc0, 0x97, 0xfc, 0x59, 0x4d, 0x44, 0x6e, 0xe0, 0xb5, 0xf6, 0xef, 0xb3, - 0x75, 0x65, 0xe9, 0xf3, 0x65, 0xac, 0xa9, 0xc9, 0xd4, 0xcf, 0x65, 0xfb, - 0x2c, 0x64, 0x2c, 0x5c, 0x9a, 0x7c, 0xa2, 0xff, 0xff, 0xfb, 0xee, 0x06, - 0x3e, 0x9d, 0xec, 0x1c, 0xe2, 0xc0, 0xb1, 0x3b, 0x9f, 0xfe, 0x7d, 0x59, - 0x7f, 0xff, 0xec, 0x1b, 0x5b, 0x1d, 0xe6, 0x77, 0x9a, 0x3c, 0x01, 0x60, - 0xd6, 0x5f, 0xfe, 0xe8, 0x63, 0x36, 0x9d, 0xc3, 0x23, 0xd2, 0xcb, 0x0a, - 0x48, 0xb5, 0x11, 0xaa, 0xa1, 0x36, 0x8c, 0x8c, 0xfa, 0xfd, 0x05, 0xf3, - 0xec, 0xb2, 0xfe, 0x98, 0xc7, 0x8d, 0x35, 0x97, 0xff, 0xff, 0xfc, 0x08, - 0xf4, 0x37, 0xb9, 0xce, 0x46, 0xb5, 0x05, 0x9b, 0x60, 0x78, 0x19, 0x8a, - 0x1a, 0xb2, 0xa1, 0x18, 0x18, 0x5b, 0x78, 0x3a, 0x61, 0x65, 0x34, 0xdf, - 0xcf, 0x90, 0xdf, 0x9f, 0xf1, 0x1f, 0x65, 0x95, 0x87, 0x9c, 0x64, 0x97, - 0x8f, 0xf8, 0x59, 0x7f, 0xa7, 0x16, 0x68, 0xe1, 0xab, 0x2f, 0xfd, 0xa7, - 0xee, 0xb0, 0xfd, 0x03, 0x59, 0x7f, 0x0c, 0xb3, 0xcf, 0xd5, 0x97, 0xee, - 0xfd, 0x23, 0xd2, 0xca, 0xc3, 0xd5, 0xe1, 0x65, 0x6c, 0x98, 0x10, 0xc7, - 0x34, 0x67, 0xfc, 0x24, 0xaf, 0x69, 0xc4, 0x59, 0x7e, 0x8e, 0xb4, 0xfa, - 0xb2, 0xdb, 0x39, 0xe2, 0x04, 0x76, 0xff, 0xd0, 0xc6, 0xe0, 0x70, 0xa6, - 0x11, 0xab, 0x2f, 0xff, 0xff, 0xf3, 0x05, 0x93, 0x8f, 0x09, 0xfb, 0xe8, - 0x9a, 0x71, 0x67, 0x8f, 0xbc, 0x08, 0x03, 0x0b, 0x2b, 0x11, 0xf9, 0xf1, - 0x40, 0x51, 0x2f, 0xfd, 0x99, 0xff, 0x27, 0x6b, 0x83, 0xe2, 0xcb, 0xfd, - 0xac, 0x07, 0x8f, 0x53, 0x2c, 0xb7, 0x46, 0x7e, 0xd8, 0x85, 0x7f, 0xb0, - 0x07, 0xdd, 0x05, 0xab, 0x2f, 0xbe, 0x2c, 0x9f, 0x59, 0x58, 0x7f, 0xe6, - 0x4e, 0xe6, 0x77, 0xec, 0x6c, 0x88, 0xd6, 0x5e, 0x32, 0xea, 0xcb, 0xfa, - 0x5c, 0x76, 0x87, 0x8b, 0x2b, 0x63, 0xc9, 0x71, 0xbb, 0xef, 0x79, 0xe4, - 0xb2, 0xdc, 0x59, 0x58, 0x6c, 0xcc, 0x8a, 0xfe, 0xe9, 0xeb, 0x6c, 0x02, - 0xca, 0x86, 0xc5, 0xb4, 0x71, 0xc1, 0xe4, 0xa2, 0x16, 0x23, 0x5b, 0x03, - 0x97, 0xd0, 0xea, 0x39, 0x53, 0xda, 0x8f, 0x39, 0xa5, 0x1e, 0x8d, 0xd5, - 0xe3, 0x22, 0x28, 0xe1, 0x79, 0x19, 0x2f, 0x4b, 0x02, 0xdf, 0x3e, 0xab, - 0xb8, 0x3f, 0x79, 0xc1, 0x8b, 0x29, 0x65, 0xf6, 0xe7, 0x8f, 0x4b, 0x2f, - 0xfa, 0x77, 0x4b, 0x05, 0xc3, 0xe2, 0xca, 0x64, 0x1f, 0x50, 0x02, 0xe6, - 0x25, 0xbd, 0xe8, 0xfd, 0x65, 0xfc, 0x67, 0x02, 0xc4, 0xcb, 0x2f, 0xff, - 0xf0, 0x84, 0xec, 0x31, 0xfb, 0xcd, 0xb8, 0x50, 0x2f, 0xd2, 0xe2, 0xca, - 0x9e, 0xd3, 0x6d, 0x88, 0x42, 0xe1, 0xa4, 0xc3, 0xae, 0x5b, 0x4b, 0x2f, - 0xec, 0x6c, 0x79, 0xfc, 0xb2, 0xe9, 0xd3, 0x2c, 0xbd, 0xe3, 0x61, 0x65, - 0x4e, 0x3e, 0x31, 0x96, 0x30, 0x35, 0x7f, 0xfd, 0xf4, 0x8a, 0x27, 0x34, - 0xa1, 0x8e, 0x9e, 0xcb, 0x2a, 0x11, 0xe7, 0x8d, 0xc6, 0x65, 0x7e, 0xd4, - 0xe2, 0xde, 0x2a, 0xcb, 0xef, 0x3f, 0xf0, 0xb2, 0xf7, 0xb3, 0x4b, 0x2a, - 0x0f, 0xad, 0xcb, 0x77, 0x08, 0xaf, 0xed, 0xa6, 0x94, 0xf7, 0xad, 0x96, - 0x5f, 0x08, 0x59, 0xbd, 0x65, 0xf1, 0x8f, 0x06, 0xb2, 0xbe, 0x3c, 0x56, - 0x92, 0x5a, 0x65, 0x97, 0x43, 0x56, 0x5b, 0xab, 0x2b, 0x46, 0x9d, 0xc5, - 0xa8, 0x67, 0xb3, 0xe3, 0x9b, 0xe8, 0x1b, 0xc9, 0x65, 0xee, 0xe7, 0x16, - 0x5f, 0xfb, 0x1f, 0xef, 0xe6, 0x94, 0x6b, 0x65, 0x97, 0xb5, 0x13, 0x2c, - 0xbd, 0xc7, 0xf9, 0x65, 0x6c, 0x8b, 0x96, 0x08, 0x7c, 0x38, 0xe8, 0x5d, - 0x1d, 0xba, 0x67, 0x59, 0x74, 0xb6, 0x59, 0x7d, 0x3b, 0xb1, 0x25, 0x97, - 0xff, 0xd9, 0x05, 0xfc, 0x1f, 0x7d, 0x8d, 0xc1, 0xac, 0xba, 0x18, 0x59, - 0x5b, 0x22, 0x22, 0x44, 0x9d, 0x4d, 0xbf, 0x9c, 0x58, 0xee, 0x6c, 0xb2, - 0xfe, 0x3d, 0x7d, 0x22, 0x85, 0x97, 0xe8, 0xec, 0x8f, 0xab, 0x2f, 0xef, - 0x47, 0xd2, 0xce, 0xac, 0xa9, 0x1e, 0xa8, 0xc9, 0xeb, 0xc8, 0xa4, 0xec, - 0x20, 0xaf, 0xfd, 0x3f, 0x05, 0xdd, 0x1e, 0xfc, 0x1a, 0xcb, 0xb3, 0xab, - 0x2d, 0x32, 0xca, 0xf1, 0xa8, 0x21, 0x6a, 0x64, 0x2e, 0x45, 0x43, 0xe6, - 0x3e, 0x1c, 0x36, 0xda, 0x97, 0xe1, 0x77, 0x85, 0x01, 0x18, 0x86, 0x1a, - 0x53, 0xe5, 0x02, 0x35, 0x5f, 0xe1, 0x72, 0x44, 0x17, 0xe2, 0xcb, 0xf7, - 0xc2, 0xb9, 0x7e, 0xb2, 0xe2, 0x61, 0x65, 0xb8, 0x67, 0x82, 0x12, 0xab, - 0x9f, 0xcb, 0x2f, 0xce, 0x38, 0xc2, 0x59, 0x66, 0x16, 0x56, 0xc7, 0x9b, - 0xe1, 0x62, 0x25, 0xbf, 0xff, 0x34, 0xb0, 0x1f, 0x74, 0x9f, 0xcd, 0x8c, - 0xea, 0xcb, 0xff, 0xec, 0xd9, 0xc8, 0x13, 0xb9, 0x0d, 0x7f, 0xba, 0xb2, - 0xa1, 0x14, 0xda, 0x54, 0xbf, 0xdb, 0xbe, 0xcd, 0xb5, 0xa8, 0x59, 0x4b, - 0x2f, 0xfe, 0x79, 0x61, 0x0c, 0xa2, 0x43, 0xe2, 0xcb, 0x66, 0x1e, 0x6e, - 0xf0, 0xbb, 0xff, 0xff, 0x82, 0xd6, 0xbc, 0xa7, 0x6e, 0x16, 0x36, 0x01, - 0x38, 0x4d, 0xb6, 0x7f, 0x96, 0x5f, 0x83, 0x21, 0x35, 0xc5, 0x96, 0x3f, - 0x22, 0x9c, 0x9f, 0x6f, 0xff, 0xd1, 0xa8, 0x06, 0x36, 0x01, 0x23, 0xe0, - 0x5a, 0xb2, 0xa1, 0x5d, 0x6c, 0xce, 0x9a, 0x74, 0xf4, 0x35, 0x5c, 0x88, - 0xa1, 0x09, 0xd8, 0x67, 0xcf, 0x93, 0xdf, 0xda, 0xc8, 0x62, 0x09, 0x65, - 0xe2, 0x76, 0xac, 0xbb, 0xf8, 0x59, 0x7f, 0xf7, 0x9b, 0x9f, 0x4b, 0x8f, - 0x1f, 0x49, 0x65, 0xc2, 0x6c, 0xb2, 0x8c, 0xf7, 0xc9, 0x1a, 0xa4, 0x8d, - 0xd3, 0x2c, 0x21, 0xbe, 0xbb, 0x53, 0x22, 0x1b, 0x17, 0x73, 0xd4, 0x2e, - 0x59, 0x31, 0xd4, 0xcf, 0x30, 0xd5, 0x9e, 0xe5, 0x35, 0x32, 0xb6, 0x68, - 0xa4, 0x0a, 0xed, 0x2f, 0x8a, 0x52, 0xc8, 0x87, 0x48, 0x93, 0xca, 0xe7, - 0xa9, 0x89, 0x7a, 0x40, 0xa5, 0xae, 0xfd, 0x48, 0x23, 0x39, 0xd7, 0x29, - 0xa7, 0x61, 0x35, 0x49, 0x49, 0x6c, 0xf3, 0x67, 0xab, 0xc4, 0x17, 0x9e, - 0x20, 0xfe, 0x5f, 0xfb, 0x2e, 0x16, 0x05, 0x5a, 0xfc, 0xf2, 0x9f, 0x41, - 0xda, 0xcd, 0x4c, 0x32, 0xa6, 0x37, 0xc6, 0x8c, 0x2c, 0x26, 0x27, 0xe7, - 0x2e, 0x84, 0x9c, 0x5a, 0xdc, 0x8d, 0x82, 0xff, 0xfe, 0x08, 0x19, 0xfd, - 0xdd, 0x46, 0x7d, 0x3d, 0x8d, 0xdd, 0x85, 0x94, 0xcd, 0x58, 0x91, 0xca, - 0xad, 0xbf, 0x9c, 0xfb, 0xc3, 0x25, 0x97, 0x8f, 0x58, 0xb2, 0xb7, 0x4f, - 0x1b, 0x85, 0x77, 0xed, 0x01, 0xdc, 0x0a, 0x8a, 0x75, 0x76, 0x7c, 0xb2, - 0xff, 0xf0, 0x42, 0x46, 0x51, 0xe3, 0x6e, 0x71, 0x65, 0xda, 0x6a, 0xcb, - 0x33, 0x84, 0x67, 0x61, 0x2f, 0xc6, 0x8d, 0x17, 0xfd, 0x1e, 0xff, 0xfd, - 0x26, 0x79, 0x2f, 0x61, 0xcb, 0x91, 0xd8, 0x1a, 0xcb, 0xff, 0x69, 0x9c, - 0xfb, 0xed, 0xde, 0x3f, 0xeb, 0x2a, 0x11, 0x38, 0x6a, 0xd7, 0xed, 0x01, - 0xdc, 0x0a, 0x8a, 0x8d, 0x7f, 0xe7, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, - 0x9a, 0x17, 0xff, 0x8b, 0x26, 0x93, 0xea, 0x45, 0x9b, 0xdd, 0x65, 0xf1, - 0x46, 0x7c, 0xb2, 0xb1, 0x1d, 0x6d, 0x34, 0xe2, 0x67, 0x52, 0xaf, 0xf0, - 0x8f, 0xbd, 0x9f, 0x4f, 0x65, 0x94, 0xcc, 0xfd, 0x60, 0xf2, 0xfd, 0xb0, - 0x9b, 0x46, 0xcb, 0x2f, 0x80, 0xee, 0x05, 0x45, 0x5e, 0xac, 0x3d, 0xad, - 0x16, 0x5f, 0xd9, 0xbe, 0x0b, 0xc1, 0x59, 0x7f, 0x18, 0xc7, 0x1a, 0x85, - 0x97, 0xf4, 0x70, 0x9e, 0x38, 0xb2, 0xff, 0xfd, 0xf9, 0x05, 0xa2, 0x0c, - 0x71, 0xfb, 0x63, 0x3a, 0xb2, 0xfe, 0x7e, 0xf3, 0x3e, 0xea, 0xca, 0xf9, - 0x10, 0xc4, 0xb1, 0x66, 0x78, 0x9a, 0x7e, 0x88, 0x7c, 0x5d, 0xd2, 0xc1, - 0x21, 0x63, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0xad, 0x97, 0xfd, 0x26, 0x79, - 0xa0, 0x3b, 0x81, 0x51, 0x20, 0xaf, 0xb1, 0xb1, 0xba, 0xb2, 0xcc, 0xf1, - 0x13, 0xee, 0x69, 0xc4, 0x7b, 0xe6, 0x99, 0x42, 0xcb, 0xf6, 0x80, 0xee, - 0x05, 0x44, 0x86, 0xbf, 0xb4, 0x1d, 0xf0, 0x2b, 0x56, 0x5f, 0xc5, 0x9c, - 0xec, 0xa1, 0x65, 0xf3, 0x37, 0x93, 0x38, 0x45, 0x8e, 0x10, 0x19, 0xa6, - 0xf3, 0x1b, 0xff, 0x71, 0x9e, 0x74, 0xc7, 0x85, 0x32, 0xcb, 0xce, 0xe0, - 0x5c, 0x60, 0x6a, 0x83, 0xe8, 0x02, 0x05, 0xde, 0xdd, 0x59, 0x74, 0xf3, - 0xb2, 0xcb, 0xfe, 0xf4, 0x77, 0x93, 0xd7, 0x27, 0x92, 0x59, 0x4c, 0x83, - 0xe0, 0x90, 0xed, 0xf7, 0x7b, 0x9b, 0x8b, 0x2c, 0x4b, 0x2c, 0x6b, 0x2a, - 0x7a, 0x34, 0x13, 0xc0, 0x42, 0xff, 0xf4, 0xf0, 0x9e, 0x13, 0xd7, 0xa1, - 0xa4, 0xfe, 0x3d, 0x2c, 0xb7, 0xcb, 0x2f, 0x77, 0x3f, 0x59, 0x71, 0x92, - 0xcb, 0xa2, 0x65, 0x97, 0xf3, 0x70, 0x04, 0xfb, 0xab, 0x2c, 0x22, 0xca, - 0xc3, 0xc1, 0x09, 0x7d, 0xf8, 0x71, 0xd7, 0x1a, 0xcb, 0x8f, 0x7a, 0xca, - 0x83, 0x7f, 0xd2, 0x7b, 0xde, 0xce, 0x2c, 0xb3, 0xac, 0xa1, 0x9a, 0xce, - 0x8e, 0x50, 0xd3, 0x69, 0xdd, 0x12, 0x98, 0x77, 0xc2, 0xbc, 0x58, 0xeb, - 0x00, 0x89, 0x97, 0xdd, 0xe1, 0xef, 0x59, 0x7e, 0x1c, 0x16, 0xdb, 0xab, - 0x2f, 0xf4, 0x30, 0x27, 0xff, 0xc7, 0xcb, 0x2a, 0x0f, 0x8f, 0x62, 0xbb, - 0xf3, 0xf8, 0xdb, 0x8b, 0x2c, 0x64, 0x79, 0x1b, 0xc8, 0xaf, 0xb0, 0xbf, - 0xe2, 0xcb, 0xc0, 0x2d, 0xd5, 0x97, 0xfe, 0x71, 0x7c, 0x6f, 0x2e, 0x9e, - 0xcb, 0x29, 0xcf, 0x78, 0x87, 0xef, 0xff, 0x67, 0xdf, 0xe7, 0xdc, 0x13, - 0x46, 0xdc, 0x59, 0x7d, 0xb7, 0x3e, 0x35, 0x97, 0xff, 0xa3, 0xe9, 0x1b, - 0x45, 0xc2, 0x1f, 0xa1, 0x65, 0x62, 0x6b, 0x7a, 0x84, 0x01, 0x10, 0x71, - 0x34, 0x24, 0x97, 0xe7, 0x18, 0x90, 0x4b, 0x2f, 0xf1, 0x87, 0x77, 0xd1, - 0x9b, 0x2c, 0xbf, 0xf6, 0xba, 0x21, 0x38, 0x30, 0x80, 0xb2, 0xfa, 0x1a, - 0x73, 0xeb, 0x2f, 0xfc, 0x2b, 0xcb, 0x58, 0x7e, 0x81, 0xac, 0xbe, 0x03, - 0xb8, 0x15, 0x16, 0x22, 0xfd, 0xad, 0x39, 0x75, 0x65, 0xf3, 0x8f, 0xc1, - 0x59, 0x61, 0x56, 0x5d, 0xc3, 0x59, 0x63, 0x33, 0x51, 0xf8, 0x95, 0xfd, - 0x11, 0xf3, 0x5c, 0x6b, 0x2f, 0x04, 0xa4, 0xb2, 0xff, 0x02, 0x33, 0x5f, - 0xff, 0xd5, 0x95, 0xb2, 0xa4, 0x09, 0x13, 0xe1, 0xb0, 0x0f, 0x8c, 0x93, - 0x47, 0xcd, 0x2e, 0xf1, 0x39, 0x25, 0x70, 0x9b, 0xa5, 0xa1, 0x1c, 0xbe, - 0xd4, 0x13, 0x0b, 0x2f, 0x4a, 0x37, 0x56, 0x56, 0x1e, 0x0c, 0xc4, 0x56, - 0x35, 0x96, 0x35, 0x96, 0x93, 0x06, 0x83, 0xf1, 0x0b, 0xf0, 0x93, 0xf9, - 0xa8, 0x59, 0x7e, 0xef, 0x60, 0xb6, 0x59, 0x74, 0x12, 0xcb, 0xfa, 0x38, - 0x26, 0xd1, 0xb2, 0xca, 0xe1, 0xe2, 0x88, 0x2b, 0x50, 0x8b, 0xbc, 0x2b, - 0x36, 0xdb, 0xfe, 0x0e, 0xc5, 0x83, 0xf0, 0x58, 0x59, 0x4c, 0x26, 0x99, - 0xe8, 0x72, 0x11, 0x6d, 0xf7, 0xb8, 0x18, 0x59, 0x7f, 0xfb, 0x3e, 0xfb, - 0xf7, 0xef, 0x0c, 0xbe, 0x92, 0xcb, 0xff, 0xa3, 0x39, 0x84, 0x33, 0xfe, - 0x09, 0x65, 0xe2, 0x8d, 0x96, 0x51, 0xa2, 0xa8, 0x93, 0x42, 0x83, 0x7d, - 0x1a, 0x86, 0xac, 0xa8, 0x4c, 0x6e, 0x50, 0xcc, 0xe1, 0x75, 0xf0, 0xc4, - 0x9e, 0xa4, 0xb2, 0xfd, 0xf8, 0x3c, 0x6c, 0xb5, 0x97, 0xbd, 0x9f, 0xac, - 0xbf, 0xbe, 0xe7, 0xa0, 0xfa, 0xb2, 0xe7, 0xea, 0xca, 0x33, 0xc4, 0x69, - 0x75, 0xef, 0x47, 0xeb, 0x2e, 0x0c, 0xfa, 0xcb, 0xff, 0xee, 0xe7, 0xd2, - 0x20, 0xf5, 0xcc, 0xa0, 0x6b, 0x2f, 0xe6, 0x96, 0x46, 0xec, 0xcb, 0x2d, - 0xfa, 0xca, 0x83, 0xc2, 0x33, 0x0b, 0xcf, 0x1f, 0x2c, 0xa9, 0xe5, 0x3d, - 0xbc, 0x29, 0x01, 0x6e, 0x98, 0x7c, 0x42, 0x43, 0xbd, 0x1a, 0x9f, 0x84, - 0x86, 0xe1, 0x05, 0xff, 0xf9, 0xf5, 0x26, 0x94, 0x6a, 0x07, 0x93, 0x47, - 0x96, 0x5f, 0x6f, 0x0b, 0xf1, 0x65, 0x8d, 0x65, 0xf8, 0xf4, 0x62, 0xb2, - 0xd6, 0x54, 0x91, 0x68, 0x6a, 0x93, 0x12, 0x78, 0x42, 0xff, 0xc7, 0xef, - 0xa5, 0x9d, 0xcf, 0xba, 0xb2, 0xff, 0x7b, 0x1b, 0x8f, 0xad, 0x96, 0x54, - 0x8f, 0xcc, 0x68, 0x17, 0xee, 0xf5, 0xe5, 0xc5, 0x97, 0xfe, 0x0e, 0x7c, - 0x3d, 0xfe, 0xc7, 0x99, 0x65, 0x7c, 0x7d, 0x5b, 0xca, 0x2d, 0x25, 0x97, - 0xbe, 0xe3, 0xac, 0xbe, 0xcc, 0x17, 0x8b, 0x2a, 0x0f, 0x43, 0x04, 0x7a, - 0x3b, 0x6d, 0xeb, 0x2e, 0x09, 0x2c, 0xb3, 0x2d, 0x65, 0xb7, 0xac, 0xa8, - 0x4d, 0xff, 0x21, 0x19, 0xa7, 0x5f, 0xcb, 0x78, 0x27, 0xd1, 0x6d, 0xe2, - 0xb7, 0xf0, 0x23, 0xbe, 0xcf, 0xd6, 0x5f, 0xc2, 0x66, 0xb3, 0x26, 0x59, - 0x44, 0x7b, 0x9c, 0x2e, 0xbf, 0x7d, 0xc8, 0xd7, 0x16, 0x5f, 0xf3, 0xf7, - 0x83, 0x0b, 0xea, 0x4b, 0x2f, 0xf6, 0xdf, 0x4b, 0x84, 0x73, 0x2c, 0xbe, - 0xe9, 0x07, 0x65, 0x95, 0x07, 0xb2, 0x46, 0xd5, 0x08, 0xfc, 0xc2, 0x12, - 0x29, 0x0c, 0x24, 0xaf, 0xed, 0x4b, 0xfc, 0xc9, 0x96, 0x5c, 0x11, 0x16, - 0x5f, 0x3c, 0x1c, 0xfa, 0xcb, 0xda, 0x13, 0x8b, 0x2b, 0x11, 0x10, 0xc1, - 0x7e, 0x86, 0x37, 0x91, 0xdf, 0x48, 0x4f, 0x42, 0xcb, 0xda, 0x89, 0x2c, - 0xa7, 0x37, 0xfb, 0xc8, 0xef, 0xcd, 0xc3, 0xd4, 0xcb, 0x2d, 0xba, 0xb2, - 0xa0, 0xde, 0x39, 0x45, 0xf0, 0x91, 0xb9, 0xc5, 0x97, 0xfe, 0x22, 0x76, - 0xf3, 0x1b, 0x1b, 0xab, 0x2f, 0xfc, 0x7b, 0x39, 0x79, 0xf9, 0x1b, 0xab, - 0x2f, 0x7a, 0x3c, 0xb2, 0x96, 0x5b, 0x06, 0x69, 0xda, 0x39, 0x7d, 0xa3, - 0x17, 0x75, 0x65, 0x1a, 0x3c, 0xbc, 0x7e, 0x4c, 0xfc, 0x26, 0xbf, 0xfd, - 0xa3, 0x6c, 0x7d, 0xe8, 0x19, 0x3e, 0xea, 0xca, 0x1a, 0x73, 0xfc, 0x8c, - 0x63, 0xa7, 0x77, 0xef, 0x81, 0xe8, 0xd2, 0xcb, 0xfd, 0xf8, 0x5c, 0x4f, - 0x44, 0x96, 0x54, 0x2b, 0x2f, 0x37, 0xef, 0x2f, 0x3c, 0x77, 0xc1, 0x37, - 0x14, 0xa6, 0xfe, 0xf8, 0x1e, 0x8f, 0xb7, 0x16, 0x5f, 0xc6, 0x4e, 0xd8, - 0xf2, 0xcb, 0xff, 0xd0, 0xd8, 0x90, 0xca, 0x3c, 0xf9, 0xa5, 0x97, 0x1f, - 0x96, 0x52, 0xca, 0x91, 0xf4, 0x75, 0x1e, 0x7c, 0x5a, 0xfc, 0x51, 0xe8, - 0xdd, 0x59, 0x7b, 0xb9, 0xfa, 0xcb, 0xf9, 0xa7, 0xce, 0x18, 0xd6, 0x5e, - 0x7d, 0x30, 0xb2, 0x82, 0x79, 0x42, 0x96, 0xdf, 0xe0, 0x16, 0x6f, 0x2c, - 0xe2, 0xcb, 0xfd, 0xbb, 0x38, 0x48, 0x27, 0x61, 0x65, 0xfe, 0x93, 0xe1, - 0x67, 0x78, 0xb2, 0xfe, 0x1e, 0x61, 0x7d, 0xd5, 0x95, 0x88, 0x97, 0xf8, - 0xe7, 0xf3, 0x1b, 0xff, 0x67, 0xd2, 0xf4, 0x71, 0x8f, 0x42, 0xca, 0x85, - 0x5c, 0xd2, 0x33, 0xfa, 0x12, 0x66, 0x65, 0x31, 0x4e, 0x99, 0xfc, 0x46, - 0x50, 0xca, 0xdc, 0x31, 0xbe, 0xeb, 0xbe, 0xcb, 0x2d, 0x3e, 0xb2, 0xe9, - 0x71, 0x65, 0x9e, 0x46, 0xaf, 0xe1, 0x4b, 0xee, 0x99, 0x0a, 0x92, 0xc1, - 0x59, 0x68, 0xc3, 0x67, 0xe2, 0x2b, 0xb3, 0x4b, 0x2f, 0xf1, 0x77, 0x9f, - 0x71, 0xf7, 0x56, 0x5f, 0xd8, 0x3d, 0xdc, 0xfb, 0x75, 0x65, 0x39, 0xf5, - 0x91, 0xbd, 0x6e, 0xa6, 0xda, 0xe9, 0xbf, 0xad, 0x11, 0x28, 0x61, 0x03, - 0x78, 0x4f, 0x05, 0x65, 0xff, 0x9a, 0x19, 0xbe, 0xe4, 0x4c, 0x7b, 0xd6, - 0x5e, 0x68, 0x7c, 0xb2, 0xff, 0x7a, 0x1a, 0x51, 0xf4, 0x96, 0x5e, 0xd6, - 0xb1, 0x65, 0xef, 0xa5, 0xc5, 0x97, 0x78, 0xf8, 0x6e, 0x85, 0x1c, 0xbe, - 0xd6, 0x3e, 0xe2, 0xcb, 0xd0, 0x2c, 0x96, 0x5f, 0xf6, 0x77, 0x9a, 0xce, - 0x47, 0xcb, 0x2f, 0x63, 0x81, 0x65, 0x00, 0xfc, 0x4c, 0x74, 0x8e, 0x6f, - 0xfd, 0x02, 0x89, 0xb7, 0x31, 0xb1, 0xba, 0xb2, 0xe7, 0x15, 0x65, 0x6c, - 0x9e, 0xa0, 0xc7, 0x40, 0xdb, 0xa2, 0xdf, 0x42, 0x57, 0xa5, 0xbb, 0xd1, - 0x2e, 0xe7, 0xcb, 0x2e, 0xce, 0x2c, 0xbb, 0x73, 0x4b, 0x2a, 0x15, 0x66, - 0xe4, 0xa1, 0x83, 0x6d, 0x10, 0x63, 0x70, 0x5a, 0xfe, 0x3c, 0xf7, 0xd2, - 0xe2, 0xcb, 0xff, 0x04, 0x04, 0xfc, 0xe0, 0x60, 0x0b, 0x2f, 0xfe, 0xf3, - 0x9f, 0x65, 0x8c, 0x16, 0x7e, 0xb2, 0xf7, 0xb0, 0x55, 0x97, 0xf9, 0xa7, - 0xcf, 0x1c, 0x1a, 0xcb, 0xf1, 0x4d, 0x1e, 0x85, 0x94, 0xb2, 0xec, 0x1a, - 0xcb, 0xbf, 0x7f, 0x8d, 0x0e, 0xf0, 0xbb, 0xf6, 0x7b, 0xe7, 0xdd, 0x59, - 0x7d, 0xff, 0x20, 0x96, 0x5f, 0xed, 0x79, 0xcf, 0x87, 0xbd, 0x65, 0xcc, - 0x1a, 0xca, 0x83, 0xed, 0xc2, 0x27, 0x34, 0xbf, 0xfb, 0xd8, 0x44, 0xfd, - 0x9d, 0x28, 0x6a, 0xcb, 0xf3, 0xf4, 0x2e, 0x22, 0xca, 0x1a, 0xaa, 0x6c, - 0x2e, 0x33, 0xed, 0xd4, 0x46, 0x8e, 0xb9, 0x8f, 0xe9, 0x04, 0x61, 0xc8, - 0x4c, 0x74, 0xb0, 0x28, 0x97, 0xf0, 0xb1, 0xad, 0x3c, 0xcb, 0x2f, 0xf8, - 0x70, 0x01, 0x3f, 0xfe, 0x3e, 0x59, 0x7f, 0xcf, 0xac, 0x69, 0xcf, 0xc3, - 0x56, 0x50, 0x0f, 0xdc, 0x27, 0xb7, 0xef, 0x86, 0x33, 0xe2, 0xcb, 0xda, - 0xce, 0x2c, 0xa8, 0x3c, 0x5c, 0x29, 0xbe, 0xec, 0x7d, 0x25, 0x97, 0xf1, - 0xff, 0x3e, 0x47, 0xfa, 0xcb, 0xb3, 0xf5, 0x95, 0xb1, 0xf5, 0xe8, 0x8c, - 0x8c, 0x6f, 0xfe, 0xf3, 0x9f, 0x73, 0x5f, 0xb5, 0xe4, 0xb2, 0xf0, 0xfc, - 0x6b, 0x28, 0xcf, 0x80, 0x28, 0x97, 0xc4, 0x51, 0xb2, 0xcb, 0xdd, 0xc1, - 0x16, 0x54, 0x2a, 0x86, 0xc8, 0x53, 0x79, 0x9d, 0xe1, 0x17, 0xc8, 0x47, - 0x84, 0x87, 0x70, 0x86, 0xfe, 0x28, 0x94, 0x6f, 0x85, 0x97, 0x47, 0xeb, - 0x2f, 0x82, 0x7b, 0x8d, 0x59, 0x7f, 0x6f, 0xd3, 0xc1, 0xcf, 0xac, 0xb8, - 0xf6, 0x59, 0x6c, 0x59, 0x46, 0x8c, 0x19, 0x8b, 0x74, 0x2e, 0xd2, 0x57, - 0x31, 0x21, 0x7b, 0xf6, 0x7b, 0x79, 0xe9, 0x65, 0xec, 0xd4, 0x2c, 0xbe, - 0x98, 0x58, 0x61, 0x65, 0xf6, 0xdd, 0xc0, 0x2c, 0xbf, 0xce, 0xc0, 0x9e, - 0xf4, 0x49, 0x65, 0x42, 0x26, 0x30, 0x6d, 0xc9, 0x67, 0xc8, 0xef, 0xfd, - 0xec, 0x18, 0xcf, 0xec, 0xfb, 0xab, 0x2f, 0xe9, 0xc3, 0x11, 0xf5, 0xa5, - 0x95, 0xb1, 0xf8, 0x8d, 0x02, 0xff, 0x0f, 0x3b, 0xe8, 0x20, 0x2c, 0xbe, - 0x78, 0x39, 0xf5, 0x97, 0xfc, 0x39, 0xd9, 0xc8, 0xcd, 0x7e, 0xb2, 0xf7, - 0x84, 0xe2, 0xca, 0xc3, 0xd9, 0x73, 0xbb, 0xfc, 0x63, 0xe9, 0x3f, 0xdc, - 0x59, 0x7f, 0xbb, 0xc3, 0xfb, 0x3e, 0xea, 0xcb, 0xb6, 0x85, 0x95, 0x07, - 0xfe, 0xe6, 0x61, 0x35, 0xbe, 0xce, 0x1f, 0xeb, 0x2a, 0x13, 0xbf, 0xd8, - 0x8c, 0x66, 0x5e, 0x7c, 0x28, 0x4f, 0xcf, 0x96, 0xd4, 0xf4, 0xea, 0xb3, - 0x27, 0x97, 0xa9, 0xec, 0x99, 0x95, 0xa2, 0xb2, 0xa9, 0x64, 0x47, 0x87, - 0xb3, 0x54, 0xa1, 0x9e, 0x38, 0xe0, 0xf2, 0x54, 0x73, 0x10, 0xe6, 0x04, - 0x71, 0xdf, 0x46, 0xa2, 0x72, 0x84, 0x26, 0x8d, 0x07, 0x52, 0x8b, 0xdb, - 0x1e, 0x1f, 0xa5, 0xfb, 0x3c, 0xb4, 0x3f, 0xe3, 0xf9, 0x65, 0xa9, 0x14, - 0xae, 0xbe, 0x4a, 0xfa, 0xec, 0xb2, 0x50, 0xc6, 0x6d, 0xbd, 0x56, 0x7e, - 0x18, 0x22, 0x4a, 0x6d, 0xb8, 0x10, 0xb2, 0xf9, 0xc1, 0x1a, 0x59, 0x42, - 0x9b, 0x7d, 0xc1, 0x6b, 0x85, 0xc5, 0x97, 0xfe, 0x38, 0xef, 0x9d, 0x8c, - 0x2f, 0xd6, 0x5f, 0xfe, 0x7d, 0x4e, 0x7e, 0xce, 0xef, 0xc0, 0x32, 0x59, - 0x46, 0x8a, 0x3f, 0x0b, 0xef, 0x3e, 0xbe, 0xee, 0xb2, 0x4b, 0x2f, 0xec, - 0xec, 0x1b, 0x78, 0xb2, 0xff, 0x0e, 0x25, 0x9a, 0xce, 0x2c, 0xbf, 0xfe, - 0xcd, 0x68, 0x32, 0xd6, 0x47, 0xd2, 0x36, 0xac, 0xbd, 0xc1, 0x38, 0xb2, - 0xff, 0xe9, 0x74, 0x3b, 0x33, 0xf3, 0xb4, 0xf8, 0xb2, 0xff, 0xde, 0x0f, - 0xdc, 0x86, 0xbf, 0xdd, 0x59, 0x6c, 0xf9, 0x11, 0x3d, 0x48, 0xbf, 0xf7, - 0x61, 0xbc, 0x83, 0xd9, 0xfa, 0xb2, 0xfe, 0x7d, 0xd7, 0xcf, 0xba, 0xb2, - 0xbe, 0x3e, 0xef, 0x1f, 0x5f, 0xe7, 0xc1, 0x9f, 0xc4, 0xeb, 0x2b, 0x0f, - 0x50, 0x24, 0x77, 0xd1, 0xd9, 0x3a, 0xcb, 0xed, 0x6e, 0x41, 0x2c, 0xb1, - 0x2c, 0xa8, 0x36, 0x82, 0x92, 0x5e, 0xe9, 0x42, 0xcb, 0xbc, 0xce, 0x17, - 0x03, 0x72, 0x19, 0x06, 0x63, 0x31, 0x13, 0x4b, 0x3c, 0x64, 0xea, 0x05, - 0x0a, 0x7e, 0x43, 0xaf, 0x79, 0x08, 0xaa, 0xa2, 0x10, 0xd3, 0x35, 0xf2, - 0x88, 0x9e, 0x63, 0xbf, 0xb3, 0x40, 0x77, 0x02, 0xa2, 0xcd, 0x5f, 0xef, - 0xe3, 0x86, 0xff, 0x0a, 0xb2, 0xfc, 0x19, 0xbc, 0x63, 0x59, 0x7f, 0xec, - 0x1e, 0x63, 0x03, 0x23, 0xd9, 0x65, 0xf6, 0xbc, 0xec, 0xcd, 0x13, 0x8d, - 0x35, 0x22, 0x9b, 0xfd, 0xdf, 0x61, 0xec, 0xd8, 0x59, 0x7f, 0xe8, 0xd7, - 0xfd, 0xe7, 0xb0, 0xc6, 0xb2, 0xdb, 0x2c, 0xbd, 0x28, 0xf9, 0x65, 0xb2, - 0x0d, 0x7c, 0xc2, 0x57, 0xc6, 0x4f, 0xb2, 0xca, 0xc4, 0x74, 0x78, 0xcc, - 0x9b, 0xb8, 0x4d, 0x6f, 0x2c, 0xbf, 0x7a, 0x39, 0xe3, 0x59, 0x7f, 0xe3, - 0xec, 0x34, 0x9d, 0x8f, 0x1a, 0xcb, 0xa3, 0xcb, 0x2f, 0xe2, 0xcd, 0xfe, - 0x79, 0x2c, 0xb3, 0x3d, 0x91, 0x73, 0x82, 0x33, 0x13, 0xf8, 0xf7, 0xa2, - 0xd4, 0xcd, 0x34, 0x7d, 0xc8, 0x7a, 0x5f, 0xff, 0x05, 0xf6, 0xd6, 0x35, - 0x9f, 0xa3, 0x62, 0x0a, 0xca, 0x66, 0xaf, 0x30, 0xe1, 0xaa, 0xf2, 0x9d, - 0x88, 0xba, 0xf8, 0xda, 0x26, 0x96, 0x5e, 0xf1, 0x8a, 0xb2, 0xfb, 0x85, - 0x02, 0xac, 0xbe, 0x80, 0x67, 0x96, 0x5f, 0xc5, 0x0d, 0xe1, 0xec, 0xb2, - 0xf1, 0x68, 0x2b, 0x2a, 0x47, 0x92, 0x65, 0xb7, 0xe0, 0x9c, 0xf1, 0x64, - 0xcf, 0x4b, 0x2f, 0x07, 0xee, 0x2c, 0xbf, 0x09, 0xd2, 0x8f, 0xd6, 0x56, - 0x8f, 0x1f, 0x78, 0xf5, 0xfb, 0x60, 0xc8, 0x30, 0xb2, 0xa0, 0xf3, 0x4c, - 0x92, 0xf8, 0x42, 0xce, 0x2c, 0xbe, 0xf1, 0xfd, 0xc5, 0x97, 0x47, 0xcb, - 0x2e, 0x39, 0xf5, 0x95, 0xba, 0x7a, 0x73, 0x11, 0x88, 0x2f, 0x76, 0x98, - 0x59, 0x73, 0x59, 0xc2, 0xa9, 0x91, 0x91, 0xfc, 0x3a, 0x64, 0x53, 0x35, - 0x34, 0x87, 0xd0, 0xcb, 0x72, 0x00, 0xba, 0x88, 0x69, 0x76, 0x1a, 0xcb, - 0xb0, 0x6b, 0x2f, 0xda, 0x03, 0xb8, 0x15, 0x14, 0x02, 0xfe, 0x7d, 0x1f, - 0x79, 0x8b, 0x2f, 0x3c, 0x99, 0xe1, 0xf0, 0x70, 0xd2, 0xff, 0x1b, 0x63, - 0x77, 0xd9, 0xb2, 0xcb, 0x33, 0x92, 0x3d, 0x70, 0x55, 0xae, 0xde, 0x34, - 0xba, 0x4d, 0x59, 0x7f, 0x1f, 0x26, 0x28, 0x1a, 0xcb, 0xda, 0xfa, 0x4b, - 0x28, 0x67, 0x96, 0xe5, 0xb7, 0xe8, 0xfb, 0xaf, 0xa5, 0x97, 0xee, 0xf2, - 0x47, 0xfa, 0xcb, 0xf8, 0xfd, 0x05, 0x1d, 0x59, 0x78, 0x6e, 0x6b, 0x2a, - 0x49, 0x8d, 0x63, 0x11, 0x90, 0xb9, 0x47, 0x0a, 0x42, 0x57, 0x7e, 0x67, - 0x93, 0x44, 0x96, 0x5f, 0xf4, 0x77, 0xd8, 0xdc, 0xd6, 0x2c, 0xbe, 0x9b, - 0x30, 0x0b, 0x2f, 0xdd, 0x61, 0xf8, 0xcf, 0x47, 0xb2, 0x21, 0xbd, 0x49, - 0x18, 0xc2, 0xc2, 0x0e, 0x99, 0xa6, 0x89, 0x11, 0x8d, 0xdd, 0xce, 0xac, - 0xb4, 0x2c, 0xb7, 0x96, 0x53, 0x4d, 0x08, 0x44, 0x2f, 0x99, 0x3b, 0xfe, - 0xe2, 0xcb, 0xff, 0xba, 0x61, 0xe0, 0x8d, 0xd6, 0x8d, 0x85, 0x97, 0xff, - 0xed, 0xf1, 0xe3, 0x1f, 0xa2, 0x5c, 0x7f, 0x1f, 0x16, 0x5f, 0xdc, 0x86, - 0x94, 0x4c, 0xb2, 0xde, 0x59, 0x78, 0x42, 0x99, 0x65, 0xbb, 0x86, 0xbf, - 0xf1, 0x1b, 0xb3, 0x65, 0x95, 0x86, 0xf8, 0x89, 0xef, 0x8d, 0xb1, 0x32, - 0xca, 0x92, 0x6f, 0x06, 0x8f, 0xfa, 0xb1, 0x42, 0x6a, 0x7c, 0x7e, 0xdc, - 0x59, 0x7c, 0x33, 0x2f, 0xd6, 0x54, 0xe3, 0x66, 0xe2, 0x37, 0xff, 0x67, - 0xfc, 0x27, 0x63, 0x37, 0x9e, 0x96, 0x5e, 0x08, 0xf1, 0x65, 0xfd, 0xae, - 0x94, 0x37, 0x8b, 0x2f, 0xff, 0xda, 0x1b, 0x93, 0x1e, 0xcd, 0xdd, 0x1b, - 0x61, 0x85, 0x95, 0x88, 0x86, 0x09, 0x6d, 0xa7, 0xd6, 0x56, 0x26, 0x3c, - 0x68, 0xde, 0x85, 0x17, 0xe4, 0x57, 0xc0, 0x77, 0x02, 0xa2, 0xdf, 0x5e, - 0x9f, 0x7e, 0xac, 0xbf, 0xc6, 0x50, 0xdf, 0xdf, 0xab, 0x2f, 0x4d, 0x9f, - 0xac, 0xbf, 0x84, 0xeb, 0x81, 0xf4, 0xb2, 0xb4, 0x8c, 0xb6, 0x97, 0x78, - 0x7d, 0xcc, 0xbf, 0x1e, 0xbf, 0xe3, 0xf4, 0x7d, 0x1b, 0xb9, 0xf2, 0xcb, - 0xff, 0xfe, 0x79, 0x86, 0x7a, 0xf6, 0x0c, 0xa0, 0x0f, 0xb1, 0x43, 0x56, - 0x5f, 0xf6, 0x83, 0xcf, 0x3c, 0xbf, 0x35, 0x96, 0x3f, 0xd1, 0x3f, 0xd6, - 0x5b, 0xfd, 0x9b, 0x67, 0x78, 0xfd, 0x59, 0x5e, 0x3d, 0xc2, 0x29, 0xb0, - 0xab, 0x2f, 0xf9, 0xc8, 0x1c, 0x8f, 0x3e, 0xea, 0xca, 0x60, 0xf3, 0x3a, - 0x25, 0x7d, 0x84, 0x73, 0x2c, 0xbe, 0x3c, 0xd6, 0xf5, 0x97, 0xdf, 0x4b, - 0x68, 0x59, 0x7a, 0x05, 0x9f, 0x59, 0x58, 0x78, 0x9a, 0x24, 0xbd, 0xe8, - 0xd2, 0xcb, 0xf7, 0x8f, 0x5e, 0x75, 0x97, 0xff, 0xbd, 0x1b, 0x77, 0x3c, - 0x59, 0xdf, 0x1a, 0xcb, 0xcd, 0xc1, 0xac, 0xb3, 0x56, 0x5f, 0xe8, 0xd8, - 0x78, 0x2f, 0x19, 0xc2, 0x2e, 0x70, 0x72, 0x62, 0x77, 0x49, 0x10, 0x72, - 0xa4, 0x9a, 0x7f, 0xa1, 0xb5, 0x7c, 0x36, 0xe7, 0xcb, 0x2f, 0xa5, 0xc1, - 0x38, 0xb2, 0xa0, 0xf1, 0xfa, 0x47, 0x7d, 0x9d, 0xe6, 0x2c, 0xbf, 0x9f, - 0xe1, 0x99, 0x6c, 0xb2, 0xa0, 0xf3, 0xf4, 0x43, 0x7b, 0x9e, 0x1a, 0xcb, - 0xf0, 0x9d, 0x28, 0xfd, 0x65, 0x34, 0xf1, 0xb7, 0x8e, 0xdf, 0xfd, 0xde, - 0x1f, 0x20, 0xb3, 0xbe, 0x35, 0x97, 0xfe, 0x7d, 0xcd, 0x1b, 0x19, 0xe3, - 0x92, 0xcb, 0xfe, 0xfc, 0xfa, 0x4f, 0xd8, 0x1a, 0xcb, 0xc5, 0x9e, 0x59, - 0x4d, 0x46, 0xb7, 0x90, 0xb8, 0x83, 0xbc, 0xe2, 0xfc, 0x38, 0xdd, 0x0b, - 0x56, 0x5f, 0xf3, 0xf2, 0x30, 0x87, 0xe8, 0x59, 0x7f, 0xbd, 0x03, 0x3d, - 0xf0, 0x35, 0x97, 0xfd, 0xac, 0xfb, 0xc4, 0xfb, 0xbb, 0x2c, 0xb6, 0x0c, - 0xfc, 0x5a, 0x69, 0x77, 0x39, 0xa4, 0x67, 0x14, 0x29, 0xea, 0x15, 0x32, - 0xe4, 0x3e, 0x8c, 0xfd, 0xe1, 0xf3, 0x70, 0x58, 0x59, 0x7c, 0xd9, 0xa0, - 0x45, 0x94, 0xd3, 0x78, 0xe3, 0x17, 0x8c, 0xba, 0xb2, 0xe0, 0xfc, 0xb2, - 0xff, 0x9e, 0x5d, 0xe6, 0x0b, 0xe3, 0x59, 0x7b, 0xe7, 0xf2, 0xca, 0x74, - 0x44, 0xfe, 0x36, 0x43, 0x01, 0x39, 0xbf, 0xd1, 0xcc, 0xfb, 0xa7, 0xa5, - 0x97, 0xdc, 0xec, 0x35, 0x65, 0x68, 0xf5, 0x7f, 0x33, 0xbd, 0xa8, 0xea, - 0xcb, 0xfa, 0x67, 0x1f, 0x8d, 0xab, 0x2f, 0xee, 0x9e, 0x0e, 0x1a, 0xb2, - 0xba, 0x7b, 0x42, 0x97, 0x5f, 0x3e, 0xc1, 0x25, 0x97, 0x70, 0x96, 0x5f, - 0xdf, 0x72, 0x01, 0x8d, 0x59, 0x7c, 0xd0, 0x61, 0x2c, 0xa8, 0x4d, 0x0f, - 0x44, 0x6e, 0xec, 0x44, 0x7c, 0x22, 0x08, 0xb0, 0x85, 0xd7, 0xe9, 0xa0, - 0x8a, 0x16, 0x5c, 0x0d, 0x2c, 0xb9, 0xc9, 0x65, 0x19, 0xe9, 0x74, 0x98, - 0x22, 0xf7, 0xe7, 0xda, 0x3c, 0xeb, 0x2f, 0x14, 0x30, 0xb2, 0xfb, 0x37, - 0x5f, 0xcb, 0x2f, 0x13, 0xf4, 0x07, 0x81, 0xc1, 0xcb, 0x86, 0xd5, 0x97, - 0xec, 0x9a, 0x51, 0xf2, 0xca, 0x60, 0xf0, 0x08, 0x5e, 0x80, 0x89, 0x4f, - 0x39, 0x5f, 0xb0, 0xbb, 0x1c, 0x59, 0x69, 0x2c, 0xbf, 0xdf, 0xfe, 0x1e, - 0x6e, 0xe7, 0xcb, 0x2b, 0x0f, 0x2d, 0xc4, 0x6f, 0xfc, 0xff, 0x7d, 0xc3, - 0x1e, 0x0b, 0xc5, 0x95, 0x09, 0xf8, 0x64, 0x3e, 0xfc, 0x46, 0x4e, 0x3c, - 0x20, 0xbf, 0xfe, 0x7f, 0xb5, 0x99, 0xf0, 0xbe, 0x0c, 0x7d, 0xc5, 0x97, - 0xfb, 0xa7, 0xc7, 0x03, 0xec, 0xb2, 0xfc, 0xe4, 0x3f, 0x42, 0xcb, 0xef, - 0xcc, 0x98, 0x59, 0x4e, 0x79, 0x3f, 0x93, 0x53, 0x25, 0xb3, 0x70, 0x9e, - 0x4e, 0x19, 0x59, 0x0c, 0x47, 0x45, 0x28, 0x42, 0x8e, 0x34, 0x0c, 0x8c, - 0x35, 0x84, 0xa0, 0x46, 0x6f, 0xf3, 0x69, 0x91, 0xee, 0x90, 0xcd, 0x1d, - 0xb6, 0x9c, 0x1a, 0xe1, 0xe9, 0x59, 0x8f, 0x08, 0x1f, 0xe1, 0x52, 0x51, - 0xea, 0x72, 0x16, 0xbd, 0x94, 0x3c, 0x14, 0xd1, 0x14, 0xf7, 0x1f, 0x2f, - 0xe7, 0xf9, 0x9b, 0x5f, 0xab, 0x29, 0x9a, 0x7a, 0x25, 0x1d, 0x0d, 0xfc, - 0x36, 0x7c, 0xef, 0x3e, 0x59, 0x78, 0x0e, 0x05, 0x97, 0xff, 0x08, 0x09, - 0xd1, 0xad, 0x19, 0x38, 0x16, 0x56, 0x1f, 0x13, 0x47, 0x2e, 0x64, 0x4f, - 0x2b, 0x2f, 0x35, 0xfe, 0x59, 0x7b, 0xf7, 0xf2, 0xcb, 0xb7, 0x9a, 0xcb, - 0xed, 0x6b, 0x04, 0x59, 0x7f, 0xd1, 0x21, 0x5f, 0x5a, 0xc1, 0x16, 0x5e, - 0xc1, 0x59, 0xcf, 0x48, 0xcf, 0x82, 0x0c, 0x1d, 0x98, 0x75, 0xc6, 0x08, - 0x8e, 0xdc, 0x66, 0x9a, 0xee, 0xd0, 0xf0, 0xa8, 0x54, 0x46, 0x71, 0xf8, - 0xdf, 0xff, 0xf3, 0x2c, 0xfa, 0x17, 0xd9, 0x9e, 0x4b, 0xd1, 0xac, 0xc2, - 0x61, 0x65, 0xff, 0xff, 0xc0, 0x7d, 0x3f, 0xa5, 0x9d, 0xc1, 0xf1, 0xdb, - 0x9a, 0xda, 0x3e, 0x59, 0x7f, 0x60, 0xdd, 0xb8, 0x4b, 0x28, 0xd1, 0x3b, - 0xa7, 0x2b, 0xf6, 0x80, 0xee, 0x05, 0x45, 0x28, 0xbf, 0xfe, 0x7e, 0x96, - 0x6d, 0xa8, 0xf1, 0xfb, 0x34, 0xb2, 0xee, 0x0a, 0xb2, 0xff, 0xde, 0x8f, - 0xda, 0xf2, 0xe7, 0x05, 0x59, 0x79, 0xe4, 0xce, 0x11, 0xfb, 0x84, 0x5f, - 0x9a, 0x71, 0x38, 0x41, 0x8b, 0xfe, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, - 0x93, 0x94, 0xd4, 0x52, 0x3a, 0xed, 0xfe, 0xd3, 0x3c, 0xf4, 0x4c, 0xeb, - 0x29, 0x99, 0xeb, 0xb9, 0x15, 0x44, 0x69, 0xb2, 0x3b, 0x53, 0x1f, 0x65, - 0x38, 0x8c, 0x3c, 0x6e, 0x42, 0x64, 0x68, 0x2c, 0x43, 0xb8, 0x11, 0xc0, - 0x9c, 0x79, 0x9b, 0xb0, 0xf7, 0x9a, 0x1c, 0xfa, 0x85, 0xfb, 0x6d, 0x90, - 0xaf, 0xa5, 0xfd, 0xbc, 0xae, 0x3f, 0xe3, 0x95, 0x29, 0x54, 0x5c, 0xad, - 0x5b, 0x3b, 0x29, 0x38, 0x25, 0x3b, 0xe5, 0x80, 0xdf, 0xb4, 0x07, 0x70, - 0x2a, 0x21, 0xf5, 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x53, - 0x59, 0x9e, 0x22, 0x01, 0xa6, 0x97, 0xf9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, - 0x44, 0xeb, 0xf1, 0xf7, 0x81, 0x6a, 0xcb, 0xf0, 0x5a, 0x4e, 0xc2, 0xcb, - 0xde, 0x89, 0x96, 0x54, 0xc7, 0xdb, 0xa2, 0x8f, 0x14, 0x5f, 0xe0, 0xfc, - 0x20, 0xc3, 0xde, 0x2c, 0xbf, 0xfc, 0xca, 0x30, 0x2e, 0xee, 0xc3, 0x9e, - 0xe7, 0x4e, 0xf4, 0xfa, 0xcb, 0xf6, 0x80, 0xee, 0x05, 0x44, 0x62, 0xbf, - 0x70, 0xf7, 0xc3, 0x56, 0x5e, 0xfa, 0x5b, 0x2c, 0xb7, 0xa0, 0xf2, 0x30, - 0xa6, 0xfe, 0x94, 0x7f, 0xe3, 0x15, 0x65, 0xff, 0xfc, 0x12, 0x76, 0x27, - 0x75, 0x88, 0x29, 0x67, 0x8d, 0xab, 0x2f, 0xa1, 0xa0, 0xfd, 0x65, 0xff, - 0xf4, 0xb6, 0x65, 0x22, 0x79, 0xd8, 0x1a, 0x9d, 0x3b, 0xd3, 0xeb, 0x2b, - 0xc8, 0x88, 0xfc, 0x8e, 0xfe, 0xce, 0xc6, 0x7d, 0xd5, 0x97, 0xfe, 0xeb, - 0x10, 0x52, 0xcf, 0x1b, 0x56, 0x5f, 0xf3, 0x10, 0x52, 0xcf, 0x1b, 0x56, - 0x5f, 0x04, 0x9d, 0x89, 0xc7, 0xed, 0xd3, 0xeb, 0xf6, 0xbf, 0x3f, 0x42, - 0xca, 0x69, 0xf1, 0x84, 0xee, 0xf8, 0xfe, 0x94, 0xf2, 0xb2, 0xfd, 0x3a, - 0x62, 0x81, 0xac, 0xb3, 0x38, 0x5c, 0x1f, 0xd8, 0xc2, 0x46, 0xf8, 0xc8, - 0x07, 0xc9, 0x89, 0x9a, 0x5f, 0xe8, 0x72, 0x91, 0x27, 0x23, 0x06, 0xe9, - 0x14, 0xf9, 0x45, 0xff, 0xe6, 0x6d, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, - 0x89, 0xe5, 0x7d, 0x1b, 0xe3, 0xcb, 0x2f, 0xa0, 0xa5, 0xc5, 0x97, 0x67, - 0x16, 0x5e, 0xec, 0x35, 0x65, 0xfb, 0xc6, 0x59, 0xbd, 0x65, 0x69, 0x13, - 0xdf, 0x91, 0xb2, 0xc8, 0x7a, 0x2c, 0x20, 0xe5, 0xfb, 0x81, 0x1e, 0x35, - 0x65, 0xd2, 0x11, 0x65, 0xf0, 0x5f, 0x52, 0x59, 0x79, 0xa1, 0xdd, 0x59, - 0x7e, 0x71, 0xfa, 0x38, 0xb2, 0xff, 0x67, 0xbd, 0x1f, 0x3e, 0xea, 0xcb, - 0x33, 0x84, 0x6f, 0xc8, 0xa0, 0x63, 0x1f, 0x91, 0x11, 0x07, 0x09, 0xe9, - 0x9a, 0x71, 0xa2, 0xc6, 0x5f, 0x50, 0xc8, 0x66, 0xd8, 0xaa, 0x53, 0x99, - 0xbe, 0x85, 0xef, 0x65, 0x42, 0xdf, 0xb4, 0x07, 0x70, 0x2a, 0x22, 0x05, - 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x54, 0x5f, 0xda, 0x0f, - 0xa0, 0x80, 0xb2, 0xfe, 0x01, 0xe6, 0xe7, 0xa1, 0x65, 0x41, 0xee, 0x61, - 0x6d, 0x99, 0xe2, 0x3f, 0x1a, 0x68, 0x50, 0xa8, 0xbf, 0x68, 0x0e, 0xe0, - 0x54, 0x45, 0x0b, 0xf7, 0x8d, 0xa1, 0x1a, 0xcb, 0xff, 0x05, 0xf4, 0xf2, - 0xe9, 0xf0, 0x2b, 0x2f, 0xfa, 0x3e, 0x2c, 0xef, 0x21, 0xab, 0x28, 0x8f, - 0xd8, 0x27, 0xd7, 0xa3, 0xfc, 0x59, 0x66, 0x78, 0x98, 0x7b, 0x9a, 0x72, - 0x13, 0xc2, 0x10, 0xdf, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x19, 0x2f, - 0xda, 0x03, 0xb8, 0x15, 0x13, 0x2a, 0xfd, 0x2c, 0xeb, 0x81, 0x65, 0xf9, - 0x9b, 0x5e, 0x4c, 0xf0, 0xf6, 0xfe, 0x34, 0xbf, 0x68, 0x0e, 0xe0, 0x54, - 0x54, 0x8b, 0x12, 0xcb, 0xa4, 0xd5, 0x96, 0x11, 0x65, 0x99, 0xe1, 0xf6, - 0xee, 0x9a, 0x68, 0x40, 0x22, 0xf7, 0xf9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, - 0x57, 0x4b, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x2c, 0x55, 0xff, 0x47, - 0x39, 0x0d, 0xee, 0x01, 0x65, 0xf0, 0x1d, 0xc0, 0xa8, 0x9e, 0x97, 0xe6, - 0xbc, 0x99, 0xe0, 0x0f, 0x9b, 0x47, 0x17, 0x85, 0x70, 0x2c, 0xbf, 0xbd, - 0x07, 0xa3, 0x65, 0xac, 0xbf, 0x41, 0xcf, 0x9e, 0xe2, 0xcb, 0x85, 0x67, - 0x87, 0xf2, 0x01, 0xd7, 0x30, 0xbf, 0xff, 0xfc, 0x3c, 0x15, 0x99, 0x63, - 0x0c, 0x3f, 0x78, 0x65, 0x34, 0x03, 0x59, 0xf2, 0xcb, 0xff, 0xfb, 0x33, - 0xc6, 0x0f, 0x63, 0x32, 0xce, 0xf8, 0xc5, 0x59, 0x7f, 0xfe, 0x98, 0xa1, - 0xac, 0xf3, 0x86, 0x28, 0xdd, 0xd8, 0x59, 0x77, 0x3a, 0xb2, 0xec, 0xe2, - 0xcb, 0xff, 0x66, 0xbe, 0x86, 0xf9, 0xf3, 0x4b, 0x2e, 0xe7, 0xeb, 0x2f, - 0xc4, 0xed, 0x28, 0x59, 0x7f, 0x07, 0x9e, 0x79, 0x33, 0x9e, 0x51, 0x50, - 0xe2, 0xe4, 0x2c, 0x29, 0xf0, 0x83, 0x17, 0xb6, 0x8d, 0xd5, 0x97, 0x6b, - 0xab, 0x2f, 0xd9, 0xde, 0x1b, 0x56, 0x5f, 0xfe, 0x8f, 0xbb, 0x93, 0x1e, - 0xbb, 0xc0, 0xee, 0xac, 0xbc, 0xff, 0x33, 0x84, 0x56, 0xb9, 0x01, 0x0b, - 0xf4, 0x9e, 0xb1, 0x53, 0x7e, 0xa3, 0x00, 0xe4, 0x64, 0x34, 0x35, 0x70, - 0x64, 0xf9, 0xd9, 0x59, 0x54, 0xcd, 0x72, 0xc2, 0x21, 0x72, 0x72, 0xef, - 0xef, 0xff, 0x0d, 0x9f, 0x7a, 0x1d, 0x84, 0x9b, 0x81, 0xf9, 0x65, 0xf1, - 0xc0, 0x59, 0x6b, 0x2e, 0xec, 0x2c, 0xa9, 0xe8, 0xdd, 0xfc, 0x4b, 0x7e, - 0x3f, 0x13, 0xcc, 0xb2, 0xfd, 0x2c, 0x1c, 0xec, 0x59, 0x7e, 0x73, 0xdb, - 0x50, 0xb2, 0xfd, 0xd2, 0x0b, 0xcf, 0x6b, 0x29, 0x92, 0x8a, 0x38, 0x27, - 0xf1, 0x48, 0x84, 0xf7, 0x37, 0xf5, 0x97, 0xec, 0xe9, 0x87, 0x8b, 0x2e, - 0x9e, 0x99, 0x55, 0x65, 0x4f, 0x47, 0xc4, 0xca, 0xa3, 0x0c, 0xa1, 0x3d, - 0xfa, 0x78, 0x4f, 0x5c, 0xd7, 0x56, 0x5f, 0xe1, 0x0b, 0x35, 0xa8, 0x02, - 0xca, 0x9e, 0x8f, 0x9e, 0x7b, 0x34, 0xbe, 0xd3, 0x7b, 0xf2, 0xcb, 0xc0, - 0x3e, 0x2c, 0xbf, 0x32, 0x19, 0x31, 0x26, 0xac, 0xbf, 0xf3, 0x29, 0x3c, - 0xcf, 0x6c, 0x99, 0xee, 0x7b, 0x9e, 0x33, 0xdc, 0xf4, 0xb2, 0xff, 0xd3, - 0xc2, 0x7b, 0x9e, 0x33, 0xc2, 0x78, 0x32, 0x59, 0x2c, 0x89, 0xe9, 0x65, - 0xff, 0xa7, 0x8b, 0x29, 0x3c, 0x27, 0x8c, 0xf0, 0x64, 0xb2, 0xac, 0xf0, - 0x9e, 0x96, 0x5f, 0xf7, 0x87, 0x26, 0x72, 0xe1, 0x33, 0x64, 0xa6, 0xa3, - 0x3c, 0xb7, 0x32, 0xab, 0x7d, 0x4f, 0x49, 0xfa, 0xb2, 0xac, 0x70, 0x37, - 0xe6, 0x4b, 0x5d, 0xc9, 0x65, 0xfd, 0x07, 0xde, 0xc3, 0x56, 0x53, 0x20, - 0xf5, 0xa7, 0x81, 0x55, 0xe0, 0x67, 0x92, 0x5d, 0xcd, 0x2c, 0xbc, 0xd8, - 0xe2, 0xcb, 0xff, 0xfd, 0xd1, 0x35, 0x1e, 0x8c, 0x00, 0xcc, 0xb6, 0x6c, - 0x49, 0x65, 0xda, 0x85, 0x94, 0x67, 0xef, 0xfb, 0x0d, 0xe9, 0x8c, 0x55, - 0x97, 0x64, 0x96, 0x5d, 0x9f, 0x99, 0xb4, 0x71, 0xeb, 0xf7, 0x7f, 0x10, - 0xa6, 0x59, 0x7f, 0xe7, 0xe4, 0xee, 0x73, 0x25, 0x28, 0x59, 0x6e, 0x2c, - 0xbf, 0xa0, 0x07, 0xb3, 0x92, 0xcb, 0xff, 0xf1, 0x3b, 0x07, 0xa8, 0x94, - 0xb3, 0x9f, 0xff, 0x0b, 0x2f, 0xf3, 0xf4, 0x39, 0x84, 0xc2, 0xca, 0x1a, - 0x6b, 0x78, 0x56, 0xc1, 0x5c, 0xc8, 0x1a, 0x11, 0xf1, 0x67, 0xea, 0xd7, - 0xf6, 0x76, 0x0a, 0x26, 0x59, 0x7f, 0xff, 0x68, 0xf7, 0x1d, 0xac, 0xe3, - 0x5a, 0x3d, 0xc0, 0x07, 0x65, 0x97, 0xc7, 0xe1, 0x1a, 0xb2, 0xff, 0xf1, - 0xb1, 0x3b, 0x09, 0xfe, 0xe3, 0x0c, 0x3a, 0xca, 0x01, 0xf8, 0x91, 0x1d, - 0xff, 0xe7, 0xe1, 0x67, 0xec, 0xfc, 0x60, 0x7d, 0x2c, 0xb8, 0x85, 0x59, - 0x7e, 0xe1, 0x05, 0xe4, 0xb2, 0xfe, 0xec, 0xd2, 0x7d, 0x30, 0xb2, 0xec, - 0x02, 0xcb, 0xc3, 0xc6, 0x1c, 0xf1, 0xba, 0x61, 0x7d, 0xe8, 0x68, 0x16, - 0x54, 0x23, 0x67, 0x05, 0xdd, 0xb7, 0xa6, 0x77, 0xdc, 0x90, 0x7f, 0x59, - 0x78, 0x79, 0xe5, 0x97, 0xa6, 0x31, 0x56, 0x58, 0x72, 0x37, 0x46, 0x39, - 0x7f, 0xf4, 0xe8, 0x82, 0x86, 0xce, 0x9d, 0xe9, 0xf5, 0x95, 0x07, 0xe4, - 0x44, 0xd7, 0xfe, 0xf6, 0x4d, 0xe3, 0xf4, 0x6a, 0x16, 0x5c, 0xff, 0x2c, - 0xbf, 0xcf, 0xc7, 0xf0, 0x4b, 0x65, 0x94, 0x47, 0x94, 0x11, 0x7a, 0x9c, - 0xbd, 0xb7, 0xb0, 0xbc, 0xa1, 0x26, 0x71, 0xd8, 0xcc, 0xcf, 0xa2, 0xc6, - 0xc3, 0x57, 0xc4, 0x25, 0x19, 0x27, 0x0e, 0xbb, 0x0d, 0x01, 0x08, 0x37, - 0x21, 0x11, 0x74, 0x69, 0x65, 0xd9, 0xe5, 0x97, 0xc5, 0x9b, 0xf1, 0x65, - 0x00, 0xf3, 0xa7, 0xc5, 0x84, 0x16, 0xbe, 0xc6, 0x9f, 0x56, 0x56, 0x8f, - 0x53, 0xa6, 0x77, 0x80, 0x1d, 0x2c, 0xbd, 0xa7, 0xc5, 0x97, 0x89, 0xfa, - 0xb2, 0xf1, 0x1f, 0x16, 0x58, 0x56, 0x49, 0xb6, 0x81, 0xbb, 0xa3, 0xcb, - 0x2f, 0xb5, 0xbd, 0xda, 0xb2, 0xfe, 0x03, 0x4a, 0x3e, 0xfd, 0x65, 0xf8, - 0xb3, 0xb0, 0x2a, 0xcb, 0xff, 0xc7, 0x3b, 0xd9, 0x31, 0xfd, 0xcf, 0x60, - 0x16, 0x5f, 0x9a, 0x4f, 0xde, 0x2c, 0xbd, 0x19, 0xa5, 0x97, 0xff, 0x80, - 0xfa, 0x7e, 0x9f, 0x20, 0xa3, 0xf5, 0x96, 0x97, 0x8f, 0x8c, 0x41, 0xba, - 0xf9, 0x16, 0x7a, 0x84, 0x55, 0x42, 0xa7, 0x4d, 0x88, 0x86, 0x3b, 0x8a, - 0x20, 0x2b, 0x31, 0x69, 0x89, 0x38, 0x5f, 0xd2, 0x70, 0xc6, 0x01, 0x7c, - 0x36, 0x8b, 0xc5, 0x97, 0x8c, 0x46, 0xac, 0xb8, 0xc6, 0xb2, 0x9c, 0xd9, - 0x88, 0x3b, 0x7b, 0x9b, 0x9b, 0x8b, 0x2f, 0xa7, 0x4b, 0xf6, 0xac, 0xbd, - 0xac, 0x1a, 0xcb, 0xfc, 0xfd, 0x89, 0xb8, 0x6d, 0x59, 0x4c, 0x1e, 0x7f, - 0x87, 0x2f, 0xf4, 0x48, 0xb3, 0xee, 0xe2, 0xcb, 0xf0, 0x0f, 0xed, 0x89, - 0x65, 0xff, 0xce, 0x08, 0x21, 0xcd, 0x28, 0xd6, 0xcb, 0x2c, 0x7f, 0x1f, - 0x77, 0x8a, 0x6f, 0xe2, 0xd3, 0xbb, 0xf5, 0x65, 0xff, 0xf7, 0x78, 0x3d, - 0x61, 0xb1, 0xe1, 0x5c, 0xb6, 0x59, 0x7c, 0x43, 0xc6, 0x16, 0x5e, 0xf0, - 0x5a, 0xb2, 0xed, 0xe3, 0x59, 0x4c, 0xad, 0x56, 0x84, 0x95, 0xf0, 0x87, - 0xe2, 0x33, 0x75, 0xd1, 0x1f, 0xa1, 0x40, 0xe5, 0x1c, 0x2b, 0xea, 0x90, - 0x48, 0x85, 0x1d, 0xbf, 0x61, 0x14, 0x6c, 0xb2, 0xdf, 0x2c, 0xd1, 0xa6, - 0xbf, 0x72, 0x68, 0x2d, 0x96, 0x56, 0x1e, 0x5f, 0x48, 0xaf, 0xc4, 0xc1, - 0xe7, 0x16, 0x5f, 0xed, 0x4b, 0xc7, 0xc3, 0x1a, 0xcb, 0xe7, 0xeb, 0x81, - 0x65, 0x19, 0xea, 0x0a, 0x67, 0x7c, 0x16, 0x5f, 0x36, 0x59, 0x7f, 0xe1, - 0x5f, 0xfc, 0x07, 0x9f, 0xfe, 0x2c, 0xa8, 0x3e, 0x9c, 0x28, 0xbf, 0xf7, - 0x1f, 0xe8, 0x27, 0x1e, 0x30, 0xb2, 0x8d, 0x36, 0x4f, 0x3d, 0x94, 0x22, - 0xfa, 0x41, 0x7f, 0xfb, 0xbe, 0xc6, 0xfe, 0xfa, 0xcd, 0xf8, 0x35, 0x97, - 0x47, 0x96, 0x58, 0x6b, 0x29, 0xa6, 0x9c, 0x85, 0xac, 0xc2, 0xcb, 0xc5, - 0xfc, 0x2c, 0xb8, 0x87, 0x38, 0xd7, 0x70, 0x4a, 0xfe, 0xce, 0x0a, 0xe5, - 0xb2, 0xca, 0x84, 0xc7, 0x71, 0xcd, 0xd3, 0x88, 0xba, 0xfd, 0xa0, 0xf1, - 0xc0, 0xb2, 0xf7, 0x07, 0x0b, 0x2f, 0xfb, 0x9d, 0xc0, 0x07, 0xf7, 0xc5, - 0x94, 0xc1, 0xea, 0xb8, 0xe5, 0x42, 0x27, 0xc2, 0xfb, 0x6e, 0x2c, 0xb6, - 0x2c, 0xb3, 0x4c, 0xd0, 0xee, 0x08, 0xdf, 0xf6, 0x13, 0xcb, 0x92, 0x17, - 0x65, 0x97, 0xd2, 0xe1, 0x92, 0xcb, 0xff, 0x00, 0x9f, 0xcf, 0xf6, 0x7d, - 0xd5, 0x95, 0x24, 0x4d, 0x7c, 0x74, 0x12, 0x1b, 0xed, 0x63, 0xb5, 0x65, - 0x41, 0xe9, 0x39, 0x8d, 0xfe, 0x7d, 0x4a, 0x00, 0x60, 0x59, 0x50, 0xba, - 0xcd, 0x91, 0xc2, 0x9c, 0x6b, 0xde, 0x86, 0xcb, 0xa1, 0x94, 0x62, 0xa1, - 0x20, 0xbf, 0xfc, 0xc3, 0xe7, 0xdd, 0xec, 0x66, 0xf3, 0x02, 0xcb, 0xfc, - 0x59, 0xce, 0xbb, 0x92, 0xca, 0x60, 0xff, 0x37, 0xa6, 0x5f, 0xff, 0xf8, - 0xf5, 0xa8, 0x13, 0xa6, 0x41, 0x96, 0x70, 0x61, 0x7d, 0x49, 0x65, 0xff, - 0xfc, 0x58, 0xc6, 0x14, 0xee, 0x77, 0xd8, 0xd1, 0x23, 0xf5, 0x95, 0x08, - 0xca, 0xc6, 0xcb, 0xfc, 0x17, 0xe1, 0xcc, 0x62, 0xac, 0xa3, 0x4d, 0x13, - 0xd0, 0xef, 0x22, 0x1b, 0xde, 0x82, 0x59, 0x7b, 0xee, 0xb5, 0x65, 0x00, - 0xdc, 0xb8, 0xdd, 0xf0, 0xf4, 0x62, 0xac, 0xb9, 0x8d, 0xeb, 0x2f, 0x60, - 0x46, 0xb2, 0xb6, 0x3d, 0x92, 0x23, 0xe0, 0xd5, 0xe3, 0x2e, 0xac, 0xbf, - 0x9f, 0x79, 0xcc, 0x62, 0xac, 0xa6, 0x9e, 0x58, 0x83, 0x77, 0xf8, 0x3a, - 0xd9, 0xb1, 0x9d, 0x59, 0x7f, 0xdc, 0x86, 0x8f, 0xd0, 0x40, 0x59, 0x71, - 0x96, 0x1f, 0x63, 0x06, 0x95, 0x08, 0xbb, 0x1c, 0x23, 0xef, 0x48, 0x3c, - 0x59, 0x7f, 0x0d, 0xf5, 0xfc, 0xfe, 0x2c, 0xbd, 0xe1, 0x37, 0xac, 0xbf, - 0xe8, 0x69, 0x60, 0x34, 0x7f, 0xac, 0xb0, 0xd6, 0x5e, 0xe7, 0x31, 0x65, - 0x87, 0x06, 0xb5, 0xc4, 0x6a, 0x48, 0xaa, 0xe1, 0x00, 0x59, 0x6f, 0xef, - 0x39, 0x83, 0x09, 0x65, 0xfe, 0x96, 0x1f, 0x38, 0x18, 0x59, 0x7f, 0x0f, - 0x0a, 0x5e, 0xc5, 0x95, 0x07, 0xbc, 0x66, 0x57, 0xfe, 0xec, 0x37, 0xe0, - 0x1f, 0xd9, 0xa5, 0x97, 0xef, 0x66, 0x8f, 0x8b, 0x2f, 0x11, 0xcb, 0xe3, - 0xe7, 0xea, 0x05, 0xff, 0x9f, 0x3f, 0x82, 0x71, 0xe3, 0x0b, 0x2a, 0x13, - 0x80, 0xda, 0x11, 0x32, 0x84, 0x3f, 0xe6, 0x77, 0xff, 0x8b, 0xb3, 0xf9, - 0x34, 0x9f, 0x5b, 0x0e, 0x16, 0x5f, 0xff, 0xc5, 0x28, 0xeb, 0xfb, 0x86, - 0xfd, 0xfc, 0x42, 0x92, 0xcb, 0xee, 0xf7, 0x37, 0x56, 0x5f, 0xf4, 0x64, - 0xbd, 0x87, 0x2e, 0x2c, 0xae, 0x1e, 0xe7, 0x49, 0x6f, 0xc3, 0x9b, 0xc1, - 0xdd, 0x59, 0x5f, 0x1e, 0x79, 0x11, 0x56, 0x26, 0xec, 0x69, 0xcf, 0x18, - 0x35, 0xfb, 0x44, 0x78, 0xc2, 0xcb, 0x9b, 0x25, 0x97, 0xfc, 0xf8, 0x01, - 0xe6, 0xbf, 0x35, 0x94, 0x33, 0xcf, 0xf0, 0xbd, 0xfe, 0xfb, 0x82, 0x11, - 0xc0, 0xd6, 0x56, 0x8f, 0x58, 0x88, 0xaa, 0x11, 0xda, 0x70, 0xcc, 0xbf, - 0xe8, 0x97, 0x0a, 0x3f, 0x76, 0xac, 0xbf, 0x8f, 0x5b, 0x07, 0xfc, 0x59, - 0x7e, 0xec, 0x61, 0x01, 0x65, 0xf7, 0xdd, 0x86, 0xac, 0xa6, 0x0f, 0x27, - 0xe2, 0x6b, 0xfe, 0x90, 0x9d, 0x3f, 0x19, 0x75, 0x65, 0xff, 0xb3, 0x74, - 0x7e, 0x8f, 0x47, 0x78, 0xb2, 0xff, 0xf4, 0x67, 0xdd, 0xf4, 0x74, 0xa3, - 0xfe, 0x2c, 0xba, 0x3f, 0x59, 0x77, 0x9a, 0xb2, 0x80, 0x6b, 0xb8, 0x2f, - 0x5b, 0x27, 0x5e, 0x6f, 0x0e, 0x48, 0x47, 0x3d, 0x41, 0x0b, 0xc5, 0xff, - 0xe2, 0x0b, 0xc9, 0xa1, 0xef, 0xa0, 0x2c, 0xb5, 0x97, 0xb6, 0x3d, 0x2c, - 0xbf, 0xee, 0x1f, 0xdd, 0x9a, 0x51, 0xf2, 0xcb, 0xf7, 0x3b, 0xcc, 0xea, - 0xca, 0xe1, 0xf2, 0x04, 0xf2, 0xfe, 0x0b, 0x2c, 0xe6, 0x31, 0x56, 0x5d, - 0x9e, 0x59, 0x78, 0x51, 0x45, 0x49, 0x7f, 0xfb, 0xa7, 0xde, 0x78, 0xe7, - 0xc4, 0xd4, 0x49, 0x23, 0x33, 0x41, 0x4c, 0x26, 0xd8, 0x70, 0x81, 0x72, - 0x2e, 0x99, 0x84, 0xda, 0xe9, 0x8d, 0x65, 0xff, 0xfd, 0x28, 0x2c, 0xef, - 0x8f, 0x3b, 0x0d, 0x3d, 0x49, 0x65, 0x68, 0xfb, 0xfa, 0x2f, 0x7e, 0xce, - 0x04, 0xba, 0xb2, 0x8c, 0xf2, 0x48, 0x8a, 0xa4, 0xcd, 0x0e, 0x1b, 0x6e, - 0x3c, 0x82, 0x33, 0x5f, 0x89, 0xcc, 0x76, 0x68, 0x6d, 0xea, 0x3b, 0x06, - 0xc7, 0x7f, 0xe8, 0xc8, 0x7f, 0x26, 0x28, 0xf9, 0xf8, 0xad, 0xd8, 0xee, - 0xb7, 0xc6, 0x0f, 0x7f, 0xdf, 0x4b, 0x9c, 0xc1, 0xbf, 0x56, 0x5f, 0xda, - 0xec, 0x05, 0x97, 0xc5, 0x96, 0xc5, 0x97, 0xda, 0x27, 0xde, 0xb2, 0xf6, - 0x39, 0x2c, 0xb9, 0xc5, 0x59, 0x50, 0x8d, 0x01, 0x9d, 0x30, 0x64, 0x62, - 0x1a, 0x23, 0x68, 0xd5, 0xef, 0xf9, 0x8b, 0x2f, 0xf3, 0xca, 0x6f, 0x1f, - 0xdd, 0x59, 0x67, 0x59, 0x7a, 0x3d, 0xc5, 0x95, 0xf1, 0xac, 0x31, 0x0b, - 0xff, 0x40, 0x27, 0x61, 0x40, 0x59, 0x7c, 0x59, 0x7f, 0xff, 0x3f, 0x4f, - 0xce, 0xd9, 0xd9, 0xc8, 0xcd, 0x61, 0x2c, 0xbf, 0xfb, 0x8f, 0xf7, 0x39, - 0x85, 0xfc, 0xfe, 0x2c, 0xbf, 0xfc, 0x60, 0xe4, 0x4f, 0xe7, 0x65, 0x2c, - 0xe2, 0xca, 0x1a, 0x76, 0x5a, 0x61, 0x69, 0x09, 0x21, 0xf5, 0x67, 0x7a, - 0x45, 0xf6, 0xbd, 0x84, 0xb2, 0x8c, 0xfe, 0x9d, 0x66, 0xfe, 0x18, 0x92, - 0x3f, 0xf8, 0xb2, 0xfe, 0x29, 0xc2, 0x72, 0x31, 0x65, 0xf7, 0x63, 0xe1, - 0x56, 0x50, 0x15, 0x76, 0x7a, 0x52, 0x4b, 0x90, 0x7e, 0x60, 0x29, 0x7d, - 0xff, 0xfb, 0xa1, 0x13, 0xa5, 0x1f, 0xbf, 0x7f, 0x10, 0xa4, 0xb2, 0xfe, - 0x3e, 0xf7, 0x09, 0xab, 0x2e, 0x17, 0xcb, 0x2f, 0xff, 0x41, 0x00, 0x4d, - 0x3f, 0xe7, 0xdf, 0x42, 0xcb, 0xe7, 0xd9, 0xc9, 0x65, 0xfb, 0xbe, 0xcf, - 0xdd, 0x65, 0x7c, 0x79, 0x24, 0x43, 0x7f, 0x36, 0x77, 0xb3, 0xf7, 0x59, - 0x7f, 0x0b, 0xcc, 0xc2, 0xd9, 0x65, 0x42, 0x20, 0x30, 0x88, 0xcc, 0x2f, - 0xa3, 0x91, 0xbd, 0x65, 0xff, 0xd0, 0x4f, 0xd9, 0x43, 0x0e, 0x2f, 0x56, - 0x57, 0x8f, 0x9c, 0x24, 0x77, 0xa7, 0x38, 0x16, 0x54, 0x2a, 0x84, 0x92, - 0xc8, 0x0b, 0x3f, 0x18, 0xe4, 0x62, 0x7d, 0x84, 0xa6, 0xe1, 0x15, 0xfd, - 0x21, 0x1a, 0xd3, 0xdd, 0x59, 0x7f, 0x4b, 0x9d, 0x38, 0xf9, 0x65, 0xf3, - 0x44, 0x82, 0x59, 0x7c, 0x63, 0xc6, 0xac, 0xbe, 0x77, 0x2f, 0xd6, 0x58, - 0x58, 0x3c, 0x26, 0x08, 0x6e, 0x0b, 0x56, 0x5f, 0xe1, 0x5e, 0x6c, 0x94, - 0x6e, 0xac, 0xbf, 0x6e, 0x06, 0x63, 0x99, 0x65, 0x1a, 0x29, 0x3c, 0x53, - 0xc1, 0x70, 0x9b, 0xdf, 0xf1, 0xb7, 0xdf, 0x3e, 0xef, 0x78, 0xb2, 0xfe, - 0x03, 0xfb, 0xd8, 0x35, 0x95, 0x07, 0xd4, 0x13, 0xdb, 0xfd, 0x0f, 0xaf, - 0x0a, 0xe3, 0x49, 0x70, 0xa2, 0xa4, 0xa1, 0x9e, 0x60, 0xa6, 0x77, 0xba, - 0x7b, 0xa9, 0x19, 0x9a, 0x3b, 0xfb, 0xe0, 0x1f, 0x3c, 0x6b, 0x2f, 0x83, - 0x20, 0xf5, 0x65, 0x42, 0xb2, 0x0f, 0x8c, 0x8c, 0xba, 0x68, 0xc2, 0x1b, - 0x0a, 0x6e, 0x42, 0x43, 0xa6, 0x33, 0xe5, 0xd7, 0xc4, 0x3f, 0x3a, 0xcb, - 0xd8, 0xfb, 0xab, 0x2b, 0x0d, 0xfe, 0x88, 0x6f, 0xec, 0xfc, 0xa3, 0xbc, - 0x59, 0x70, 0xbc, 0x59, 0x6c, 0x59, 0x6f, 0xb0, 0xd4, 0x74, 0x62, 0xfb, - 0xe9, 0x32, 0x7e, 0x59, 0x7f, 0xf7, 0x38, 0x32, 0x81, 0xfa, 0x3b, 0xc5, - 0x95, 0x08, 0x94, 0xc2, 0x70, 0x94, 0xdf, 0xef, 0x1b, 0xcb, 0xa7, 0xb2, - 0xcb, 0xff, 0x74, 0xf4, 0xff, 0xee, 0x77, 0x3c, 0xb2, 0xff, 0x8c, 0x52, - 0xce, 0x98, 0x7f, 0x59, 0x7f, 0x1b, 0x4e, 0x63, 0x15, 0x65, 0xf8, 0xf4, - 0x38, 0xd9, 0x65, 0xfe, 0x7d, 0x77, 0x84, 0x6c, 0x2c, 0xbf, 0xe7, 0x17, - 0xb9, 0xe1, 0xc3, 0x56, 0x5f, 0xfe, 0xe6, 0x31, 0x81, 0xd3, 0x8e, 0x3d, - 0x0b, 0x2f, 0x84, 0x1f, 0xa1, 0x65, 0x42, 0xaf, 0x39, 0x43, 0xa7, 0xe2, - 0xe3, 0x33, 0xdd, 0x42, 0xd1, 0xcf, 0x8b, 0x9c, 0xa0, 0x8c, 0xf8, 0x72, - 0x14, 0x9b, 0xd3, 0x3e, 0x96, 0x5f, 0xf7, 0x7d, 0x9f, 0x86, 0x3e, 0x11, - 0x65, 0xff, 0xff, 0x9c, 0xfb, 0x1e, 0x2c, 0xef, 0x8c, 0x49, 0x46, 0xf3, - 0x2f, 0xd6, 0x5f, 0x81, 0x8d, 0x8e, 0x2c, 0xbc, 0x12, 0x1a, 0xcb, 0xff, - 0xde, 0xc3, 0xd9, 0xb0, 0xe7, 0x27, 0xe2, 0xca, 0x84, 0xd4, 0x3e, 0x1d, - 0xf1, 0xe3, 0xb6, 0x7e, 0x4f, 0xd1, 0xcb, 0xd0, 0x5d, 0x59, 0x71, 0xe9, - 0x65, 0x6c, 0x6c, 0x70, 0x6e, 0xff, 0x48, 0xdb, 0xef, 0x9f, 0x75, 0x65, - 0xf3, 0xea, 0x24, 0xb2, 0xff, 0x9f, 0xe9, 0xdf, 0x73, 0x09, 0x85, 0x95, - 0xb2, 0x2d, 0xbe, 0x21, 0x69, 0xbf, 0x48, 0x6f, 0xbd, 0xba, 0x6d, 0x59, - 0x78, 0xa3, 0xf5, 0x95, 0x38, 0xf0, 0x78, 0x4b, 0x7f, 0x75, 0xda, 0xd8, - 0x6a, 0xcb, 0x37, 0x0f, 0x47, 0xe2, 0x4b, 0xfd, 0xf7, 0xb2, 0x6f, 0x1e, - 0x96, 0x54, 0x1e, 0xee, 0x14, 0x5f, 0xfa, 0x3e, 0xf4, 0x34, 0x1e, 0x39, - 0x96, 0x5f, 0xf4, 0xb9, 0xe7, 0x04, 0x10, 0xd6, 0x5e, 0xff, 0xbe, 0x59, - 0x67, 0xf8, 0xf5, 0xbf, 0x38, 0xa8, 0x56, 0x99, 0x91, 0x9f, 0x9c, 0x65, - 0xda, 0x20, 0x78, 0x4b, 0x5f, 0xc4, 0x3e, 0x70, 0xda, 0xb2, 0xfc, 0x07, - 0xdb, 0x05, 0x59, 0x7e, 0x8d, 0x0f, 0x09, 0x65, 0x61, 0xfe, 0x11, 0x6f, - 0x4a, 0x6f, 0xd1, 0x3e, 0x7e, 0x0a, 0xcb, 0xe2, 0xd1, 0xf9, 0x65, 0xe9, - 0xf8, 0x11, 0x65, 0xff, 0xd1, 0xfc, 0x79, 0xa4, 0xec, 0x78, 0xd6, 0x5a, - 0x7b, 0x59, 0x7f, 0x7a, 0x08, 0x57, 0xf9, 0x65, 0xff, 0x8a, 0x68, 0xc2, - 0xdb, 0x3e, 0xea, 0xca, 0x19, 0xf6, 0xb9, 0x75, 0xff, 0xc6, 0x3f, 0x40, - 0x23, 0xf7, 0x2f, 0xd6, 0x5f, 0x0a, 0xf0, 0xd5, 0x97, 0xe7, 0xe6, 0xc7, - 0xa5, 0x97, 0xda, 0x30, 0xec, 0xb8, 0xbd, 0x57, 0x80, 0x1d, 0x97, 0x17, - 0xaa, 0xff, 0xd8, 0x7b, 0xf0, 0xb0, 0x6f, 0x25, 0xc5, 0xea, 0xbf, 0x39, - 0x7d, 0x26, 0x63, 0x45, 0x2f, 0x0c, 0x05, 0x2b, 0xa1, 0xa6, 0x3a, 0xd8, - 0x66, 0xdf, 0x98, 0xeb, 0xb9, 0x2c, 0xbc, 0x41, 0xd9, 0x65, 0x39, 0xe2, - 0x74, 0x9e, 0x8d, 0x11, 0xc4, 0xdb, 0x50, 0xae, 0xc8, 0x65, 0xb8, 0x54, - 0x64, 0x3a, 0x20, 0x6a, 0x23, 0xc2, 0x0f, 0x84, 0x3d, 0x44, 0x0c, 0x79, - 0xb7, 0xf8, 0x9d, 0xbe, 0x8c, 0x1a, 0xcb, 0xa7, 0xa9, 0xe5, 0x65, 0xe3, - 0x8d, 0x2c, 0xa9, 0xec, 0xde, 0x78, 0x86, 0xff, 0xed, 0x1b, 0x63, 0x74, - 0xb1, 0xbf, 0x42, 0xca, 0x91, 0xf6, 0x4c, 0x4d, 0x78, 0x9c, 0x6b, 0x2f, - 0x73, 0x67, 0x59, 0x46, 0x6e, 0x04, 0x1b, 0xbf, 0xdd, 0x3d, 0x40, 0x33, - 0x7a, 0xcb, 0x9a, 0x6b, 0x2a, 0x0f, 0x2b, 0x63, 0x4b, 0xf6, 0x37, 0x4f, - 0xf2, 0xca, 0x1a, 0x2d, 0x49, 0xaf, 0x84, 0x57, 0xe9, 0x66, 0xf8, 0x92, - 0xcb, 0xd9, 0xa8, 0x59, 0x40, 0x54, 0xb9, 0xf4, 0x36, 0x4e, 0x31, 0x0d, - 0x17, 0xf8, 0xa6, 0xff, 0xc7, 0x31, 0x8b, 0x06, 0x3c, 0x6a, 0xcb, 0xcf, - 0xad, 0x96, 0x52, 0xcb, 0x10, 0x0d, 0x44, 0xc3, 0xb7, 0xf7, 0x9e, 0x6d, - 0x46, 0xcb, 0x2f, 0xe3, 0xfb, 0x9e, 0xc0, 0x2c, 0xbf, 0xa3, 0x7e, 0x7b, - 0xd0, 0xb2, 0xfd, 0x9d, 0xe6, 0x4c, 0xb3, 0xc6, 0xba, 0xff, 0xff, 0xfc, - 0x79, 0xf7, 0x0f, 0x05, 0x9d, 0x9f, 0x4b, 0x87, 0xde, 0x1f, 0xc3, 0x18, - 0x76, 0x59, 0x7f, 0xfe, 0x32, 0x1c, 0xe1, 0x3a, 0x7c, 0x73, 0x20, 0xc9, - 0x65, 0xf3, 0xed, 0xe3, 0x59, 0x58, 0x9f, 0x59, 0x93, 0xcc, 0x5e, 0x4b, - 0x9d, 0x38, 0xdf, 0x08, 0x99, 0xf5, 0x6b, 0xc1, 0xd4, 0x96, 0x5f, 0xf9, - 0xae, 0x3d, 0x47, 0x7d, 0x83, 0x59, 0x7f, 0x3f, 0x7f, 0x10, 0xa4, 0xb2, - 0xff, 0x86, 0xee, 0x2f, 0xef, 0xde, 0x2c, 0xbf, 0xf0, 0xe3, 0xaf, 0x2c, - 0xde, 0xe3, 0x59, 0x7e, 0x3d, 0xb6, 0x3d, 0x2c, 0xbf, 0x41, 0x10, 0x5a, - 0xb2, 0xd2, 0xe9, 0xe7, 0x88, 0x53, 0x53, 0x93, 0x7b, 0x81, 0xdd, 0x8f, - 0x98, 0x2f, 0x69, 0xd3, 0xc2, 0x3a, 0xff, 0x44, 0x8d, 0x98, 0xa2, 0x8a, - 0x92, 0xec, 0xf2, 0xcb, 0xb0, 0x6b, 0x2f, 0xdd, 0xfc, 0x42, 0x92, 0xca, - 0x60, 0xf0, 0x1c, 0x5a, 0xfe, 0xf3, 0xe8, 0x11, 0xd5, 0x97, 0x38, 0xd6, - 0x5f, 0xda, 0x7e, 0x79, 0xe4, 0xb2, 0xdf, 0x2c, 0xb8, 0xc5, 0x59, 0x70, - 0x9f, 0xac, 0xa9, 0x8d, 0x87, 0xe2, 0xf7, 0xa4, 0xe3, 0x59, 0x70, 0xa2, - 0xac, 0xa9, 0x23, 0x77, 0x05, 0x80, 0x5a, 0x68, 0x5c, 0x23, 0x14, 0x72, - 0xf7, 0x44, 0xfd, 0x23, 0x33, 0xd6, 0xbf, 0xd8, 0xd3, 0x1e, 0xc1, 0xe2, - 0xcb, 0xff, 0xfb, 0xf9, 0xfc, 0xd4, 0x74, 0xc0, 0x63, 0xda, 0x0a, 0x16, - 0x5e, 0xcf, 0xba, 0xb2, 0xd8, 0x47, 0xf5, 0xc5, 0xda, 0xf2, 0x35, 0x39, - 0x0a, 0xeb, 0xfe, 0x31, 0xe3, 0x4e, 0x63, 0x15, 0x65, 0xff, 0xff, 0x4b, - 0xd0, 0x38, 0x3f, 0xbf, 0xd6, 0x0e, 0x34, 0x7f, 0x7e, 0xb2, 0xff, 0xf3, - 0x8f, 0x30, 0x98, 0xe7, 0x30, 0xbf, 0x59, 0x7d, 0xe0, 0xbb, 0x10, 0x8e, - 0xbc, 0x39, 0x6b, 0x4d, 0xe2, 0x8f, 0x2c, 0xbf, 0xff, 0xa4, 0xfc, 0xe4, - 0x66, 0xc1, 0x90, 0xf4, 0x4e, 0x2a, 0xcb, 0x40, 0xd1, 0x7a, 0xc2, 0x31, - 0x8d, 0xd7, 0x15, 0x02, 0xf6, 0x3d, 0x0b, 0xe9, 0x78, 0xf8, 0xb2, 0xfe, - 0x7d, 0xb3, 0x09, 0x85, 0x97, 0xf1, 0xb4, 0x18, 0x40, 0x59, 0x7c, 0xfb, - 0x73, 0xcb, 0x2b, 0x47, 0x9f, 0xc2, 0xca, 0x9c, 0xbb, 0x9d, 0x25, 0x61, - 0x91, 0x7d, 0x1b, 0x01, 0xcb, 0x0b, 0x22, 0xbe, 0x11, 0x75, 0xf2, 0xfd, - 0xbc, 0x4f, 0x1f, 0x56, 0x5f, 0xf6, 0x77, 0xd1, 0xae, 0xe0, 0x16, 0x5c, - 0xc3, 0xac, 0xbf, 0x7d, 0x84, 0x19, 0x96, 0x5d, 0xa9, 0x96, 0x5d, 0xa8, - 0x59, 0x50, 0x6b, 0xb0, 0x62, 0xa1, 0x98, 0xcf, 0x25, 0x7c, 0x94, 0xa2, - 0x71, 0xf4, 0x79, 0x7d, 0xe7, 0x81, 0xbf, 0x84, 0x11, 0x15, 0xf4, 0xe0, - 0x22, 0xf3, 0xea, 0xf7, 0xf7, 0x3c, 0x7b, 0xf3, 0x65, 0x97, 0xfd, 0xe0, - 0xf7, 0xd9, 0xa3, 0xe2, 0xcb, 0xdc, 0x79, 0x96, 0x5f, 0x36, 0x3e, 0x92, - 0xcb, 0xff, 0x66, 0xf8, 0x19, 0x67, 0x73, 0xf5, 0x97, 0x61, 0x2c, 0xb6, - 0x7c, 0x7a, 0x9b, 0xcf, 0xef, 0xde, 0xec, 0x49, 0xab, 0x2e, 0x13, 0xf5, - 0x94, 0x68, 0xe2, 0xd3, 0xbf, 0x8a, 0xbf, 0x28, 0xbf, 0xf8, 0xc6, 0xfd, - 0x3e, 0x64, 0xb3, 0xcb, 0x2e, 0x7d, 0xc5, 0x97, 0xb3, 0xee, 0xac, 0xb6, - 0x78, 0xfe, 0x3a, 0x85, 0xb8, 0x33, 0x7f, 0xf7, 0xe2, 0x14, 0x8b, 0x3b, - 0xdc, 0xd9, 0x65, 0xfb, 0x4f, 0xbf, 0x71, 0xd6, 0x54, 0x95, 0x63, 0x0c, - 0xc3, 0xe3, 0x9d, 0x43, 0xfc, 0xa1, 0x6b, 0xd3, 0x7d, 0xe8, 0xd7, 0xed, - 0xf8, 0x46, 0xc2, 0xcb, 0xc4, 0x0d, 0xc5, 0x97, 0xff, 0xf7, 0xdc, 0x27, - 0xe7, 0xb2, 0x59, 0xe3, 0xd7, 0x9d, 0x65, 0xf6, 0x7d, 0xb6, 0xf5, 0x97, - 0xfc, 0x43, 0xc2, 0x0c, 0xb3, 0x8b, 0x2f, 0xbe, 0xe0, 0x7f, 0x59, 0x71, - 0x01, 0x65, 0x41, 0xbb, 0x72, 0x5b, 0xfc, 0x27, 0x4b, 0x36, 0x3d, 0x2c, - 0xbf, 0x10, 0x18, 0x1f, 0xcb, 0x2f, 0x9f, 0x73, 0x09, 0x65, 0xe3, 0xe1, - 0xac, 0xa7, 0x3e, 0x8e, 0x15, 0x74, 0x8e, 0xa1, 0x51, 0x1e, 0x14, 0x98, - 0xfe, 0x96, 0x9c, 0x9b, 0xf7, 0x22, 0x1f, 0x0c, 0x27, 0x2f, 0xfe, 0xda, - 0x04, 0xfc, 0x32, 0x93, 0xf8, 0x2b, 0x2f, 0xfb, 0xc6, 0x33, 0x65, 0xc1, - 0x1a, 0xcb, 0xff, 0xe3, 0x63, 0x0d, 0xba, 0x80, 0xb2, 0xdf, 0xdc, 0x59, - 0x7f, 0x9e, 0x58, 0x3d, 0x73, 0x8b, 0x2f, 0xa3, 0x04, 0x1a, 0xcb, 0xff, - 0xfa, 0x45, 0x19, 0xcc, 0x2e, 0xfb, 0x06, 0x1e, 0xf1, 0x65, 0xfe, 0x60, - 0xfa, 0xfe, 0x17, 0x75, 0x65, 0xfd, 0x1b, 0x4f, 0xe6, 0xa1, 0x65, 0xfe, - 0xc9, 0xbd, 0x9c, 0x72, 0x59, 0x7f, 0xe1, 0xe7, 0xd2, 0xe7, 0x78, 0xff, - 0xac, 0xad, 0x1f, 0x98, 0x4c, 0xaf, 0xb9, 0xcc, 0x15, 0x65, 0xfe, 0x14, - 0x7e, 0xcd, 0xf9, 0xa5, 0x97, 0xff, 0x1b, 0x67, 0x03, 0xc7, 0xe0, 0x1f, - 0x16, 0x5f, 0xec, 0x96, 0x05, 0x96, 0xe4, 0xb2, 0xff, 0xe8, 0x97, 0xa3, - 0xee, 0xc7, 0x9f, 0x75, 0x65, 0x42, 0x3e, 0x34, 0x6d, 0xe4, 0x62, 0x35, - 0xbf, 0xff, 0xc6, 0x59, 0xf7, 0x58, 0x7e, 0xfa, 0x3d, 0x9b, 0xde, 0x4b, - 0x2f, 0x66, 0x12, 0xca, 0xd9, 0x5e, 0x80, 0xd4, 0xc0, 0x67, 0xf1, 0x11, - 0xac, 0xcc, 0x71, 0xa8, 0x51, 0xf8, 0x8b, 0xb1, 0x8d, 0xef, 0x3b, 0xdc, - 0x62, 0xb8, 0xa1, 0x65, 0xfc, 0x3e, 0x7a, 0x05, 0xe2, 0xcb, 0xfe, 0x19, - 0xea, 0x37, 0xff, 0xc9, 0x2c, 0xba, 0x1a, 0xb2, 0xa0, 0xf4, 0xbc, 0x79, - 0x5e, 0x45, 0xbb, 0x8a, 0xf6, 0x10, 0x37, 0xfd, 0xc7, 0xf1, 0x8c, 0x07, - 0xb2, 0xcb, 0xfc, 0xf2, 0xc1, 0xf3, 0x90, 0xb2, 0xfe, 0xef, 0xa1, 0xb3, - 0x12, 0xca, 0x84, 0x4c, 0xe1, 0xcf, 0xe6, 0x55, 0x0b, 0xcd, 0x39, 0x38, - 0x14, 0xf1, 0xb1, 0x86, 0x19, 0xb7, 0xa0, 0xba, 0xb2, 0xff, 0xdb, 0xcf, - 0xbf, 0x84, 0xb8, 0x63, 0x59, 0x7e, 0xce, 0x78, 0x3b, 0x2c, 0xb6, 0xb0, - 0xfa, 0xbc, 0x83, 0x7f, 0xff, 0x9e, 0x42, 0x4b, 0xd8, 0x16, 0x5e, 0x13, - 0x04, 0x59, 0x32, 0xca, 0x84, 0x46, 0x34, 0x9e, 0xfc, 0x7a, 0x94, 0xd0, - 0xb2, 0xff, 0xef, 0x61, 0x3b, 0x1e, 0x3e, 0xc8, 0xd6, 0x58, 0xfc, 0x7d, - 0x7c, 0x28, 0xbf, 0xff, 0x18, 0x40, 0x27, 0xdf, 0xbf, 0x1f, 0x47, 0xf7, - 0xeb, 0x2f, 0xd1, 0x37, 0x8f, 0x4b, 0x2f, 0xe0, 0xf7, 0x91, 0xfe, 0xcb, - 0x2f, 0x9f, 0x51, 0x25, 0x97, 0xff, 0xf1, 0x93, 0x99, 0x7f, 0xa8, 0xf3, - 0x9f, 0x63, 0xcb, 0x28, 0x68, 0xa8, 0x23, 0x0e, 0x90, 0xdf, 0x8f, 0xbc, - 0x0e, 0xcb, 0x2f, 0xfe, 0x89, 0x08, 0x37, 0xdb, 0x1a, 0xfc, 0x59, 0x7f, - 0xf8, 0x8f, 0xfe, 0xfc, 0x03, 0xd0, 0x90, 0x35, 0x97, 0xfd, 0xe1, 0x06, - 0x1e, 0xf3, 0xf8, 0x59, 0x50, 0x88, 0x87, 0x4c, 0xa1, 0xaa, 0x70, 0x02, - 0xd1, 0xc3, 0x41, 0xa5, 0xe4, 0x53, 0xd8, 0x66, 0xdf, 0xcf, 0xfb, 0x98, - 0xcd, 0x65, 0xf3, 0xb7, 0x8e, 0xb2, 0xf4, 0x36, 0x16, 0x56, 0x8f, 0xa3, - 0x85, 0x9b, 0xc8, 0x6f, 0xda, 0x08, 0x3d, 0x0b, 0x2f, 0xed, 0x4d, 0x23, - 0xef, 0x16, 0x58, 0xa0, 0xf5, 0xf0, 0xa2, 0xfb, 0x35, 0x1c, 0x59, 0x7f, - 0xa6, 0x79, 0x9f, 0xe9, 0x71, 0x65, 0xfc, 0xfb, 0x1c, 0xc6, 0x2a, 0xcb, - 0xff, 0xfc, 0xe2, 0xf7, 0x3d, 0x38, 0x79, 0x34, 0x9f, 0x5b, 0x78, 0x2b, - 0x2a, 0x11, 0xd9, 0x84, 0x2e, 0x6c, 0x45, 0xf7, 0xec, 0x2d, 0xb0, 0x55, - 0x97, 0xe7, 0x6f, 0x8c, 0x55, 0x95, 0xb1, 0xe8, 0x0c, 0xa2, 0xff, 0xa3, - 0x61, 0x25, 0xe0, 0xbe, 0xcb, 0x2f, 0xf8, 0xc1, 0x93, 0x39, 0x6c, 0xc9, - 0x59, 0x58, 0x89, 0xcd, 0x11, 0x91, 0xe5, 0xa7, 0xb5, 0x97, 0xe8, 0xd6, - 0xb3, 0xcb, 0x2f, 0x3c, 0xba, 0xb2, 0xff, 0xfa, 0x18, 0x17, 0x0f, 0x78, - 0xae, 0x38, 0xc6, 0xac, 0xbf, 0x89, 0xd8, 0x86, 0xc2, 0xca, 0x64, 0xa3, - 0x5e, 0x42, 0xcd, 0x27, 0x21, 0xc0, 0xa9, 0x5e, 0xd9, 0x86, 0x16, 0x5e, - 0x65, 0x37, 0x7f, 0x59, 0x6d, 0xd5, 0x97, 0xd2, 0x08, 0xd9, 0xcf, 0x26, - 0xe9, 0x82, 0x6b, 0xf9, 0xaf, 0xf4, 0xf5, 0x9e, 0x59, 0x78, 0x57, 0xe2, - 0xcb, 0xf9, 0xb1, 0x85, 0xde, 0x2c, 0xbf, 0x46, 0xd9, 0x23, 0x59, 0x78, - 0x41, 0xb3, 0xc4, 0x51, 0xf8, 0xcf, 0x83, 0xbd, 0x2c, 0xa9, 0x93, 0x35, - 0xf4, 0x39, 0x2f, 0xff, 0x1f, 0x30, 0x73, 0xee, 0x38, 0x28, 0xfd, 0x65, - 0xf7, 0xbc, 0xe3, 0x59, 0x50, 0xa8, 0x98, 0x71, 0xc7, 0x80, 0xa9, 0xd2, - 0xef, 0xff, 0xc6, 0x08, 0x6f, 0x1f, 0x58, 0xd0, 0x81, 0xe4, 0xb2, 0xff, - 0x9f, 0x4f, 0xd3, 0xd3, 0xfe, 0xb2, 0xe3, 0xde, 0xb2, 0xff, 0x41, 0x3f, - 0x82, 0x5b, 0x2c, 0xbf, 0xf1, 0xb1, 0x03, 0x32, 0x7d, 0x30, 0xb2, 0xff, - 0xf6, 0x7d, 0xdf, 0xba, 0x62, 0xe0, 0xde, 0x4b, 0x2b, 0x11, 0x15, 0xf9, - 0xf5, 0xbc, 0xb2, 0xa4, 0x9c, 0xa0, 0x15, 0x37, 0x4e, 0x1a, 0x30, 0x50, - 0xbc, 0x09, 0x1d, 0xe1, 0xc3, 0x56, 0x5f, 0xdf, 0xe4, 0xd1, 0xf7, 0x16, - 0x5f, 0xfb, 0xd8, 0x40, 0x9d, 0x83, 0x3d, 0xeb, 0x2f, 0xff, 0xf1, 0x38, - 0xbe, 0xc6, 0xb8, 0xbd, 0xe6, 0x0a, 0x33, 0x6a, 0xcb, 0xde, 0xc9, 0x96, - 0x5f, 0xee, 0xe6, 0xb2, 0x68, 0x61, 0x65, 0x62, 0x64, 0x86, 0x61, 0x32, - 0x0f, 0x98, 0xba, 0x3b, 0x7f, 0x98, 0x2c, 0xdb, 0x60, 0x92, 0xca, 0x84, - 0xef, 0xf2, 0x34, 0x00, 0xa5, 0x5f, 0xde, 0x79, 0x47, 0x24, 0xb2, 0xff, - 0xb3, 0xc7, 0xf7, 0x3c, 0x1e, 0x2c, 0xbb, 0x08, 0x07, 0xcf, 0xf9, 0x6d, - 0xff, 0xbe, 0x94, 0x77, 0xb0, 0xed, 0xd9, 0x65, 0xff, 0xec, 0xf3, 0xbb, - 0x49, 0xf4, 0x71, 0xc5, 0x96, 0xc6, 0xa2, 0x1b, 0x7a, 0x05, 0xf9, 0xff, - 0x1e, 0x12, 0xca, 0xf1, 0xe8, 0x91, 0x55, 0xf8, 0xe7, 0xf3, 0x4c, 0x2c, - 0xb9, 0xe1, 0x65, 0xcc, 0x49, 0x65, 0xfb, 0xc7, 0xbc, 0xc0, 0xb2, 0xec, - 0xf4, 0x8f, 0x04, 0x03, 0x14, 0xd4, 0x57, 0x70, 0xae, 0x7d, 0x5a, 0xf0, - 0xa2, 0x8a, 0x92, 0xff, 0xda, 0x20, 0xb8, 0x99, 0x34, 0x35, 0x63, 0x33, - 0x41, 0x7a, 0x63, 0x15, 0x65, 0xef, 0x07, 0xf5, 0x96, 0xf1, 0x9b, 0xc9, - 0x87, 0xac, 0x05, 0x95, 0x08, 0xc5, 0xc8, 0x46, 0xe8, 0x9e, 0xff, 0x40, - 0xf2, 0x50, 0x40, 0x59, 0x50, 0xd9, 0x8a, 0x6d, 0x18, 0x8c, 0xa1, 0x1b, - 0x92, 0xa5, 0xce, 0x19, 0x3b, 0xb0, 0x88, 0x9a, 0x31, 0x1d, 0x46, 0x4a, - 0xd8, 0xc1, 0x7d, 0x29, 0xcd, 0xe3, 0xd7, 0x29, 0x43, 0xdc, 0x84, 0xe7, - 0x63, 0x04, 0x0c, 0x33, 0xc5, 0x8c, 0x60, 0x43, 0x3b, 0xe3, 0xd3, 0xfe, - 0xb2, 0xff, 0x0f, 0xd1, 0xb1, 0x67, 0xcb, 0x29, 0xa7, 0xad, 0xf9, 0x15, - 0xf6, 0xb5, 0x9e, 0x59, 0x7f, 0x78, 0xf7, 0x37, 0x02, 0xc2, 0xca, 0x83, - 0xd7, 0x01, 0x15, 0x99, 0x6b, 0x2c, 0x6b, 0x2f, 0xfb, 0xb1, 0xae, 0x7a, - 0x0b, 0xab, 0x2c, 0xcb, 0x59, 0x7f, 0xdd, 0x8d, 0x73, 0xd0, 0x5d, 0x59, - 0x77, 0x21, 0x65, 0xe6, 0x8e, 0x16, 0x5f, 0xe2, 0xeb, 0xcd, 0xc8, 0xea, - 0xca, 0x33, 0xcf, 0x71, 0xcb, 0xe3, 0x7c, 0x02, 0xcb, 0xff, 0x66, 0xf2, - 0xce, 0x4c, 0x50, 0x35, 0x97, 0xc0, 0x1c, 0x6c, 0xb2, 0xef, 0xe1, 0x65, - 0xee, 0x1e, 0x96, 0x56, 0x1e, 0xb7, 0xe4, 0x7d, 0x17, 0xbf, 0xd2, 0xc2, - 0x31, 0xe1, 0x2c, 0xbd, 0xde, 0x33, 0x84, 0xf9, 0xb0, 0x56, 0x63, 0x8f, - 0x32, 0xfe, 0x40, 0x44, 0x1c, 0x84, 0xaf, 0x4b, 0xee, 0xe4, 0x2c, 0xbc, - 0xd1, 0xc2, 0xcb, 0xfc, 0x5d, 0x79, 0xb9, 0x1d, 0x59, 0x46, 0x79, 0xee, - 0x39, 0x7c, 0x6f, 0x80, 0x59, 0x7f, 0xec, 0xde, 0x59, 0xc9, 0x8a, 0x06, - 0xb2, 0xf8, 0x03, 0x8d, 0x96, 0x5f, 0xd3, 0x7e, 0x7b, 0xaf, 0x32, 0xcb, - 0xbf, 0x85, 0x97, 0xb8, 0x7a, 0x59, 0x58, 0x88, 0x90, 0x11, 0xfe, 0x67, - 0xd1, 0x7b, 0xfd, 0x2c, 0x23, 0x1e, 0x12, 0xcb, 0xf8, 0x9c, 0x78, 0xc3, - 0x38, 0x5c, 0xa7, 0x18, 0xae, 0x08, 0x02, 0x50, 0xf4, 0xd0, 0x8a, 0xf3, - 0x2f, 0xe4, 0x04, 0x41, 0xc8, 0x64, 0x74, 0xf6, 0xff, 0xed, 0x47, 0xdc, - 0x28, 0x6e, 0x7d, 0xd5, 0x97, 0xff, 0xe7, 0x1e, 0x61, 0x30, 0x21, 0x41, - 0x6c, 0x7a, 0x59, 0x79, 0xf5, 0xb2, 0xe4, 0x12, 0x5f, 0x4b, 0x3e, 0x92, - 0xe4, 0x12, 0x5e, 0xe1, 0x8d, 0x72, 0x09, 0x2e, 0x14, 0x55, 0xc8, 0x24, - 0xa0, 0x22, 0xa6, 0x62, 0xae, 0x98, 0x0a, 0x53, 0x73, 0xf5, 0x32, 0x09, - 0x0c, 0xcd, 0xfd, 0xff, 0xff, 0xc3, 0x28, 0x1f, 0xa3, 0xbc, 0x8e, 0xc0, - 0xe3, 0xb8, 0xdf, 0xc5, 0x59, 0x7f, 0x67, 0xb3, 0x09, 0x85, 0x97, 0x9c, - 0xbf, 0x9c, 0xbf, 0xbf, 0x13, 0x99, 0x1a, 0x86, 0x13, 0x51, 0x4a, 0x33, - 0xce, 0x1b, 0x75, 0xca, 0xfa, 0x7f, 0x1f, 0xcb, 0x2d, 0x9b, 0xa8, 0xaf, - 0xfe, 0x11, 0x76, 0x92, 0xcb, 0xfa, 0x41, 0xdb, 0xa7, 0xb2, 0x4b, 0xed, - 0x7e, 0x7d, 0x59, 0x7c, 0xe3, 0xf6, 0x2c, 0xbc, 0x33, 0x6a, 0xcb, 0xff, - 0x7a, 0x3a, 0x65, 0x0d, 0x8e, 0x2c, 0xa8, 0x44, 0xe3, 0x04, 0x6e, 0x43, - 0xc1, 0xca, 0x99, 0x30, 0x8f, 0x43, 0x32, 0xff, 0xa0, 0xa4, 0x51, 0xfb, - 0xb5, 0x65, 0xfc, 0x03, 0xe7, 0x73, 0xcb, 0x2f, 0xc7, 0xdd, 0x05, 0xab, - 0x2f, 0xa3, 0xc1, 0xd2, 0xcb, 0xde, 0x7e, 0xac, 0xad, 0x8f, 0x9a, 0x62, - 0x8e, 0x11, 0x5a, 0x16, 0x5f, 0xe3, 0x90, 0x5f, 0x9e, 0x35, 0x97, 0xf6, - 0x6f, 0x76, 0xe7, 0x96, 0x5a, 0x49, 0x2f, 0x3e, 0xb6, 0x49, 0x49, 0x2a, - 0x0d, 0xc8, 0x04, 0x5a, 0x3b, 0x7a, 0x3f, 0x02, 0x46, 0x66, 0xb6, 0x9a, - 0x8c, 0x32, 0x84, 0xa5, 0xe2, 0x97, 0x96, 0x5e, 0xfa, 0x5c, 0x59, 0x50, - 0x9a, 0xb6, 0x43, 0xd5, 0xa4, 0xee, 0x39, 0x7f, 0x9f, 0x6c, 0x2d, 0x8f, - 0x4b, 0x2f, 0xda, 0xfd, 0xa7, 0xc5, 0x97, 0xf0, 0x85, 0x2e, 0x78, 0x6b, - 0x30, 0xd4, 0xdf, 0xdd, 0xe7, 0xee, 0xfa, 0x59, 0x7d, 0x00, 0x3e, 0x2c, - 0xbe, 0x0b, 0xea, 0x4b, 0x2c, 0xd5, 0x96, 0x90, 0xcd, 0x9c, 0xc4, 0x55, - 0x08, 0xaa, 0xd8, 0xbb, 0x15, 0x2f, 0xfe, 0xcf, 0xbb, 0xc3, 0x28, 0xfd, - 0xda, 0xb2, 0xf4, 0xa3, 0xe5, 0x97, 0xd9, 0x31, 0xb5, 0x65, 0x6c, 0x88, - 0x39, 0x91, 0x05, 0x1d, 0xbf, 0x44, 0xd2, 0x8f, 0xd2, 0x5e, 0xc2, 0xfd, - 0x65, 0xff, 0xfb, 0xd8, 0x72, 0xe4, 0xee, 0xfb, 0x06, 0x1e, 0xf1, 0x65, - 0x01, 0x13, 0xba, 0x29, 0xe8, 0xe5, 0xff, 0x7e, 0xe5, 0xd9, 0xb3, 0x58, - 0xb2, 0xc6, 0xb2, 0xff, 0xb6, 0x0c, 0x87, 0xe0, 0xb9, 0x2c, 0xbf, 0x8e, - 0x1b, 0xb6, 0x0a, 0xb2, 0xfd, 0x9b, 0x37, 0x1a, 0xb2, 0xf7, 0x0f, 0x4b, - 0x28, 0x8f, 0x13, 0xa5, 0x17, 0xf1, 0x3f, 0xff, 0x87, 0x8b, 0x2f, 0xe3, - 0x60, 0x48, 0x6b, 0x31, 0xa6, 0x19, 0x82, 0x1a, 0x3a, 0xe3, 0x97, 0x48, - 0x6b, 0x15, 0x5a, 0x9c, 0x34, 0x1c, 0xc0, 0xa3, 0x45, 0xbf, 0xbd, 0xec, - 0xdb, 0xbc, 0x59, 0x7b, 0x36, 0x0a, 0xca, 0xc3, 0xcc, 0x22, 0xfb, 0xfe, - 0xce, 0xce, 0x2c, 0xfc, 0x4f, 0x96, 0x54, 0x36, 0x56, 0xf2, 0xa4, 0x84, - 0x0c, 0xc7, 0x23, 0x19, 0x60, 0xab, 0xe3, 0x73, 0x84, 0x9e, 0x8c, 0x7d, - 0x1b, 0x33, 0xa0, 0x7e, 0xb8, 0x50, 0xe8, 0xe4, 0xb6, 0x7e, 0xc2, 0x4a, - 0x7c, 0x82, 0xff, 0xfd, 0xb6, 0xb5, 0x83, 0x76, 0xf9, 0xfa, 0x51, 0x32, - 0xcb, 0xff, 0xff, 0xc1, 0xd0, 0x66, 0x27, 0xff, 0x9c, 0xc6, 0x30, 0x3a, - 0x71, 0xc7, 0xa1, 0x65, 0xff, 0xf6, 0x76, 0x3b, 0xcd, 0x41, 0x77, 0xd9, - 0x25, 0x97, 0xf0, 0x63, 0x5a, 0x3d, 0x96, 0x5f, 0xd2, 0x8f, 0xfc, 0x62, - 0xac, 0xbf, 0x9c, 0x7e, 0x82, 0x0a, 0xcb, 0xe0, 0x31, 0xaf, 0xd6, 0x59, - 0x98, 0xd1, 0x5d, 0x31, 0x73, 0x4b, 0xc8, 0xb2, 0xfa, 0x37, 0x47, 0x0b, - 0x2f, 0xb7, 0x3c, 0x11, 0x16, 0x5f, 0xf4, 0x4c, 0x11, 0x38, 0x78, 0x4b, - 0x2f, 0x0a, 0x28, 0xa9, 0x2e, 0x94, 0x24, 0x66, 0x68, 0x2f, 0xbb, 0xe8, - 0xfd, 0x65, 0xde, 0xd2, 0xcb, 0xde, 0x9e, 0xc5, 0x59, 0x7d, 0x36, 0x60, - 0x16, 0x54, 0x2b, 0x5b, 0xd9, 0x5a, 0x4f, 0x39, 0x0f, 0xc0, 0x22, 0xfc, - 0x49, 0x31, 0x3e, 0x96, 0x5c, 0xa3, 0xa4, 0x7b, 0xc5, 0xc5, 0x23, 0xbe, - 0x1e, 0x66, 0x96, 0x5f, 0xfe, 0xec, 0xd9, 0xad, 0x3c, 0xd9, 0xac, 0xea, - 0xca, 0xc3, 0xec, 0x32, 0x1b, 0xf9, 0x88, 0xd6, 0xb3, 0xcb, 0x2f, 0xed, - 0xa6, 0x94, 0xf7, 0xad, 0x96, 0x5f, 0xfe, 0xfd, 0xaf, 0x29, 0xd0, 0x3d, - 0x9b, 0x1a, 0x59, 0x7c, 0x70, 0x5d, 0x59, 0x7b, 0x67, 0x25, 0x95, 0xa4, - 0x45, 0x79, 0x3b, 0xa4, 0x17, 0xfe, 0x60, 0x3c, 0x91, 0xeb, 0x60, 0xfe, - 0xb2, 0xe2, 0xc5, 0x97, 0x84, 0xf8, 0x96, 0x5d, 0xf0, 0xab, 0x2f, 0xb3, - 0x76, 0x1a, 0xb2, 0x9c, 0xde, 0xf0, 0x66, 0x98, 0x46, 0x99, 0xa1, 0xb4, - 0x57, 0xcb, 0x77, 0x8e, 0x1a, 0xb2, 0xe7, 0x1a, 0xcb, 0x6d, 0xa3, 0x63, - 0xd1, 0xbb, 0xef, 0x0f, 0x09, 0x65, 0xff, 0xf4, 0x09, 0xd2, 0x8f, 0xdf, - 0xbf, 0x88, 0x52, 0x59, 0x4c, 0x85, 0x59, 0xb9, 0x0c, 0x13, 0x8c, 0x0d, - 0xdb, 0xb8, 0x51, 0xd2, 0x1b, 0xe1, 0x07, 0xe3, 0x59, 0x7f, 0xe7, 0xef, - 0x05, 0xcf, 0x7e, 0xfd, 0x59, 0x7e, 0xff, 0x06, 0xf2, 0x59, 0x7f, 0xff, - 0xec, 0xec, 0x00, 0xb3, 0x0a, 0x25, 0xdf, 0x3b, 0x4b, 0x37, 0xac, 0xad, - 0x91, 0xe8, 0x32, 0x3d, 0x20, 0x0a, 0x51, 0x78, 0x41, 0xcc, 0xb2, 0xf4, - 0x8c, 0x96, 0x5f, 0xfc, 0x6d, 0x27, 0x63, 0x9e, 0x82, 0xea, 0xcb, 0xed, - 0x84, 0xdc, 0x15, 0x65, 0xff, 0x47, 0x9c, 0xfb, 0x31, 0x8a, 0xb2, 0xff, - 0xdf, 0xe6, 0x8f, 0xfc, 0xff, 0x4d, 0x59, 0x7f, 0xf9, 0x88, 0xe6, 0xa3, - 0xc5, 0x9d, 0x86, 0xac, 0xb8, 0x22, 0x2c, 0xbf, 0xe0, 0xcb, 0x38, 0x26, - 0xc1, 0x25, 0x97, 0xf8, 0xb3, 0x79, 0xcc, 0x62, 0xac, 0xaf, 0x22, 0x20, - 0x86, 0x38, 0x77, 0x7f, 0xff, 0x05, 0xf6, 0x00, 0x76, 0xee, 0x78, 0xb3, - 0xbe, 0x35, 0x97, 0xe8, 0x98, 0x83, 0xc5, 0x95, 0x89, 0xc2, 0x1c, 0x34, - 0x7c, 0x5f, 0xd5, 0xcb, 0x8c, 0x96, 0x5f, 0xce, 0x5f, 0xe7, 0x58, 0x59, - 0x50, 0xad, 0x9f, 0x63, 0xf9, 0x0f, 0xb0, 0x36, 0xe8, 0x64, 0x53, 0xc3, - 0x9e, 0xc7, 0x8b, 0xbd, 0x06, 0x7c, 0x56, 0xf8, 0xbb, 0x13, 0xeb, 0x2f, - 0xdb, 0xe3, 0x4f, 0xe5, 0x97, 0xde, 0x0b, 0x61, 0x65, 0x2c, 0xa5, 0x96, - 0x76, 0x96, 0xdc, 0x0b, 0xb8, 0x2c, 0xb5, 0x97, 0xde, 0xcf, 0xdd, 0x65, - 0x32, 0x11, 0xce, 0x64, 0x8e, 0x52, 0x47, 0x01, 0x25, 0xde, 0x37, 0x66, - 0x6c, 0x88, 0x4a, 0xe3, 0xb2, 0x61, 0x95, 0x3c, 0xc2, 0x8e, 0x7b, 0x85, - 0x3b, 0x2b, 0x2c, 0x9e, 0x24, 0x8c, 0xab, 0x28, 0x45, 0x94, 0x84, 0x64, - 0xf0, 0x2c, 0x89, 0xef, 0x7d, 0xa5, 0xf8, 0xca, 0x5b, 0x10, 0xe7, 0xa2, - 0x32, 0x9e, 0x8e, 0xc4, 0x7a, 0x20, 0x96, 0x85, 0xf4, 0xad, 0x83, 0x97, - 0x29, 0xbb, 0x0c, 0x59, 0xa5, 0x89, 0xea, 0x74, 0xed, 0xb3, 0x90, 0xfe, - 0xa7, 0xab, 0xbc, 0xb7, 0xbf, 0xe5, 0x4a, 0xb2, 0xdd, 0x0a, 0x7a, 0xc7, - 0x95, 0x9b, 0x27, 0x6b, 0x45, 0x20, 0xce, 0x2c, 0x6f, 0x8c, 0x6c, 0x52, - 0x09, 0xf9, 0x5f, 0x62, 0x4e, 0x60, 0x6e, 0x46, 0xfd, 0x7f, 0xfb, 0x66, - 0xc7, 0xcc, 0xd9, 0x0c, 0xa7, 0x49, 0xff, 0x59, 0x4e, 0xad, 0x20, 0x32, - 0xbc, 0x2f, 0x8c, 0xbf, 0x35, 0x97, 0x9d, 0xbc, 0x59, 0x52, 0x37, 0xbb, - 0xc8, 0x6f, 0xcd, 0xc3, 0x7f, 0xd6, 0x5f, 0x01, 0xdc, 0x0a, 0x8a, 0x29, - 0x7f, 0xfe, 0x7f, 0xe0, 0x1e, 0x3e, 0x78, 0xfb, 0xec, 0x25, 0x95, 0xa4, - 0x41, 0x11, 0x75, 0xf7, 0x74, 0x7f, 0x2c, 0xbf, 0xf4, 0x74, 0xff, 0x89, - 0x77, 0x93, 0xd2, 0xcb, 0xfb, 0x3f, 0x13, 0x4f, 0xfa, 0xcb, 0xcf, 0x26, - 0x70, 0x9b, 0x16, 0x42, 0xa4, 0xc8, 0xb4, 0x47, 0xd4, 0x4b, 0xff, 0xa1, - 0xf4, 0x41, 0x7f, 0xb3, 0xce, 0xb2, 0xff, 0xfc, 0x33, 0x98, 0xa3, 0xbc, - 0xef, 0xc0, 0x32, 0xd9, 0x65, 0x99, 0xe2, 0xa7, 0xe6, 0xc7, 0x0b, 0xe6, - 0x0e, 0x21, 0x5f, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x74, 0x2f, 0xfe, - 0x66, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x12, 0x5a, 0xfd, 0xa0, 0x3b, - 0x81, 0x51, 0x79, 0x2e, 0x7d, 0xeb, 0x2c, 0xcf, 0x0f, 0x32, 0x7c, 0xd2, - 0xa2, 0x14, 0xdb, 0x3b, 0x46, 0x95, 0x24, 0xac, 0x84, 0xe0, 0x21, 0x61, - 0x32, 0x33, 0x50, 0x7d, 0x3a, 0xae, 0xe7, 0xe5, 0x89, 0x99, 0xde, 0x4a, - 0xe6, 0xea, 0x60, 0x50, 0x77, 0xc2, 0x82, 0xff, 0xf3, 0x36, 0xbc, 0x99, - 0xe6, 0x80, 0xee, 0x05, 0x44, 0xb2, 0xbe, 0x64, 0x31, 0x3e, 0xc8, 0x59, - 0x69, 0xed, 0x65, 0xb7, 0x16, 0x5b, 0xcb, 0x29, 0x90, 0x6e, 0xe7, 0x91, - 0x60, 0x8a, 0x5f, 0xe3, 0x1f, 0xb0, 0xc9, 0x85, 0x97, 0xde, 0x7e, 0x85, - 0x65, 0xf7, 0xa3, 0x75, 0xab, 0x2f, 0xfd, 0x9e, 0x39, 0x16, 0x60, 0x59, - 0x6b, 0x2f, 0xfd, 0x87, 0xbc, 0xc8, 0x32, 0xce, 0x2c, 0xbc, 0x10, 0x3a, - 0xca, 0x92, 0x62, 0x66, 0x65, 0xba, 0x44, 0xd2, 0x52, 0x40, 0x10, 0xfa, - 0xfe, 0x1f, 0x42, 0xf2, 0xe2, 0xcb, 0xe3, 0xdd, 0x8d, 0x96, 0x5f, 0xcd, - 0x82, 0x63, 0x36, 0x59, 0x73, 0xb5, 0x65, 0x61, 0xe2, 0x74, 0xba, 0xfc, - 0x1e, 0x9f, 0xa1, 0x65, 0xff, 0xbd, 0x1e, 0x36, 0x3b, 0xc7, 0xfd, 0x65, - 0xff, 0x3c, 0xb8, 0x1e, 0xc7, 0x78, 0xb2, 0xfe, 0x2e, 0xea, 0x1c, 0x0b, - 0x2e, 0x7e, 0x2c, 0xbf, 0xff, 0x3b, 0xc9, 0xfd, 0x3b, 0x36, 0x0f, 0x4f, - 0xd0, 0xb2, 0xb6, 0x3e, 0xc9, 0x85, 0xaf, 0x3b, 0x81, 0x51, 0x19, 0xaf, - 0xf4, 0x7d, 0x28, 0xd3, 0x64, 0xb2, 0xff, 0xff, 0xb9, 0xde, 0x9f, 0xbe, - 0x97, 0x08, 0x38, 0xc3, 0x06, 0xf2, 0x59, 0x6c, 0xfd, 0x13, 0xbd, 0x34, - 0xa0, 0x23, 0xbb, 0x50, 0xc5, 0xbf, 0x8e, 0x1b, 0xb6, 0x0a, 0xb2, 0xe2, - 0x92, 0xcb, 0x35, 0x65, 0xf8, 0xf5, 0xe7, 0x67, 0xa3, 0xd5, 0x69, 0x70, - 0x82, 0xd6, 0xf2, 0xcb, 0xa3, 0x4b, 0x2c, 0x60, 0x34, 0xfb, 0xc4, 0x6f, - 0x8f, 0x4f, 0xa5, 0x97, 0x73, 0x75, 0x65, 0x9e, 0x46, 0xef, 0xa4, 0x37, - 0xff, 0x70, 0xc3, 0xcc, 0x20, 0xcb, 0x38, 0xb2, 0xe8, 0xf9, 0x65, 0xe3, - 0x20, 0x2c, 0xae, 0x1b, 0x2e, 0x8b, 0xdf, 0xff, 0x32, 0xcf, 0xbc, 0x3e, - 0x94, 0x05, 0xf4, 0xc2, 0xca, 0xd9, 0x72, 0xba, 0x44, 0xe3, 0x40, 0xc3, - 0x93, 0x84, 0xc6, 0xa3, 0x12, 0x6b, 0xef, 0x9d, 0x49, 0x8f, 0x84, 0xdd, - 0x75, 0x09, 0x0d, 0xff, 0x69, 0xc5, 0xf1, 0xc6, 0xa1, 0x65, 0xff, 0xfe, - 0xf1, 0xf7, 0xa7, 0xc1, 0x36, 0x8d, 0x8b, 0x3f, 0x0f, 0x16, 0x5f, 0xba, - 0x6d, 0x89, 0x96, 0x5f, 0xd9, 0x13, 0xa3, 0x8d, 0x59, 0x69, 0x61, 0xeb, - 0x70, 0xa2, 0xfd, 0xec, 0x27, 0x6a, 0xcb, 0xef, 0xbd, 0x1c, 0x59, 0x7a, - 0x67, 0x25, 0x97, 0xa3, 0xbc, 0x59, 0x7f, 0xec, 0x63, 0x91, 0x84, 0x3f, - 0x42, 0xca, 0xe1, 0xec, 0x84, 0x72, 0xa4, 0x8e, 0x0c, 0x26, 0x98, 0x8f, - 0x8e, 0xb7, 0xff, 0x74, 0xf4, 0xff, 0xce, 0xfa, 0x50, 0xd5, 0x97, 0xe2, - 0x89, 0x71, 0xd6, 0x51, 0x9f, 0x76, 0xf4, 0x8b, 0x79, 0x65, 0xff, 0xff, - 0xdd, 0x36, 0xe8, 0xf3, 0xe2, 0x0f, 0x63, 0xd3, 0xb7, 0x9f, 0x66, 0x85, - 0x95, 0x88, 0x87, 0xe8, 0x8d, 0xff, 0x43, 0x7c, 0xfd, 0x72, 0xfd, 0x65, - 0x61, 0xed, 0x19, 0x15, 0xfd, 0x2e, 0x71, 0xca, 0x4b, 0x2f, 0x6d, 0xce, - 0x2c, 0xa7, 0x3c, 0xb2, 0x2d, 0xb9, 0xc6, 0xb2, 0xfd, 0x27, 0x20, 0x81, - 0x65, 0x00, 0xde, 0xfc, 0x2d, 0x73, 0x81, 0x65, 0xd1, 0xba, 0xb2, 0xb6, - 0x35, 0xec, 0xb1, 0x6b, 0xff, 0x75, 0xcb, 0xf9, 0xc2, 0x67, 0xc2, 0xac, - 0xbe, 0xef, 0x61, 0xab, 0x2f, 0xa5, 0xd3, 0xd9, 0x65, 0x62, 0x22, 0x58, - 0x44, 0x72, 0x2b, 0xc5, 0x80, 0x59, 0x7f, 0xe0, 0x1f, 0x4d, 0xb3, 0x70, - 0xc9, 0x65, 0xff, 0xa0, 0xf5, 0xde, 0xe4, 0x6b, 0xf5, 0x96, 0xec, 0x1f, - 0xe4, 0xc7, 0xd7, 0xf9, 0xb9, 0xaf, 0xc8, 0x3f, 0xac, 0xb4, 0x96, 0x56, - 0x26, 0x0a, 0x70, 0x97, 0x72, 0x81, 0x0d, 0x6f, 0xdf, 0xc7, 0x60, 0x6b, - 0x2a, 0x15, 0x4e, 0xe2, 0x89, 0xc2, 0xbd, 0xe3, 0x34, 0x0a, 0x0d, 0xff, - 0xf0, 0x7b, 0xcf, 0xa5, 0x05, 0xff, 0x27, 0x04, 0x96, 0x5e, 0x8e, 0xc2, - 0xca, 0x19, 0xf7, 0xef, 0x54, 0xbe, 0x68, 0x7a, 0x15, 0x97, 0xbd, 0x84, - 0xb2, 0x8c, 0xf8, 0xbc, 0x48, 0x12, 0x3b, 0xbd, 0x32, 0xcb, 0xec, 0x9b, - 0x26, 0x59, 0x7e, 0xd0, 0x7b, 0x9b, 0x2c, 0xbe, 0xcd, 0x0e, 0x16, 0x5b, - 0x93, 0x8f, 0xb6, 0x08, 0xc8, 0xa6, 0xde, 0x59, 0x5f, 0x1e, 0x33, 0x9a, - 0xd1, 0xa3, 0xb5, 0xe1, 0x97, 0x7f, 0xdd, 0xe6, 0x6b, 0xf2, 0x0f, 0xeb, - 0x2f, 0xff, 0x6a, 0x3b, 0xcf, 0x41, 0xf7, 0x91, 0xb2, 0xcb, 0xee, 0xbf, - 0xa1, 0x65, 0xf7, 0x7c, 0x19, 0xf5, 0x97, 0xfb, 0x23, 0x4f, 0x23, 0xf2, - 0xcb, 0xfc, 0x62, 0xf2, 0x3c, 0xfb, 0xab, 0x2b, 0x47, 0xcf, 0xd3, 0x1b, - 0xf7, 0x7d, 0xf6, 0x6e, 0x2c, 0xa1, 0xa6, 0x8d, 0xf2, 0x51, 0x90, 0xb6, - 0x11, 0xbe, 0x22, 0xbf, 0x71, 0xd8, 0xf1, 0xac, 0xbf, 0xed, 0xd1, 0xf8, - 0x3c, 0xfa, 0x4e, 0xb2, 0xe3, 0xf6, 0x1f, 0x30, 0x4a, 0x2a, 0x15, 0x31, - 0xe4, 0x70, 0x2f, 0x0b, 0x6b, 0xfc, 0x72, 0x89, 0x43, 0x64, 0xb2, 0xf0, - 0x99, 0x3d, 0xac, 0xbf, 0xfd, 0x1a, 0x8f, 0xfc, 0x71, 0xaf, 0xdb, 0x25, - 0x97, 0xff, 0x83, 0xfb, 0x4c, 0xb3, 0xf2, 0xc7, 0x99, 0x65, 0xfe, 0x3f, - 0x1c, 0x14, 0xc1, 0x59, 0x7f, 0x8f, 0x59, 0x85, 0xf7, 0x56, 0x54, 0x1f, - 0x23, 0x99, 0x5f, 0xf8, 0x23, 0xd6, 0x07, 0xd0, 0xdc, 0x59, 0x7f, 0xff, - 0xe2, 0xcf, 0xe7, 0xf2, 0x71, 0x66, 0xc2, 0x4a, 0x77, 0x38, 0x62, 0xf1, - 0x65, 0x42, 0xa2, 0x1c, 0x32, 0x32, 0x2d, 0x25, 0xfa, 0x15, 0xdc, 0x20, - 0xe9, 0xf5, 0xf9, 0xf8, 0x47, 0x0b, 0x2f, 0xff, 0x48, 0xf4, 0x3f, 0x07, - 0x58, 0x0f, 0x62, 0xcb, 0xee, 0x85, 0xfa, 0xb2, 0xf6, 0xfc, 0xd2, 0xca, - 0x83, 0xc0, 0xc2, 0x2b, 0x8f, 0x8b, 0x29, 0x84, 0x72, 0xfc, 0x4a, 0x50, - 0x8a, 0x9f, 0x20, 0xbc, 0x10, 0x8d, 0x65, 0xfd, 0x31, 0xfb, 0x58, 0xd5, - 0x97, 0x18, 0xab, 0x2e, 0xdc, 0xc5, 0x94, 0xe7, 0xbd, 0xc2, 0xee, 0x8b, - 0xdf, 0xdc, 0x8e, 0xf3, 0xc6, 0xb2, 0xfc, 0x58, 0xdd, 0x62, 0xcb, 0xed, - 0x6f, 0xc1, 0xac, 0xac, 0x3f, 0x76, 0x96, 0x84, 0x9a, 0xfd, 0xe8, 0xd3, - 0x64, 0xb2, 0xf0, 0xf3, 0xab, 0x2f, 0xf6, 0x14, 0xef, 0x46, 0x6e, 0xac, - 0xbf, 0xf1, 0xf7, 0x98, 0x39, 0x8a, 0x06, 0xb2, 0xfb, 0xf3, 0xfa, 0x4b, - 0x2f, 0xf4, 0x17, 0x4f, 0x62, 0x85, 0x97, 0xff, 0x8f, 0x47, 0xb4, 0x16, - 0x7b, 0x41, 0xde, 0xb2, 0xa4, 0x9a, 0xc0, 0xca, 0x1a, 0x39, 0xe3, 0x6f, - 0xcf, 0x88, 0x93, 0xa6, 0x37, 0xff, 0xa0, 0x80, 0xfd, 0x76, 0x04, 0xda, - 0x36, 0x59, 0x7f, 0xe3, 0x18, 0x7b, 0xc7, 0xeb, 0xb0, 0xb2, 0xfe, 0xc1, - 0x7e, 0x97, 0x27, 0x30, 0x88, 0xb7, 0x4c, 0xbf, 0xf8, 0x48, 0xf8, 0x42, - 0x2c, 0x3f, 0xba, 0xb2, 0x8d, 0x12, 0x0e, 0x95, 0x4c, 0x86, 0xf0, 0xbe, - 0x79, 0x6a, 0x88, 0xd2, 0xb6, 0x5a, 0x91, 0x70, 0xda, 0x72, 0x73, 0x3d, - 0x88, 0x58, 0x80, 0xe3, 0xe8, 0x5d, 0x1c, 0x60, 0xf3, 0x42, 0xaf, 0x51, - 0x82, 0x35, 0xaf, 0xd2, 0xbe, 0x9e, 0x32, 0x4f, 0xe3, 0x1b, 0x29, 0x51, - 0x3c, 0x94, 0xb7, 0xd8, 0xd3, 0x42, 0x8d, 0xbd, 0xee, 0x7e, 0x14, 0xa2, - 0x47, 0x0d, 0xb9, 0x1c, 0x05, 0xff, 0x76, 0x07, 0xad, 0x43, 0x78, 0xb2, - 0xe6, 0x00, 0xb2, 0xfe, 0x6c, 0xa2, 0x38, 0x6b, 0x2e, 0x7f, 0xd6, 0x54, - 0x1e, 0x1b, 0x96, 0x5f, 0x0d, 0xdf, 0xe5, 0x97, 0xf1, 0xfc, 0x60, 0x81, - 0x16, 0x53, 0x9e, 0x81, 0x11, 0x5e, 0x03, 0xef, 0x59, 0x77, 0x59, 0xc2, - 0x68, 0x4d, 0x39, 0xf2, 0xdb, 0xb8, 0x74, 0x82, 0xff, 0xff, 0xe0, 0xfd, - 0x26, 0x6e, 0x5d, 0xc6, 0xf0, 0x7e, 0x8d, 0x0d, 0xdc, 0x55, 0x94, 0xcd, - 0x5e, 0xa6, 0x4b, 0x08, 0x25, 0x7b, 0xff, 0xcc, 0xda, 0xf2, 0x67, 0x9a, - 0x03, 0xb8, 0x15, 0x13, 0x4a, 0xff, 0xf3, 0x36, 0xbc, 0x99, 0xe6, 0x80, - 0xee, 0x05, 0x44, 0xe2, 0xbf, 0x48, 0xcb, 0xf3, 0x59, 0x7e, 0x96, 0x76, - 0x52, 0x59, 0x7f, 0xb7, 0xc7, 0xa7, 0x14, 0x49, 0x65, 0xff, 0x9e, 0x4c, - 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x81, 0x5f, 0xfe, 0x38, 0x6b, 0x8f, 0x51, - 0xdf, 0x60, 0xd6, 0x5f, 0x70, 0xbe, 0x92, 0xcb, 0x33, 0xc4, 0xcf, 0x3e, - 0x27, 0x32, 0x86, 0x9b, 0x79, 0x33, 0xa9, 0x17, 0xc0, 0x77, 0x02, 0xa2, - 0xe0, 0x5f, 0xe1, 0xfa, 0x27, 0xf3, 0x50, 0xb2, 0xb4, 0x7c, 0x64, 0x5d, - 0x7f, 0x16, 0x74, 0x07, 0xc5, 0x97, 0x41, 0xac, 0xbe, 0xf0, 0x5e, 0x4b, - 0x2f, 0xf1, 0x4a, 0x0c, 0x78, 0xd5, 0x95, 0x88, 0xb5, 0x69, 0x0f, 0x8b, - 0x3a, 0x2a, 0x12, 0x2b, 0xf4, 0x99, 0xb0, 0xc9, 0x61, 0x65, 0x33, 0x3f, - 0xa8, 0x49, 0xb9, 0xff, 0x59, 0x7e, 0x9a, 0x50, 0x52, 0x59, 0x4b, 0x2b, - 0x0d, 0x99, 0x14, 0x5f, 0xd2, 0xc6, 0x0b, 0x3f, 0x59, 0x7b, 0xfc, 0x15, - 0x65, 0xf1, 0x46, 0x79, 0x65, 0x41, 0xbe, 0xd8, 0x7a, 0xe3, 0x67, 0xa4, - 0x7b, 0x12, 0x57, 0x47, 0xc4, 0x6c, 0xbf, 0xe9, 0x33, 0xcd, 0x01, 0xdc, - 0x0a, 0x89, 0x25, 0x66, 0x7e, 0x44, 0x8b, 0xa5, 0x5f, 0xb0, 0x5f, 0xc3, - 0xc5, 0x97, 0x0b, 0xfa, 0xcb, 0xff, 0x03, 0xd1, 0xac, 0xe9, 0x43, 0x56, - 0x5f, 0xe7, 0xe9, 0x66, 0xce, 0x4b, 0x2f, 0xd1, 0x31, 0x40, 0xd6, 0x5c, - 0xc0, 0xab, 0x2f, 0xe9, 0x3e, 0xb6, 0x1c, 0x2c, 0xbf, 0xb0, 0x9f, 0xe9, - 0x71, 0x65, 0xff, 0xf8, 0x24, 0xec, 0x75, 0x88, 0x29, 0x67, 0x8d, 0xab, - 0x2f, 0xcd, 0xd6, 0x0f, 0xab, 0x2f, 0xf4, 0x7c, 0x27, 0x4a, 0x3f, 0x59, - 0x50, 0x7b, 0xa1, 0x28, 0xbf, 0x6e, 0x7a, 0x09, 0x85, 0x96, 0x1a, 0xcb, - 0xfb, 0x62, 0xcd, 0xe1, 0x85, 0x95, 0xb1, 0xe0, 0x38, 0x8d, 0xce, 0xcf, - 0x65, 0x55, 0x83, 0x2a, 0xc1, 0x96, 0x0f, 0x40, 0x63, 0xf1, 0x3c, 0xc3, - 0x3a, 0x2e, 0x69, 0x6f, 0x21, 0x65, 0xd2, 0x19, 0xf6, 0xba, 0xd9, 0xd4, - 0xdb, 0x4a, 0xd0, 0x2e, 0x80, 0xe6, 0x65, 0xaf, 0xe3, 0x96, 0xe4, 0x7e, - 0x3d, 0x8e, 0xab, 0x7c, 0xad, 0x6b, 0xff, 0x30, 0xec, 0xf3, 0x40, 0x77, - 0x02, 0xa2, 0xd4, 0x5f, 0xf9, 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x25, - 0x55, 0xc6, 0x2a, 0xca, 0x59, 0x66, 0x6c, 0x22, 0xed, 0xa9, 0xbd, 0x4c, - 0xdc, 0x17, 0xbf, 0xb3, 0x40, 0x77, 0x02, 0xa2, 0x29, 0x5f, 0xf9, 0xdd, - 0xb9, 0xaf, 0xc8, 0x3f, 0xac, 0xbf, 0xf4, 0x77, 0x99, 0xaf, 0xc8, 0x3f, - 0xac, 0xbe, 0x3e, 0x43, 0xac, 0xbf, 0xc4, 0xff, 0xf3, 0xb8, 0x05, 0x97, - 0x35, 0x9f, 0x91, 0xa4, 0x47, 0xfc, 0x40, 0xe9, 0x05, 0x33, 0x4d, 0x55, - 0xe3, 0x0b, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x46, 0x8b, 0xf8, 0x8c, 0x7a, - 0x3d, 0x96, 0x59, 0x9e, 0x1f, 0x09, 0x9a, 0x5e, 0x9e, 0x13, 0xec, 0x85, - 0x97, 0xd3, 0xd3, 0x2b, 0x9e, 0x13, 0xc1, 0x65, 0xc1, 0xf2, 0xcb, 0xff, - 0x0f, 0x1a, 0x7a, 0xce, 0x4d, 0x0b, 0x2f, 0xff, 0xf9, 0xc3, 0xcf, 0x60, - 0xc4, 0x13, 0x86, 0x27, 0x4f, 0x93, 0x08, 0xb2, 0xff, 0xf4, 0xc6, 0x7e, - 0x9b, 0x3b, 0x1d, 0x81, 0xac, 0xbc, 0x6e, 0x2a, 0x4b, 0xff, 0x44, 0x6f, - 0x82, 0x89, 0xa2, 0x65, 0x94, 0x69, 0xa7, 0xee, 0x9f, 0x4c, 0xd8, 0xd4, - 0xa2, 0x1c, 0xbe, 0x03, 0xb8, 0x15, 0x14, 0xfa, 0xee, 0xc2, 0xca, 0xd1, - 0xe2, 0x74, 0xba, 0xff, 0x1f, 0x4f, 0xbe, 0x0f, 0x56, 0x5f, 0x43, 0x74, - 0xeb, 0x2f, 0xf4, 0x77, 0xcf, 0x34, 0xec, 0x59, 0x71, 0xfc, 0xb2, 0xa6, - 0x3c, 0xcd, 0x1a, 0xd6, 0x91, 0x86, 0x46, 0x7d, 0x6d, 0xbf, 0xe7, 0x91, - 0x8f, 0xd1, 0x2e, 0x2c, 0xbf, 0x07, 0xbd, 0x8d, 0xeb, 0x2f, 0xfe, 0x89, - 0xa6, 0x3f, 0xe2, 0x69, 0xb3, 0xf5, 0x97, 0xbc, 0x71, 0xa3, 0xf3, 0x22, - 0xab, 0xbc, 0x15, 0x95, 0x87, 0x90, 0x13, 0x1b, 0xf6, 0x78, 0xcb, 0xab, - 0x2f, 0xfe, 0x69, 0x07, 0xc7, 0xac, 0xe4, 0xd0, 0xb2, 0xf9, 0xe6, 0x3f, - 0x2c, 0xbf, 0xfd, 0xac, 0x39, 0xb8, 0x18, 0xf8, 0xa3, 0xab, 0x2f, 0xdb, - 0xc3, 0xbb, 0x1f, 0xac, 0xa9, 0x26, 0x08, 0x64, 0xcd, 0x44, 0xe9, 0x10, - 0x52, 0xaf, 0xbe, 0xe8, 0x74, 0xb2, 0xff, 0xdd, 0xd0, 0x66, 0xe0, 0x1e, - 0x6e, 0x2c, 0xac, 0x3e, 0x60, 0x92, 0x5f, 0xe7, 0x28, 0xe9, 0x47, 0x56, - 0x5f, 0xfa, 0x3b, 0xf6, 0x76, 0x26, 0x3e, 0x2c, 0xbf, 0xf4, 0xc1, 0x2d, - 0xb8, 0x07, 0x9b, 0x8b, 0x2a, 0x11, 0x03, 0x87, 0xf7, 0x3f, 0x16, 0x5f, - 0xf7, 0x63, 0xe7, 0x9b, 0x51, 0xbd, 0x65, 0x6e, 0x9e, 0x97, 0x45, 0xaf, - 0x83, 0xe3, 0xd2, 0xcb, 0x33, 0x64, 0x2f, 0xe1, 0xcf, 0x45, 0x53, 0xc9, - 0xd4, 0x46, 0xcd, 0x90, 0x91, 0x38, 0x72, 0xb4, 0xbf, 0xd0, 0xf3, 0x78, - 0xc9, 0x4a, 0x16, 0x1c, 0x21, 0xec, 0x2c, 0x42, 0xe7, 0x3e, 0x4b, 0x7f, - 0xf9, 0x9b, 0x5e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x6a, 0x5f, 0xd9, - 0xa0, 0x3b, 0x81, 0x51, 0x5d, 0xaf, 0xff, 0x66, 0xe1, 0xf4, 0xe5, 0x38, - 0xa3, 0xbc, 0x59, 0x4b, 0x2e, 0x15, 0x9f, 0x8f, 0x60, 0x54, 0xda, 0x66, - 0x8c, 0x33, 0x84, 0x8d, 0xdf, 0x9a, 0xcb, 0xdc, 0x86, 0xac, 0xb9, 0xa4, - 0xb2, 0xf8, 0x0e, 0xe0, 0x54, 0x57, 0xcb, 0xc2, 0x8a, 0x2a, 0x4b, 0x12, - 0x46, 0x66, 0x82, 0xb4, 0x7e, 0x0d, 0x4e, 0xbf, 0xde, 0xc6, 0x1e, 0x3e, - 0xdc, 0x59, 0x7a, 0x51, 0xf2, 0xcb, 0xec, 0xef, 0x8d, 0x65, 0xc1, 0xe2, - 0xcb, 0xb3, 0xcb, 0x28, 0x66, 0xb6, 0x61, 0x7b, 0x9f, 0x7a, 0xcb, 0xfe, - 0xf0, 0xaf, 0xde, 0x46, 0x6c, 0xb2, 0xf8, 0x9f, 0xee, 0x2c, 0xac, 0x3d, - 0xce, 0x9d, 0x5e, 0x17, 0x34, 0xb2, 0xdd, 0x59, 0x7f, 0xc7, 0xac, 0xd8, - 0xe5, 0x83, 0x59, 0x46, 0x7c, 0xda, 0x1d, 0x71, 0x1b, 0xed, 0xcf, 0x04, - 0x45, 0x97, 0xa6, 0xc9, 0x96, 0x57, 0xc7, 0x8b, 0x31, 0x3d, 0xb4, 0xb2, - 0x96, 0x51, 0x97, 0x9a, 0x11, 0xbb, 0x66, 0x16, 0x57, 0x8d, 0xc3, 0x8f, - 0xdf, 0x61, 0x44, 0x96, 0x59, 0x9c, 0xf1, 0x57, 0x89, 0x02, 0xfb, 0x0e, - 0x64, 0x21, 0x80, 0x45, 0x31, 0xbe, 0x87, 0x5d, 0x3b, 0xf2, 0x22, 0x74, - 0xe4, 0x21, 0xc2, 0xe5, 0x3e, 0xf0, 0x21, 0x05, 0xff, 0xe6, 0x6d, 0x79, - 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0xed, 0x66, 0x5a, 0xcb, 0xfe, 0x1b, - 0x82, 0x00, 0x12, 0x1a, 0xcb, 0xe8, 0xdc, 0x7f, 0x96, 0x5e, 0x32, 0xfd, - 0x65, 0x6c, 0x7f, 0x3e, 0x38, 0xde, 0x4b, 0x7e, 0x31, 0xc6, 0xb8, 0xb2, - 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x70, 0xaf, 0x9a, 0x1e, 0xf1, 0x65, 0xfe, - 0xf1, 0xc8, 0x3f, 0xc4, 0xcb, 0x2c, 0xcd, 0x92, 0x9b, 0x9c, 0x42, 0x3a, - 0x46, 0x58, 0x4e, 0xc1, 0xa1, 0x91, 0xdf, 0xfc, 0xcd, 0xe4, 0xcf, 0x34, - 0x07, 0x70, 0x2a, 0x24, 0xf5, 0xff, 0x8e, 0x66, 0x70, 0x18, 0xec, 0x7e, - 0xb2, 0xa1, 0xb3, 0xbf, 0xda, 0x39, 0xe9, 0x42, 0x31, 0x89, 0xfe, 0xb0, - 0x43, 0xee, 0x68, 0xc7, 0x75, 0x2f, 0xb7, 0xd0, 0xdc, 0xe4, 0x79, 0xbb, - 0xd9, 0xc5, 0x54, 0xbf, 0xcc, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x2a, 0x5f, - 0xb4, 0x07, 0x70, 0x2a, 0x29, 0x95, 0xfc, 0x7e, 0xc7, 0xfb, 0xf5, 0x96, - 0x67, 0x87, 0xc5, 0x3e, 0x69, 0x7f, 0xf9, 0x9b, 0x5e, 0x4c, 0xf3, 0x40, - 0x77, 0x02, 0xa2, 0x67, 0x5f, 0xfe, 0x66, 0xd7, 0x93, 0x3c, 0xd0, 0x1d, - 0xc0, 0xa8, 0xa3, 0x55, 0xb2, 0x70, 0x63, 0x85, 0x1b, 0x05, 0x9d, 0x5a, - 0xbf, 0xf3, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x47, 0x4b, 0xf8, 0xb3, - 0xbc, 0x86, 0xac, 0xbd, 0x1d, 0xe2, 0xcb, 0xda, 0xd9, 0x9f, 0x0f, 0x20, - 0x42, 0xcb, 0xff, 0xfd, 0xa9, 0x33, 0xc2, 0x0f, 0x42, 0xc7, 0x7e, 0x01, - 0xeb, 0x8b, 0x29, 0x9a, 0x66, 0x51, 0x09, 0x43, 0x38, 0xb8, 0x3e, 0x59, - 0x7c, 0x00, 0x04, 0x0b, 0x2f, 0xc7, 0xc0, 0xb4, 0xd6, 0x5f, 0xb0, 0x87, - 0x9b, 0x2c, 0xbf, 0xe3, 0xd7, 0x0b, 0x07, 0xe8, 0x59, 0x7f, 0xa2, 0x01, - 0x9a, 0xd6, 0x2c, 0xa3, 0x44, 0x7f, 0x89, 0xc8, 0xde, 0xfd, 0x9a, 0x00, - 0x58, 0x59, 0x7f, 0xc0, 0x86, 0xe1, 0xb6, 0x37, 0x56, 0x5f, 0xf8, 0xb1, - 0x87, 0x9b, 0x9e, 0x81, 0xac, 0xbd, 0x33, 0xf5, 0x65, 0xf0, 0x1d, 0xc0, - 0xa8, 0xa6, 0x97, 0xec, 0xf8, 0x57, 0xf2, 0xcb, 0xff, 0xb9, 0x84, 0x38, - 0x9d, 0x3c, 0x77, 0xfe, 0x6b, 0x28, 0x69, 0xb2, 0x61, 0x49, 0x9d, 0x4c, - 0x7f, 0xa1, 0xd2, 0x2e, 0xe1, 0x4d, 0xf6, 0x9c, 0x66, 0xb2, 0xff, 0xf0, - 0x1f, 0x5c, 0xf3, 0x9f, 0x39, 0x9c, 0x59, 0x7f, 0xff, 0xd8, 0x5d, 0xe1, - 0x83, 0x0b, 0x80, 0xf1, 0xf8, 0x02, 0x6c, 0xb2, 0xff, 0xb8, 0xff, 0x64, - 0xd1, 0xee, 0x2c, 0xbb, 0xc7, 0xe4, 0x75, 0x12, 0x4f, 0x59, 0xef, 0xfe, - 0x97, 0x8c, 0xb6, 0xe0, 0x63, 0x53, 0x2c, 0xbd, 0x26, 0xc9, 0x65, 0xf7, - 0x78, 0xff, 0xac, 0xbd, 0xff, 0x4d, 0x65, 0xfe, 0xe0, 0x0f, 0x5a, 0x3d, - 0x96, 0x54, 0x1f, 0xa3, 0x91, 0xf0, 0x76, 0xff, 0xfe, 0xd8, 0x3a, 0x9b, - 0x9b, 0x44, 0xdc, 0xf6, 0x0c, 0xf7, 0xac, 0xbf, 0xec, 0xd3, 0xc1, 0x94, - 0x35, 0x65, 0x6c, 0x89, 0x7e, 0x31, 0x5f, 0xf6, 0xf0, 0x78, 0xff, 0xf1, - 0xb5, 0x65, 0x61, 0xf0, 0x19, 0x25, 0xe6, 0xe8, 0x2b, 0x2f, 0xf0, 0x5c, - 0x81, 0x3b, 0x6e, 0x2c, 0xbf, 0xa0, 0xbb, 0x3f, 0x9d, 0x59, 0x7f, 0xe8, - 0xf4, 0x36, 0x0b, 0xbe, 0x35, 0x97, 0xf9, 0xff, 0x7e, 0xf7, 0x3c, 0xb2, - 0xa4, 0x89, 0xe0, 0x17, 0x8a, 0x79, 0x7d, 0xe3, 0xcd, 0x2c, 0xbb, 0xc1, - 0x59, 0x69, 0x2c, 0xac, 0x3f, 0xa3, 0x31, 0xfc, 0x87, 0x78, 0xbd, 0xef, - 0x0b, 0xfa, 0xcb, 0x75, 0x65, 0x19, 0xb0, 0xf0, 0xfd, 0xc3, 0x85, 0x97, - 0xff, 0xee, 0xf0, 0x4e, 0x6a, 0x07, 0x9e, 0x06, 0x16, 0xcb, 0x2a, 0x0f, - 0xb7, 0x05, 0xaf, 0xe8, 0x3f, 0xdf, 0xa1, 0x59, 0x7f, 0xec, 0xff, 0x32, - 0x69, 0x8a, 0x06, 0xb2, 0xb1, 0x31, 0x96, 0xc2, 0x37, 0xc4, 0x04, 0x5b, - 0x7b, 0xb1, 0x25, 0x97, 0xfc, 0x1e, 0xfb, 0x26, 0x94, 0x7c, 0xb2, 0xbc, - 0x7a, 0xe4, 0x39, 0x69, 0x96, 0x5c, 0xfe, 0x59, 0x7e, 0xcf, 0x39, 0x0d, - 0x65, 0x6c, 0x79, 0xd2, 0x12, 0xfc, 0x5a, 0xe8, 0x61, 0x65, 0xfc, 0xff, - 0xf1, 0x94, 0x65, 0x19, 0x45, 0x97, 0xf1, 0xc3, 0x76, 0xc1, 0x56, 0x5f, - 0xff, 0x67, 0x7d, 0x92, 0xd3, 0x97, 0x7c, 0xf2, 0x59, 0x74, 0x7e, 0xb2, - 0xff, 0x3f, 0xd0, 0x03, 0x03, 0x3d, 0x22, 0x4c, 0x8b, 0x84, 0x4e, 0xac, - 0x4f, 0x88, 0xdb, 0xfc, 0x62, 0x42, 0xfc, 0x86, 0x8d, 0xe7, 0x9b, 0x8b, - 0x2e, 0x13, 0x4b, 0x2f, 0xdf, 0xfa, 0x25, 0xc5, 0x97, 0x88, 0x2c, 0x2c, - 0xbc, 0x2b, 0xec, 0xb2, 0xff, 0xa3, 0xf7, 0xef, 0xe2, 0x14, 0x96, 0x57, - 0x8f, 0x64, 0x87, 0xaa, 0x11, 0x80, 0x45, 0x3d, 0x76, 0xb3, 0x39, 0xe5, - 0x9a, 0x41, 0x02, 0xf2, 0x23, 0x1c, 0x2d, 0xb2, 0x39, 0x26, 0x18, 0xc1, - 0x18, 0x5f, 0xc7, 0x46, 0x8d, 0xa8, 0x48, 0xfa, 0x32, 0x47, 0x20, 0xfc, - 0x74, 0xa3, 0x4e, 0xe4, 0x70, 0xdd, 0x94, 0xf4, 0x14, 0xd9, 0xf1, 0xd1, - 0x21, 0xb1, 0x7c, 0x65, 0xf9, 0xac, 0xbe, 0x03, 0xb8, 0x15, 0x15, 0x52, - 0xa4, 0x79, 0xfa, 0x21, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x4d, 0xab, 0xee, - 0xe8, 0xfe, 0x59, 0x79, 0xe4, 0xcf, 0x0f, 0x5c, 0xcd, 0x2c, 0xcf, 0x11, - 0x58, 0xd7, 0x9b, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x2b, 0xf5, 0xfb, - 0x40, 0x77, 0x02, 0xa2, 0xc6, 0x5d, 0xb9, 0x25, 0x96, 0x67, 0x87, 0x9d, - 0x31, 0xa5, 0xfb, 0x80, 0xf4, 0x30, 0xb2, 0xff, 0x10, 0x65, 0x9c, 0x7e, - 0xac, 0xbf, 0x99, 0x03, 0x9e, 0x67, 0x92, 0x61, 0x65, 0xff, 0x10, 0x76, - 0x9a, 0x51, 0xad, 0x96, 0x5d, 0xae, 0xac, 0xbe, 0x79, 0x60, 0xd6, 0x5f, - 0xdd, 0xcd, 0x0f, 0x09, 0x65, 0xb0, 0x67, 0x9b, 0xd2, 0x1b, 0xa5, 0x8b, - 0x2f, 0xe7, 0x7e, 0xf7, 0x3c, 0xb2, 0x98, 0x3c, 0x2d, 0x0b, 0x5f, 0xd9, - 0xae, 0xfb, 0x36, 0x59, 0x7f, 0x74, 0xdb, 0xf4, 0xb8, 0xb2, 0xcc, 0xf1, - 0x3f, 0x86, 0x99, 0x78, 0xf5, 0xcf, 0x09, 0x93, 0x8d, 0x22, 0x11, 0xee, - 0x17, 0x58, 0xd9, 0xaa, 0x9c, 0xd4, 0xa2, 0x1b, 0xf6, 0x80, 0xee, 0x05, - 0x45, 0xaa, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x50, 0x4b, - 0xf4, 0x0b, 0x3f, 0x9a, 0x59, 0x66, 0x78, 0x8a, 0xb6, 0x9a, 0x08, 0x99, - 0x7d, 0xdd, 0x3f, 0x96, 0x5f, 0xde, 0x3d, 0xb6, 0x0f, 0x16, 0x5f, 0xd8, - 0x3d, 0x47, 0x78, 0xb2, 0xfe, 0x86, 0xbf, 0xdd, 0x92, 0xca, 0xc4, 0x56, - 0x80, 0x88, 0x8c, 0x38, 0x5b, 0x7f, 0x67, 0x99, 0xbe, 0xba, 0xb2, 0xe7, - 0x15, 0x99, 0xf5, 0x74, 0xee, 0xff, 0x41, 0x7f, 0x1b, 0xae, 0xd5, 0x97, - 0xff, 0xa6, 0x8d, 0xef, 0xae, 0x70, 0xf5, 0x8c, 0x2c, 0xbf, 0xc7, 0x34, - 0x6f, 0x7d, 0x71, 0x65, 0xb8, 0xb2, 0xa0, 0xf1, 0x88, 0xd6, 0xff, 0xe8, - 0xfc, 0x3d, 0xe1, 0x46, 0xe4, 0x6c, 0xb2, 0xed, 0x42, 0xca, 0x92, 0x68, - 0xc6, 0x6b, 0xe8, 0x49, 0xef, 0x20, 0xdc, 0x48, 0xbe, 0x03, 0xb8, 0x15, - 0x17, 0x12, 0xfe, 0x0b, 0xfc, 0x3c, 0xd2, 0xca, 0xd1, 0xee, 0x70, 0xba, - 0xff, 0xfd, 0x21, 0x3d, 0x27, 0xeb, 0xfe, 0x12, 0x7d, 0xe3, 0x59, 0x70, - 0x93, 0x2c, 0xbf, 0xbe, 0x01, 0xf3, 0xc6, 0xb2, 0xb6, 0x3c, 0x7e, 0x8c, - 0xdd, 0x8c, 0x2c, 0xbf, 0xdb, 0xf3, 0xbc, 0xdf, 0x1e, 0x59, 0x63, 0x91, - 0xe7, 0x78, 0x5e, 0xfd, 0x8d, 0x3d, 0xc1, 0xac, 0xba, 0x1a, 0xb2, 0xb7, - 0x4f, 0x03, 0x45, 0x57, 0xf0, 0x49, 0xd8, 0x97, 0xeb, 0x2f, 0x9f, 0x70, - 0xf6, 0x59, 0x7e, 0xf0, 0x58, 0xc2, 0x59, 0x7e, 0x1e, 0x6e, 0xc7, 0x96, - 0x5e, 0xdc, 0x30, 0x2c, 0xa1, 0x9f, 0x8e, 0x8a, 0x37, 0x0a, 0xaf, 0xf3, - 0x5e, 0x5c, 0x31, 0xe2, 0xcb, 0xcc, 0x47, 0x16, 0x5f, 0xe9, 0x44, 0xcf, - 0xe8, 0xdd, 0x59, 0x50, 0x7a, 0x78, 0x3b, 0x7e, 0x2e, 0x93, 0xb0, 0xb2, - 0x96, 0x5b, 0x98, 0x6c, 0xa7, 0xc9, 0xef, 0xe6, 0xbe, 0xf8, 0xd6, 0xe2, - 0xcb, 0xff, 0x18, 0xf3, 0x7b, 0x72, 0x5f, 0x49, 0x65, 0xfc, 0x7b, 0xe4, - 0xd8, 0x99, 0x65, 0xff, 0xa3, 0x09, 0xb1, 0xed, 0xc7, 0xdc, 0x59, 0x52, - 0x3f, 0x2d, 0x18, 0x5f, 0xf6, 0x37, 0x35, 0x9b, 0x60, 0xab, 0x2a, 0x13, - 0x40, 0xc3, 0x23, 0x85, 0x9f, 0x88, 0xaf, 0xec, 0xd3, 0xf4, 0x30, 0xb2, - 0xff, 0xf9, 0xca, 0x0f, 0x73, 0x87, 0xcc, 0xf6, 0x4f, 0xac, 0xa1, 0x9f, - 0xf6, 0xf2, 0xcb, 0xff, 0x8c, 0x83, 0x2c, 0xe7, 0x0c, 0x78, 0xb2, 0xa6, - 0x3e, 0x6e, 0x92, 0x59, 0x9c, 0x2f, 0x76, 0xe4, 0x2c, 0x3e, 0x22, 0x38, - 0x50, 0x4c, 0xe3, 0xa6, 0x76, 0x92, 0xf8, 0xbd, 0xe1, 0x2d, 0xf9, 0x91, - 0x42, 0x17, 0x8a, 0x5d, 0x8d, 0xa4, 0x48, 0xc9, 0x2f, 0xe9, 0xea, 0x7a, - 0xd3, 0xbc, 0x96, 0x5f, 0xe6, 0x41, 0x4f, 0x3d, 0x9f, 0x9e, 0x46, 0xb2, - 0xf1, 0x3b, 0x25, 0x65, 0xfa, 0x7b, 0x65, 0x7f, 0xb1, 0x0b, 0x2f, 0xfc, - 0x7f, 0x32, 0x9c, 0xd4, 0xe9, 0xde, 0x9f, 0x59, 0x7d, 0xe8, 0xe8, 0x16, - 0x53, 0x2a, 0x9f, 0x78, 0xd3, 0x6f, 0xfa, 0x34, 0xfd, 0xfc, 0x42, 0x92, - 0xcb, 0xff, 0xcc, 0xa3, 0x02, 0xee, 0xec, 0x39, 0xee, 0x74, 0xef, 0x4f, - 0xac, 0xbf, 0x73, 0x8f, 0xbf, 0x16, 0x5f, 0x01, 0xdc, 0x0a, 0x8b, 0xa5, - 0x7e, 0x20, 0xf6, 0x38, 0xb2, 0xb4, 0x7a, 0xbe, 0x2e, 0xbe, 0x27, 0x1c, - 0x2c, 0xbf, 0xd1, 0xbd, 0xca, 0x37, 0xf1, 0x65, 0x41, 0xea, 0xf8, 0x82, - 0xff, 0xe6, 0x47, 0x39, 0x34, 0x99, 0x73, 0xa7, 0x7a, 0x7d, 0x65, 0xfd, - 0x28, 0xf9, 0xf9, 0x25, 0x97, 0xfc, 0x53, 0x6a, 0x3e, 0x91, 0xb5, 0x65, - 0xff, 0xb7, 0xc1, 0x77, 0x81, 0xee, 0x69, 0x65, 0x41, 0xfd, 0x61, 0xd5, - 0xf4, 0xb7, 0x33, 0xab, 0x2f, 0xb9, 0x1b, 0x9c, 0x59, 0x50, 0x79, 0x5b, - 0x84, 0xb7, 0xa3, 0xbb, 0x8b, 0x2f, 0xec, 0x91, 0xc4, 0xb7, 0x56, 0x5e, - 0x1e, 0x0d, 0x65, 0x0c, 0xf2, 0xf0, 0xbe, 0xff, 0xed, 0xe6, 0x5a, 0x8e, - 0x98, 0x0c, 0x6b, 0x2f, 0xf6, 0xf8, 0xef, 0x02, 0x06, 0x5a, 0xca, 0xc3, - 0xfe, 0x74, 0x4b, 0xee, 0x6c, 0xe2, 0x2c, 0xbf, 0xd1, 0xd7, 0xd8, 0x27, - 0x25, 0x97, 0x09, 0xe5, 0x94, 0x47, 0x96, 0x21, 0x9d, 0xff, 0xf9, 0xe4, - 0x51, 0xcc, 0xf8, 0x04, 0xf9, 0xf0, 0x16, 0x5f, 0xf1, 0xfb, 0x3e, 0xfe, - 0x43, 0xc5, 0x96, 0x66, 0xc8, 0x5e, 0xf1, 0x9e, 0x8d, 0xe7, 0x94, 0x56, - 0x50, 0x7e, 0x21, 0x49, 0xb1, 0x4c, 0x8e, 0x86, 0xc9, 0x8f, 0xc6, 0xef, - 0xba, 0x43, 0x32, 0xbe, 0xa1, 0x50, 0xd6, 0xaf, 0x12, 0x3b, 0x51, 0x42, - 0x7f, 0xa4, 0x01, 0x6f, 0xde, 0x45, 0x3e, 0xa9, 0x7f, 0xf8, 0xba, 0x6d, - 0xf4, 0x19, 0x3e, 0x98, 0x59, 0x7f, 0x3f, 0x61, 0xb0, 0x4b, 0x2b, 0x0f, - 0xcf, 0x49, 0x17, 0xfe, 0x6f, 0x03, 0xd9, 0x1e, 0xff, 0x1a, 0xcb, 0xfb, - 0x33, 0x80, 0xec, 0x2c, 0xbf, 0xb6, 0x8e, 0xbb, 0x01, 0x59, 0x4b, 0x2f, - 0xfe, 0x8d, 0x7f, 0x3b, 0x9e, 0x86, 0xb9, 0x2c, 0xbf, 0xd1, 0xa1, 0x3d, - 0xec, 0xfd, 0x65, 0x48, 0xfe, 0xfc, 0x8d, 0x7f, 0x49, 0xe4, 0xe4, 0x05, - 0x97, 0x77, 0x8b, 0x2f, 0xff, 0x67, 0x60, 0x51, 0x36, 0xe6, 0x36, 0x37, - 0x56, 0x59, 0xab, 0x2f, 0xdb, 0x14, 0x0f, 0x4b, 0x2c, 0xcd, 0x90, 0x9b, - 0x9e, 0x42, 0x1a, 0x62, 0x2f, 0x16, 0x10, 0xbf, 0x53, 0xc4, 0x11, 0xad, - 0x2a, 0x18, 0x6c, 0x74, 0x57, 0xd8, 0x2b, 0x21, 0xab, 0x2f, 0xe2, 0x8f, - 0x9a, 0xfd, 0x59, 0x7f, 0xf8, 0x57, 0x1f, 0xa3, 0xee, 0xc7, 0x9f, 0x75, - 0x65, 0x8f, 0x47, 0xf7, 0xe2, 0xdb, 0xff, 0xfe, 0x0e, 0xa5, 0xcf, 0x39, - 0xeb, 0x5a, 0x0f, 0xc7, 0xa7, 0xe2, 0xcb, 0xff, 0xb4, 0x08, 0xcf, 0x47, - 0x4a, 0x3a, 0xb2, 0xff, 0xff, 0x77, 0x51, 0x9f, 0x13, 0xb0, 0x0f, 0x1c, - 0xda, 0x81, 0x56, 0x5f, 0xf8, 0x9c, 0x5e, 0xe7, 0x9e, 0x67, 0x59, 0x7f, - 0xfe, 0xff, 0xf8, 0x9d, 0xe8, 0xe8, 0x41, 0xe8, 0x27, 0x59, 0x7f, 0xfe, - 0x20, 0xbe, 0xee, 0x4b, 0xd8, 0xc6, 0x0e, 0x60, 0xac, 0xac, 0x45, 0x8f, - 0x96, 0x2e, 0x06, 0x2c, 0xa8, 0x37, 0x0c, 0x11, 0x5f, 0xe7, 0xef, 0x23, - 0xc2, 0x4c, 0xb2, 0xf4, 0xa1, 0xab, 0x2d, 0x3c, 0xac, 0xbb, 0x92, 0x59, - 0x7f, 0xfe, 0xf6, 0x0c, 0x3d, 0xe0, 0x3c, 0x7c, 0x0b, 0xfc, 0xb2, 0x98, - 0x3e, 0xee, 0x8b, 0xdf, 0xed, 0x69, 0xe5, 0xb6, 0x0a, 0xb2, 0x96, 0x5d, - 0x30, 0x56, 0x56, 0x1e, 0xc7, 0x8d, 0x45, 0x0b, 0xbf, 0xef, 0x09, 0xd3, - 0xd1, 0xed, 0x0b, 0x2a, 0x47, 0xd3, 0x85, 0xf7, 0xff, 0x60, 0xe2, 0x51, - 0xa8, 0x11, 0xc9, 0x65, 0xff, 0xb7, 0xe4, 0x9a, 0x33, 0xdf, 0x03, 0x59, - 0x4d, 0x44, 0x23, 0xa1, 0x5c, 0xec, 0xf6, 0x5c, 0xd5, 0xc6, 0x8f, 0x90, - 0xa6, 0x63, 0xd4, 0x64, 0xfe, 0x21, 0x73, 0x52, 0x1c, 0xe4, 0x21, 0x3b, - 0x0e, 0x41, 0x21, 0x4b, 0x5e, 0x5d, 0xba, 0x29, 0xcf, 0xcb, 0xfd, 0x2c, - 0xef, 0xa0, 0x42, 0x59, 0x7f, 0xee, 0x98, 0x0c, 0x6e, 0x4c, 0x42, 0xcb, - 0xfe, 0x8f, 0xbc, 0xfc, 0xec, 0x0a, 0xb2, 0xa0, 0xfd, 0xf4, 0x7b, 0x7f, - 0x9f, 0xa4, 0x1d, 0xbe, 0xdd, 0x59, 0x66, 0x4a, 0xcb, 0x83, 0xe5, 0x97, - 0xe2, 0xcf, 0x3f, 0x56, 0x5f, 0xd2, 0x7c, 0xdf, 0x03, 0x59, 0x4c, 0x93, - 0xd4, 0x9e, 0x24, 0xd7, 0xc6, 0x19, 0x42, 0xcb, 0xec, 0xfa, 0x1a, 0xb2, - 0xf8, 0xca, 0x3f, 0x59, 0x7f, 0x7a, 0x37, 0xbe, 0x69, 0x65, 0xf9, 0xe6, - 0x91, 0xf5, 0x65, 0xfe, 0x0e, 0xe1, 0xef, 0xee, 0x79, 0x65, 0xff, 0xa0, - 0x7a, 0x89, 0x1f, 0xdd, 0xc5, 0x95, 0x24, 0xcc, 0x18, 0x21, 0x01, 0x17, - 0x88, 0x7f, 0x2e, 0x22, 0x8e, 0x9c, 0x5f, 0xf6, 0xb9, 0xe3, 0x00, 0x03, - 0xb2, 0xcb, 0xf8, 0x5c, 0xde, 0x41, 0x92, 0xcb, 0xf8, 0x2c, 0x61, 0x6e, - 0x62, 0xcb, 0xff, 0xff, 0xb5, 0x20, 0x78, 0xda, 0xd3, 0x17, 0x9f, 0x00, - 0xf3, 0x43, 0x8f, 0x96, 0x54, 0x26, 0x21, 0x87, 0x64, 0x60, 0x13, 0x0b, - 0xff, 0xfe, 0x81, 0xfb, 0x3e, 0xe9, 0x3f, 0xbf, 0x7e, 0x71, 0xf4, 0x05, - 0x97, 0xfb, 0x33, 0x18, 0x61, 0xe4, 0xb2, 0x98, 0x44, 0xd7, 0x59, 0xef, - 0xd9, 0xc0, 0x76, 0x16, 0x5f, 0xfe, 0x31, 0x78, 0x0f, 0x1f, 0xdd, 0xd6, - 0xa1, 0x65, 0xff, 0xb5, 0xd7, 0x97, 0x37, 0x87, 0x46, 0xb2, 0xff, 0xe7, - 0xe1, 0x3b, 0x03, 0xf0, 0x5f, 0x8b, 0x2a, 0x11, 0x0a, 0x14, 0x1b, 0xff, - 0xfe, 0x71, 0x44, 0xcd, 0x13, 0xfd, 0x20, 0x47, 0x79, 0x9f, 0x75, 0x65, - 0xf8, 0xb3, 0xf8, 0xfd, 0x65, 0xfe, 0x91, 0x94, 0xd2, 0x3f, 0x2c, 0xb4, - 0x48, 0xf6, 0xe6, 0x28, 0xac, 0x54, 0x0d, 0xa2, 0x7f, 0x43, 0x45, 0xc8, - 0x8a, 0x18, 0x97, 0xed, 0xe7, 0xac, 0x1a, 0xcb, 0xff, 0xee, 0x78, 0xf9, - 0xdf, 0x60, 0xcf, 0x98, 0x4b, 0x2f, 0x7a, 0x0b, 0x0f, 0xdc, 0x25, 0x37, - 0xe7, 0xf4, 0x88, 0x0b, 0x2f, 0xf4, 0x37, 0x0d, 0xb1, 0xba, 0xb2, 0xff, - 0x49, 0xbc, 0x32, 0xfa, 0x4b, 0x28, 0x07, 0xd1, 0x31, 0xa5, 0xfe, 0x3d, - 0x39, 0x7f, 0x84, 0xb2, 0xff, 0xf6, 0x6b, 0x4f, 0x2e, 0x16, 0x34, 0x4f, - 0x96, 0x5f, 0xf1, 0xc8, 0xb3, 0xc4, 0xf2, 0x59, 0x7f, 0xfe, 0x96, 0x10, - 0xfd, 0x18, 0x51, 0xfb, 0x5e, 0x4b, 0x28, 0x91, 0x12, 0x21, 0xb5, 0xe7, - 0x70, 0x2a, 0x24, 0xc5, 0xed, 0xc3, 0xe2, 0xca, 0x91, 0xf5, 0x00, 0x8f, - 0x70, 0xa2, 0xfc, 0x06, 0x52, 0x7b, 0x64, 0x32, 0x56, 0x5f, 0xfe, 0xfa, - 0x5c, 0xcd, 0xee, 0xdc, 0x62, 0x38, 0xb2, 0xff, 0x67, 0xdd, 0xeb, 0xcb, - 0x8b, 0x2a, 0x11, 0x79, 0x87, 0x7a, 0x4d, 0xbf, 0xc4, 0xfd, 0xe0, 0x02, - 0x4b, 0x2f, 0xff, 0xbf, 0x3f, 0xc5, 0xc3, 0xde, 0x59, 0xdf, 0x1a, 0xcb, - 0xfc, 0xff, 0x71, 0xde, 0x5c, 0x59, 0x6d, 0x62, 0x21, 0x7c, 0xa5, 0x58, - 0x8d, 0xf3, 0x85, 0xbd, 0xfa, 0x5c, 0x91, 0xfe, 0xb2, 0xff, 0xff, 0xde, - 0xc9, 0x7b, 0x06, 0x50, 0x01, 0x20, 0x5c, 0xe7, 0x1d, 0x85, 0x95, 0x08, - 0x96, 0xe9, 0x4d, 0xff, 0x85, 0xc1, 0xbc, 0xbb, 0xc7, 0xfd, 0x65, 0xff, - 0xfc, 0xff, 0x61, 0x40, 0xa2, 0x74, 0xa3, 0xfc, 0xfb, 0xab, 0x28, 0xd1, - 0x3a, 0x14, 0x0b, 0xff, 0x8f, 0xe1, 0x7b, 0xe3, 0x82, 0xc0, 0x2c, 0xbf, - 0xe3, 0x62, 0x07, 0xb3, 0x63, 0x4b, 0x2a, 0x4b, 0xcd, 0x03, 0x31, 0xc8, - 0x47, 0xb0, 0x46, 0x03, 0x1d, 0x46, 0x7c, 0xd8, 0x77, 0x7a, 0x30, 0xd2, - 0x85, 0xe7, 0x21, 0x7f, 0xd2, 0x2d, 0xe8, 0x97, 0xf0, 0xff, 0x64, 0xf3, - 0xf9, 0xf5, 0x97, 0xb7, 0x37, 0x21, 0x65, 0xff, 0xe1, 0xe0, 0xbe, 0x7e, - 0xf2, 0x3c, 0x24, 0xcb, 0x2f, 0x70, 0xc6, 0xb2, 0xfe, 0x28, 0xf9, 0xaf, - 0xd5, 0x97, 0xfd, 0x00, 0xe8, 0x7d, 0xa8, 0x15, 0x65, 0xff, 0x1e, 0x0a, - 0x0f, 0x41, 0xcf, 0xac, 0xbf, 0xfd, 0x05, 0x2c, 0x0e, 0xb6, 0xff, 0x30, - 0x6b, 0x2f, 0xf0, 0x0f, 0x5c, 0x9a, 0x1d, 0x65, 0xff, 0xc1, 0xe7, 0x9e, - 0x5e, 0x79, 0x41, 0x2c, 0xa6, 0x11, 0x81, 0xf2, 0x56, 0x8c, 0xec, 0x63, - 0x4f, 0xf6, 0x64, 0xdd, 0x0e, 0x34, 0xb5, 0x96, 0x75, 0xd8, 0x7d, 0xdf, - 0x87, 0x1c, 0xe9, 0xac, 0xa8, 0x55, 0x5b, 0xe9, 0x43, 0xee, 0xcf, 0x7d, - 0xd3, 0x6b, 0xac, 0xbe, 0x17, 0xc1, 0x02, 0xcb, 0x30, 0xb2, 0xfe, 0xf7, - 0x23, 0xb0, 0x35, 0x95, 0x07, 0xc7, 0x84, 0x86, 0x25, 0x58, 0x8b, 0x0e, - 0xc2, 0x12, 0xff, 0xf0, 0x5f, 0xce, 0x39, 0x37, 0xd0, 0x21, 0x2c, 0xbf, - 0xe8, 0xf7, 0x4f, 0x66, 0xc0, 0x16, 0x5f, 0xff, 0x9c, 0x1a, 0x8f, 0x16, - 0x77, 0x19, 0x8a, 0x28, 0xa9, 0x2a, 0x49, 0x81, 0x80, 0x9f, 0x89, 0x5d, - 0x39, 0xbf, 0x00, 0x20, 0x28, 0x59, 0x7e, 0xe4, 0xde, 0x8e, 0xac, 0xbd, - 0xa3, 0xf9, 0x65, 0x00, 0xfb, 0x66, 0x27, 0xe9, 0x4d, 0xff, 0xdf, 0x48, - 0xa2, 0x5a, 0x8e, 0xbf, 0x56, 0x5f, 0xf0, 0xc4, 0x8f, 0xa7, 0xf3, 0x50, - 0xb2, 0xe8, 0x92, 0xca, 0xc4, 0x4b, 0xba, 0x21, 0x1e, 0xdf, 0x07, 0x76, - 0x24, 0xb2, 0xff, 0xcf, 0xd8, 0xd7, 0x3d, 0x05, 0xd5, 0x97, 0xec, 0x91, - 0xbe, 0xf5, 0x95, 0xe4, 0x45, 0x11, 0x2f, 0x0f, 0x6a, 0x48, 0xe6, 0x0c, - 0x2d, 0xef, 0x35, 0xfc, 0xb2, 0xff, 0xf1, 0x44, 0xb5, 0xa0, 0xfc, 0x7a, - 0x7e, 0x2c, 0xbf, 0xfe, 0xe6, 0x30, 0x59, 0xde, 0x64, 0x89, 0xc5, 0x59, - 0x63, 0xf2, 0x26, 0x7a, 0x95, 0x46, 0x8d, 0xdd, 0xf0, 0xb5, 0xbe, 0xdc, - 0x8f, 0x71, 0x65, 0xfe, 0xdb, 0xa5, 0x01, 0xef, 0x16, 0x5f, 0xe6, 0xf7, - 0x26, 0x93, 0x92, 0xca, 0xc3, 0xe7, 0x33, 0x4a, 0x84, 0x6a, 0xe1, 0x4e, - 0xa1, 0x19, 0x73, 0xb2, 0xd6, 0x5f, 0xff, 0xc4, 0xec, 0x7a, 0x0e, 0x46, - 0x5d, 0x96, 0x6b, 0x16, 0x51, 0x1f, 0x90, 0x46, 0xaf, 0x7f, 0xfc, 0x2c, - 0xbf, 0x10, 0x76, 0xfb, 0x75, 0x65, 0x70, 0xf2, 0xfa, 0x3d, 0x7f, 0xfa, - 0x36, 0x2c, 0xcd, 0xba, 0xc4, 0x14, 0x96, 0x5f, 0xf9, 0xcb, 0x6f, 0x3b, - 0x4f, 0x86, 0xb2, 0x9d, 0x15, 0x24, 0x44, 0x2a, 0x55, 0xff, 0x74, 0xf8, - 0x61, 0x65, 0x8e, 0x16, 0x5e, 0x14, 0x51, 0x52, 0x5f, 0x6c, 0xd3, 0xe2, - 0x46, 0x66, 0x82, 0xe8, 0x1a, 0xca, 0x73, 0xcb, 0x23, 0x5b, 0xfe, 0x3e, - 0x44, 0xa6, 0xf1, 0xfe, 0xb2, 0x8d, 0x30, 0x1d, 0x42, 0x9f, 0xc4, 0x17, - 0xe8, 0xc2, 0x76, 0xac, 0xbf, 0xf3, 0xcb, 0xc7, 0xf7, 0xfa, 0x71, 0xac, - 0xb8, 0x62, 0xac, 0xbf, 0xff, 0x66, 0xf8, 0x2e, 0xb6, 0x30, 0x87, 0x9f, - 0x75, 0x65, 0xe7, 0x20, 0x6c, 0x7d, 0xba, 0x18, 0xaf, 0xd3, 0x05, 0x22, - 0x50, 0xc2, 0xb6, 0xff, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xff, 0xbd, - 0x9c, 0xe6, 0x34, 0x67, 0xbe, 0x06, 0xb2, 0xfe, 0x86, 0xcd, 0xe3, 0xd2, - 0xcb, 0xfb, 0x39, 0x8d, 0x7f, 0x96, 0x5f, 0xb8, 0x78, 0x5f, 0xac, 0xad, - 0x1e, 0xa7, 0x0b, 0x6f, 0x6b, 0x37, 0x56, 0x5f, 0xfe, 0x0f, 0x3c, 0x79, - 0x31, 0xed, 0x9f, 0x75, 0x65, 0xff, 0x0a, 0x26, 0xdc, 0xc6, 0xc6, 0xea, - 0xcb, 0xff, 0xc6, 0x0c, 0x21, 0xe9, 0xc1, 0x9f, 0x75, 0x65, 0x42, 0x22, - 0x38, 0x7f, 0x7f, 0xe3, 0x21, 0x32, 0x6e, 0x1f, 0xc2, 0xac, 0xbe, 0x7f, - 0xfa, 0xcb, 0x59, 0x40, 0x54, 0xd9, 0x32, 0x5e, 0xa1, 0x04, 0xd2, 0x22, - 0x1f, 0xec, 0x35, 0x37, 0x91, 0x0a, 0x83, 0x7f, 0x7b, 0x3e, 0xef, 0xa1, - 0x65, 0x42, 0xb4, 0xfc, 0x95, 0x42, 0xf0, 0x80, 0xbf, 0xff, 0x1f, 0x39, - 0x1a, 0x96, 0xa3, 0xbc, 0x10, 0xa4, 0xb2, 0xff, 0xf8, 0xe6, 0x28, 0xef, - 0x3b, 0xf0, 0x0c, 0xb6, 0x59, 0x7f, 0xff, 0xf8, 0xcb, 0xf1, 0x0b, 0x35, - 0xac, 0x17, 0x37, 0x70, 0xa3, 0xf6, 0xbc, 0x96, 0x5f, 0xff, 0xdd, 0xe0, - 0x47, 0xe3, 0xc9, 0x9c, 0xf7, 0x4f, 0xe9, 0x2c, 0xbf, 0xff, 0x8b, 0x3f, - 0x72, 0xff, 0x5a, 0xc1, 0x73, 0xf7, 0xf9, 0x65, 0x12, 0x2f, 0x3a, 0xbf, - 0x7e, 0x3e, 0xed, 0x82, 0xac, 0xbf, 0xe8, 0x07, 0x88, 0x3d, 0x8e, 0x2c, - 0xbf, 0xf6, 0xe4, 0x02, 0x1b, 0x83, 0x76, 0xac, 0xbf, 0x6e, 0x88, 0x50, - 0x05, 0x94, 0x67, 0xd6, 0xe8, 0x17, 0xff, 0x4b, 0x99, 0x03, 0x32, 0x7d, - 0x30, 0xb2, 0xfd, 0xa8, 0xc1, 0x9a, 0xcb, 0xfb, 0xc6, 0x31, 0xe0, 0xab, - 0x2f, 0xda, 0xcd, 0xfe, 0xc9, 0xc7, 0xa8, 0x02, 0x6a, 0x84, 0x6c, 0xbc, - 0x25, 0xef, 0xff, 0xdd, 0xf6, 0x4a, 0x70, 0x3c, 0x7d, 0xf8, 0x07, 0xa5, - 0x95, 0x25, 0x73, 0x87, 0x19, 0xb6, 0x88, 0x9a, 0x53, 0xe8, 0x51, 0xff, - 0x0f, 0x92, 0x26, 0xbf, 0xfd, 0xd8, 0x68, 0x1c, 0x78, 0x28, 0x9a, 0x92, - 0xcb, 0xe2, 0xdb, 0x78, 0xd6, 0x5f, 0xff, 0xef, 0x19, 0x0f, 0x58, 0x0f, - 0x47, 0xb3, 0x5a, 0x86, 0x16, 0x5f, 0xf3, 0x5c, 0x62, 0x6e, 0x41, 0x49, - 0x65, 0xff, 0x00, 0x3b, 0xbc, 0x31, 0x73, 0x4b, 0x2a, 0x0f, 0xe4, 0x07, - 0x97, 0xff, 0xfd, 0xd0, 0xe9, 0xf8, 0x0f, 0x1c, 0xc4, 0xe2, 0xf7, 0x3c, - 0xd5, 0x97, 0xff, 0xb9, 0x9a, 0x9c, 0x0f, 0x1e, 0xf3, 0x21, 0xac, 0xa3, - 0x45, 0xaf, 0x1a, 0x28, 0xd1, 0xf0, 0xf0, 0xd6, 0xbf, 0xe6, 0xc6, 0xb7, - 0xe6, 0xa2, 0x65, 0x97, 0xfe, 0xd0, 0x1b, 0x1f, 0x73, 0x37, 0xe2, 0xcb, - 0x9f, 0x75, 0x65, 0x98, 0x59, 0x7f, 0xff, 0x4c, 0x50, 0x3c, 0xfb, 0xb9, - 0x28, 0x2d, 0x9b, 0x8b, 0x2f, 0xef, 0xe7, 0xf0, 0x78, 0xd5, 0x95, 0xa4, - 0x4f, 0x78, 0x48, 0x96, 0xef, 0xba, 0xfa, 0xe2, 0xcb, 0xf4, 0xe9, 0xfc, - 0xd4, 0x2c, 0xad, 0x8f, 0x38, 0x88, 0xaa, 0x13, 0x97, 0xd9, 0x07, 0x21, - 0x6e, 0xef, 0xb7, 0xf9, 0xff, 0x9d, 0x83, 0x79, 0x2c, 0xb3, 0x0b, 0x2f, - 0xfe, 0xc0, 0x7a, 0x3d, 0x9a, 0xd4, 0x30, 0xb2, 0xfd, 0x9a, 0xd4, 0x30, - 0xb2, 0xf8, 0x8f, 0xfe, 0x41, 0xff, 0x68, 0x4b, 0xc8, 0x97, 0xfd, 0xe7, - 0xfd, 0xaf, 0x27, 0xe2, 0xcb, 0xfc, 0xf2, 0x94, 0x48, 0x1c, 0x59, 0x58, - 0x7d, 0x81, 0x39, 0xac, 0x4e, 0x14, 0xe1, 0x67, 0xe8, 0x58, 0xdf, 0xfe, - 0x7d, 0xbc, 0x70, 0x59, 0x31, 0xe8, 0xd6, 0x54, 0x99, 0x67, 0x23, 0x56, - 0xc9, 0x7d, 0xbf, 0x3a, 0x9a, 0x64, 0xc4, 0xbe, 0x8f, 0x47, 0xf2, 0x6e, - 0x47, 0xa5, 0xd8, 0xf1, 0x85, 0x39, 0xbf, 0xff, 0x61, 0x18, 0xf9, 0xe7, - 0xe1, 0x91, 0x47, 0xcb, 0x2f, 0xc5, 0x9e, 0x7e, 0xac, 0xbf, 0xf4, 0xa0, - 0xb6, 0x13, 0x44, 0x19, 0x2c, 0xbf, 0x89, 0xc7, 0xff, 0xdf, 0xac, 0xad, - 0xd4, 0x4b, 0x4c, 0x4d, 0xc4, 0x0b, 0xff, 0x9c, 0xa5, 0xa7, 0xfb, 0xd1, - 0x9c, 0x59, 0x7f, 0xf0, 0x0f, 0x5e, 0xc9, 0xbc, 0x7a, 0xd9, 0x65, 0xf7, - 0x76, 0xc1, 0xac, 0xbf, 0xe3, 0x60, 0x4d, 0x7e, 0xd3, 0xe2, 0xca, 0x98, - 0xf7, 0xe7, 0xc8, 0xef, 0x0a, 0x28, 0xab, 0x2f, 0xff, 0x9b, 0xd2, 0x8f, - 0xf0, 0x7c, 0xc6, 0xc0, 0x12, 0x33, 0x34, 0x17, 0xfe, 0x7f, 0xc1, 0xe3, - 0x98, 0xa3, 0xf5, 0x95, 0x88, 0xa1, 0x36, 0x1b, 0xfb, 0x59, 0xb9, 0xe7, - 0x1a, 0xcb, 0xff, 0x67, 0xd3, 0x8b, 0x37, 0xe8, 0xf8, 0xb2, 0xfe, 0x07, - 0x8e, 0x08, 0x0b, 0x2a, 0x0f, 0xbb, 0x10, 0xaf, 0xf6, 0xa3, 0xa6, 0x03, - 0x1a, 0xcb, 0xf4, 0xa6, 0xcc, 0x02, 0xcb, 0x69, 0x65, 0x4f, 0x47, 0xd7, - 0x06, 0x42, 0x14, 0x5f, 0x8f, 0xfc, 0x7d, 0xd5, 0x97, 0x1f, 0x16, 0x54, - 0x97, 0x2a, 0x72, 0x1d, 0x0c, 0x1a, 0x7c, 0x86, 0x70, 0xa5, 0xf4, 0x39, - 0xdc, 0x84, 0xa1, 0x3d, 0xc8, 0x45, 0xf4, 0xd2, 0x7c, 0xaa, 0xf8, 0xb6, - 0x8f, 0x2c, 0xbd, 0xf0, 0xb3, 0xd2, 0xcb, 0xf7, 0x7a, 0x6d, 0xe2, 0xcb, - 0xa5, 0xe5, 0x94, 0x66, 0xff, 0xa5, 0x16, 0x35, 0x97, 0xff, 0xf8, 0x58, - 0x28, 0x60, 0xa1, 0x81, 0x27, 0xe3, 0x50, 0x08, 0x59, 0x7f, 0x7a, 0x27, - 0x00, 0xf6, 0x59, 0x7f, 0xe7, 0x6e, 0x69, 0x86, 0x02, 0x5d, 0x59, 0x7f, - 0xa3, 0xbc, 0xe1, 0x94, 0xcb, 0x2b, 0xc7, 0xe6, 0x48, 0x17, 0xfc, 0xfd, - 0xe7, 0x7a, 0xf2, 0xe2, 0xca, 0x98, 0xf6, 0x88, 0x86, 0xff, 0xe7, 0xd3, - 0xcb, 0x38, 0xfd, 0xc9, 0x96, 0x5f, 0xda, 0x7d, 0x14, 0x49, 0x65, 0xff, - 0xf3, 0xf7, 0xd9, 0xbf, 0xc7, 0x3b, 0x9c, 0x36, 0xac, 0xbf, 0xf1, 0xc8, - 0xf5, 0xf4, 0x14, 0x71, 0x65, 0x32, 0xb5, 0x52, 0x50, 0x20, 0x36, 0x4c, - 0x87, 0xe8, 0x08, 0xb4, 0x86, 0x45, 0x9d, 0x53, 0xb3, 0x39, 0xe9, 0xda, - 0x18, 0xcf, 0x22, 0xb3, 0xdb, 0x5c, 0x46, 0xb9, 0xb4, 0x6e, 0xd2, 0x86, - 0xa8, 0xe5, 0x15, 0x64, 0xf9, 0x93, 0x10, 0xc9, 0x04, 0xae, 0x5f, 0xa3, - 0xea, 0x38, 0x55, 0xcd, 0x1d, 0x6e, 0xa3, 0xda, 0x6c, 0x29, 0x7d, 0x18, - 0xab, 0xc6, 0x61, 0xfc, 0x67, 0x45, 0x2e, 0x17, 0x94, 0xb7, 0x4e, 0xce, - 0xb0, 0x06, 0x16, 0xa2, 0x91, 0x4f, 0xb1, 0x89, 0x2a, 0xca, 0xfd, 0x2f, - 0xa0, 0x86, 0xb2, 0xa4, 0xa8, 0x58, 0xa3, 0xee, 0xbf, 0xfd, 0xac, 0x14, - 0x7e, 0xc9, 0x8b, 0x35, 0x25, 0x97, 0xb5, 0x9b, 0xab, 0x2f, 0xfd, 0x02, - 0x89, 0xb7, 0x31, 0xb1, 0xba, 0xb2, 0xb4, 0x8a, 0xe6, 0xa5, 0xf4, 0x7e, - 0xff, 0xf9, 0xdb, 0x1a, 0x06, 0x82, 0xc6, 0x82, 0xfc, 0x59, 0x58, 0x88, - 0x10, 0x98, 0x5f, 0xed, 0x00, 0x2e, 0x36, 0xc2, 0xcb, 0xff, 0xa3, 0x42, - 0x74, 0xfb, 0xec, 0x19, 0xac, 0xbf, 0xc5, 0xf7, 0xf9, 0xc7, 0xdd, 0x59, - 0x7f, 0xc5, 0x1b, 0x09, 0xef, 0x3e, 0xea, 0xcb, 0xe8, 0xc1, 0xfc, 0xb2, - 0xb1, 0x12, 0xde, 0x37, 0xde, 0x7b, 0x76, 0xfd, 0xc5, 0x97, 0xff, 0xfc, - 0x64, 0x7f, 0xf3, 0x58, 0x0f, 0x47, 0xb3, 0x5a, 0x86, 0x16, 0x54, 0x27, - 0x81, 0xb1, 0x9e, 0x43, 0x6b, 0xf3, 0x1e, 0x8e, 0x5e, 0x9e, 0x33, 0xd4, - 0x96, 0x5e, 0x7d, 0x6c, 0xb2, 0xe1, 0x45, 0x59, 0x79, 0xc0, 0xcc, 0x06, - 0xd8, 0x51, 0xdb, 0xf6, 0x9e, 0x47, 0xe5, 0x97, 0xff, 0x6b, 0x9e, 0x31, - 0x7c, 0x7b, 0x39, 0x2c, 0xa8, 0x3e, 0xc7, 0x27, 0xbf, 0x63, 0x7c, 0xe3, - 0x59, 0x66, 0x70, 0xf8, 0xae, 0xb2, 0x21, 0x1a, 0x0e, 0x4a, 0x44, 0x60, - 0xac, 0x13, 0xcb, 0x93, 0x16, 0xea, 0x15, 0x5e, 0x21, 0x7b, 0x6c, 0xfe, - 0x51, 0xac, 0xf2, 0x3e, 0x2e, 0xa8, 0x6f, 0x5e, 0x16, 0x14, 0x3b, 0x84, - 0x15, 0x27, 0xed, 0xd1, 0x1d, 0x35, 0x5b, 0xe9, 0x48, 0x5a, 0x2a, 0x6c, - 0x23, 0xfd, 0x2b, 0x1b, 0xf8, 0x6f, 0x14, 0x69, 0xfc, 0xa4, 0x31, 0xf6, - 0x7f, 0x68, 0x37, 0x8e, 0x69, 0x7e, 0xc1, 0xfa, 0x05, 0x59, 0x7f, 0x72, - 0x26, 0x91, 0xcc, 0xb2, 0xff, 0xbb, 0x04, 0x7f, 0xe7, 0xdd, 0x59, 0x7d, - 0x3e, 0xe5, 0xfa, 0xcb, 0xa3, 0x6c, 0x3d, 0xe1, 0x0e, 0x68, 0x91, 0xc7, - 0xc2, 0x81, 0x21, 0x1b, 0x7f, 0x9f, 0x40, 0x67, 0x2c, 0xf9, 0x65, 0xff, - 0xe9, 0x3f, 0x19, 0x94, 0x67, 0x63, 0xe9, 0x2c, 0xba, 0x3f, 0x59, 0x7d, - 0xde, 0xc3, 0x56, 0x5e, 0x31, 0xb3, 0xf1, 0xb9, 0x10, 0x5e, 0xff, 0xd1, - 0x26, 0x62, 0x40, 0xa2, 0x4d, 0xc5, 0x96, 0x30, 0x1f, 0xd7, 0xe6, 0xb4, - 0xcd, 0x39, 0x1d, 0x8d, 0x4c, 0xdb, 0xb0, 0xfe, 0xbf, 0xf3, 0x81, 0x98, - 0x7f, 0x39, 0x64, 0x96, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x23, 0x55, 0xff, - 0xf7, 0x8c, 0x57, 0x20, 0x6a, 0x0e, 0x4f, 0xc5, 0x97, 0xe3, 0x1b, 0xe7, - 0x56, 0x5e, 0x63, 0xee, 0x2c, 0xb3, 0x3d, 0x93, 0x08, 0xc4, 0x10, 0x1a, - 0x3a, 0x77, 0x49, 0xaf, 0xff, 0xf6, 0xf8, 0x2e, 0xb3, 0x7d, 0xee, 0x3c, - 0x1b, 0xb5, 0xc6, 0xb2, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x52, 0xac, 0x05, - 0x44, 0x34, 0xa5, 0x94, 0xe6, 0xa7, 0xf1, 0xeb, 0x33, 0xc3, 0xfe, 0x75, - 0xdb, 0xff, 0xc4, 0xec, 0xc4, 0xcf, 0x13, 0xf7, 0xb0, 0xb2, 0xfc, 0xed, - 0xd9, 0xf7, 0x56, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x23, 0xe5, 0xff, 0xc1, - 0xd7, 0xe0, 0xf1, 0xcc, 0x51, 0xfa, 0xcb, 0xfd, 0x2c, 0xdd, 0x72, 0xfe, - 0x7b, 0x59, 0x7f, 0xfc, 0x4f, 0xd9, 0x43, 0x13, 0xa3, 0xbc, 0x8f, 0xd6, - 0x5d, 0x26, 0x7b, 0x26, 0x67, 0x85, 0x7c, 0x34, 0xea, 0x38, 0x87, 0x74, - 0x04, 0xf5, 0xde, 0x37, 0xdb, 0xf9, 0x9f, 0x1e, 0x3e, 0x92, 0xcb, 0xf7, - 0x7d, 0x04, 0xc2, 0xcb, 0xff, 0x3e, 0xd1, 0xe3, 0xd1, 0xc3, 0x56, 0x5f, - 0xe8, 0xd6, 0x17, 0x73, 0xcb, 0x2e, 0xc6, 0x70, 0x89, 0x69, 0xf2, 0x81, - 0x0f, 0x69, 0x84, 0xc1, 0x9b, 0x0c, 0x6a, 0x66, 0x9a, 0xcc, 0x46, 0x5f, - 0x7f, 0xff, 0x83, 0xa6, 0x1f, 0x98, 0x38, 0xfb, 0x82, 0x75, 0x83, 0x61, - 0x65, 0xf4, 0x71, 0xf8, 0xb2, 0xa4, 0x88, 0x79, 0x99, 0xaf, 0x0a, 0xc0, - 0x16, 0x5f, 0xbe, 0xfa, 0x59, 0xd5, 0x95, 0xc3, 0xc9, 0x08, 0xfd, 0xff, - 0xe6, 0x51, 0x81, 0x77, 0x76, 0x1c, 0xf7, 0x3a, 0x77, 0xa7, 0xd6, 0x5f, - 0xf8, 0x2f, 0xa9, 0x16, 0x72, 0x34, 0xb2, 0xf8, 0x0e, 0xe0, 0x54, 0x58, - 0xeb, 0xf4, 0x78, 0x9c, 0x45, 0x95, 0xa3, 0xd5, 0x69, 0x75, 0xfe, 0xc3, - 0x2d, 0xbb, 0x9e, 0x59, 0x73, 0xf1, 0x65, 0xfd, 0xb0, 0x9a, 0xd6, 0x69, - 0x65, 0x48, 0xf1, 0x9c, 0x5a, 0xff, 0x89, 0xd8, 0xf1, 0xc1, 0x6c, 0xb2, - 0xfe, 0x2e, 0xe8, 0x30, 0xd5, 0x97, 0xff, 0xe2, 0x76, 0x27, 0x75, 0x88, - 0x29, 0x67, 0x8d, 0xab, 0x29, 0xd1, 0x08, 0x12, 0xdb, 0xfb, 0xf7, 0xef, - 0x21, 0x85, 0x97, 0xf8, 0xfb, 0x1a, 0x63, 0xc6, 0xb2, 0xff, 0xfa, 0x5b, - 0x32, 0x91, 0x3c, 0xec, 0x0d, 0x4e, 0x9d, 0xe9, 0xf5, 0x97, 0xfd, 0x9b, - 0xe2, 0x5f, 0x4b, 0x3a, 0xb2, 0xb1, 0x30, 0x27, 0x2f, 0xfc, 0xcc, 0x99, - 0x6e, 0x39, 0x2c, 0xbf, 0xdd, 0x2c, 0xdf, 0xe7, 0x92, 0xca, 0x19, 0xe5, - 0x60, 0xb5, 0xf8, 0xfb, 0xd3, 0xea, 0xcb, 0xff, 0xf0, 0x49, 0xd8, 0xeb, - 0x10, 0x52, 0xcf, 0x1b, 0x56, 0x5f, 0x6b, 0x59, 0x3e, 0xb2, 0xfd, 0xaf, - 0xcf, 0xd0, 0xb2, 0xb1, 0x19, 0x2d, 0x27, 0x75, 0x50, 0x92, 0xdf, 0xb3, - 0x59, 0x93, 0x2c, 0xb3, 0x38, 0x5d, 0xf2, 0xd9, 0xb6, 0x44, 0x43, 0x64, - 0xc8, 0x49, 0x30, 0x44, 0x6f, 0x13, 0x10, 0xb6, 0x17, 0x9e, 0x8c, 0x90, - 0xa1, 0x0d, 0xc8, 0x75, 0x08, 0x77, 0x7c, 0xc1, 0xea, 0x65, 0x97, 0xfa, - 0x62, 0x71, 0x7b, 0x9e, 0x59, 0x73, 0x58, 0x59, 0x4c, 0x93, 0xcc, 0x65, - 0x0d, 0x2f, 0xc5, 0x9e, 0x7e, 0xac, 0xbd, 0x3c, 0x27, 0xaf, 0xd6, 0x53, - 0x24, 0xf3, 0xd9, 0x42, 0x6b, 0xff, 0x8b, 0x05, 0xe6, 0x1f, 0x3b, 0x9b, - 0xab, 0x2f, 0x78, 0x23, 0x59, 0x7f, 0xd1, 0x31, 0xf7, 0x86, 0x53, 0x2c, - 0xbf, 0xcf, 0xff, 0x1f, 0xbd, 0x75, 0x97, 0x34, 0x0b, 0x2f, 0xf9, 0xc6, - 0x7f, 0x4b, 0xa7, 0xa5, 0x94, 0x34, 0xc7, 0xf1, 0x1b, 0x43, 0xa4, 0x73, - 0xd3, 0x3d, 0xe2, 0xf7, 0xfc, 0x2e, 0xb0, 0x9f, 0xe9, 0x71, 0x65, 0xc4, - 0xc2, 0xcb, 0xb0, 0x6b, 0x2b, 0x0f, 0x9d, 0xce, 0xb7, 0x8b, 0xdf, 0xbc, - 0xed, 0x82, 0x59, 0x7d, 0xcf, 0x18, 0xab, 0x2f, 0xe0, 0x3e, 0xa7, 0xdf, - 0xcb, 0x2f, 0xd0, 0x2f, 0x73, 0xcb, 0x2e, 0x13, 0x16, 0x5f, 0x0f, 0x3e, - 0xea, 0xca, 0x83, 0x74, 0x62, 0xf5, 0x39, 0x1f, 0x58, 0x4c, 0x64, 0x64, - 0x61, 0xc6, 0x2b, 0x01, 0x65, 0xef, 0xd9, 0x1e, 0x59, 0x4c, 0xac, 0xd9, - 0xf0, 0x46, 0xf8, 0x3c, 0xf6, 0x2c, 0xad, 0x1e, 0x49, 0x13, 0xdf, 0xfe, - 0xcd, 0xcc, 0x07, 0x7e, 0x96, 0x17, 0xee, 0xb2, 0xff, 0xff, 0xe3, 0x2d, - 0xf8, 0x32, 0x77, 0xdf, 0x9b, 0xbd, 0xdd, 0x3e, 0x94, 0x7e, 0xb2, 0xf1, - 0x87, 0xf5, 0x96, 0xfb, 0x75, 0x12, 0xb3, 0x3c, 0x5e, 0x69, 0xe9, 0x65, - 0x61, 0xe5, 0x7e, 0x5d, 0x7b, 0x1c, 0x96, 0x5e, 0xf4, 0x4c, 0xb2, 0xe3, - 0xe9, 0x9b, 0x77, 0x1a, 0xbe, 0x96, 0xe9, 0xb5, 0x65, 0xf7, 0x1d, 0xf7, - 0x56, 0x5f, 0xec, 0xdf, 0x9e, 0xdd, 0x32, 0x73, 0xc9, 0xe9, 0x2d, 0xff, - 0xef, 0x47, 0xd9, 0xb1, 0x04, 0x3d, 0x8f, 0x2c, 0xbf, 0xe3, 0x07, 0x8f, - 0xbc, 0x7f, 0x96, 0x5f, 0xe8, 0xd1, 0x60, 0xf3, 0xc0, 0x44, 0x27, 0x92, - 0xef, 0xff, 0xd9, 0x36, 0x6e, 0x16, 0x6f, 0x2c, 0xfd, 0xb1, 0x25, 0x97, - 0xfc, 0xff, 0x16, 0x77, 0x98, 0x2a, 0xca, 0xc5, 0x78, 0x80, 0x21, 0x38, - 0xcb, 0x37, 0x56, 0x74, 0xe7, 0xe8, 0x68, 0x12, 0x48, 0x56, 0x6f, 0xde, - 0x3d, 0x06, 0x4b, 0x2f, 0xfb, 0x63, 0xf4, 0xcf, 0x23, 0xf2, 0xcb, 0xf6, - 0xbf, 0x9f, 0x0f, 0x56, 0x5f, 0xd1, 0xac, 0xc2, 0x61, 0x65, 0x41, 0xec, - 0xf8, 0xb6, 0xff, 0x17, 0x67, 0xb7, 0xe8, 0x61, 0x65, 0xfd, 0x22, 0xcf, - 0xba, 0xeb, 0x2a, 0x0f, 0x91, 0xcd, 0xef, 0xfb, 0x7b, 0xed, 0xde, 0x3b, - 0xee, 0xac, 0xbf, 0xf1, 0xe8, 0x1e, 0x39, 0x9d, 0xe4, 0xb2, 0xff, 0xef, - 0x43, 0x41, 0xe3, 0xee, 0x63, 0x56, 0x5f, 0xe7, 0x63, 0x35, 0xb4, 0x30, - 0xb2, 0xa0, 0xfe, 0x09, 0x0e, 0xfb, 0xfc, 0x37, 0x59, 0x7b, 0xf3, 0x11, - 0x65, 0xff, 0xff, 0xe8, 0x2e, 0xf0, 0xfc, 0x6d, 0x1c, 0x7b, 0x37, 0xee, - 0x99, 0x0f, 0x36, 0x59, 0x4e, 0x8b, 0x9f, 0xc8, 0x7a, 0x3d, 0x7f, 0xcf, - 0xad, 0xbc, 0x79, 0xa9, 0x96, 0x5f, 0xfc, 0xee, 0x5f, 0xf3, 0x37, 0x66, - 0x77, 0x59, 0x40, 0x44, 0x04, 0xc7, 0x57, 0xe9, 0x73, 0x6c, 0x15, 0x65, - 0xec, 0xd6, 0xcb, 0x2f, 0x39, 0x4c, 0xb2, 0xbc, 0x6e, 0x5c, 0x76, 0xf3, - 0xb8, 0x15, 0x16, 0x82, 0xff, 0xce, 0x2e, 0xe0, 0x1f, 0x5b, 0x60, 0xab, - 0x2f, 0xef, 0xe0, 0xa3, 0xbc, 0x59, 0x50, 0x98, 0xe0, 0xd8, 0xc0, 0x41, - 0xa2, 0x8f, 0xd1, 0x2f, 0x04, 0x3a, 0x59, 0x78, 0xa3, 0x4b, 0x2e, 0xd4, - 0xd3, 0x1b, 0x8e, 0x0e, 0xdf, 0xff, 0xee, 0x39, 0x7a, 0x37, 0xfb, 0x3b, - 0x8e, 0x40, 0xc1, 0xac, 0xbf, 0xff, 0xf3, 0x91, 0xc7, 0x4f, 0xd1, 0xcf, - 0x67, 0x35, 0x80, 0xce, 0xac, 0xb6, 0xa1, 0x18, 0xfe, 0x5f, 0xac, 0x4c, - 0x78, 0xe1, 0xed, 0x7e, 0x1c, 0x4c, 0x6d, 0x59, 0x7e, 0x1e, 0x7e, 0xf0, - 0xb2, 0xff, 0xff, 0xcf, 0xa9, 0x70, 0xc7, 0x9a, 0xd8, 0xf9, 0xe7, 0xff, - 0x98, 0x4b, 0x2c, 0x1c, 0x44, 0x9f, 0x09, 0xef, 0xdb, 0x35, 0xdc, 0x96, - 0x5f, 0xf3, 0xff, 0x87, 0xce, 0x47, 0xeb, 0x2a, 0x0f, 0x83, 0x84, 0xf7, - 0xfe, 0x1c, 0xfe, 0x70, 0x7e, 0x3d, 0x6c, 0xb2, 0xff, 0xfb, 0x05, 0xeb, - 0x63, 0x3b, 0xec, 0xc2, 0x02, 0xca, 0x84, 0x48, 0xf9, 0x0e, 0xff, 0xfc, - 0x7d, 0x96, 0x6b, 0x4f, 0x21, 0x09, 0xfb, 0xc5, 0x97, 0xfa, 0x6f, 0x47, - 0x7d, 0x13, 0x2c, 0xa8, 0x64, 0xc3, 0x6c, 0x51, 0x28, 0x49, 0x8e, 0x10, - 0xb8, 0x40, 0xc1, 0xf0, 0x21, 0x6c, 0x70, 0xd9, 0xdd, 0x85, 0x86, 0xa3, - 0x40, 0xf4, 0x74, 0x2e, 0x4e, 0x50, 0xbb, 0xe4, 0x22, 0x3b, 0x0b, 0x2d, - 0xe4, 0x42, 0x2a, 0xdf, 0xf0, 0x7b, 0xc2, 0xcf, 0xba, 0xeb, 0x2d, 0x8b, - 0x2f, 0xff, 0x0f, 0xd1, 0x07, 0xde, 0x19, 0x7d, 0x25, 0x96, 0x08, 0xcf, - 0x64, 0x84, 0x2e, 0xc6, 0xac, 0xbf, 0xfe, 0x60, 0xf5, 0x9f, 0x77, 0xc6, - 0x24, 0x0e, 0x16, 0x5f, 0xfb, 0xed, 0xfe, 0xdd, 0x3e, 0x94, 0x35, 0x65, - 0x62, 0x25, 0x5d, 0x46, 0xf4, 0x6c, 0x6b, 0x29, 0x84, 0xe8, 0x4e, 0x12, - 0x5a, 0x27, 0x78, 0x55, 0x91, 0x0d, 0xf8, 0xbb, 0x39, 0xbb, 0x2c, 0xbe, - 0x0b, 0x5f, 0xab, 0x2f, 0xff, 0xc7, 0xb1, 0x66, 0xff, 0x1f, 0x7e, 0x94, - 0x14, 0xcb, 0x2a, 0x11, 0x4a, 0x32, 0xbf, 0x11, 0x5f, 0xf4, 0xc5, 0x0d, - 0xf4, 0x6f, 0x6a, 0xcb, 0xf7, 0x4e, 0x7f, 0x36, 0x59, 0x7f, 0xb9, 0x9e, - 0x3e, 0x07, 0x65, 0x97, 0xc7, 0x3f, 0x9b, 0x2c, 0xb9, 0xfe, 0x9c, 0x88, - 0x4e, 0x15, 0xf4, 0xd2, 0xb1, 0x1f, 0xbc, 0x85, 0xfd, 0x8c, 0x69, 0xa9, - 0xf6, 0x32, 0xcb, 0xfe, 0xf1, 0xf7, 0x8f, 0xf7, 0xe2, 0xac, 0xbc, 0x37, - 0xd9, 0x65, 0xda, 0xd8, 0x07, 0xb2, 0x21, 0xe5, 0xff, 0xf0, 0x76, 0xd1, - 0xf7, 0x60, 0xea, 0x5c, 0xdd, 0x35, 0x95, 0xe4, 0xc3, 0x9e, 0x11, 0x04, - 0x61, 0x7f, 0xc1, 0x7e, 0xbc, 0x9f, 0xe9, 0x2c, 0xbf, 0x38, 0x99, 0xf7, - 0x56, 0x50, 0x0f, 0x8b, 0x87, 0x37, 0xf8, 0xc7, 0x8d, 0x9d, 0x83, 0x59, - 0x73, 0xf1, 0x65, 0xf8, 0xc5, 0x64, 0x32, 0x59, 0x0b, 0x2f, 0xff, 0x83, - 0xad, 0x41, 0x63, 0x07, 0xef, 0x60, 0x8b, 0x2c, 0xcb, 0x59, 0x5a, 0x3e, - 0x50, 0xa8, 0x5f, 0x46, 0xa2, 0x65, 0x97, 0x8a, 0x1a, 0xb2, 0xd0, 0xb2, - 0xa6, 0x35, 0x6d, 0x1b, 0xbf, 0xcd, 0x09, 0x77, 0x81, 0xd2, 0xca, 0x92, - 0x75, 0x23, 0x34, 0x60, 0x5b, 0x50, 0x9a, 0x69, 0x11, 0x26, 0xcf, 0x91, - 0x5b, 0x4b, 0x2f, 0x6b, 0x31, 0x65, 0x7e, 0x6b, 0x37, 0x04, 0x6e, 0x26, - 0x16, 0x5f, 0xbe, 0x96, 0xb9, 0xc5, 0x95, 0x07, 0x83, 0x82, 0xf7, 0xff, - 0x8f, 0x70, 0x2d, 0xf4, 0x36, 0x6d, 0xd3, 0x1a, 0xcb, 0xf8, 0xbe, 0x97, - 0x42, 0x35, 0x97, 0xed, 0xdc, 0x26, 0x9a, 0xca, 0x83, 0xd8, 0x72, 0xfb, - 0xc5, 0x9f, 0xac, 0xbf, 0xd9, 0xee, 0x4d, 0x99, 0xb2, 0xcb, 0x0b, 0xa3, - 0xd0, 0xe8, 0xe5, 0xfc, 0x2f, 0x4a, 0x1b, 0xc5, 0x94, 0xe7, 0xae, 0x12, - 0x9b, 0xf4, 0xde, 0xcf, 0xdd, 0x65, 0x42, 0xa4, 0x09, 0x33, 0x61, 0x07, - 0xa1, 0x52, 0x50, 0xc7, 0xde, 0x43, 0x7f, 0xff, 0xf4, 0x0f, 0xd9, 0xde, - 0xbe, 0xd9, 0xd6, 0x98, 0x4a, 0x62, 0xc1, 0x56, 0x5f, 0xe2, 0x77, 0xdf, - 0x2d, 0xff, 0xac, 0xbf, 0xfe, 0xe4, 0x4d, 0xe8, 0xde, 0x58, 0x3f, 0x47, - 0x16, 0x50, 0xd1, 0x11, 0xd3, 0x7b, 0xff, 0xcd, 0x3f, 0xa5, 0xc2, 0xc0, - 0x74, 0x24, 0xb2, 0xff, 0x73, 0x37, 0x7f, 0x77, 0x99, 0x65, 0x62, 0x29, - 0x1a, 0x47, 0xe4, 0xab, 0xfe, 0x7e, 0x96, 0x0f, 0xd9, 0xd5, 0x95, 0x0a, - 0x81, 0x32, 0x39, 0xe7, 0x2f, 0xbf, 0x10, 0x1f, 0x86, 0xb2, 0xff, 0xfe, - 0xd1, 0x44, 0x7d, 0x3b, 0x9d, 0x28, 0x1f, 0xa3, 0xab, 0x2e, 0x3f, 0x2c, - 0xbe, 0x91, 0x38, 0x8b, 0x2f, 0xf0, 0xdf, 0xfd, 0x69, 0xff, 0x59, 0x7d, - 0xa0, 0x6e, 0x8a, 0xb2, 0xf9, 0x86, 0x4b, 0x8a, 0xb2, 0xb0, 0xf3, 0xdc, - 0x9e, 0x8d, 0x14, 0x85, 0x08, 0x4a, 0x84, 0xe1, 0x30, 0x9b, 0x75, 0x71, - 0xc5, 0x83, 0x0c, 0x6b, 0xff, 0xb4, 0x59, 0xbf, 0x58, 0x7e, 0x81, 0xac, - 0xbc, 0xfb, 0xa6, 0xb2, 0xff, 0xc2, 0x75, 0x83, 0x62, 0x30, 0xa1, 0x65, - 0xbe, 0x59, 0x7f, 0xf8, 0xdd, 0xe6, 0xef, 0xb2, 0x5e, 0x3d, 0xeb, 0x2a, - 0x0f, 0x77, 0x74, 0x4a, 0xfc, 0x27, 0x4a, 0x3f, 0x59, 0x50, 0x9a, 0x5f, - 0xc8, 0x9a, 0x1e, 0x6c, 0x27, 0x37, 0x92, 0x5f, 0xa3, 0xb9, 0xe8, 0x59, - 0x7e, 0xfe, 0x3b, 0x8d, 0x59, 0x7f, 0xff, 0xff, 0x9b, 0xba, 0x7e, 0xff, - 0x1c, 0x81, 0x9f, 0x4b, 0x87, 0xde, 0x1f, 0xd2, 0x28, 0xf4, 0x2c, 0xbf, - 0xf6, 0x7d, 0x2e, 0x1f, 0x5c, 0xb1, 0x65, 0xfe, 0xc6, 0xfb, 0x26, 0x79, - 0x96, 0x5f, 0xd8, 0x7b, 0x7a, 0x22, 0x71, 0xf8, 0xf4, 0xf6, 0xff, 0xff, - 0xb2, 0x6c, 0xe8, 0xfd, 0x1f, 0x66, 0xa3, 0xa6, 0x03, 0x1a, 0xcb, 0x18, - 0xd1, 0x57, 0xe4, 0x5a, 0xc4, 0xf5, 0x7d, 0x1d, 0x6d, 0xff, 0xff, 0x8c, - 0xb3, 0xb0, 0xd1, 0x42, 0xfb, 0x4e, 0xcf, 0x1e, 0xbc, 0xeb, 0x2f, 0xcc, - 0x30, 0xfd, 0xe2, 0xcb, 0xff, 0xec, 0xd9, 0xc6, 0x61, 0x06, 0x8c, 0x59, - 0x8d, 0x65, 0x42, 0x3a, 0x31, 0xb7, 0x45, 0x57, 0xfe, 0xcf, 0xa5, 0xc9, - 0xb4, 0xfd, 0xe2, 0xcb, 0xf1, 0x40, 0x24, 0xd5, 0x97, 0xff, 0xb3, 0x77, - 0xc1, 0x9b, 0xd9, 0x34, 0xa3, 0xe5, 0x97, 0xff, 0x73, 0x26, 0xf4, 0x6f, - 0xcf, 0x7a, 0x16, 0x50, 0xd1, 0x7b, 0xa2, 0x7e, 0xa8, 0x5f, 0xe7, 0xff, - 0x8d, 0x7f, 0xba, 0xb2, 0x96, 0x5f, 0xf7, 0x08, 0x21, 0xec, 0xa1, 0x85, - 0x95, 0xf1, 0xe2, 0xf4, 0x2e, 0xb1, 0x19, 0xae, 0x60, 0x17, 0xab, 0xff, - 0x8b, 0x36, 0xd4, 0x47, 0x4f, 0xd0, 0xb2, 0xff, 0xf4, 0x8d, 0x83, 0xe9, - 0x64, 0xb5, 0xce, 0x2c, 0xbf, 0xd1, 0x13, 0x66, 0xf3, 0xd2, 0xcb, 0xe3, - 0xd6, 0x12, 0xca, 0x84, 0x4f, 0x12, 0x57, 0x0d, 0x2f, 0xff, 0x18, 0x47, - 0x84, 0x19, 0x18, 0xf3, 0xf5, 0x97, 0xff, 0xe3, 0x0f, 0xde, 0xc1, 0x43, - 0x87, 0xee, 0x46, 0xcb, 0x2b, 0x65, 0xf0, 0x9c, 0x26, 0x04, 0x7f, 0xba, - 0x8c, 0x47, 0xf2, 0xe2, 0x8f, 0x2f, 0x85, 0xdd, 0x87, 0x06, 0xf2, 0xed, - 0xc4, 0x9b, 0xe9, 0xa4, 0x73, 0x2c, 0xb8, 0xb6, 0x59, 0x7d, 0xfe, 0x9e, - 0x7d, 0x65, 0x4e, 0x3e, 0x19, 0xe4, 0x93, 0xe1, 0x7b, 0x6e, 0x2c, 0xbb, - 0xdb, 0x8b, 0x2f, 0xff, 0x66, 0xff, 0x3c, 0xbf, 0x7f, 0xbf, 0x3f, 0x96, - 0x5b, 0xb0, 0x7d, 0x3e, 0x1a, 0xbf, 0xfe, 0xd6, 0xd1, 0xbb, 0xc2, 0xce, - 0xf4, 0xf4, 0x05, 0x97, 0xf6, 0x6d, 0xc2, 0xcd, 0xeb, 0x2a, 0x49, 0x93, - 0x1b, 0xeb, 0x93, 0xf5, 0x4e, 0xa1, 0x93, 0xff, 0x93, 0xeb, 0x67, 0x18, - 0x5b, 0xc6, 0xbb, 0x7c, 0xed, 0x79, 0x2c, 0xbf, 0xfb, 0xc7, 0x3b, 0x0b, - 0x0f, 0x4f, 0xbd, 0x65, 0xff, 0xc6, 0x4e, 0x32, 0xc1, 0xfa, 0x38, 0xb2, - 0xf0, 0x91, 0xa5, 0x97, 0xfd, 0xb3, 0x63, 0x5d, 0x28, 0xd9, 0x65, 0xf8, - 0xc1, 0xf3, 0x00, 0x59, 0x7d, 0xbe, 0x08, 0x0b, 0x2f, 0xff, 0xe8, 0x2c, - 0xff, 0x98, 0x3f, 0x46, 0xcd, 0x09, 0x0d, 0x65, 0x19, 0xff, 0x78, 0x8e, - 0xfc, 0x7d, 0xec, 0x49, 0x65, 0xd1, 0xf2, 0xca, 0x1a, 0xa0, 0x56, 0x08, - 0x40, 0x8b, 0xa4, 0x17, 0x1d, 0x23, 0xae, 0xc2, 0xa3, 0x79, 0x0c, 0xf9, - 0x3d, 0xfc, 0x5d, 0x8e, 0x74, 0xd6, 0x5f, 0xff, 0xd1, 0x36, 0x0f, 0xd1, - 0xbf, 0xd9, 0xd2, 0x88, 0x6a, 0xcb, 0xfb, 0xe1, 0x8f, 0x1f, 0x65, 0x97, - 0x8a, 0x06, 0xb2, 0xfa, 0x59, 0xec, 0x59, 0x7b, 0x60, 0x92, 0xcb, 0xbe, - 0xe4, 0x22, 0x22, 0x62, 0xf7, 0x1b, 0x10, 0x86, 0xff, 0xa0, 0x1e, 0x39, - 0x9d, 0xf6, 0x59, 0x50, 0x9c, 0x93, 0x4b, 0x1e, 0x1c, 0x7f, 0xa5, 0x5f, - 0x1e, 0xcd, 0x85, 0x97, 0xfa, 0x51, 0xad, 0xa3, 0x5b, 0x2c, 0xbf, 0xed, - 0xee, 0x5f, 0xfb, 0x3f, 0x75, 0x97, 0xff, 0xb3, 0x3f, 0x6c, 0x4d, 0xc1, - 0xf9, 0xf6, 0x59, 0x46, 0x88, 0x72, 0x3b, 0xbe, 0x7f, 0x19, 0x2c, 0xbe, - 0xcf, 0xe0, 0x96, 0x58, 0xb6, 0x3c, 0x1f, 0x10, 0x5f, 0xf1, 0x84, 0xa5, - 0xa8, 0xc1, 0xac, 0xbf, 0xff, 0xd9, 0x20, 0x78, 0xfd, 0x19, 0xa9, 0x74, - 0xa1, 0xbc, 0x59, 0x7f, 0xed, 0x3e, 0xc1, 0x8c, 0x20, 0xec, 0xb2, 0xbc, - 0x89, 0xee, 0x2f, 0xdf, 0xf0, 0x7b, 0xbb, 0xcc, 0x32, 0x1a, 0xcb, 0xe0, - 0xc7, 0xc3, 0x59, 0x43, 0x4f, 0x81, 0xd8, 0xb8, 0x51, 0xd8, 0x6a, 0xef, - 0x23, 0x14, 0xee, 0xfb, 0x72, 0x35, 0xb2, 0xca, 0x85, 0x64, 0x39, 0x2a, - 0x71, 0xd7, 0xef, 0xf6, 0x81, 0x36, 0x1f, 0x82, 0xb2, 0xff, 0xff, 0xde, - 0x76, 0x38, 0x33, 0xcf, 0x80, 0x64, 0xff, 0x36, 0x23, 0x8b, 0x2f, 0xfc, - 0x7b, 0xcb, 0x39, 0xd6, 0x0c, 0x0b, 0x2f, 0xfc, 0x5b, 0xf0, 0x73, 0x66, - 0x13, 0x0b, 0x2f, 0xf7, 0x7d, 0xba, 0x7e, 0x79, 0x96, 0x5f, 0xd0, 0x02, - 0x7f, 0xba, 0xb2, 0xa4, 0x8e, 0x43, 0x40, 0xdd, 0x40, 0x69, 0xbd, 0xfa, - 0x3b, 0xb6, 0x0a, 0xb2, 0xff, 0xdf, 0x00, 0x9f, 0x67, 0x91, 0xf9, 0x65, - 0x68, 0xfa, 0x02, 0x53, 0x7f, 0x60, 0x30, 0xff, 0xe2, 0xcb, 0xf0, 0xc0, - 0x1c, 0xdd, 0x59, 0x7f, 0xe2, 0x8f, 0xbd, 0x06, 0x4e, 0x35, 0x95, 0x31, - 0xf3, 0xb4, 0xae, 0xfb, 0x98, 0x4c, 0x2c, 0xbe, 0x8c, 0x93, 0xac, 0xaf, - 0x8f, 0x0b, 0xc4, 0x57, 0xed, 0x7f, 0x3c, 0xb2, 0x67, 0xa5, 0x95, 0x08, - 0xc0, 0x1b, 0x2b, 0x91, 0xdf, 0xe1, 0xef, 0x82, 0xee, 0x7e, 0xb2, 0xfd, - 0x1d, 0xf4, 0x75, 0x65, 0xc5, 0xfa, 0xca, 0xd8, 0xfc, 0xf4, 0x6a, 0xe4, - 0xf7, 0xff, 0xff, 0x83, 0xaf, 0x64, 0xd3, 0x3e, 0xa6, 0xef, 0x83, 0xff, - 0x30, 0xf7, 0x8e, 0x16, 0x5f, 0xf1, 0xfb, 0x9a, 0x32, 0x86, 0xac, 0xbf, - 0xa3, 0x9b, 0xa7, 0xf7, 0x56, 0x5f, 0xd1, 0xc9, 0x8b, 0x26, 0x59, 0x46, - 0x98, 0xa6, 0xeb, 0xf6, 0x8d, 0xfc, 0x63, 0x7e, 0xef, 0x9c, 0x98, 0x59, - 0x7f, 0xb7, 0x08, 0x21, 0x01, 0xb0, 0xb2, 0xfc, 0x62, 0xb5, 0xfa, 0xb2, - 0xff, 0x07, 0x61, 0xfb, 0x0a, 0x16, 0x54, 0x22, 0x48, 0x06, 0xe4, 0x51, - 0x7f, 0xf6, 0x0f, 0xd0, 0x2f, 0xd2, 0xe8, 0x46, 0xb2, 0xec, 0xe2, 0xcb, - 0x9f, 0xab, 0x2f, 0x70, 0x32, 0xd1, 0xac, 0xf0, 0xb5, 0xb0, 0x69, 0xe7, - 0x62, 0x00, 0x21, 0x74, 0x45, 0xdd, 0x73, 0xbf, 0xfd, 0x90, 0x58, 0x02, - 0xce, 0x85, 0xc5, 0x59, 0x7f, 0xd9, 0xfc, 0xfe, 0x38, 0xf3, 0x8b, 0x2f, - 0xfe, 0x3e, 0xfb, 0x0e, 0x5c, 0xcf, 0xba, 0xb2, 0x86, 0x8c, 0x62, 0x47, - 0xe1, 0xdd, 0xff, 0x7e, 0x59, 0xde, 0x3b, 0x92, 0xcb, 0xff, 0x83, 0x93, - 0x61, 0x80, 0xb3, 0xd8, 0xb2, 0xdf, 0x80, 0xfe, 0x48, 0xde, 0xf3, 0x5f, - 0xe5, 0x95, 0xa3, 0xc5, 0xfc, 0xa2, 0xa1, 0x92, 0xf8, 0x33, 0x4c, 0x8d, - 0x40, 0xe1, 0x4f, 0xa2, 0x2f, 0x46, 0xa8, 0xf0, 0xa1, 0x29, 0x62, 0x3d, - 0x8c, 0x64, 0x30, 0xed, 0xbf, 0xfe, 0xfd, 0xfd, 0x9f, 0xfe, 0xfa, 0xcd, - 0xfe, 0xc5, 0x97, 0xff, 0xee, 0xf0, 0x82, 0x1f, 0xa5, 0xc1, 0xfb, 0x0f, - 0xab, 0x2d, 0x0d, 0x45, 0x51, 0x29, 0xd9, 0xab, 0x2f, 0xdf, 0x99, 0x4b, - 0x8b, 0x2c, 0x7f, 0x1b, 0x9e, 0x88, 0xdf, 0xde, 0x98, 0xfc, 0x6d, 0x59, - 0x77, 0xfc, 0x59, 0x58, 0x78, 0xc6, 0x5d, 0x7f, 0xa5, 0x9a, 0xe1, 0x46, - 0xcb, 0x2f, 0x98, 0xd4, 0x35, 0x65, 0xd9, 0xb2, 0xca, 0x83, 0x75, 0x3e, - 0x47, 0x7f, 0x8c, 0xbb, 0x2c, 0xd6, 0x2c, 0xbf, 0xa0, 0x1a, 0x38, 0x6a, - 0xca, 0x91, 0xee, 0x91, 0x8d, 0xff, 0xe6, 0xfe, 0xfa, 0xcd, 0xf8, 0x63, - 0xf1, 0xac, 0xbf, 0xf3, 0xff, 0xa8, 0x2e, 0xfb, 0x24, 0xb2, 0xa1, 0x15, - 0x58, 0x42, 0x69, 0x77, 0xb3, 0xce, 0xb2, 0xf0, 0x42, 0x4b, 0x2f, 0xc7, - 0xef, 0x60, 0xd6, 0x5a, 0x65, 0x83, 0x3c, 0x3e, 0x0e, 0x50, 0xd1, 0x1c, - 0xeb, 0xd7, 0xf6, 0xc5, 0x9f, 0x87, 0x8b, 0x2f, 0xf7, 0xf3, 0xf8, 0xe3, - 0xce, 0x2c, 0xbd, 0xba, 0x6d, 0x59, 0x7f, 0xfc, 0xff, 0xf2, 0x3f, 0xee, - 0x18, 0xf0, 0xa6, 0x59, 0xe2, 0xfe, 0xa1, 0x1c, 0x78, 0x5e, 0xea, 0xb7, - 0xfa, 0x5d, 0xf6, 0x6a, 0x3a, 0xb2, 0xfe, 0x17, 0x00, 0x0c, 0x15, 0x65, - 0xc0, 0xde, 0xb2, 0xff, 0xf9, 0xe5, 0xcc, 0xd4, 0x70, 0xb3, 0xf0, 0xf1, - 0x65, 0x41, 0xf4, 0x78, 0x66, 0xb1, 0x17, 0x1d, 0x84, 0xbd, 0xff, 0xec, - 0xdc, 0xfd, 0xb1, 0x37, 0x4c, 0x3a, 0xe2, 0xcb, 0xfc, 0xdc, 0xc2, 0xec, - 0xfe, 0x2c, 0xbf, 0xfb, 0x9d, 0x88, 0xd7, 0xf3, 0x16, 0x0a, 0xb2, 0xbe, - 0x3f, 0xa7, 0x34, 0xbc, 0xc4, 0x82, 0xb2, 0xfd, 0xe8, 0xd6, 0xcd, 0x59, - 0x7f, 0x82, 0xe5, 0xec, 0x79, 0x96, 0x5b, 0xe9, 0x8f, 0x6c, 0x52, 0x9a, - 0x34, 0x52, 0x3b, 0xcd, 0x42, 0xac, 0x2c, 0x87, 0x59, 0x93, 0xbc, 0x32, - 0x4a, 0x18, 0xd5, 0x0b, 0xf1, 0x32, 0x60, 0xc6, 0xdf, 0x88, 0x0d, 0xb7, - 0xd1, 0x95, 0x3c, 0x2e, 0xca, 0x30, 0x5e, 0x4a, 0xef, 0xb8, 0x24, 0xb2, - 0xfb, 0xee, 0x47, 0xcb, 0x29, 0x96, 0x6e, 0x88, 0x5a, 0xf1, 0x67, 0xeb, - 0x2d, 0x0b, 0x2b, 0xf3, 0x59, 0xd1, 0xcb, 0x9f, 0xab, 0x2b, 0x46, 0xe3, - 0xc4, 0x57, 0xcd, 0x8d, 0x71, 0x65, 0xfe, 0x86, 0x96, 0x7e, 0x1e, 0x2c, - 0xbf, 0xed, 0x67, 0xb3, 0x69, 0xc7, 0xc5, 0x95, 0x88, 0xb1, 0x32, 0x12, - 0x22, 0x09, 0x9d, 0xfe, 0x91, 0xf3, 0x91, 0xa9, 0x2c, 0xbe, 0x76, 0xc1, - 0xac, 0xa1, 0x9e, 0x9c, 0xc6, 0x77, 0xf1, 0x90, 0x65, 0x9c, 0x59, 0x7f, - 0xfe, 0x91, 0xf7, 0x80, 0xf1, 0xf7, 0xe9, 0x1f, 0x78, 0xb2, 0xff, 0xa3, - 0xf6, 0xbc, 0xb5, 0x9b, 0x2c, 0xbf, 0xee, 0xc7, 0xdf, 0xbf, 0xbc, 0x6b, - 0x2f, 0x8e, 0x7f, 0x36, 0x59, 0x58, 0x7b, 0xfd, 0x3a, 0xb3, 0x56, 0x5f, - 0xc6, 0x41, 0x96, 0x72, 0x71, 0xb2, 0xde, 0x43, 0x50, 0x9d, 0xbb, 0x04, - 0x73, 0x16, 0x79, 0x5f, 0xb0, 0xcb, 0xbf, 0xfb, 0x41, 0xfa, 0x5c, 0xf6, - 0x6c, 0x12, 0x59, 0x66, 0x73, 0xd3, 0xe6, 0x94, 0x4f, 0x2e, 0x13, 0xdb, - 0xd4, 0x46, 0x95, 0xb4, 0x2f, 0xe5, 0x19, 0x48, 0xe7, 0x22, 0x72, 0x94, - 0x08, 0xc4, 0xac, 0x20, 0x4b, 0x59, 0xfa, 0x12, 0xc7, 0x1e, 0x5c, 0xd2, - 0xb6, 0x75, 0x29, 0x99, 0xb1, 0xdc, 0xfa, 0x97, 0x34, 0xf2, 0x95, 0xbf, - 0x94, 0x36, 0xcb, 0x42, 0x29, 0x68, 0x7c, 0xa4, 0xd9, 0x76, 0x91, 0xca, - 0x18, 0x67, 0xcf, 0xc6, 0x72, 0x24, 0xa4, 0x4d, 0xc5, 0x1b, 0xfb, 0x4c, - 0xc7, 0xbc, 0xe1, 0x65, 0xfd, 0xb8, 0x63, 0x28, 0x99, 0x65, 0xe8, 0x72, - 0x59, 0x7d, 0x9e, 0x7e, 0xac, 0xb3, 0x27, 0x0f, 0xaf, 0xc6, 0x04, 0x35, - 0x7f, 0xfa, 0x34, 0x19, 0xa6, 0x3f, 0x1b, 0x5c, 0x6b, 0x2f, 0xe2, 0x7e, - 0xf2, 0x37, 0x56, 0x5f, 0xff, 0xfc, 0xe5, 0xde, 0x41, 0xcb, 0x37, 0x0b, - 0xb1, 0xe8, 0x60, 0x31, 0xb8, 0xb2, 0xfc, 0x1e, 0xcd, 0x0c, 0x2c, 0xa0, - 0x26, 0x32, 0x69, 0x7e, 0x2f, 0x27, 0x5b, 0xec, 0xe7, 0xe6, 0xb2, 0xdf, - 0x2c, 0xbf, 0xe8, 0x3e, 0x61, 0xfa, 0x3a, 0xb2, 0xa4, 0x79, 0x1e, 0x12, - 0xbe, 0x03, 0xb8, 0x15, 0x16, 0xb2, 0x8c, 0xf4, 0x34, 0x45, 0x7e, 0xc9, - 0x1f, 0x82, 0xb2, 0xff, 0xa4, 0x13, 0xf6, 0xce, 0x43, 0x59, 0x7f, 0x9a, - 0x6d, 0x79, 0xb3, 0xcb, 0x2f, 0xdf, 0xe6, 0xe1, 0x75, 0x65, 0xfe, 0x09, - 0x66, 0xe1, 0x8a, 0x6b, 0x2f, 0xb8, 0xe4, 0x05, 0x95, 0xe3, 0xd6, 0xdc, - 0x35, 0xa8, 0x45, 0x36, 0x42, 0x06, 0xf6, 0xa1, 0xab, 0x2f, 0xef, 0x67, - 0x23, 0x6d, 0xc5, 0x97, 0x7e, 0x35, 0x97, 0xed, 0x01, 0xdc, 0x0a, 0x8a, - 0x0d, 0x7d, 0x80, 0xcf, 0x96, 0x5d, 0x26, 0x63, 0x3e, 0xec, 0x18, 0xf1, - 0xa5, 0x62, 0x36, 0xde, 0x13, 0xf7, 0xd9, 0x34, 0x75, 0x65, 0xfe, 0xe6, - 0x10, 0x1c, 0xbf, 0x59, 0x7f, 0xd1, 0x28, 0xd6, 0xd1, 0xad, 0x96, 0x5e, - 0xc6, 0x9a, 0xcb, 0xed, 0x1b, 0x0d, 0x59, 0x7b, 0xb9, 0xe5, 0x94, 0x33, - 0xda, 0xc1, 0xb6, 0x08, 0xee, 0x6c, 0xcb, 0x2f, 0xd1, 0xf8, 0x4a, 0x65, - 0x96, 0xf4, 0xe3, 0xc1, 0x66, 0x31, 0x7e, 0x7e, 0x36, 0x3f, 0x59, 0x7e, - 0x9b, 0xf7, 0x29, 0x96, 0x5c, 0x46, 0xb2, 0xa0, 0xdf, 0x80, 0xaa, 0xf9, - 0xff, 0xcd, 0x2c, 0xac, 0x46, 0xab, 0x05, 0x86, 0xcf, 0xe2, 0x0b, 0xfd, - 0x31, 0xf4, 0x33, 0x1f, 0x56, 0x5f, 0xff, 0x70, 0xf6, 0x7e, 0x39, 0x3f, - 0x7d, 0x13, 0x2c, 0xbf, 0xf3, 0x97, 0xf9, 0xd8, 0x23, 0xfd, 0x65, 0x75, - 0x11, 0x93, 0xe9, 0xf6, 0x67, 0x3d, 0xb2, 0x0c, 0xe2, 0x35, 0x09, 0x1e, - 0x64, 0x2e, 0x98, 0x21, 0xf8, 0x9c, 0xce, 0x66, 0x86, 0xce, 0x89, 0x9b, - 0x0f, 0x7f, 0x13, 0x39, 0x11, 0x19, 0x72, 0x12, 0x9d, 0x8d, 0x14, 0x27, - 0x82, 0x43, 0x06, 0xff, 0x30, 0xcd, 0xfd, 0xec, 0xd9, 0x65, 0xff, 0xe6, - 0x6d, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x8a, 0x2d, 0x7f, 0x99, 0xe6, - 0x80, 0xee, 0x05, 0x45, 0xd4, 0xa8, 0x7e, 0x74, 0xd9, 0x46, 0x9b, 0x8a, - 0x40, 0x87, 0x11, 0xcb, 0x58, 0x6c, 0xf5, 0x27, 0xaf, 0x37, 0xfd, 0xe5, - 0x0a, 0xff, 0x48, 0xcf, 0x28, 0xc6, 0xf8, 0x6f, 0xd5, 0xab, 0xf6, 0x80, - 0xee, 0x05, 0x44, 0x42, 0xbd, 0xe3, 0x25, 0x97, 0x60, 0xd6, 0x58, 0x0b, - 0x28, 0x07, 0x85, 0xe1, 0xb2, 0x16, 0xbe, 0xcd, 0xe7, 0xa5, 0x97, 0xc7, - 0xac, 0xf9, 0x65, 0x62, 0x3a, 0x7e, 0x76, 0xdd, 0x2e, 0x9f, 0x23, 0xbe, - 0x28, 0xff, 0x8b, 0x2f, 0x66, 0x0d, 0x65, 0xdd, 0x67, 0x31, 0xbd, 0x22, - 0x2a, 0x66, 0x8a, 0xfc, 0x84, 0x05, 0xa7, 0xd6, 0x5f, 0x47, 0xa1, 0xab, - 0x2f, 0x80, 0xee, 0x05, 0x44, 0x6c, 0xa0, 0x1e, 0x7e, 0x88, 0x6c, 0xcc, - 0x68, 0x85, 0xc6, 0x3b, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x29, 0xb5, - 0xcf, 0x25, 0x97, 0xc0, 0x77, 0x02, 0xa2, 0xa0, 0x50, 0xcf, 0x13, 0x42, - 0xd7, 0xb3, 0xe1, 0x56, 0x59, 0x9e, 0x1e, 0x07, 0x88, 0xaf, 0xf3, 0x3c, - 0xd0, 0x1d, 0xc0, 0xa8, 0xa9, 0x97, 0x82, 0x7a, 0x59, 0x7e, 0xd0, 0x1d, - 0xc0, 0xa8, 0xac, 0x17, 0xe3, 0x14, 0x61, 0xd2, 0xcb, 0x6c, 0xb2, 0xe1, - 0x24, 0xb2, 0xf3, 0x90, 0x16, 0x54, 0x1e, 0x2f, 0xe2, 0x5d, 0x18, 0xbb, - 0x84, 0xb2, 0xe1, 0xb0, 0xb2, 0xe6, 0xf1, 0x65, 0xf9, 0xe5, 0xd3, 0xd9, - 0x65, 0xfb, 0x9c, 0x2c, 0xfd, 0x65, 0x19, 0xe8, 0x39, 0x45, 0xfc, 0x73, - 0xef, 0x07, 0x3e, 0xb2, 0xff, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x88, 0xfd, - 0x70, 0x78, 0xb2, 0xf1, 0x40, 0xd6, 0x54, 0x22, 0x92, 0x46, 0x23, 0x41, - 0x31, 0x7b, 0xec, 0xc2, 0x92, 0xcb, 0x42, 0xcb, 0xa3, 0x65, 0x95, 0x23, - 0x4f, 0x82, 0x17, 0xd1, 0x30, 0x74, 0xb2, 0xfe, 0xfa, 0x4f, 0x23, 0x25, - 0x97, 0xa0, 0xa6, 0x59, 0x7d, 0x34, 0xa3, 0xe5, 0x97, 0xd1, 0xc3, 0x99, - 0x65, 0x62, 0x23, 0xd8, 0x2d, 0x31, 0xcd, 0x12, 0x5c, 0xfd, 0x59, 0x73, - 0x77, 0x16, 0x5d, 0xde, 0xac, 0xb3, 0x31, 0xae, 0x0e, 0xe0, 0xe0, 0x0d, - 0x3e, 0x6e, 0x32, 0xfd, 0xd1, 0x66, 0x8c, 0x79, 0x9d, 0xe1, 0x89, 0xf9, - 0xd9, 0x23, 0xf0, 0x83, 0xb0, 0xb2, 0x9f, 0x3c, 0x10, 0x5b, 0x70, 0x6a, - 0xff, 0xf3, 0x36, 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xde, 0xbf, - 0xf9, 0xaf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x3f, 0x2f, 0xd3, 0xd4, - 0xf5, 0x3d, 0x32, 0x27, 0xa5, 0x97, 0xf3, 0xb6, 0x1b, 0x02, 0x2c, 0xb9, - 0xe4, 0xb2, 0x99, 0x08, 0x84, 0x9e, 0x90, 0x59, 0x59, 0x6d, 0xc2, 0x35, - 0x65, 0xfd, 0x8c, 0x1f, 0x4a, 0x16, 0x50, 0x0f, 0x12, 0x7c, 0x62, 0xfd, - 0xa8, 0xf0, 0x61, 0x65, 0xfb, 0xd9, 0xd8, 0x1a, 0xca, 0x64, 0x9f, 0x99, - 0x92, 0xb9, 0x3d, 0xfa, 0x7a, 0x8e, 0xc0, 0xd6, 0x5f, 0xe9, 0xe1, 0x3d, - 0x1c, 0xff, 0x8d, 0x96, 0xb2, 0xe2, 0x02, 0xcb, 0xee, 0x4c, 0xde, 0x2c, - 0xbf, 0x17, 0x7c, 0x6d, 0x59, 0x7d, 0x30, 0x5c, 0x45, 0x95, 0x07, 0x96, - 0xe4, 0xf7, 0x00, 0x0b, 0x2f, 0xf0, 0x3c, 0x7d, 0xcc, 0x6a, 0xcb, 0xb7, - 0x81, 0x71, 0x81, 0x29, 0x90, 0x9c, 0x2c, 0xf0, 0x2c, 0x84, 0x53, 0x16, - 0x99, 0xbf, 0xf2, 0x0e, 0x0b, 0xf4, 0xca, 0xfc, 0xc8, 0x64, 0xcf, 0xe7, - 0xcb, 0x2f, 0xe9, 0xe9, 0xf6, 0xf1, 0xee, 0xac, 0xbf, 0xe9, 0xdd, 0xf6, - 0x37, 0x35, 0x8b, 0x2f, 0xe6, 0x55, 0x64, 0x32, 0x19, 0x3c, 0x85, 0x97, - 0xe9, 0xe5, 0x86, 0x33, 0x75, 0x65, 0xfd, 0xd3, 0x21, 0x70, 0x96, 0x5d, - 0xbc, 0x0b, 0x8c, 0x05, 0x6f, 0x2c, 0xbb, 0xff, 0xd6, 0x54, 0xf4, 0x9c, - 0x9b, 0x24, 0xd2, 0x7b, 0x36, 0x65, 0x67, 0x53, 0xc1, 0x07, 0x0c, 0xba, - 0x58, 0x12, 0x61, 0x04, 0x6f, 0xa4, 0xe3, 0x35, 0x97, 0xb4, 0xf8, 0xb2, - 0xf9, 0xc7, 0x8d, 0x59, 0x78, 0x10, 0x4b, 0x29, 0x92, 0x7f, 0x13, 0xc9, - 0x0c, 0xf1, 0x1b, 0xc2, 0x1b, 0xe9, 0xef, 0x66, 0xf1, 0x65, 0xfd, 0x93, - 0x41, 0x1f, 0xcb, 0x2f, 0xff, 0xc4, 0xfd, 0x82, 0x01, 0xb4, 0x61, 0x7d, - 0x49, 0x65, 0xf8, 0x5e, 0xf6, 0x1a, 0xb2, 0xa7, 0x93, 0xfc, 0xd9, 0x4e, - 0xff, 0x9f, 0xc7, 0xbd, 0x98, 0xa2, 0x8a, 0x92, 0xff, 0x79, 0xfb, 0xd7, - 0x71, 0x56, 0x5f, 0xb0, 0x0f, 0xc3, 0x59, 0x53, 0xda, 0x72, 0x6c, 0xac, - 0xa6, 0x78, 0xc2, 0xa5, 0x95, 0x4a, 0x27, 0x82, 0x07, 0x8c, 0xef, 0xff, - 0xf7, 0x8f, 0x91, 0x2c, 0xf1, 0xeb, 0xcf, 0x81, 0xcf, 0x2c, 0xbf, 0xfe, - 0xd4, 0x1f, 0x7d, 0x83, 0x3e, 0x61, 0x7e, 0xb2, 0xcc, 0x97, 0x45, 0x67, - 0x17, 0xae, 0xe4, 0x2c, 0xa6, 0x41, 0xe1, 0x48, 0xb2, 0xfe, 0xdd, 0x8d, - 0x3b, 0xc9, 0x65, 0xfb, 0xc6, 0xff, 0xcf, 0x05, 0x97, 0xa3, 0xe9, 0x2c, - 0xa9, 0xe9, 0x14, 0x0c, 0xa1, 0x37, 0x4b, 0xf7, 0x0b, 0xaf, 0xfd, 0x3c, - 0xcf, 0x53, 0x14, 0x0f, 0x3e, 0xea, 0xcb, 0xec, 0x1b, 0xc9, 0x65, 0xed, - 0x07, 0x71, 0x65, 0x4f, 0x28, 0x8b, 0x9e, 0x29, 0x41, 0x21, 0xbe, 0x2c, - 0x3f, 0xd6, 0x5f, 0x32, 0xbf, 0xd8, 0x85, 0x97, 0x1e, 0xcb, 0x29, 0x92, - 0x7c, 0x53, 0xd9, 0x0f, 0x4a, 0xaf, 0xf9, 0xfb, 0xf4, 0xbb, 0x9a, 0x61, - 0x65, 0xc7, 0xfa, 0xca, 0x9e, 0x07, 0xa4, 0x47, 0x77, 0xfe, 0x88, 0x88, - 0x88, 0x8f, 0xb8, 0xb2, 0xf4, 0xd1, 0xd5, 0x97, 0x44, 0x41, 0xec, 0x4c, - 0x77, 0x7f, 0xfb, 0xd1, 0x37, 0xdc, 0xcf, 0xb7, 0x62, 0x09, 0x65, 0xe3, - 0xfb, 0x16, 0x5f, 0xb4, 0x7b, 0x3b, 0x52, 0x5c, 0x28, 0xa9, 0x2b, 0x0f, - 0x04, 0x52, 0x8b, 0x05, 0x23, 0x33, 0x45, 0x7b, 0xd8, 0x05, 0x95, 0x09, - 0x9c, 0x78, 0xb3, 0xf4, 0xee, 0x3f, 0x88, 0x47, 0x7e, 0x0c, 0xfc, 0x07, - 0xe5, 0x97, 0xce, 0x51, 0xb8, 0xb2, 0xb0, 0xf3, 0xdc, 0xb2, 0xff, 0x7d, - 0x29, 0xdc, 0x30, 0xe9, 0x65, 0xff, 0xb7, 0x0f, 0x77, 0xd3, 0x46, 0xeb, - 0xb5, 0x65, 0xff, 0xb1, 0xb1, 0xce, 0x64, 0xa7, 0xf1, 0x65, 0x79, 0x11, - 0x04, 0x91, 0x7e, 0x6b, 0xb7, 0x06, 0xb2, 0xff, 0xba, 0x0f, 0x19, 0x14, - 0x7c, 0xb2, 0xa0, 0xf7, 0xdc, 0x9e, 0xb1, 0x36, 0x03, 0x85, 0xff, 0xa1, - 0x03, 0x7f, 0xb0, 0x67, 0xbf, 0x9f, 0x81, 0x65, 0xff, 0xff, 0xb3, 0x79, - 0xf6, 0x59, 0xff, 0x0b, 0x3f, 0xd4, 0x6c, 0xfa, 0x02, 0xcb, 0xa2, 0x4e, - 0x8a, 0x5e, 0x1b, 0x5f, 0xdd, 0xe6, 0x66, 0xd0, 0xb2, 0xbc, 0x7b, 0x44, - 0x5b, 0x7d, 0xc1, 0xf4, 0x2b, 0x2f, 0xff, 0xfe, 0xdf, 0x1a, 0xc1, 0x93, - 0xe9, 0x87, 0xe8, 0x7a, 0x7d, 0xe7, 0x8d, 0x65, 0xfe, 0xd0, 0x48, 0x3d, - 0x0f, 0x56, 0x5e, 0xf4, 0x12, 0xcb, 0x41, 0x9e, 0x7f, 0x4d, 0x2e, 0x60, - 0x55, 0x97, 0xff, 0xe9, 0x41, 0x14, 0x6c, 0x2b, 0xed, 0xe3, 0x82, 0x59, - 0x50, 0x9c, 0xc8, 0x08, 0x4c, 0x8f, 0xd0, 0xc2, 0xe9, 0x30, 0x46, 0x6f, - 0x8f, 0x67, 0x6a, 0xcb, 0xc4, 0x70, 0xb2, 0xfd, 0x02, 0x37, 0xc6, 0xb2, - 0x86, 0x7c, 0x9a, 0x22, 0x21, 0xab, 0xf3, 0xed, 0x0e, 0x05, 0x97, 0xf0, - 0x93, 0xa3, 0x90, 0xd5, 0x95, 0xe3, 0xd7, 0x72, 0x7b, 0xfa, 0x5c, 0xee, - 0x13, 0x0b, 0x2f, 0xb8, 0xf2, 0xdd, 0x59, 0x7f, 0xe9, 0x72, 0x25, 0x1f, - 0xf3, 0x37, 0xac, 0xbf, 0xfa, 0x01, 0x9a, 0xcf, 0x1e, 0xbc, 0xeb, 0x2f, - 0x0a, 0xe2, 0xac, 0xbf, 0xfa, 0x35, 0x20, 0x78, 0xe6, 0x27, 0x15, 0x65, - 0xff, 0xda, 0x7d, 0x87, 0xe8, 0xe7, 0x43, 0xe5, 0x95, 0xc4, 0x45, 0xf5, - 0x16, 0xcd, 0xd2, 0x61, 0xde, 0x42, 0xe4, 0x2a, 0x6f, 0xa1, 0xb1, 0xe5, - 0x97, 0xe8, 0x14, 0x78, 0xd5, 0x96, 0x39, 0x1e, 0x48, 0x84, 0x35, 0x09, - 0xfe, 0x64, 0x69, 0xfe, 0x84, 0x2d, 0xfc, 0xff, 0xb8, 0x1f, 0x4b, 0x2f, - 0xff, 0x82, 0x45, 0x0c, 0x37, 0xd1, 0xf7, 0x63, 0xcb, 0x2f, 0x0d, 0xfc, - 0xb2, 0xff, 0xa3, 0xd1, 0xf4, 0xa5, 0x1b, 0x2c, 0xbe, 0x07, 0x8f, 0x4b, - 0x2f, 0xed, 0xd2, 0xcd, 0xb0, 0x55, 0x95, 0x88, 0xa9, 0xd0, 0xe3, 0x9d, - 0x04, 0x8a, 0xff, 0xf7, 0x8d, 0xa3, 0x89, 0xd3, 0xe1, 0xf1, 0xe9, 0x65, - 0xfd, 0xd8, 0xf1, 0x44, 0x96, 0x5f, 0xe2, 0x76, 0x0f, 0x51, 0x29, 0xc7, - 0xf6, 0x69, 0xf7, 0x1f, 0xcb, 0x2f, 0xf7, 0xe1, 0xcf, 0xda, 0xf2, 0x59, - 0x76, 0x42, 0xcb, 0x3c, 0x8f, 0x87, 0xe1, 0x76, 0x9a, 0xdf, 0xff, 0xf7, - 0x9c, 0x7e, 0x32, 0x7e, 0xc4, 0xc6, 0xc1, 0x96, 0x6f, 0x59, 0x7f, 0xc7, - 0xdc, 0xd6, 0x83, 0xb6, 0xf5, 0x97, 0xfd, 0xcc, 0xe8, 0xf3, 0x3f, 0xe2, - 0xca, 0xf1, 0xfa, 0xf4, 0xf2, 0xff, 0x8f, 0xb9, 0xad, 0x07, 0x6d, 0xeb, - 0x2e, 0x09, 0x4e, 0x3d, 0xef, 0x11, 0x56, 0x26, 0xd1, 0xc8, 0xce, 0x6a, - 0x4b, 0xd5, 0x03, 0x94, 0x43, 0x87, 0x40, 0x2d, 0xd4, 0x3e, 0x7d, 0x0b, - 0x62, 0x85, 0x5f, 0x23, 0x9d, 0xbe, 0x69, 0x8e, 0x16, 0x5f, 0xc7, 0xed, - 0x68, 0xf6, 0x59, 0x50, 0x79, 0xfe, 0x21, 0xb8, 0x5e, 0xac, 0xbf, 0xf8, - 0xcf, 0xd3, 0x67, 0x63, 0xb0, 0x35, 0x96, 0x85, 0x97, 0xff, 0xd1, 0xf4, - 0x9c, 0xbf, 0x9d, 0xf9, 0xe8, 0xd8, 0x59, 0x50, 0x8b, 0xf9, 0x86, 0x27, - 0xd0, 0xf7, 0x04, 0x2f, 0xf4, 0x7d, 0x37, 0xa0, 0x98, 0x59, 0x71, 0x4c, - 0xb2, 0xf7, 0x3c, 0x6b, 0x29, 0xa6, 0xcf, 0xa2, 0xf7, 0xdb, 0x34, 0xe4, - 0xb2, 0xfa, 0x3f, 0x11, 0xab, 0x2f, 0x88, 0x2f, 0x25, 0x94, 0x03, 0xc5, - 0xe1, 0x25, 0xfe, 0xf4, 0x35, 0x9f, 0xff, 0xc2, 0xca, 0x84, 0x60, 0xe3, - 0x41, 0x91, 0x5f, 0x8f, 0xdd, 0xc0, 0x2c, 0xbd, 0x85, 0xfa, 0xca, 0x98, - 0xf0, 0xf7, 0x09, 0xea, 0x13, 0xe0, 0xc6, 0x8d, 0x43, 0x89, 0xdc, 0x2f, - 0xf0, 0xc4, 0x8d, 0xdf, 0x07, 0x8b, 0x2f, 0xdb, 0x86, 0xdc, 0xea, 0xca, - 0xf8, 0xf8, 0x9a, 0x71, 0x7b, 0x90, 0x2a, 0xcb, 0x9f, 0xcb, 0x2e, 0x9a, - 0x16, 0x5d, 0x1d, 0x59, 0x50, 0x6b, 0x58, 0x17, 0xbe, 0x1e, 0x14, 0x96, - 0x5f, 0xb0, 0xe5, 0xe8, 0x59, 0x74, 0xdd, 0x33, 0xc7, 0xf1, 0x0d, 0xff, - 0xf8, 0x7e, 0x8d, 0x1f, 0xf0, 0x24, 0x4c, 0x50, 0xd5, 0x97, 0xf9, 0x88, - 0x2e, 0xf1, 0xfc, 0xb2, 0xa1, 0x16, 0xe6, 0x5c, 0xea, 0xd7, 0xe2, 0xc7, - 0x2d, 0x96, 0x54, 0x27, 0xeb, 0x84, 0x66, 0x3a, 0xe8, 0x65, 0x18, 0xff, - 0x0b, 0x6f, 0x3e, 0x69, 0x65, 0xfd, 0x1b, 0x6a, 0x30, 0x6b, 0x2f, 0xef, - 0x47, 0x7b, 0x0d, 0x59, 0x7f, 0xff, 0x6b, 0x07, 0xc2, 0x0e, 0x48, 0x2e, - 0x3e, 0x66, 0x96, 0x50, 0xd1, 0x0e, 0x65, 0xb5, 0xa4, 0x78, 0xf8, 0x6c, - 0x48, 0x5a, 0x5f, 0xf6, 0xa3, 0x4f, 0x12, 0x89, 0x2c, 0xbf, 0xfe, 0x2c, - 0xde, 0x07, 0xd6, 0xcf, 0xd7, 0xfb, 0xf5, 0x95, 0x08, 0xc0, 0x33, 0x67, - 0x37, 0xbf, 0xc4, 0xfb, 0x7d, 0x28, 0xdc, 0x59, 0x7f, 0xb9, 0xe7, 0x13, - 0xd1, 0x25, 0x95, 0xb1, 0xf5, 0xfc, 0x6f, 0x76, 0x4c, 0xb2, 0xff, 0xff, - 0xd9, 0xd8, 0x39, 0x3f, 0x39, 0x18, 0x51, 0x2c, 0x6b, 0xfc, 0xb2, 0xb0, - 0xff, 0xf8, 0x2f, 0x7f, 0xfd, 0xe8, 0x69, 0xe8, 0xf7, 0x20, 0x4d, 0xb0, - 0x55, 0x97, 0xf6, 0x04, 0x02, 0x67, 0xcb, 0x2a, 0x64, 0x41, 0xef, 0x54, - 0xbf, 0xf1, 0xea, 0x38, 0x21, 0x14, 0x69, 0x65, 0xff, 0x44, 0x89, 0xfb, - 0x23, 0xde, 0xb2, 0xf0, 0x91, 0xfa, 0xca, 0xf1, 0xeb, 0xf0, 0xe6, 0xdb, - 0xab, 0x2f, 0x76, 0x58, 0xb2, 0xee, 0x62, 0xcb, 0xf4, 0x4c, 0x71, 0xc5, - 0x97, 0xff, 0x72, 0x34, 0x0e, 0x96, 0x6c, 0xe4, 0xb2, 0xff, 0xdd, 0xf6, - 0x6f, 0x72, 0x1e, 0x7e, 0xb2, 0xa1, 0x3c, 0xcd, 0x89, 0xb2, 0x12, 0x86, - 0x44, 0xe2, 0x9f, 0x8e, 0x10, 0xb7, 0x49, 0xc2, 0x87, 0x77, 0x5a, 0xb2, - 0xfd, 0x9e, 0x37, 0x92, 0xcb, 0xee, 0x7c, 0x5a, 0x59, 0x7f, 0xfe, 0xe6, - 0x19, 0x64, 0xd1, 0xb3, 0xec, 0xd3, 0xd9, 0x65, 0x42, 0x2d, 0xb8, 0x2f, - 0xd2, 0x60, 0x91, 0xdf, 0xfa, 0x3a, 0xfc, 0xcf, 0x78, 0xda, 0xb2, 0xfc, - 0x51, 0xb4, 0x6c, 0xb2, 0x86, 0x7c, 0xb3, 0x1e, 0xdf, 0xc3, 0x87, 0xd7, - 0xe1, 0x59, 0x76, 0x79, 0x65, 0x6c, 0x78, 0x9b, 0xcb, 0xaf, 0xff, 0xb0, - 0xda, 0x7f, 0xbf, 0x4b, 0x36, 0xd4, 0x2c, 0xbf, 0xb7, 0x73, 0x79, 0x64, - 0x96, 0x5c, 0x73, 0x2c, 0xa3, 0x3c, 0x8e, 0x98, 0xdf, 0xe3, 0x61, 0xe5, - 0xc3, 0x1a, 0xca, 0x84, 0xdd, 0xb1, 0x9f, 0xc4, 0xbc, 0x84, 0xb7, 0x48, - 0x6e, 0x0c, 0x96, 0x5f, 0xde, 0x3d, 0x6b, 0x3a, 0xb2, 0xb6, 0x3c, 0x40, - 0x0b, 0xdf, 0xe3, 0xe7, 0x9d, 0xb1, 0xba, 0xb2, 0xff, 0xf4, 0xd2, 0x3d, - 0xf1, 0xac, 0x39, 0x07, 0x4b, 0x2b, 0x48, 0x81, 0x73, 0x5b, 0xed, 0xd3, - 0x14, 0x0b, 0x2e, 0x39, 0x2c, 0xa8, 0x37, 0x9d, 0x26, 0xbf, 0xec, 0x6f, - 0x0e, 0x7f, 0x35, 0x0b, 0x2a, 0x1b, 0xe8, 0xfd, 0xa1, 0x37, 0x28, 0xe0, - 0x07, 0x2b, 0x47, 0x21, 0x7e, 0x08, 0x42, 0xfc, 0x42, 0x73, 0xda, 0xdb, - 0xb0, 0xdd, 0x9a, 0x1c, 0x1a, 0x94, 0x46, 0xd9, 0x52, 0xfe, 0x94, 0x14, - 0xf0, 0x98, 0xfe, 0x14, 0x65, 0x29, 0xc3, 0x91, 0x9b, 0xf6, 0x50, 0xb8, - 0x61, 0x25, 0xbe, 0x14, 0x82, 0x2f, 0x6e, 0x10, 0x5c, 0xc7, 0x56, 0x5f, - 0xff, 0xf4, 0xf1, 0x9e, 0xe3, 0x19, 0x57, 0x53, 0xdb, 0x29, 0xbf, 0x76, - 0x78, 0x06, 0x74, 0xef, 0x4f, 0xac, 0xb8, 0xe1, 0x65, 0xe9, 0x84, 0x6a, - 0xcb, 0xfe, 0xce, 0xf3, 0x3b, 0xec, 0xfd, 0x65, 0xfe, 0x36, 0x1c, 0xbb, - 0x84, 0xb2, 0x98, 0x44, 0xf3, 0x8a, 0x90, 0xff, 0x4e, 0x6e, 0x72, 0x59, - 0x5a, 0x3d, 0x16, 0x9e, 0x5f, 0x47, 0x71, 0xab, 0x2f, 0xdd, 0x82, 0x3f, - 0xd6, 0x5d, 0xf7, 0xcb, 0x2f, 0xda, 0x0e, 0xff, 0xc5, 0x59, 0x71, 0x71, - 0x65, 0xfd, 0x82, 0xbf, 0xed, 0xc5, 0x95, 0x39, 0x1a, 0x58, 0x43, 0xf1, - 0x3f, 0x86, 0x7f, 0x2d, 0x21, 0x6b, 0xff, 0x43, 0x4f, 0xee, 0x06, 0x60, - 0xb0, 0xb2, 0xfc, 0x5d, 0xf6, 0x49, 0x65, 0xdc, 0xc5, 0x94, 0x66, 0xf5, - 0xc9, 0xef, 0xf1, 0x40, 0xb3, 0xf9, 0xa8, 0x59, 0x7c, 0x43, 0x8d, 0xc5, - 0x96, 0x16, 0x72, 0x3d, 0xe4, 0xfe, 0x31, 0xf7, 0x35, 0xbe, 0xda, 0x3b, - 0xc5, 0x97, 0xa3, 0xfe, 0x2c, 0xad, 0x1e, 0x01, 0x11, 0xdf, 0x3e, 0x9e, - 0x4b, 0x2d, 0xac, 0x3c, 0x22, 0x21, 0xbc, 0x28, 0xa2, 0xac, 0xbe, 0xd8, - 0x8e, 0x12, 0x33, 0x34, 0x17, 0xfd, 0xbb, 0xe7, 0x29, 0x0e, 0x36, 0x59, - 0x7c, 0xfd, 0x81, 0xac, 0xbb, 0xe9, 0x2c, 0xbf, 0xcc, 0x47, 0x79, 0xe7, - 0x0a, 0xcb, 0xf1, 0xed, 0x9f, 0x75, 0x65, 0xfe, 0x7f, 0x16, 0x6f, 0x70, - 0x2c, 0xb7, 0xeb, 0x2c, 0x05, 0x95, 0x86, 0x8c, 0xc4, 0xaa, 0x11, 0xd4, - 0xc0, 0xc3, 0x4d, 0x08, 0xa7, 0xaa, 0xd7, 0xfd, 0x2f, 0xb8, 0x7a, 0x07, - 0xb1, 0x65, 0xf9, 0x87, 0xe6, 0xf9, 0x2c, 0xaf, 0x91, 0x5d, 0xa4, 0x9e, - 0x9d, 0x5f, 0x9c, 0xa4, 0x6d, 0x59, 0x7b, 0x03, 0x3e, 0xb2, 0x99, 0x2b, - 0xf1, 0xac, 0xa0, 0xc4, 0x47, 0x0c, 0x38, 0x7a, 0x64, 0x6a, 0x07, 0x0c, - 0x7f, 0x23, 0x39, 0x99, 0x1e, 0x06, 0x3b, 0x9d, 0xe6, 0x33, 0xe4, 0xd7, - 0xa7, 0xa6, 0x56, 0xc8, 0x59, 0x7f, 0xde, 0x79, 0x8a, 0x33, 0x52, 0x59, - 0x7f, 0xe7, 0x21, 0x26, 0xe1, 0x97, 0xd2, 0x59, 0x7f, 0xe1, 0x73, 0x84, - 0x71, 0xac, 0xd9, 0x65, 0x6e, 0xa2, 0xd8, 0x27, 0x1b, 0xd0, 0x2f, 0xff, - 0xff, 0xfd, 0xbb, 0x3b, 0xd9, 0xf4, 0xbc, 0xd9, 0xc0, 0xf0, 0x7b, 0xdc, - 0x2f, 0x67, 0x60, 0x73, 0xa7, 0x7a, 0x7d, 0x65, 0xff, 0x0f, 0x02, 0xcb, - 0x3f, 0x3b, 0x56, 0x5f, 0xa1, 0xa5, 0x93, 0x2c, 0xc3, 0x79, 0x7b, 0x51, - 0xbd, 0x65, 0xed, 0xf8, 0x35, 0x97, 0xf7, 0x8e, 0x08, 0x30, 0xb2, 0xff, - 0x46, 0xeb, 0x19, 0xc7, 0xdd, 0x59, 0x4c, 0x1f, 0x27, 0x8a, 0xef, 0xd8, - 0x31, 0x3f, 0xe2, 0xcb, 0xee, 0x39, 0x49, 0x65, 0x4e, 0x4c, 0x3b, 0xc3, - 0xcf, 0x08, 0x22, 0x23, 0xe1, 0x55, 0xf7, 0xa0, 0x4f, 0x2c, 0xa1, 0xa7, - 0x6f, 0xc8, 0xd1, 0x3a, 0xa1, 0x7f, 0x44, 0xbd, 0x1b, 0xcd, 0x65, 0xfe, - 0x39, 0x47, 0xfe, 0x94, 0x2c, 0xbf, 0x34, 0x25, 0x0d, 0x59, 0x61, 0xac, - 0xb9, 0xf8, 0xb2, 0xda, 0x69, 0xa7, 0x08, 0x8d, 0x41, 0xfa, 0xba, 0x75, - 0xd2, 0xea, 0xcb, 0xe9, 0xa3, 0xae, 0xb2, 0xf8, 0x3f, 0xe1, 0x00, 0xdc, - 0x84, 0x5e, 0xd2, 0x59, 0x5b, 0x1e, 0x4f, 0x8e, 0x2f, 0xfe, 0x8f, 0x08, - 0x3e, 0x9e, 0x4d, 0x0d, 0x59, 0x7f, 0xee, 0x98, 0xa0, 0xf1, 0xef, 0x31, - 0xac, 0xbf, 0xda, 0x97, 0xb3, 0x7c, 0x35, 0x65, 0xf0, 0x59, 0x7c, 0xc5, - 0x95, 0xf2, 0x27, 0x0d, 0x05, 0xcd, 0x6f, 0xcf, 0x2e, 0x1e, 0xf5, 0x97, - 0xfd, 0x9a, 0xc9, 0xd9, 0xa8, 0x1a, 0xcb, 0xcd, 0x0e, 0xf5, 0x97, 0xf6, - 0x4b, 0xe9, 0x67, 0x56, 0x5b, 0xb2, 0x44, 0x36, 0x1c, 0xf8, 0x7e, 0xf7, - 0x42, 0xd5, 0x97, 0xdf, 0x4b, 0xc6, 0xb2, 0xa0, 0xf0, 0x1c, 0x76, 0x95, - 0x10, 0x72, 0xfe, 0x7d, 0xbf, 0x72, 0x1a, 0x2b, 0x06, 0xad, 0xc0, 0x1e, - 0xa4, 0xf8, 0xc5, 0x35, 0x13, 0xfd, 0x74, 0xbf, 0xe3, 0xce, 0xf3, 0x58, - 0x3c, 0x59, 0x7f, 0x79, 0xda, 0x51, 0xf2, 0xcb, 0xe6, 0xf1, 0xe5, 0xe3, - 0xe4, 0x10, 0xde, 0xfe, 0xff, 0xc5, 0x9d, 0xe2, 0xcb, 0xf8, 0xb3, 0x79, - 0x67, 0x16, 0x5a, 0x34, 0x7b, 0x7d, 0x2e, 0xa8, 0x4d, 0x0f, 0x21, 0x0f, - 0xc8, 0x4a, 0xdb, 0x8b, 0x2f, 0xde, 0x8d, 0xd0, 0xc9, 0x65, 0x41, 0xbc, - 0x71, 0x1a, 0x92, 0xf2, 0x2b, 0x05, 0xc0, 0x85, 0x46, 0xa1, 0x44, 0xd2, - 0x3f, 0x43, 0x87, 0xf2, 0xf2, 0x85, 0x7f, 0x65, 0x2b, 0xef, 0x75, 0xbf, - 0xa4, 0x59, 0xf7, 0x71, 0x65, 0xff, 0xf8, 0x4f, 0xff, 0x8f, 0xb3, 0x61, - 0xbb, 0x81, 0xc6, 0xb2, 0xa1, 0x10, 0xda, 0x2d, 0xbf, 0x8b, 0xb2, 0xcd, - 0x62, 0xcb, 0xa7, 0xdd, 0x65, 0x39, 0xe2, 0x88, 0x59, 0x7f, 0xb5, 0xb7, - 0x1c, 0x1a, 0xc5, 0x97, 0xfb, 0xd8, 0x07, 0xf4, 0x79, 0x65, 0xff, 0xce, - 0x7d, 0x82, 0x06, 0x77, 0xc6, 0xb2, 0xfe, 0x23, 0xff, 0x9e, 0x35, 0x97, - 0x68, 0x6b, 0x2e, 0x14, 0x55, 0x95, 0x23, 0x60, 0x28, 0xbd, 0xe8, 0x3d, - 0xe9, 0x19, 0x9a, 0x2b, 0xfe, 0x32, 0x3f, 0xf9, 0x9e, 0x75, 0x95, 0x89, - 0xac, 0x78, 0xc9, 0xd0, 0x78, 0xff, 0xd2, 0xfb, 0xfa, 0x0b, 0xbe, 0xc9, - 0x2c, 0xbb, 0xfe, 0x2c, 0xbf, 0x8f, 0xc6, 0xc3, 0x10, 0xb2, 0xc2, 0x0c, - 0xf1, 0xba, 0x31, 0x5a, 0x44, 0xdf, 0x1c, 0xaa, 0x15, 0x49, 0x9c, 0x71, - 0x82, 0x43, 0x92, 0xee, 0x75, 0x65, 0xfb, 0x24, 0x64, 0xeb, 0x28, 0x06, - 0xf3, 0x74, 0x5e, 0xf9, 0xbe, 0x88, 0x59, 0x78, 0x51, 0x45, 0x49, 0x49, - 0x19, 0x9a, 0x0b, 0xe3, 0x14, 0xe6, 0x49, 0x40, 0x3c, 0x03, 0x1d, 0xbe, - 0xd4, 0x6f, 0xc5, 0x97, 0xa6, 0xcf, 0x2c, 0xac, 0x3c, 0x07, 0x23, 0xbe, - 0xce, 0x85, 0xd6, 0x5d, 0x8c, 0xb5, 0x95, 0x3c, 0xb6, 0x0b, 0x11, 0x0e, - 0x2d, 0x8d, 0x72, 0x54, 0xf1, 0xcf, 0x3e, 0x6a, 0x33, 0x26, 0xb3, 0xfa, - 0x55, 0xab, 0xbc, 0x7e, 0x48, 0x50, 0x81, 0xe3, 0x0f, 0x48, 0x05, 0x21, - 0xbe, 0xd4, 0x83, 0x8b, 0x2f, 0xf1, 0x7d, 0xd1, 0x3c, 0xff, 0xac, 0xbc, - 0x47, 0xc5, 0x97, 0x8f, 0x36, 0x59, 0x7c, 0x37, 0x2f, 0xd6, 0x5f, 0xfd, - 0x05, 0xf9, 0x47, 0xd3, 0x41, 0x7e, 0xb2, 0xb1, 0x1a, 0x86, 0x6d, 0xe1, - 0xbf, 0xc7, 0x38, 0x45, 0x7d, 0x2f, 0xe4, 0x4b, 0x2f, 0xd3, 0x4f, 0xff, - 0x3f, 0x8b, 0x2f, 0xa3, 0xaf, 0xe5, 0x97, 0xed, 0x66, 0xf7, 0xf2, 0xcb, - 0x1a, 0xcb, 0xfe, 0x76, 0x01, 0xe3, 0x1b, 0xc9, 0x65, 0xf7, 0xc0, 0x3d, - 0x2c, 0xbe, 0xdb, 0x67, 0xf9, 0x65, 0xb8, 0x68, 0x91, 0x21, 0x0e, 0x9c, - 0x88, 0x47, 0x4c, 0x23, 0xf3, 0xf8, 0x5d, 0x5f, 0x66, 0xbc, 0x6b, 0x2f, - 0xff, 0x3c, 0x8b, 0x37, 0xbc, 0xd1, 0x9d, 0xe2, 0xca, 0x83, 0xeb, 0x72, - 0x1b, 0xf6, 0x0d, 0xcc, 0x6b, 0x2f, 0xf6, 0x6c, 0x27, 0xbd, 0x9b, 0xab, - 0x2f, 0xfe, 0xff, 0xd9, 0x9b, 0x1e, 0x6f, 0x8f, 0x96, 0x54, 0x1f, 0xf8, - 0xa7, 0x17, 0xff, 0xbf, 0x86, 0xeb, 0x51, 0xb7, 0x5d, 0xd8, 0x59, 0x7c, - 0x1e, 0x7b, 0x16, 0x5e, 0x6c, 0x01, 0x65, 0xff, 0x3c, 0xb9, 0xfb, 0xef, - 0xc1, 0xac, 0xbb, 0x3d, 0x87, 0xaf, 0xe1, 0xcb, 0xff, 0xf1, 0xeb, 0xc1, - 0xf3, 0x9f, 0x62, 0x41, 0x1e, 0x2c, 0xbf, 0x68, 0xf6, 0x76, 0xac, 0xb8, - 0x51, 0x56, 0x56, 0x1e, 0x08, 0xa5, 0x16, 0x0a, 0x46, 0x66, 0x8a, 0x9a, - 0x8d, 0xaf, 0x42, 0xde, 0xf4, 0x84, 0x6a, 0xcb, 0xe7, 0xf8, 0x63, 0x59, - 0x52, 0x4d, 0xbc, 0xe3, 0x06, 0x72, 0x8e, 0x0f, 0x5e, 0xc6, 0xee, 0xac, - 0xbf, 0xf3, 0xef, 0xc1, 0x0a, 0x3c, 0x7b, 0x2c, 0xbf, 0xd9, 0xc2, 0xce, - 0xf8, 0xd6, 0x50, 0xd1, 0x21, 0xa1, 0xf2, 0x40, 0xbf, 0x8f, 0xce, 0x46, - 0xd5, 0x95, 0x8b, 0x9b, 0x93, 0x42, 0x57, 0x44, 0x1e, 0x85, 0x2f, 0xe4, - 0x44, 0x99, 0xd8, 0xfa, 0x37, 0xc3, 0x4b, 0x70, 0xbe, 0xd0, 0xb2, 0xfb, - 0x3c, 0x62, 0xac, 0xbe, 0x97, 0xf9, 0xfa, 0xcb, 0xfb, 0xb9, 0x31, 0x43, - 0x57, 0x10, 0x12, 0xf8, 0x87, 0xe8, 0x54, 0x40, 0x46, 0x66, 0xea, 0xb6, - 0x46, 0x07, 0xc4, 0x4e, 0xbd, 0x7f, 0xef, 0xa4, 0x47, 0xb7, 0x5e, 0x5c, - 0x59, 0x7f, 0xdc, 0x1e, 0x14, 0x10, 0x61, 0x65, 0x8d, 0x83, 0xf6, 0xf9, - 0x02, 0xfe, 0xc6, 0xff, 0xac, 0xf9, 0x65, 0xfb, 0x46, 0x16, 0x5c, 0x2c, - 0xbf, 0xda, 0xcf, 0xb9, 0xfb, 0xf5, 0x65, 0x41, 0xf0, 0x30, 0x57, 0x60, - 0xec, 0x8b, 0x10, 0x42, 0x3e, 0xfd, 0x12, 0x7f, 0x85, 0x59, 0x7f, 0xd3, - 0xb5, 0xac, 0xf7, 0xd2, 0xe2, 0xcb, 0xff, 0xfd, 0x9c, 0x0b, 0xfd, 0x98, - 0x4c, 0x73, 0x98, 0x5d, 0xe2, 0xca, 0x02, 0x27, 0x7e, 0x3d, 0xbf, 0x38, - 0xa3, 0x63, 0x7a, 0xca, 0xc5, 0x43, 0xe7, 0x0d, 0xad, 0x17, 0xbc, 0x31, - 0x88, 0x92, 0xfb, 0xbc, 0x0c, 0x96, 0x5f, 0x83, 0x3f, 0x9a, 0xfd, 0x65, - 0x39, 0xe7, 0xf0, 0x8e, 0xdb, 0x2c, 0xbf, 0x4e, 0xc9, 0x8d, 0xab, 0x2f, - 0xfd, 0x1f, 0x77, 0x24, 0x65, 0xf9, 0xac, 0xbf, 0xfc, 0x18, 0x9d, 0xb9, - 0xd3, 0xe7, 0xbe, 0x71, 0x56, 0x56, 0xc8, 0xb9, 0x32, 0xae, 0x1f, 0x5f, - 0xfb, 0x07, 0xe7, 0x67, 0x1e, 0x8f, 0x96, 0x53, 0x25, 0x33, 0xbd, 0x43, - 0x2d, 0xa6, 0x17, 0xfc, 0x4c, 0x68, 0x8c, 0x01, 0x25, 0x97, 0xee, 0xc6, - 0x14, 0x2c, 0xa3, 0x3d, 0xd2, 0x38, 0xbc, 0x21, 0x75, 0x65, 0xe3, 0x6b, - 0xac, 0xad, 0x8d, 0xc3, 0x03, 0xb7, 0xe0, 0x61, 0xf1, 0xab, 0x2f, 0xfe, - 0xe4, 0x17, 0x44, 0x9b, 0xc7, 0xde, 0x2c, 0xbe, 0xcd, 0x46, 0xf5, 0x96, - 0xfb, 0xe3, 0xe9, 0xea, 0x35, 0x35, 0x17, 0x4f, 0x09, 0x0a, 0x84, 0xfc, - 0xf2, 0x12, 0xe6, 0xb0, 0x18, 0x6e, 0xde, 0xdc, 0x8f, 0x96, 0x5f, 0xe2, - 0xcf, 0xf8, 0x23, 0xf5, 0x65, 0xe8, 0xc6, 0xac, 0xbf, 0xdd, 0xcd, 0x68, - 0xe6, 0xe2, 0xcb, 0xcd, 0xda, 0x16, 0x53, 0x07, 0xa2, 0x03, 0x4b, 0xec, - 0xe4, 0x80, 0xb2, 0xf7, 0xed, 0xea, 0xca, 0x92, 0x64, 0x66, 0x40, 0xd3, - 0x47, 0x6c, 0xfc, 0x8c, 0x88, 0xaf, 0xfd, 0x8d, 0x80, 0x1f, 0x74, 0x16, - 0xac, 0xbf, 0x6c, 0x19, 0x9c, 0x6b, 0x2f, 0x1f, 0xdc, 0x59, 0x7f, 0xf7, - 0x23, 0x6c, 0xd4, 0xc5, 0x1f, 0xf1, 0x65, 0xfe, 0x3f, 0x66, 0xb5, 0x9f, - 0x2c, 0xbf, 0x4c, 0x51, 0xa9, 0x2c, 0xb4, 0x48, 0xf6, 0xf0, 0xce, 0xa4, - 0x9a, 0x63, 0x9f, 0x7e, 0x55, 0xd1, 0xd1, 0x61, 0x43, 0x7d, 0xa7, 0x94, - 0xcb, 0x2f, 0xdc, 0xe4, 0x7f, 0x3d, 0x2c, 0xa6, 0x0f, 0x44, 0x52, 0x3b, - 0xef, 0x67, 0xee, 0xb2, 0xa1, 0x1d, 0x0f, 0x0a, 0x2e, 0x12, 0x5f, 0xed, - 0x4d, 0xc3, 0x2e, 0x9a, 0xcb, 0xff, 0x48, 0xda, 0x2e, 0x10, 0xfd, 0x0b, - 0x2f, 0xf3, 0x19, 0xaf, 0xda, 0x7c, 0x59, 0x5f, 0x1f, 0x99, 0x1f, 0x5f, - 0xef, 0x1f, 0xdf, 0xe9, 0xc6, 0xb2, 0xfb, 0xef, 0xf5, 0x09, 0x2e, 0x14, - 0x54, 0x95, 0x06, 0xf4, 0x52, 0x4b, 0x88, 0xd2, 0x33, 0x34, 0x37, 0xff, - 0xff, 0x13, 0x3c, 0xcd, 0xc8, 0x98, 0xdb, 0x13, 0x4e, 0x2f, 0xa5, 0xe0, - 0xfe, 0xb2, 0xe3, 0x02, 0xca, 0x59, 0x76, 0xa5, 0x39, 0x35, 0x69, 0x42, - 0x4f, 0xe2, 0x7d, 0x3d, 0xfe, 0x2d, 0x50, 0x9e, 0xc3, 0xc6, 0xf1, 0x7e, - 0x29, 0x00, 0x3b, 0x2c, 0xbd, 0x1a, 0x99, 0x65, 0x39, 0xe3, 0x04, 0xa6, - 0xfe, 0x11, 0xa4, 0xfd, 0xe2, 0xca, 0x9e, 0x5b, 0x70, 0xc8, 0x87, 0xb6, - 0xc9, 0x32, 0x23, 0x19, 0x86, 0x4e, 0xfc, 0xfd, 0x09, 0xb3, 0x86, 0x86, - 0xa5, 0x63, 0x36, 0x14, 0x3e, 0x96, 0x9e, 0xf1, 0xb4, 0x14, 0xa8, 0xae, - 0x99, 0x86, 0x53, 0xf0, 0xad, 0xc2, 0x10, 0xde, 0xe9, 0x8a, 0xb2, 0xfe, - 0xda, 0x7c, 0x3e, 0x3d, 0x2c, 0xbf, 0xc5, 0x2e, 0x0f, 0xc6, 0x2a, 0xcb, - 0xdb, 0x3b, 0x56, 0x5d, 0xf1, 0x2c, 0xbf, 0x7d, 0x2f, 0x09, 0xc5, 0x96, - 0x7c, 0x3c, 0x22, 0x17, 0xb8, 0xc6, 0xb2, 0xf7, 0x4c, 0x55, 0xc6, 0x10, - 0xbc, 0x17, 0x11, 0x51, 0x03, 0xbe, 0x35, 0x55, 0x24, 0x50, 0x78, 0x97, - 0xa8, 0x15, 0x09, 0xca, 0x99, 0x93, 0x9a, 0x06, 0x1f, 0xf7, 0x8b, 0x4c, - 0xb5, 0x97, 0xf6, 0x17, 0xf9, 0x83, 0x59, 0x7f, 0xff, 0xe9, 0x03, 0xc7, - 0xad, 0x9b, 0x00, 0xf4, 0x18, 0xe3, 0xd1, 0x25, 0x97, 0xbd, 0x0c, 0x2c, - 0xaf, 0x91, 0x13, 0xbd, 0xb2, 0xff, 0x60, 0x23, 0x62, 0x80, 0x2c, 0xbf, - 0x00, 0xa3, 0xe9, 0x2c, 0xb7, 0xeb, 0x2d, 0xbb, 0x38, 0xfb, 0x30, 0xc8, - 0xca, 0x2e, 0x80, 0xac, 0xbf, 0x04, 0xbf, 0x12, 0x4b, 0x2f, 0xff, 0x8b, - 0x39, 0x38, 0x4f, 0x47, 0xed, 0x79, 0x4e, 0xc3, 0xc0, 0xe0, 0xb5, 0x3a, - 0x6e, 0xa1, 0x84, 0x96, 0xf7, 0x8b, 0xff, 0xb4, 0x7f, 0x09, 0xdc, 0x39, - 0x3f, 0x16, 0x5f, 0xf0, 0x76, 0x89, 0xd1, 0xd8, 0x1a, 0xca, 0xd2, 0x20, - 0x3c, 0x8b, 0x79, 0xf5, 0xb2, 0xcb, 0x85, 0x15, 0x65, 0xfe, 0xd1, 0xe6, - 0xf1, 0x24, 0xcc, 0x06, 0xd8, 0x51, 0xdb, 0xff, 0x1b, 0x13, 0xb8, 0x1f, - 0xdb, 0x12, 0x59, 0x7f, 0xb9, 0x9d, 0x76, 0xe1, 0x2c, 0xa1, 0xa6, 0x39, - 0xa5, 0x9f, 0x27, 0xf5, 0x0e, 0xff, 0xdc, 0xc2, 0xcf, 0x60, 0x30, 0x96, - 0x5f, 0xfe, 0x3e, 0x61, 0x4e, 0x13, 0x53, 0x66, 0x0a, 0xb2, 0xff, 0x73, - 0xbe, 0xc6, 0xe4, 0x96, 0x5d, 0x1c, 0x59, 0x52, 0x3c, 0x9f, 0xcc, 0xef, - 0xfd, 0x8c, 0x79, 0xe4, 0x23, 0xfd, 0x0b, 0x2a, 0x49, 0x9a, 0x0c, 0xec, - 0xe1, 0x2c, 0x44, 0x75, 0x09, 0xd9, 0xe4, 0x6e, 0x57, 0xfb, 0x78, 0xb8, - 0x43, 0xf4, 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x10, 0xc2, 0xff, 0x1c, 0x6a, - 0x41, 0x8c, 0x59, 0x7e, 0x6b, 0x5e, 0x59, 0xa3, 0xdf, 0x22, 0xeb, 0xff, - 0xfe, 0x2c, 0x07, 0xa3, 0xe9, 0x4f, 0xe7, 0x80, 0x78, 0x4e, 0xc2, 0xcb, - 0x81, 0xfa, 0xcb, 0x9f, 0x98, 0x88, 0x06, 0xb4, 0x56, 0x23, 0xa8, 0x30, - 0xbd, 0xbf, 0xb5, 0x93, 0x41, 0x0d, 0x65, 0x42, 0xfe, 0x54, 0x88, 0x0e, - 0x51, 0x57, 0xa5, 0xc3, 0x39, 0x41, 0x46, 0xfc, 0x12, 0x7b, 0xf1, 0x47, - 0xff, 0x7e, 0xb2, 0xfd, 0x92, 0x8d, 0x7e, 0xb2, 0xe8, 0x11, 0x65, 0xf9, - 0xf6, 0x28, 0x92, 0x4a, 0x98, 0xdf, 0x78, 0x5e, 0xff, 0xdd, 0xf3, 0x9f, - 0x63, 0x51, 0xfa, 0xcb, 0xf7, 0x9c, 0x84, 0xd9, 0x65, 0x49, 0x31, 0x96, - 0x0a, 0x9a, 0xcc, 0x44, 0x42, 0x9f, 0x5f, 0xf8, 0xc1, 0x1c, 0x7d, 0x68, - 0xc5, 0x59, 0x7f, 0xdb, 0x49, 0xb1, 0xe7, 0x36, 0x16, 0x5f, 0xfb, 0xa6, - 0x5b, 0x67, 0xdd, 0xf3, 0xac, 0xbf, 0xf8, 0xf4, 0xc0, 0x3c, 0x7e, 0x20, - 0xec, 0xb2, 0xb1, 0x10, 0xbf, 0x9f, 0xdf, 0xff, 0xc3, 0xd1, 0x38, 0xb3, - 0x8f, 0x50, 0x59, 0xec, 0x02, 0xca, 0x24, 0xcf, 0x79, 0x0b, 0xf1, 0x48, - 0xef, 0x83, 0x9c, 0x35, 0x97, 0x70, 0x2b, 0x2f, 0xe9, 0x79, 0xdc, 0xa1, - 0x65, 0xa0, 0x07, 0x85, 0xf0, 0xbd, 0xff, 0xd9, 0xd8, 0xf1, 0xe3, 0x0c, - 0x44, 0x96, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x20, 0xa5, 0xef, 0x43, 0x56, - 0x5f, 0xfa, 0x36, 0x7e, 0xeb, 0x25, 0x3f, 0x8b, 0x2f, 0x6c, 0x7a, 0x59, - 0x43, 0x47, 0x96, 0x22, 0x19, 0xa1, 0x0e, 0x71, 0x06, 0xfd, 0xe8, 0x68, - 0x7e, 0x59, 0x7b, 0x91, 0xf2, 0xcb, 0xee, 0xf2, 0x3f, 0x49, 0x79, 0xf5, - 0xb2, 0x4b, 0xe0, 0x93, 0xb0, 0x92, 0xff, 0x1e, 0xd9, 0xde, 0x47, 0xe9, - 0x29, 0x25, 0xfd, 0x80, 0x8f, 0x43, 0x52, 0x5c, 0x28, 0xa9, 0x2f, 0xe2, - 0x82, 0xd8, 0xf4, 0x92, 0xb1, 0x31, 0x20, 0x11, 0xb4, 0x77, 0xc4, 0x5f, - 0x9a, 0x10, 0x58, 0xa5, 0x82, 0x0c, 0xdb, 0x49, 0x19, 0x9f, 0x9d, 0x7c, - 0x9e, 0x31, 0xc7, 0x45, 0x52, 0x54, 0xc1, 0x32, 0x3f, 0xa3, 0xef, 0xbf, - 0xfe, 0x17, 0x85, 0x9f, 0x75, 0xcb, 0x6c, 0xfb, 0xab, 0x2f, 0xed, 0xf3, - 0x9e, 0x52, 0xc5, 0x95, 0x08, 0x83, 0xc5, 0x2b, 0xff, 0xee, 0x9f, 0x81, - 0x0d, 0x13, 0x6c, 0x1c, 0x35, 0x65, 0x42, 0xf8, 0x46, 0x26, 0x1c, 0x6f, - 0x7a, 0x36, 0xf3, 0x1b, 0xcb, 0x7a, 0x28, 0x5e, 0x04, 0x86, 0xf3, 0x5c, - 0x6b, 0x2f, 0xff, 0xf8, 0xb3, 0xbd, 0x8f, 0xa5, 0x3b, 0xd0, 0xd0, 0xfd, - 0xcf, 0x42, 0xcb, 0xfb, 0x0b, 0x86, 0x58, 0xb2, 0xfe, 0x6e, 0x0f, 0xd9, - 0xb2, 0xcb, 0xff, 0xc4, 0xec, 0x73, 0xfe, 0xf7, 0xee, 0xe0, 0x16, 0x54, - 0x1f, 0xdb, 0x05, 0xd7, 0xbc, 0x16, 0xac, 0xa6, 0x13, 0x6a, 0xdd, 0x1c, - 0xf3, 0x51, 0x42, 0x97, 0x70, 0x8a, 0xfe, 0x2c, 0xe6, 0xa3, 0x8b, 0x2f, - 0x06, 0x58, 0xb2, 0x9c, 0xf2, 0x3f, 0x2c, 0xbf, 0x61, 0x3f, 0x78, 0xb2, - 0xfd, 0x9e, 0x27, 0x99, 0x65, 0x0c, 0xf3, 0x48, 0x9a, 0xa4, 0x89, 0x0e, - 0x37, 0xdf, 0x3c, 0xd9, 0xe5, 0x97, 0xfd, 0x06, 0x4f, 0xd9, 0x8c, 0x55, - 0x96, 0xd4, 0xe3, 0xda, 0xe1, 0x15, 0x42, 0x29, 0xcd, 0xf6, 0xfd, 0xaf, - 0xa5, 0x9d, 0x59, 0x7f, 0xfc, 0xe7, 0xff, 0x31, 0x87, 0x6e, 0xa3, 0x09, - 0x65, 0xf4, 0x00, 0x4f, 0xd6, 0x5f, 0x7a, 0x3e, 0xe2, 0xcb, 0xe3, 0xcf, - 0xba, 0xb2, 0xb0, 0xf1, 0x7a, 0x47, 0x7f, 0xff, 0xde, 0x3d, 0x60, 0xdd, - 0xb8, 0x5d, 0x28, 0x17, 0x3b, 0xc5, 0x96, 0x85, 0x97, 0xd1, 0xbc, 0x70, - 0x03, 0xf4, 0xfd, 0x92, 0xff, 0xcf, 0x2f, 0x3f, 0x79, 0x85, 0x25, 0x95, - 0xe3, 0xf8, 0xe9, 0xdd, 0x69, 0x50, 0x7f, 0x8a, 0x49, 0x3b, 0x8d, 0x3d, - 0x8c, 0x36, 0xff, 0xf6, 0x6b, 0xfe, 0xeb, 0x36, 0xec, 0x67, 0x16, 0x5e, - 0x06, 0x35, 0x65, 0xfc, 0x37, 0xef, 0x03, 0x25, 0x97, 0x4a, 0x7e, 0x0f, - 0x28, 0x41, 0xcb, 0xf9, 0xf5, 0x1d, 0x3d, 0xeb, 0x2b, 0xe3, 0xdf, 0x23, - 0x1b, 0xff, 0xff, 0x6b, 0x51, 0xf4, 0xbe, 0xe1, 0xe8, 0x1e, 0xc1, 0x34, - 0x70, 0x35, 0x97, 0xe2, 0x60, 0x4c, 0xf9, 0x65, 0xff, 0x3e, 0xb3, 0xe9, - 0x47, 0xf0, 0xb2, 0xa1, 0x1e, 0x98, 0x44, 0x6d, 0xe1, 0x2a, 0xbf, 0xef, - 0xa5, 0xdc, 0xe7, 0x73, 0x75, 0x65, 0xff, 0xf8, 0x0c, 0x3f, 0x33, 0x52, - 0x3f, 0x39, 0x7d, 0x25, 0x97, 0xfe, 0x04, 0x77, 0x99, 0xd3, 0xf8, 0x55, - 0x95, 0x88, 0x96, 0x61, 0x5a, 0xa1, 0x1e, 0xcf, 0x0d, 0x3a, 0x85, 0x71, - 0xe3, 0x51, 0xf4, 0x7d, 0x05, 0x19, 0x85, 0xfb, 0x84, 0x1d, 0xf2, 0x59, - 0x7e, 0xc2, 0xf6, 0x12, 0xcb, 0xdb, 0x08, 0x05, 0x97, 0xc4, 0x73, 0x6e, - 0xac, 0xa8, 0x44, 0x9f, 0x8a, 0x9c, 0x97, 0x83, 0xf7, 0x3f, 0xeb, 0x2a, - 0x47, 0xa5, 0xd3, 0xbb, 0xfe, 0x96, 0x75, 0xb1, 0x84, 0x35, 0x97, 0xff, - 0xe7, 0x79, 0x3f, 0xa7, 0x66, 0xc1, 0xe8, 0x5c, 0x45, 0x45, 0xf6, 0xbd, - 0xbc, 0x3d, 0x59, 0x74, 0x0d, 0x65, 0x41, 0xb5, 0xfc, 0x7e, 0xfe, 0x70, - 0x41, 0x47, 0xeb, 0x2f, 0xfd, 0xc3, 0x2f, 0xa5, 0xa0, 0xc7, 0x16, 0x5f, - 0xb3, 0x58, 0x38, 0x59, 0x5f, 0x27, 0x07, 0x31, 0xbe, 0xa1, 0x35, 0xe2, - 0x1e, 0x96, 0x6f, 0x3f, 0xbf, 0x7b, 0x26, 0x8d, 0xd5, 0x97, 0xe1, 0xeb, - 0x58, 0x2a, 0xca, 0xd8, 0xf5, 0x08, 0xae, 0xfe, 0x32, 0xce, 0xc4, 0xcb, - 0x2f, 0xfe, 0x97, 0x21, 0xb8, 0x02, 0x7c, 0x02, 0xcb, 0xe8, 0x26, 0x06, - 0xb2, 0xf3, 0xff, 0x0b, 0x2a, 0x11, 0x9d, 0x22, 0x2f, 0x8b, 0x3c, 0x85, - 0xc2, 0x2b, 0xa5, 0xc5, 0x97, 0xe9, 0x18, 0x1f, 0x4b, 0x2f, 0xff, 0x39, - 0x67, 0x60, 0xf4, 0x6c, 0x31, 0x0b, 0x2b, 0x87, 0xde, 0x21, 0x3d, 0x80, - 0xb2, 0xff, 0xff, 0x7e, 0x7a, 0x63, 0xd0, 0xd9, 0xa4, 0x65, 0xe8, 0xd4, - 0x2c, 0xb7, 0x70, 0xfc, 0xf8, 0x23, 0x78, 0xf5, 0x8b, 0x2f, 0x16, 0x49, - 0x65, 0x00, 0xdb, 0x74, 0x6e, 0xf1, 0x43, 0x56, 0x54, 0x22, 0x64, 0xd7, - 0x78, 0x43, 0x7f, 0xe2, 0x39, 0x77, 0xd9, 0xa3, 0xe2, 0xcb, 0xf4, 0x8b, - 0x33, 0x65, 0x97, 0x6b, 0x65, 0x97, 0xfd, 0x33, 0x27, 0xa6, 0x31, 0xe1, - 0x2c, 0xa8, 0x3f, 0xcc, 0x27, 0x31, 0x8b, 0xfc, 0xe3, 0x8f, 0xe0, 0x5e, - 0x2c, 0xaf, 0x1f, 0x03, 0x96, 0x5f, 0xd3, 0xec, 0xab, 0x3a, 0x77, 0xa7, - 0xd7, 0x10, 0x0a, 0xff, 0x77, 0xf1, 0x0a, 0x5e, 0xc5, 0xc4, 0x02, 0xbc, - 0xfa, 0x92, 0xe2, 0x01, 0x56, 0x1f, 0x58, 0x50, 0xae, 0x79, 0x2e, 0x20, - 0x15, 0xf3, 0x97, 0xd2, 0x5c, 0x40, 0x2b, 0xfc, 0x60, 0xf6, 0x7f, 0xfc, - 0x2e, 0x20, 0x15, 0xe3, 0x21, 0xae, 0x20, 0x15, 0x0d, 0x17, 0x6d, 0x23, - 0xf1, 0x7e, 0xf4, 0x1b, 0x30, 0xb8, 0x80, 0x57, 0xb5, 0x1d, 0x5c, 0x40, - 0x2a, 0x5c, 0x40, 0x2b, 0xd3, 0xe7, 0xfa, 0xe2, 0x01, 0x5d, 0x0d, 0x5c, - 0x40, 0x2a, 0x19, 0xf4, 0x60, 0xc1, 0x96, 0xdf, 0x1b, 0x47, 0x0b, 0x88, - 0x05, 0x7b, 0xae, 0x05, 0xc4, 0x02, 0xbf, 0xf1, 0x3c, 0x99, 0xf8, 0xc0, - 0xfa, 0x5c, 0x40, 0x2b, 0xff, 0x9f, 0xa1, 0xd8, 0xcb, 0xbe, 0x79, 0x2e, - 0x20, 0x15, 0xce, 0x35, 0xc4, 0x02, 0xbf, 0xc4, 0xe2, 0xf3, 0x91, 0xfa, - 0xe2, 0x01, 0x5f, 0x8d, 0x87, 0x2f, 0xd7, 0x10, 0x0a, 0xe3, 0xe2, 0xe2, - 0x01, 0x56, 0x8f, 0x63, 0xa6, 0xb7, 0xff, 0xbc, 0x7d, 0xee, 0x72, 0x76, - 0x8e, 0x1a, 0xb8, 0x80, 0x57, 0xee, 0x94, 0x7d, 0x25, 0x44, 0x02, 0xbb, - 0xf8, 0x5c, 0x40, 0x26, 0x66, 0xd6, 0xfc, 0x70, 0xd7, 0x1a, 0xe2, 0x01, - 0x5f, 0x05, 0xc8, 0x0b, 0x88, 0x05, 0x7a, 0x34, 0x05, 0xc4, 0x02, 0xbf, - 0xf6, 0x7d, 0xc1, 0xc6, 0x17, 0xfc, 0x5c, 0x40, 0x2b, 0xf0, 0x5e, 0x52, - 0x85, 0xc4, 0x02, 0xbf, 0x38, 0x3d, 0x1f, 0x2e, 0x20, 0x15, 0x62, 0x2d, - 0x7c, 0x98, 0x13, 0x4b, 0xb5, 0xfa, 0xe2, 0x01, 0x54, 0x95, 0x9a, 0x0c, - 0x8f, 0x21, 0x32, 0x02, 0x23, 0x84, 0x6f, 0x8d, 0xbf, 0x33, 0xe1, 0x77, - 0x61, 0xbc, 0x12, 0xfb, 0xf6, 0x77, 0x8f, 0xf2, 0xe2, 0x01, 0x5f, 0xe1, - 0xc0, 0x26, 0xd4, 0x75, 0x71, 0x00, 0x86, 0x6d, 0x6f, 0x6a, 0x05, 0x5c, - 0x40, 0x2a, 0x01, 0xfd, 0xe9, 0x46, 0xff, 0x05, 0xe5, 0x28, 0x11, 0xab, - 0x88, 0x05, 0x7c, 0x65, 0x2e, 0x2e, 0x20, 0x15, 0xfc, 0xf3, 0x4b, 0x3e, - 0x92, 0xe2, 0x01, 0x56, 0x23, 0x37, 0xc4, 0x5f, 0xa0, 0x84, 0xba, 0xff, - 0xbd, 0x1c, 0x67, 0xc0, 0xeb, 0xf5, 0xc4, 0x02, 0xb1, 0xae, 0x20, 0x15, - 0xcf, 0xb0, 0xcf, 0x9f, 0xc9, 0x57, 0x6b, 0xf5, 0xc4, 0x02, 0xbf, 0x3f, - 0x78, 0x7f, 0x2e, 0x20, 0x15, 0xfc, 0x64, 0x19, 0x67, 0x17, 0x10, 0x0a, - 0xa1, 0x12, 0x64, 0x4b, 0xd3, 0x5a, 0x86, 0x54, 0x18, 0xe1, 0x71, 0x90, - 0xdc, 0x33, 0xf9, 0x87, 0xf5, 0x09, 0x1f, 0x16, 0xb9, 0x77, 0xe5, 0x24, - 0x99, 0xc9, 0x70, 0xbd, 0x94, 0x31, 0x3f, 0x0a, 0x41, 0x21, 0x83, 0x7b, - 0xa6, 0x2a, 0xe3, 0x09, 0x5e, 0x77, 0x02, 0xa2, 0x01, 0x33, 0x4c, 0x57, - 0xe8, 0x75, 0xde, 0x65, 0x63, 0x6a, 0xcb, 0xfb, 0xa5, 0x9f, 0xcf, 0xe2, - 0xca, 0x60, 0xf4, 0xda, 0x47, 0x7f, 0xa4, 0x7d, 0x61, 0x8c, 0xdd, 0x59, - 0x7d, 0x1d, 0x81, 0xac, 0xb6, 0xcb, 0x2a, 0x46, 0xcf, 0x79, 0x0d, 0xfd, - 0xb4, 0x6b, 0xcf, 0xba, 0xb2, 0xdc, 0x59, 0x7c, 0x50, 0x3f, 0x2c, 0xaf, - 0x1b, 0x2d, 0xe2, 0x35, 0x08, 0xa9, 0xc2, 0x33, 0x63, 0xbf, 0xf1, 0x60, - 0x3c, 0x7f, 0xfe, 0x19, 0x96, 0x5f, 0xf0, 0xf1, 0x82, 0xce, 0xc0, 0xab, - 0x2a, 0x47, 0xf5, 0xfa, 0x0d, 0xfb, 0xb8, 0x37, 0xf2, 0xcb, 0xbf, 0x84, - 0x96, 0x61, 0x25, 0xef, 0x46, 0xcb, 0x2e, 0x14, 0x54, 0x94, 0x67, 0xbf, - 0xba, 0x2f, 0x30, 0x90, 0xa3, 0xb6, 0xe2, 0x46, 0x67, 0x81, 0x58, 0x8e, - 0xa3, 0x86, 0x35, 0xff, 0xd9, 0xfc, 0x8f, 0xb0, 0xd8, 0x21, 0xac, 0xa6, - 0x9f, 0x4b, 0x93, 0x5f, 0xdd, 0xe6, 0x0b, 0xe3, 0x59, 0x6e, 0xac, 0xae, - 0x9b, 0xf0, 0x97, 0x5f, 0xa3, 0x6e, 0x36, 0x4b, 0x28, 0xcf, 0x2b, 0xa4, - 0x37, 0xff, 0xef, 0xa5, 0xc2, 0xfa, 0x18, 0xe4, 0x7d, 0x23, 0x6a, 0xcb, - 0xff, 0xdd, 0xe6, 0x30, 0x7a, 0x13, 0xff, 0xe3, 0xe5, 0x95, 0x3d, 0xb6, - 0x83, 0xf1, 0x08, 0x6d, 0xa3, 0x2f, 0x91, 0x70, 0xe3, 0x19, 0x05, 0x2e, - 0xe4, 0xe1, 0x47, 0x31, 0x1e, 0xa3, 0x14, 0x78, 0x53, 0xff, 0x1b, 0xb7, - 0x61, 0x54, 0x12, 0x11, 0x16, 0x6f, 0xfb, 0x24, 0x63, 0x70, 0x72, 0x4b, - 0x2f, 0xf9, 0xa6, 0x40, 0x3d, 0x1f, 0xeb, 0x28, 0x07, 0xe1, 0xe3, 0x8b, - 0xfb, 0xa3, 0xf0, 0x5c, 0x96, 0x5e, 0x07, 0x89, 0x65, 0xff, 0xdd, 0x9f, - 0xc9, 0xa4, 0xfa, 0xd8, 0x70, 0xb2, 0xbe, 0x44, 0x93, 0x4b, 0x48, 0x72, - 0xfe, 0x8f, 0xa0, 0x9f, 0xab, 0x2e, 0x2f, 0xd6, 0x5d, 0x1c, 0x59, 0x46, - 0x6b, 0x77, 0x8b, 0xdd, 0xd1, 0x3c, 0x7f, 0x7b, 0xd6, 0x6f, 0xf6, 0x7d, - 0xde, 0xbc, 0xb8, 0xb2, 0xf4, 0x99, 0x72, 0x59, 0x77, 0xd2, 0x5c, 0x60, - 0x0b, 0xff, 0xd8, 0x2c, 0x77, 0x26, 0x91, 0xf7, 0x8e, 0xb2, 0xfa, 0x6d, - 0x47, 0x56, 0x57, 0xc8, 0xb3, 0x22, 0x1e, 0x12, 0xf5, 0x2a, 0xff, 0xfd, - 0x19, 0xee, 0x13, 0xf4, 0x3d, 0x1f, 0x8d, 0x85, 0x97, 0xff, 0xff, 0xff, - 0xfb, 0x81, 0xdd, 0x27, 0xcf, 0x38, 0x85, 0x9b, 0xf0, 0x9d, 0x89, 0xa4, - 0x1e, 0x70, 0x57, 0x1f, 0x8c, 0x5e, 0x63, 0x8d, 0x65, 0x42, 0xbc, 0xbc, - 0x85, 0xa1, 0xc2, 0xaf, 0x46, 0x2f, 0x0e, 0x72, 0x3d, 0xea, 0xad, 0xff, - 0xf8, 0x88, 0x3f, 0x67, 0xdd, 0x1e, 0x9f, 0xec, 0xd9, 0x65, 0xfb, 0x3b, - 0xa8, 0xe2, 0xca, 0x33, 0xff, 0x25, 0x8b, 0xf4, 0xd2, 0x8d, 0x6c, 0xb2, - 0xfa, 0x18, 0x86, 0xac, 0xa9, 0x1f, 0x66, 0x88, 0x1a, 0x55, 0x7f, 0xe9, - 0x72, 0x71, 0x63, 0x63, 0x4c, 0x2c, 0xbf, 0x4e, 0x9d, 0x9e, 0x75, 0x97, - 0xfe, 0xe7, 0x9c, 0xfb, 0x2f, 0x05, 0x85, 0x97, 0xf4, 0xa3, 0x5f, 0x88, - 0xd5, 0x97, 0xff, 0x1b, 0x0c, 0x19, 0x02, 0x76, 0xde, 0x61, 0x65, 0xff, - 0xdb, 0xcb, 0x39, 0xdc, 0x29, 0x67, 0x16, 0x5f, 0x36, 0x03, 0xd5, 0x95, - 0x87, 0xcc, 0xe8, 0x97, 0xdd, 0xeb, 0xe9, 0x65, 0xfb, 0x26, 0xf4, 0x6c, - 0xb2, 0x9c, 0xf2, 0xc8, 0x8a, 0xf7, 0x5c, 0x96, 0x59, 0xe7, 0x27, 0x8d, - 0x88, 0x1e, 0x30, 0x28, 0x58, 0x71, 0xaf, 0x70, 0x82, 0xa7, 0x2a, 0x56, - 0xf4, 0x7e, 0x37, 0xfd, 0x1b, 0xa3, 0xf4, 0x6c, 0xe4, 0xb2, 0xff, 0xa0, - 0x10, 0xd3, 0x6f, 0xe6, 0xb2, 0xb4, 0x8a, 0x0f, 0x16, 0xee, 0x1d, 0xdf, - 0xc2, 0x0b, 0xa3, 0xcf, 0x24, 0xbf, 0xcf, 0xd8, 0x90, 0x47, 0x8b, 0x2f, - 0xbd, 0x19, 0xb2, 0xca, 0x23, 0xd4, 0xe1, 0x95, 0xf4, 0xd9, 0x82, 0xac, - 0xbe, 0x91, 0xeb, 0x8b, 0x2f, 0xfe, 0xfc, 0x8f, 0x3e, 0xec, 0xd2, 0x7d, - 0x2c, 0xbe, 0x9b, 0xcf, 0x32, 0xcb, 0xe0, 0x3e, 0xb6, 0x59, 0x7e, 0xc9, - 0xa5, 0x1f, 0x2c, 0xb8, 0xe6, 0x59, 0x78, 0xe0, 0x96, 0x5f, 0xb3, 0x43, - 0xf6, 0x2c, 0xa1, 0x9e, 0x0f, 0x06, 0xab, 0xc7, 0xf5, 0xc5, 0x8b, 0xc5, - 0x12, 0x49, 0x7f, 0xe2, 0xfc, 0xf7, 0x37, 0x03, 0x28, 0xdd, 0x59, 0x66, - 0xac, 0xac, 0x3f, 0x47, 0x1b, 0x11, 0x22, 0xa7, 0x2a, 0x5a, 0x19, 0x0e, - 0x11, 0xfc, 0x45, 0xa4, 0x6f, 0x12, 0x11, 0x1f, 0x61, 0x47, 0xb9, 0x09, - 0x6a, 0x85, 0xf0, 0x4c, 0x2f, 0x39, 0x66, 0xfe, 0x33, 0x79, 0x5b, 0xb7, - 0xee, 0x6b, 0x51, 0xd5, 0x97, 0xfb, 0x3c, 0xf9, 0xf8, 0x9d, 0x59, 0x5f, - 0x1e, 0xe6, 0xe9, 0x45, 0xfb, 0x8c, 0x69, 0xc0, 0xb2, 0xee, 0x49, 0x65, - 0x48, 0xf0, 0x37, 0x94, 0xde, 0x2e, 0xf1, 0x65, 0xe2, 0x39, 0x2c, 0xbf, - 0x6b, 0xce, 0xed, 0x59, 0x7c, 0x12, 0x08, 0x16, 0x53, 0x9e, 0x4f, 0x09, - 0xef, 0xee, 0xcd, 0x2c, 0xfa, 0x4b, 0x2a, 0x11, 0xea, 0x64, 0x8e, 0x38, - 0x16, 0x41, 0x08, 0x6f, 0xfe, 0xf0, 0xb1, 0xae, 0x60, 0xaf, 0xa6, 0x16, - 0x5f, 0xe1, 0x73, 0xee, 0xf6, 0x1a, 0xb2, 0xfc, 0x59, 0xf8, 0x78, 0xb2, - 0xff, 0x80, 0x78, 0x59, 0xbd, 0xf8, 0xb2, 0xb6, 0x3e, 0x0f, 0x14, 0x53, - 0xa2, 0xe3, 0x90, 0x95, 0xbe, 0x18, 0xf1, 0xab, 0x2e, 0xfe, 0x12, 0x5c, - 0x28, 0xa9, 0x28, 0xcd, 0x80, 0xa2, 0xf7, 0xe1, 0x85, 0xf5, 0x24, 0x8c, - 0xcd, 0x0d, 0x62, 0x2b, 0x58, 0x73, 0xbf, 0xfd, 0xdf, 0x80, 0x7e, 0x9f, - 0x8e, 0xf8, 0x4e, 0x2c, 0xbf, 0xd1, 0x23, 0xec, 0xa3, 0xab, 0x2e, 0x65, - 0xf1, 0x66, 0x8d, 0x95, 0xff, 0x79, 0xfb, 0xc0, 0x16, 0x6c, 0xb2, 0xe0, - 0x1a, 0xcb, 0xe2, 0x3f, 0xa4, 0xb2, 0xff, 0x8f, 0xef, 0x60, 0xf4, 0xe0, - 0x59, 0x50, 0x7b, 0x7a, 0x22, 0xbf, 0xdc, 0xc3, 0xeb, 0x07, 0xe5, 0x97, - 0xfd, 0xe8, 0xd4, 0x00, 0xc8, 0x0b, 0x2f, 0x30, 0xfc, 0x02, 0x3f, 0x34, - 0xe3, 0xd2, 0x1d, 0xc3, 0x3a, 0xc4, 0xe1, 0xfb, 0x19, 0xad, 0x49, 0x71, - 0x4f, 0xe8, 0x7f, 0xea, 0x1a, 0x8d, 0x23, 0x0c, 0x20, 0x85, 0x8e, 0xca, - 0xfe, 0x15, 0x87, 0xe9, 0x42, 0xcb, 0xcd, 0x0e, 0x96, 0x5e, 0x01, 0xf1, - 0x65, 0xf0, 0x5b, 0x83, 0x59, 0x5f, 0x22, 0x24, 0xcb, 0xbc, 0x3b, 0xb8, - 0x39, 0x7f, 0xff, 0x6a, 0x41, 0x8c, 0xf0, 0x0f, 0x98, 0x3d, 0xb0, 0x55, - 0x97, 0xfe, 0xf6, 0x6e, 0x39, 0x31, 0x9f, 0x75, 0x65, 0xfd, 0xe3, 0x1f, - 0x82, 0xc2, 0xcb, 0xf1, 0x44, 0xc7, 0xf2, 0xcb, 0x60, 0x0f, 0x5c, 0xcb, - 0xef, 0x77, 0x00, 0xb2, 0x9a, 0x78, 0x5c, 0x26, 0xbd, 0x26, 0xfe, 0xb2, - 0xa1, 0x37, 0x76, 0x17, 0x3f, 0x86, 0xdf, 0x48, 0xaf, 0xb0, 0x8d, 0x85, - 0x97, 0xfc, 0xc3, 0xce, 0x86, 0x91, 0xb0, 0xb2, 0xff, 0xcf, 0xc6, 0xc1, - 0xeb, 0x46, 0x2a, 0xcb, 0x71, 0x83, 0xf9, 0xf1, 0xdd, 0xf3, 0xc9, 0xf4, - 0xb2, 0xf3, 0x11, 0xc5, 0x97, 0xfd, 0x9d, 0xe9, 0xb1, 0xdc, 0x02, 0xcb, - 0xfa, 0x3e, 0xe6, 0x7d, 0xd5, 0x97, 0x6a, 0x16, 0x50, 0xcf, 0x17, 0xa5, - 0xf7, 0xff, 0xdd, 0xd4, 0x67, 0xd3, 0xe4, 0xd0, 0xf7, 0xf7, 0x59, 0x7f, - 0xba, 0x60, 0x31, 0xc7, 0x56, 0x5f, 0xb9, 0x00, 0xc6, 0xac, 0xa8, 0x3d, - 0x9e, 0x19, 0x5b, 0x92, 0x4e, 0x2c, 0x63, 0xb8, 0xfd, 0xf1, 0x16, 0xa1, - 0x5b, 0x52, 0x55, 0x8b, 0xf4, 0x26, 0x9a, 0x53, 0xd8, 0xeb, 0x2f, 0xfb, - 0xa7, 0xb4, 0x7d, 0xfe, 0xa1, 0x65, 0xee, 0x77, 0x16, 0x5d, 0x9c, 0x9c, - 0x7a, 0xe2, 0x1d, 0xdf, 0xef, 0x00, 0xf8, 0x19, 0x1a, 0xcb, 0xff, 0xb3, - 0xa7, 0xf4, 0x8a, 0x27, 0xb9, 0xe3, 0x3e, 0xb2, 0xff, 0xf0, 0x65, 0xe7, - 0x3e, 0x99, 0x74, 0x3e, 0x59, 0x7f, 0x98, 0xef, 0xc0, 0x3d, 0x71, 0x65, - 0xfb, 0x3b, 0xfb, 0xf5, 0x65, 0x42, 0x65, 0x92, 0x33, 0xd2, 0x90, 0x52, - 0x67, 0xcd, 0xaf, 0xff, 0xd1, 0xe7, 0xc2, 0x8d, 0x30, 0x30, 0xbe, 0xa4, - 0xb2, 0xa4, 0x9f, 0xef, 0x63, 0x5c, 0xdc, 0x4d, 0xa8, 0x64, 0x49, 0xe4, - 0x3e, 0x8e, 0x3b, 0x77, 0x96, 0x12, 0x19, 0x53, 0xf7, 0xde, 0x37, 0x92, - 0xcb, 0xfd, 0x85, 0x2c, 0xe0, 0x8d, 0x59, 0x7e, 0x6f, 0x3f, 0x77, 0x59, - 0x5d, 0x3d, 0xb1, 0x0c, 0xef, 0xf6, 0x14, 0xef, 0x67, 0xc2, 0xac, 0xbf, - 0xa3, 0xc7, 0xbf, 0x26, 0x59, 0x5a, 0x3e, 0x5f, 0xcd, 0xaf, 0xfa, 0x44, - 0x1f, 0xe7, 0x01, 0xbf, 0xac, 0xad, 0x93, 0x65, 0x93, 0xe6, 0x42, 0x23, - 0xe2, 0x3b, 0xfe, 0xcf, 0xa5, 0xed, 0xcd, 0xc8, 0xdd, 0x59, 0x7f, 0xf3, - 0xfb, 0x87, 0x23, 0xec, 0x77, 0x8b, 0x2f, 0xa3, 0x59, 0xbd, 0x65, 0xfb, - 0xc7, 0x3e, 0xfb, 0x2c, 0xae, 0x1e, 0x77, 0x48, 0xef, 0xf7, 0xfc, 0xc2, - 0xce, 0x05, 0x65, 0x61, 0xea, 0xb9, 0x15, 0xff, 0x14, 0x67, 0xdd, 0xcd, - 0x42, 0xcb, 0xff, 0x47, 0x84, 0xe1, 0x67, 0x7d, 0x8b, 0x2f, 0xdb, 0xfd, - 0x9f, 0xba, 0xcb, 0xef, 0x47, 0xf8, 0xb2, 0xb0, 0xf3, 0x02, 0x55, 0x50, - 0xa9, 0xbf, 0x11, 0x0d, 0x0f, 0xd0, 0xe6, 0x72, 0x0f, 0xcd, 0xca, 0x11, - 0x57, 0xe7, 0xde, 0x31, 0xc2, 0xcb, 0xff, 0xfb, 0x52, 0x9c, 0x3f, 0x44, - 0xe2, 0xcf, 0xbb, 0x18, 0x2a, 0xcb, 0xb9, 0xc5, 0x97, 0x85, 0x14, 0x55, - 0x97, 0x7e, 0xe9, 0x19, 0x9a, 0x0a, 0x34, 0x60, 0x69, 0x83, 0x86, 0xf7, - 0xfe, 0xce, 0x13, 0xb1, 0x31, 0x1c, 0xcb, 0x2f, 0xef, 0xe2, 0x5e, 0x13, - 0x8b, 0x2f, 0xf8, 0xff, 0x13, 0x37, 0x90, 0x78, 0xb2, 0xfe, 0x32, 0xfc, - 0x00, 0x35, 0x97, 0x9f, 0xfc, 0x49, 0x52, 0x54, 0x18, 0xd8, 0x74, 0xf8, - 0xbf, 0xf3, 0xf2, 0x30, 0xde, 0x79, 0x3e, 0x5b, 0x7d, 0x03, 0x31, 0xac, - 0xbf, 0xb9, 0xe3, 0x03, 0xe9, 0x65, 0xf8, 0x7a, 0x30, 0xec, 0xb2, 0xfd, - 0x9d, 0xe3, 0xfc, 0xb2, 0xff, 0x0b, 0x85, 0x9b, 0xcf, 0x4b, 0x2f, 0xe2, - 0xcf, 0xbf, 0x12, 0x4b, 0x2f, 0xff, 0xb9, 0xdc, 0xf0, 0x8d, 0xc0, 0x47, - 0xa1, 0xab, 0x2d, 0xc5, 0x95, 0x89, 0xa1, 0xcc, 0x5b, 0xa2, 0x92, 0x28, - 0xe9, 0xa0, 0x4c, 0x05, 0x50, 0xbf, 0x66, 0x77, 0xd8, 0xb2, 0xe7, 0x6a, - 0xcb, 0xfe, 0x0f, 0x3b, 0x13, 0x07, 0xee, 0x2c, 0xbe, 0x3d, 0x6a, 0x16, - 0x5f, 0xec, 0xdf, 0x8c, 0xc5, 0x14, 0x54, 0x97, 0xe9, 0xa3, 0x3d, 0xc5, - 0x95, 0x39, 0x17, 0xfe, 0x3c, 0x22, 0x11, 0x0e, 0xaf, 0xf3, 0x2e, 0x02, - 0x0f, 0x1e, 0x96, 0x5e, 0x6b, 0xf5, 0x65, 0x4c, 0x9b, 0x3f, 0xa1, 0xaa, - 0x13, 0xfd, 0xe6, 0xf4, 0xb2, 0xfb, 0xe0, 0x1e, 0x96, 0x5b, 0xf6, 0x41, - 0xae, 0xe8, 0x5d, 0xfb, 0x7b, 0xb4, 0xda, 0xb2, 0xa0, 0xf5, 0x48, 0xb2, - 0xfd, 0x93, 0x4a, 0x24, 0xb2, 0xfe, 0xd8, 0x71, 0x84, 0x35, 0x95, 0x0b, - 0xa0, 0x92, 0x70, 0x38, 0xd9, 0x3c, 0xca, 0xf1, 0xc6, 0xf2, 0x19, 0x3d, - 0x20, 0x10, 0xa2, 0xf3, 0xfe, 0x6b, 0x2f, 0xf8, 0x64, 0x1e, 0x66, 0xd9, - 0xb2, 0xcb, 0xd1, 0xa2, 0x59, 0x7f, 0xb0, 0x64, 0xfc, 0x31, 0xac, 0xb7, - 0x96, 0x5e, 0x0b, 0xec, 0x47, 0x85, 0xc3, 0x1a, 0xd2, 0x24, 0x3a, 0xbb, - 0x7c, 0xde, 0x63, 0x56, 0x51, 0x9e, 0x2b, 0x91, 0xdf, 0xd1, 0xae, 0xf7, - 0x37, 0x56, 0x5d, 0x1b, 0xd6, 0x53, 0x53, 0x93, 0x71, 0xc6, 0x5c, 0x61, - 0xe4, 0x41, 0xb8, 0x61, 0x7f, 0x08, 0x32, 0x8c, 0xd9, 0x65, 0x89, 0x65, - 0xf4, 0x6d, 0x12, 0x59, 0x43, 0x3e, 0x07, 0x2e, 0x21, 0x0b, 0xfb, 0xc7, - 0xd2, 0x86, 0xac, 0xbf, 0xfd, 0x83, 0x76, 0xe7, 0xd2, 0xcf, 0xf0, 0x6b, - 0x2e, 0xf3, 0xac, 0xba, 0x6e, 0x2c, 0xbf, 0x66, 0xf3, 0x21, 0xe1, 0xae, - 0x10, 0x5a, 0xfe, 0x9d, 0xdc, 0xe7, 0x21, 0x65, 0xf6, 0x7d, 0xd8, 0x59, - 0x7f, 0xf3, 0xeb, 0x18, 0x3d, 0x66, 0xf7, 0xd2, 0xca, 0xf1, 0xf3, 0xef, - 0x22, 0xbf, 0x6e, 0x3e, 0xc2, 0x49, 0x65, 0x4e, 0x4e, 0x75, 0x9b, 0xc4, - 0x1f, 0x64, 0x25, 0x82, 0x49, 0x7c, 0x3c, 0xf3, 0xac, 0xbf, 0xe2, 0x97, - 0xb0, 0x8a, 0x05, 0x59, 0x7f, 0xf9, 0xf6, 0x8d, 0x69, 0xe5, 0x3b, 0xf1, - 0xe2, 0xca, 0xc4, 0x42, 0x11, 0xbd, 0xff, 0xb3, 0x5a, 0x79, 0x4e, 0xdf, - 0x1b, 0xab, 0x2a, 0x0f, 0x9a, 0x44, 0x35, 0xa4, 0xdf, 0x89, 0x4b, 0xb1, - 0x85, 0xdf, 0xed, 0x73, 0xd8, 0x47, 0xc5, 0x95, 0x0a, 0xf7, 0x30, 0xb4, - 0xe5, 0xa3, 0xb9, 0xb5, 0xff, 0x60, 0xf0, 0xa0, 0x83, 0x0b, 0x2c, 0x2a, - 0xcb, 0xff, 0xdf, 0xe7, 0xdd, 0x8f, 0xa5, 0xdf, 0xe2, 0x4b, 0x2f, 0xf7, - 0x48, 0xfe, 0xe0, 0x8d, 0x59, 0x44, 0x88, 0x3e, 0x27, 0x54, 0x22, 0xdc, - 0xe1, 0x2b, 0x50, 0xfc, 0xa2, 0xdb, 0x47, 0x65, 0x2a, 0x40, 0x50, 0xe9, - 0x13, 0x19, 0x1f, 0x5b, 0x11, 0xea, 0x82, 0x76, 0xff, 0xe8, 0xcb, 0x8e, - 0x3a, 0x59, 0xa3, 0x83, 0xd5, 0x68, 0xd2, 0xd9, 0xd3, 0xaf, 0x52, 0x17, - 0xde, 0x16, 0x7f, 0xc6, 0xb6, 0x54, 0xd2, 0xee, 0x4e, 0x1b, 0xf6, 0x7d, - 0xf0, 0x32, 0x85, 0xb7, 0xce, 0x49, 0x08, 0x85, 0xb9, 0x0e, 0xcb, 0xfe, - 0xcd, 0x14, 0x76, 0x59, 0xe5, 0x97, 0xf4, 0x8b, 0x00, 0x7d, 0x59, 0x7f, - 0xf1, 0x01, 0x87, 0xe6, 0x4a, 0x08, 0x0b, 0x2f, 0xdf, 0xe0, 0xde, 0x4b, - 0x2b, 0xe4, 0x4b, 0x99, 0x61, 0x21, 0xdf, 0xf7, 0x79, 0xe3, 0x86, 0xb8, - 0xd6, 0x5f, 0x0f, 0x4f, 0x25, 0x97, 0x84, 0x8f, 0xd6, 0x5f, 0xfb, 0xc6, - 0x51, 0xf7, 0x0d, 0xb0, 0xb2, 0xf7, 0x23, 0x4b, 0x2e, 0xef, 0x00, 0x7b, - 0x3f, 0x1e, 0xd4, 0x26, 0x00, 0xc1, 0xc3, 0x91, 0x05, 0xde, 0xff, 0x00, - 0xb2, 0x52, 0x7e, 0x2c, 0xbf, 0x9c, 0x5c, 0xfc, 0x4e, 0xac, 0xb8, 0x66, - 0xb2, 0xfb, 0xee, 0x47, 0xcb, 0x2e, 0x79, 0x4e, 0x37, 0x46, 0x2d, 0x79, - 0x8f, 0x1a, 0xcb, 0xff, 0xa6, 0xd4, 0x6f, 0xf4, 0x1e, 0x8e, 0x65, 0x95, - 0x23, 0xe4, 0xf8, 0x76, 0xff, 0x38, 0xfd, 0x9d, 0xe3, 0xac, 0xbf, 0xb9, - 0x83, 0x3e, 0x6c, 0xb2, 0xf4, 0xa3, 0xf5, 0x97, 0xe1, 0x26, 0x94, 0x6e, - 0xa4, 0xa8, 0x5c, 0x34, 0xc8, 0x67, 0x31, 0x19, 0x79, 0x9e, 0xe8, 0xcb, - 0xcd, 0x4f, 0x09, 0x12, 0x23, 0xe1, 0x97, 0x4b, 0x84, 0x1d, 0xb0, 0x16, - 0x5f, 0xfc, 0xc1, 0x05, 0xc4, 0xce, 0x1c, 0x12, 0xcb, 0xd3, 0xe6, 0x35, - 0x95, 0xa3, 0xe2, 0x6a, 0x1d, 0xe8, 0x7d, 0x2c, 0xbf, 0x9b, 0xdf, 0x46, - 0xf8, 0x59, 0x7d, 0x84, 0x0f, 0xd6, 0x5f, 0xfb, 0xa1, 0x6f, 0xa0, 0xc9, - 0xc6, 0xb2, 0xfa, 0x52, 0x7e, 0xac, 0xaf, 0x8f, 0x7d, 0xcf, 0x6f, 0x98, - 0xd3, 0x8a, 0xb2, 0xe0, 0x6f, 0x59, 0x61, 0x15, 0x10, 0x2a, 0xdd, 0x55, - 0x02, 0x8a, 0xd1, 0xeb, 0x74, 0x64, 0x51, 0xfa, 0xc4, 0x55, 0x1b, 0xd5, - 0xfc, 0x03, 0xdb, 0xae, 0x35, 0x97, 0xf1, 0xb2, 0xc1, 0xe8, 0x15, 0x65, - 0xfe, 0xf1, 0x88, 0xcf, 0xff, 0xe1, 0x25, 0x68, 0xfa, 0xa7, 0xcc, 0xaf, - 0xd8, 0xd7, 0x7d, 0x96, 0x5f, 0xa0, 0x1e, 0x8d, 0x2c, 0xbd, 0xe0, 0xb0, - 0xb2, 0xf6, 0xe3, 0x2f, 0x8b, 0x2b, 0xc7, 0x84, 0x43, 0xd5, 0xb2, 0x6d, - 0xc7, 0x09, 0x82, 0x25, 0xe9, 0x38, 0x8d, 0x37, 0xfc, 0x5f, 0x8f, 0xce, - 0x26, 0x6c, 0xb2, 0xfd, 0x81, 0x65, 0xe7, 0x16, 0x51, 0x9f, 0x37, 0x8e, - 0xef, 0xf8, 0xbb, 0xc0, 0xfd, 0xd3, 0x15, 0x65, 0xff, 0xfb, 0x05, 0x86, - 0x85, 0xc7, 0xdf, 0x80, 0x64, 0x2a, 0xcb, 0xff, 0x7d, 0xd0, 0x78, 0xc7, - 0xec, 0xd9, 0x65, 0xfe, 0xfc, 0xfe, 0xe7, 0x8c, 0x55, 0x95, 0x87, 0xef, - 0xa4, 0x1b, 0xf9, 0xf9, 0x98, 0x4c, 0x2c, 0xac, 0x3c, 0xd0, 0x90, 0xde, - 0x77, 0x15, 0x65, 0x42, 0x72, 0x63, 0x3b, 0xf4, 0x63, 0x64, 0x43, 0x7f, - 0xbb, 0xc9, 0xd8, 0xd3, 0x1a, 0xcb, 0xfe, 0x7d, 0x4c, 0x51, 0xff, 0x02, - 0xb2, 0xa0, 0xfb, 0xc6, 0x6b, 0x7f, 0xa1, 0xe5, 0xc1, 0x23, 0x75, 0x65, - 0xff, 0xa7, 0x13, 0xb1, 0x3b, 0x9f, 0xff, 0x0b, 0x2f, 0xff, 0x6c, 0x1f, - 0xf9, 0x23, 0xe7, 0x23, 0x52, 0x59, 0x63, 0x61, 0x12, 0x5a, 0x45, 0xbf, - 0xcf, 0xef, 0xb9, 0x05, 0xd5, 0x95, 0x24, 0xc9, 0x39, 0x0c, 0x8e, 0x94, - 0xdf, 0xff, 0xe1, 0xfa, 0x01, 0xe3, 0x99, 0xde, 0x4c, 0x38, 0x8f, 0xba, - 0xb2, 0xf8, 0xb3, 0x7e, 0x2c, 0xad, 0x91, 0x0e, 0x2b, 0x2d, 0xfe, 0xf1, - 0xcd, 0x28, 0x29, 0x2c, 0xbf, 0xff, 0xa3, 0xbc, 0x10, 0xbb, 0xe0, 0xbc, - 0xbb, 0xcc, 0x15, 0x65, 0xff, 0x9c, 0x5e, 0xe7, 0xba, 0x71, 0xba, 0xb2, - 0xff, 0xd0, 0x2f, 0x19, 0x2e, 0x0c, 0xfb, 0xab, 0x2a, 0x13, 0x3a, 0x01, - 0x2e, 0x8c, 0xc9, 0x77, 0xa8, 0x37, 0xd2, 0xf6, 0x6c, 0xb2, 0xf8, 0xf6, - 0x04, 0x96, 0x5f, 0xf4, 0x7c, 0xd7, 0xee, 0x7d, 0xd5, 0x97, 0x3e, 0xcb, - 0x2b, 0xe4, 0x4b, 0xe8, 0x8c, 0x88, 0xc5, 0x3a, 0xbf, 0xcd, 0x7e, 0x14, - 0x63, 0x0b, 0x2f, 0xf8, 0x21, 0xf1, 0xf7, 0xcf, 0x25, 0x97, 0xe0, 0xfb, - 0x50, 0x2a, 0xcb, 0xa7, 0xdd, 0x65, 0xd0, 0x0c, 0x45, 0x6b, 0x4c, 0xba, - 0x72, 0x21, 0x4d, 0xda, 0x75, 0x97, 0xff, 0x6f, 0x3e, 0x73, 0x08, 0x0e, - 0x5f, 0xac, 0xbf, 0xde, 0x31, 0x8f, 0x05, 0x99, 0x65, 0xf3, 0x07, 0xf7, - 0x16, 0x5b, 0xfc, 0x44, 0xf0, 0x11, 0x7a, 0x6b, 0x7c, 0x27, 0x9f, 0xab, - 0x2d, 0x1a, 0x3d, 0x96, 0x9b, 0x56, 0x93, 0x34, 0xf4, 0x61, 0xb7, 0xfe, - 0x7f, 0xb9, 0x9d, 0x36, 0xbc, 0x96, 0x5b, 0xab, 0x2b, 0xf3, 0xcf, 0x10, - 0xfa, 0xff, 0xec, 0xf1, 0x83, 0xd9, 0xdc, 0x62, 0x4b, 0x2f, 0xff, 0xfc, - 0xfa, 0x60, 0x7e, 0x8e, 0x7b, 0x3e, 0x97, 0x4e, 0x68, 0xe0, 0x56, 0x56, - 0x22, 0xcd, 0xd1, 0x2f, 0x8a, 0x70, 0x26, 0x59, 0x7f, 0xff, 0xa6, 0x28, - 0x6e, 0xa0, 0x19, 0xac, 0xf1, 0xeb, 0xce, 0xb2, 0xff, 0xf9, 0xf5, 0xfc, - 0xfe, 0x6a, 0x24, 0x7f, 0x77, 0x16, 0x5f, 0xff, 0xfc, 0x1e, 0x79, 0xe5, - 0xc9, 0x1f, 0x44, 0xd4, 0x7a, 0x3b, 0xc7, 0xf9, 0x65, 0xfa, 0x30, 0xbb, - 0x3e, 0xb2, 0xfe, 0x3f, 0xbf, 0xd3, 0x8d, 0x65, 0x9a, 0xb2, 0x9a, 0x7d, - 0x3e, 0x29, 0x22, 0xfb, 0xf7, 0xa3, 0x5c, 0x35, 0x97, 0x6b, 0x75, 0x65, - 0xe9, 0x04, 0x6b, 0x2e, 0x7f, 0xa7, 0x22, 0x30, 0x65, 0xd3, 0x13, 0xb8, - 0xd5, 0x42, 0xa8, 0xbc, 0x25, 0x35, 0xfd, 0x29, 0xf2, 0x36, 0x9b, 0xf8, - 0xf5, 0x3d, 0xf3, 0xa6, 0xb2, 0xff, 0xfe, 0xc2, 0xdb, 0x9c, 0x8f, 0xf3, - 0xc7, 0xa7, 0x17, 0xab, 0x2f, 0xe1, 0xe1, 0x31, 0xa8, 0x59, 0x52, 0x66, - 0xf7, 0x0e, 0x3b, 0x40, 0x42, 0xc7, 0xe8, 0xd1, 0x66, 0x8f, 0xdf, 0x50, - 0xe0, 0x6c, 0x3a, 0xfd, 0x1b, 0xe7, 0xef, 0x25, 0x0d, 0x7e, 0xca, 0xac, - 0xde, 0x9e, 0x29, 0x94, 0xfa, 0xe5, 0xcc, 0xbd, 0xc5, 0x97, 0x8d, 0xb8, - 0xb2, 0xbe, 0x37, 0x3a, 0x1e, 0xbf, 0xff, 0xc5, 0x83, 0xf4, 0x0a, 0x58, - 0x7b, 0x4f, 0x87, 0xc7, 0xa5, 0x95, 0x0d, 0x83, 0x01, 0xd3, 0xa9, 0x1e, - 0x33, 0x70, 0x91, 0x5f, 0x40, 0x0c, 0x0b, 0x2f, 0x87, 0xa3, 0x15, 0x65, - 0xef, 0x67, 0xeb, 0x2d, 0x0b, 0x2f, 0xff, 0xa6, 0x77, 0x97, 0x21, 0xa3, - 0xf4, 0x10, 0x16, 0x54, 0x1e, 0xf9, 0x88, 0x5f, 0xf6, 0x4d, 0x28, 0xfb, - 0x3e, 0xea, 0xcb, 0x6d, 0x08, 0xd7, 0xc7, 0xc2, 0x20, 0xa9, 0x26, 0x9e, - 0x32, 0x1d, 0x43, 0xea, 0xf8, 0x7e, 0x0e, 0xcb, 0x2f, 0xe7, 0x96, 0x6c, - 0x12, 0x59, 0x76, 0x0d, 0x65, 0x0c, 0xf0, 0xc0, 0x5b, 0x7f, 0xed, 0x66, - 0xec, 0xde, 0x76, 0x9f, 0x16, 0x5b, 0x68, 0x46, 0x5e, 0x33, 0xe8, 0x8a, - 0xc6, 0xb2, 0xe6, 0x5e, 0x2c, 0xac, 0x3d, 0xfd, 0x1a, 0xb8, 0x85, 0xff, - 0xb7, 0x9f, 0x65, 0x13, 0xbb, 0x01, 0x59, 0x69, 0x96, 0x5f, 0xa7, 0xc3, - 0xec, 0x02, 0xca, 0xc3, 0xff, 0x99, 0x0b, 0xa2, 0x57, 0xf4, 0x74, 0xff, - 0x89, 0x2c, 0xba, 0x4e, 0xb2, 0xb4, 0x78, 0x6e, 0x5b, 0x7f, 0x7d, 0xb3, - 0xca, 0x37, 0x56, 0x5c, 0x52, 0x59, 0x50, 0x79, 0x1b, 0x19, 0x53, 0x25, - 0xb8, 0xc1, 0x87, 0x39, 0x11, 0x30, 0x36, 0x02, 0xf3, 0x84, 0x0b, 0x61, - 0x99, 0xea, 0xc7, 0xbd, 0xe3, 0x9d, 0x28, 0xd8, 0x39, 0x0a, 0xce, 0xb9, - 0x05, 0xa6, 0xff, 0xcc, 0x91, 0x21, 0xa0, 0xf3, 0xfd, 0xfa, 0xcb, 0xfd, - 0x29, 0xb0, 0x9f, 0xd8, 0xb2, 0xfb, 0xe9, 0x43, 0x56, 0x5f, 0xf4, 0x16, - 0xdc, 0xc6, 0xc6, 0xea, 0xcb, 0xa3, 0xcb, 0x2f, 0xe7, 0x98, 0x70, 0x5b, - 0x2c, 0xad, 0x91, 0x44, 0x32, 0x32, 0x3b, 0xde, 0x2d, 0x7d, 0x13, 0x1f, - 0x96, 0x5e, 0xdc, 0x86, 0xac, 0xa7, 0x3c, 0x1d, 0xc2, 0x2b, 0xf1, 0x0f, - 0xd1, 0x25, 0x97, 0xef, 0x44, 0xb3, 0x8b, 0x2f, 0xb7, 0x20, 0x80, 0xb2, - 0xfe, 0xf6, 0x30, 0xf1, 0xb2, 0xcb, 0xe8, 0x9b, 0x50, 0xb2, 0xe6, 0xe2, - 0xca, 0x69, 0xb8, 0xf1, 0x15, 0xf4, 0x05, 0x96, 0x6b, 0x2f, 0xb8, 0x50, - 0x2a, 0xcb, 0xf0, 0xfd, 0x85, 0x25, 0x95, 0x87, 0x92, 0xe4, 0x57, 0xa4, - 0x7f, 0xac, 0xbf, 0x3f, 0x3a, 0x73, 0x2c, 0xbf, 0xc7, 0xa8, 0xd9, 0xf4, - 0x05, 0x97, 0x02, 0x65, 0x96, 0xec, 0xe5, 0x47, 0x70, 0x48, 0x32, 0x7c, - 0x27, 0x01, 0x21, 0xb3, 0x68, 0x87, 0xcd, 0xce, 0x41, 0xc1, 0xde, 0x94, - 0x4f, 0x99, 0xdf, 0xfe, 0xd0, 0x0b, 0x37, 0x96, 0x46, 0xa3, 0x8b, 0x2f, - 0xfc, 0xd3, 0xcf, 0xb0, 0xc7, 0x1b, 0x8b, 0x2f, 0xf3, 0xcd, 0xec, 0x6e, - 0x71, 0x65, 0x62, 0x2f, 0x34, 0x93, 0xbd, 0x02, 0xf4, 0xfc, 0x75, 0x65, - 0xf4, 0x6f, 0x3d, 0xeb, 0x2e, 0xc6, 0xac, 0xb3, 0x13, 0x8d, 0xd9, 0x92, - 0xd6, 0xc8, 0x83, 0x25, 0xab, 0xf3, 0x1d, 0xcc, 0x6a, 0xcb, 0xff, 0x4a, - 0x46, 0x08, 0x6c, 0xdc, 0x85, 0x95, 0x88, 0x8a, 0x32, 0x37, 0x28, 0xbf, - 0xfd, 0x31, 0x63, 0x0c, 0x3f, 0x78, 0x65, 0x32, 0xcb, 0xef, 0x66, 0xc4, - 0xb2, 0xfd, 0x83, 0x3d, 0x71, 0x65, 0xf8, 0x49, 0x1f, 0xfc, 0x59, 0x7e, - 0xd0, 0x23, 0x36, 0x59, 0x7b, 0xbd, 0xf9, 0x65, 0xff, 0xdf, 0x00, 0xfd, - 0x3b, 0x73, 0x3c, 0x6d, 0x59, 0x5f, 0x9f, 0x47, 0x47, 0xae, 0x0e, 0x96, - 0x56, 0x23, 0x2b, 0x90, 0x90, 0x9f, 0x23, 0xb4, 0x6c, 0x9a, 0x93, 0x49, - 0xc5, 0x87, 0xa5, 0x42, 0xfc, 0x6e, 0x4a, 0xbb, 0x38, 0xda, 0xbd, 0x19, - 0xf3, 0x96, 0xf1, 0x33, 0xb1, 0xba, 0x5f, 0xf8, 0x8c, 0x4f, 0xb3, 0x7f, - 0xd0, 0x22, 0xcb, 0x49, 0x65, 0xff, 0xe3, 0xcd, 0x0e, 0x05, 0xcf, 0x47, - 0xdc, 0x59, 0x7c, 0x24, 0x6b, 0xf5, 0x97, 0xfe, 0x8f, 0xbd, 0xe8, 0xda, - 0x02, 0xd5, 0x97, 0xff, 0x6b, 0x4f, 0xfe, 0x78, 0xf5, 0xe7, 0x59, 0x69, - 0x2c, 0xae, 0x1e, 0xa8, 0x88, 0x97, 0x3e, 0x96, 0x5f, 0xff, 0x98, 0xce, - 0x9f, 0x3c, 0x1c, 0xef, 0xee, 0x38, 0x59, 0x7f, 0x74, 0xf6, 0x6c, 0x01, - 0x65, 0x0d, 0x13, 0x5a, 0x16, 0xf2, 0xb5, 0xf4, 0x8f, 0x52, 0x59, 0x7f, - 0x7f, 0x34, 0x8f, 0x52, 0x59, 0x31, 0xa2, 0xbf, 0xde, 0xcf, 0x60, 0x1c, - 0x0b, 0x2e, 0x3d, 0x96, 0x50, 0x0f, 0x27, 0xa6, 0x55, 0xf2, 0x2b, 0x35, - 0x08, 0xab, 0xfc, 0x09, 0x8d, 0xa1, 0x7e, 0x2c, 0xbe, 0xc0, 0xeb, 0x65, - 0x95, 0xf1, 0xeb, 0xb4, 0xd2, 0xf4, 0x0c, 0x6b, 0x2e, 0xcd, 0xc5, 0x97, - 0xdf, 0x88, 0x52, 0x59, 0x67, 0x23, 0x7b, 0xd1, 0x9b, 0xf7, 0x39, 0x85, - 0xfa, 0xca, 0xfc, 0xf3, 0x48, 0x96, 0xa1, 0x53, 0x49, 0xc3, 0xf9, 0xe1, - 0x01, 0xd2, 0x30, 0xc2, 0x9a, 0xd3, 0x2c, 0xbf, 0xe0, 0xb8, 0x93, 0x4b, - 0x3e, 0x92, 0xca, 0xf8, 0xf3, 0x88, 0x4a, 0xfc, 0x27, 0x7f, 0x6e, 0x2c, - 0xa6, 0x9e, 0x67, 0xe4, 0x57, 0x47, 0x16, 0x5f, 0x47, 0xa0, 0x6b, 0x28, - 0x06, 0xde, 0x61, 0x6b, 0xfe, 0x93, 0xeb, 0xa5, 0x0d, 0xe2, 0xcb, 0xfd, - 0x03, 0x8d, 0x06, 0x3f, 0x59, 0x78, 0xb3, 0xe5, 0x97, 0x37, 0x93, 0x22, - 0x1d, 0xa7, 0x04, 0x67, 0x7f, 0xfd, 0x19, 0xf7, 0x7d, 0x87, 0x23, 0x61, - 0x8c, 0x59, 0x7e, 0x28, 0xdc, 0x28, 0x59, 0x7f, 0xf9, 0xdf, 0x5b, 0x79, - 0xfb, 0xe3, 0xd4, 0x96, 0x5f, 0xb4, 0x3f, 0x1c, 0xcb, 0x2e, 0x71, 0x46, - 0x7e, 0x78, 0x95, 0x7f, 0xce, 0x59, 0xde, 0x98, 0xbd, 0x59, 0x7f, 0xff, - 0xf4, 0xd2, 0x32, 0xec, 0x7f, 0xb9, 0xd3, 0x63, 0x59, 0x1f, 0x48, 0xda, - 0xb2, 0xa1, 0x15, 0xe4, 0x71, 0x50, 0xac, 0x9f, 0x16, 0x8e, 0x15, 0x3a, - 0x3c, 0x75, 0x02, 0x84, 0xd8, 0x61, 0xb9, 0x53, 0xdb, 0x64, 0x53, 0x08, - 0xd2, 0xa4, 0x30, 0xe3, 0xe3, 0x08, 0x60, 0x11, 0x99, 0x2b, 0xc4, 0x9f, - 0xc2, 0x57, 0x92, 0xc9, 0xbb, 0x38, 0x33, 0x7e, 0x31, 0x02, 0xfc, 0x59, - 0x7f, 0xf7, 0x7e, 0x96, 0x74, 0xf7, 0xc1, 0x01, 0x65, 0xfd, 0x01, 0xf8, - 0xfe, 0xdc, 0x59, 0x7e, 0xc1, 0x73, 0xee, 0xac, 0xa9, 0xc7, 0xb6, 0x66, - 0x57, 0xfb, 0xe9, 0x60, 0xfd, 0x9b, 0x2c, 0xa1, 0xa6, 0x43, 0xf1, 0x46, - 0xa1, 0x42, 0x44, 0x77, 0xe8, 0xd7, 0xd2, 0xe2, 0xcb, 0xff, 0xfe, 0xd4, - 0xcf, 0xe3, 0xe4, 0x4c, 0x7d, 0xee, 0x7b, 0xf3, 0xde, 0xb2, 0xb6, 0x44, - 0x98, 0x4a, 0x6f, 0x6b, 0x38, 0xb2, 0xfc, 0x65, 0xbf, 0x24, 0xb2, 0xf6, - 0x1e, 0xcb, 0x29, 0x83, 0xe0, 0x68, 0xe7, 0x8a, 0x2f, 0xe8, 0xdb, 0x3b, - 0x8d, 0x59, 0x7f, 0xf6, 0x10, 0x41, 0xec, 0x6c, 0xce, 0x05, 0x94, 0x68, - 0xa1, 0xd1, 0x87, 0x0b, 0x6f, 0x9a, 0x70, 0x35, 0x97, 0xf8, 0x98, 0xf4, - 0x35, 0xa4, 0xb2, 0xfe, 0xdd, 0x38, 0xdc, 0x0f, 0x56, 0x5f, 0xa2, 0x6c, - 0xc0, 0x2c, 0xa8, 0x45, 0x76, 0x10, 0x99, 0x9f, 0x8c, 0xef, 0x89, 0xaf, - 0xd5, 0x97, 0x88, 0xe4, 0xb2, 0xff, 0xde, 0xc9, 0x8e, 0x60, 0xee, 0x07, - 0x8b, 0x2f, 0x1e, 0x98, 0x59, 0x7d, 0xd3, 0x8f, 0x96, 0x51, 0xa2, 0x0c, - 0x91, 0x38, 0x3b, 0x7f, 0xd1, 0x34, 0x77, 0xd9, 0xa0, 0x2c, 0xbd, 0xe8, - 0x99, 0x65, 0xa3, 0xe3, 0xd6, 0xdc, 0x39, 0xa9, 0x22, 0xbf, 0x90, 0x84, - 0xbc, 0x46, 0x6b, 0x2e, 0x7d, 0x96, 0x5f, 0xce, 0xdc, 0xde, 0xfa, 0x59, - 0x5b, 0x1e, 0x2b, 0x45, 0xef, 0xfd, 0x31, 0xfa, 0x3e, 0x94, 0x4d, 0x0b, - 0x28, 0xcf, 0x8c, 0x24, 0x77, 0xcd, 0x8e, 0xb5, 0x65, 0xf8, 0x6e, 0x51, - 0xe5, 0x97, 0xf4, 0xa3, 0xee, 0xe7, 0x96, 0x5f, 0xfe, 0xef, 0x0f, 0xf8, - 0x97, 0x33, 0x3e, 0xea, 0xca, 0x98, 0xfe, 0x78, 0x5d, 0x5e, 0x46, 0x10, - 0xb0, 0x9f, 0xbf, 0xde, 0x79, 0xb0, 0xf7, 0x06, 0xb2, 0xa1, 0x34, 0x33, - 0x87, 0x27, 0x0a, 0x6f, 0xcd, 0xdc, 0x20, 0xec, 0xb2, 0xff, 0x70, 0xfc, - 0x73, 0x1e, 0xcb, 0x2f, 0xef, 0xa5, 0x81, 0xd6, 0xcb, 0x2f, 0xff, 0x6b, - 0x50, 0x58, 0xc1, 0xfb, 0xd8, 0x22, 0xca, 0x33, 0xfa, 0x09, 0x85, 0x42, - 0x3e, 0xf0, 0xb3, 0x50, 0xae, 0xbc, 0x0f, 0x42, 0xcb, 0xb5, 0x0b, 0x2b, - 0xe3, 0x65, 0x30, 0xe5, 0xfa, 0x0f, 0xb3, 0xd4, 0xf0, 0x59, 0x7e, 0x73, - 0x1c, 0x12, 0xcb, 0xa0, 0x2b, 0x2a, 0x11, 0x21, 0xe2, 0x32, 0x32, 0xe1, - 0x2d, 0xf6, 0xd1, 0xb9, 0x0b, 0x2f, 0xbd, 0xfb, 0xf5, 0x65, 0xbc, 0xb2, - 0xdb, 0xdc, 0xda, 0x04, 0x8e, 0xff, 0xe3, 0x69, 0xf3, 0xd0, 0x7a, 0x0e, - 0xea, 0xca, 0x84, 0x63, 0x9a, 0xcb, 0x94, 0x5f, 0xc5, 0xc3, 0xdf, 0x03, - 0x59, 0x7f, 0xdf, 0x99, 0x76, 0x38, 0x1f, 0x2c, 0xbc, 0x46, 0xc2, 0xcb, - 0xf3, 0xeb, 0x51, 0xb2, 0xcb, 0xfb, 0xa7, 0xa3, 0xe8, 0x56, 0x54, 0xe4, - 0x55, 0x34, 0xe7, 0xa3, 0x82, 0x14, 0x5e, 0xe3, 0xfe, 0xb2, 0xa0, 0xf7, - 0x7a, 0x81, 0x7f, 0x04, 0x4f, 0x67, 0xdc, 0x59, 0x7f, 0xff, 0xfd, 0x1d, - 0x27, 0x01, 0xf2, 0x63, 0xd0, 0x23, 0x9d, 0x8f, 0xa0, 0x4c, 0xe2, 0xcb, - 0xfd, 0xcc, 0xd4, 0x6f, 0x8d, 0xd5, 0x95, 0xa4, 0x5a, 0x75, 0xf6, 0xff, - 0x7b, 0x3e, 0x8d, 0x1b, 0x56, 0x5f, 0x76, 0x1b, 0x0b, 0x2f, 0xff, 0xff, - 0xfb, 0x99, 0xdf, 0x3b, 0x79, 0xad, 0x1f, 0xdd, 0x77, 0x63, 0x32, 0x60, - 0xf6, 0x05, 0xfa, 0x16, 0x5f, 0x83, 0x36, 0x4f, 0xe2, 0xcb, 0xbc, 0xeb, - 0x2b, 0x88, 0xd8, 0xec, 0x25, 0xf7, 0x95, 0xdf, 0xf7, 0xdc, 0x23, 0x6f, - 0x73, 0x75, 0x65, 0xd9, 0xa5, 0x95, 0x07, 0xa5, 0xe3, 0xcb, 0xfb, 0xa4, - 0xff, 0xe1, 0x2c, 0xbf, 0x13, 0xff, 0x84, 0xb2, 0xa7, 0x1e, 0x97, 0x4b, - 0x2a, 0x15, 0x37, 0x8c, 0x8f, 0x0c, 0xde, 0x1f, 0x3d, 0x84, 0x48, 0x5c, - 0xef, 0xfd, 0xd3, 0xe1, 0x3f, 0x66, 0x71, 0xac, 0xbe, 0xfd, 0xfe, 0xe2, - 0xcb, 0x85, 0x15, 0x65, 0x70, 0xde, 0x8a, 0x49, 0x7d, 0xe7, 0xcf, 0x24, - 0x66, 0x68, 0xab, 0x11, 0xa0, 0x70, 0x9d, 0xbf, 0x09, 0x8d, 0x3d, 0x2c, - 0xbf, 0x00, 0xf9, 0xe3, 0x59, 0x73, 0x5d, 0x65, 0xfe, 0xec, 0x10, 0x27, - 0x9f, 0xda, 0xb2, 0xbc, 0x79, 0xe1, 0x16, 0xb8, 0xfe, 0x59, 0x7b, 0xd1, - 0xfa, 0xcb, 0xdb, 0x9b, 0x90, 0xb2, 0xff, 0x87, 0xe3, 0xd1, 0xfd, 0x34, - 0x2c, 0xa7, 0x3d, 0xc0, 0x91, 0x5c, 0xc8, 0xde, 0xb2, 0xb1, 0x38, 0xef, - 0x8a, 0x0d, 0xdb, 0x44, 0x4e, 0x2e, 0x4f, 0x3d, 0x21, 0xbd, 0xe9, 0xdb, - 0xab, 0x2f, 0x10, 0x0d, 0x65, 0xfb, 0xd0, 0x59, 0xb2, 0xca, 0x83, 0xe4, - 0x32, 0x27, 0x1b, 0xbf, 0xa3, 0xa1, 0x68, 0x7a, 0xb2, 0xff, 0x41, 0x79, - 0xff, 0x0c, 0xcb, 0x2b, 0xc7, 0xc5, 0xb8, 0x5d, 0x50, 0xd9, 0x93, 0xed, - 0x0d, 0x69, 0x46, 0x4a, 0x38, 0x6e, 0xe1, 0xd3, 0x04, 0x3f, 0x46, 0x9a, - 0x65, 0x1b, 0xb0, 0xc2, 0x9a, 0x36, 0x4d, 0x46, 0x5e, 0xd8, 0x7a, 0xfa, - 0x30, 0x27, 0x2d, 0xfe, 0x33, 0x56, 0x59, 0x09, 0x4b, 0x53, 0xe4, 0x66, - 0x1d, 0x8e, 0xd3, 0x7c, 0x31, 0xb7, 0x21, 0x1d, 0x7f, 0x81, 0xe3, 0xef, - 0x1f, 0xe5, 0x97, 0xb3, 0x5b, 0xd6, 0x5f, 0x1e, 0x84, 0x99, 0x65, 0xff, - 0x8b, 0xf6, 0xbc, 0x8a, 0x3b, 0xc5, 0x97, 0x66, 0x2c, 0xbe, 0x07, 0x8c, - 0x45, 0x94, 0xc2, 0x3b, 0x0c, 0xd3, 0xc3, 0xce, 0x48, 0xcb, 0x3e, 0x10, - 0x56, 0xfd, 0x34, 0x4d, 0xe8, 0x59, 0x7f, 0xf8, 0xbb, 0xc1, 0x3a, 0x64, - 0x19, 0x67, 0x16, 0x5c, 0x24, 0x2c, 0xbc, 0x28, 0xa2, 0xa4, 0xbe, 0x97, - 0x70, 0x09, 0x19, 0x9a, 0x0b, 0xf6, 0x0c, 0xff, 0xe2, 0xee, 0xfe, 0x56, - 0x8f, 0xa4, 0x8d, 0x2f, 0x47, 0x24, 0xb2, 0xf6, 0x36, 0x7d, 0x65, 0x42, - 0x6d, 0xf8, 0x53, 0xa4, 0xa7, 0x85, 0x07, 0xe4, 0x24, 0x39, 0x7c, 0xd1, - 0xe1, 0x2c, 0xbb, 0xbc, 0x59, 0x7f, 0xf8, 0x79, 0x8c, 0x4e, 0xce, 0x9f, - 0x3c, 0x6b, 0x2f, 0xf7, 0x7d, 0x1d, 0xe7, 0x8d, 0x65, 0xcf, 0x25, 0x97, - 0xe9, 0xd9, 0x31, 0xec, 0xb2, 0xa7, 0x1f, 0xa3, 0x4c, 0xf8, 0x2d, 0x6e, - 0x2c, 0xbf, 0xdd, 0xfa, 0x5e, 0x82, 0xd9, 0x25, 0xff, 0xb3, 0xe9, 0x1e, - 0x11, 0x60, 0xd6, 0x5f, 0x34, 0x3f, 0x75, 0x65, 0xf6, 0x7a, 0x37, 0xac, - 0xad, 0x8f, 0x1f, 0x84, 0x95, 0x09, 0xf9, 0xec, 0x2f, 0xf4, 0x2f, 0xf4, - 0x62, 0x42, 0x3c, 0x35, 0xec, 0x20, 0xef, 0xf0, 0x3c, 0x63, 0x87, 0xd2, - 0xcb, 0xc7, 0xc3, 0x59, 0x63, 0x59, 0x7c, 0xe2, 0x38, 0xd6, 0x5a, 0x5e, - 0x3c, 0xd7, 0x1b, 0x08, 0x85, 0x0d, 0x16, 0x7f, 0x3f, 0xdf, 0xf1, 0x40, - 0xbc, 0x32, 0xfa, 0x4b, 0x2f, 0xff, 0xfd, 0xcf, 0xcf, 0x43, 0xc2, 0xf1, - 0x83, 0xc7, 0xd6, 0x20, 0xa4, 0xb2, 0xe8, 0x02, 0xca, 0x24, 0x5d, 0xf4, - 0xe7, 0x7b, 0x65, 0xe1, 0x23, 0x75, 0x65, 0xe6, 0x3c, 0x6b, 0x2b, 0x63, - 0x7a, 0x64, 0x17, 0xe2, 0x81, 0x70, 0x96, 0x5f, 0xf7, 0xbe, 0x86, 0x26, - 0x94, 0x6e, 0xac, 0xb7, 0x06, 0x7c, 0xb8, 0x4d, 0x5a, 0x45, 0x6f, 0x61, - 0x0d, 0x4b, 0x2f, 0xd2, 0xd1, 0xc3, 0x56, 0x5e, 0x13, 0xe1, 0x56, 0x56, - 0xc7, 0xa5, 0xf0, 0x5f, 0x09, 0xea, 0x15, 0xe3, 0xe4, 0x64, 0x47, 0x0d, - 0xf7, 0x8c, 0x6c, 0x2f, 0x57, 0xef, 0xa5, 0x9d, 0x35, 0x97, 0xfa, 0x5e, - 0x8f, 0xbb, 0x1e, 0x59, 0x7f, 0xfa, 0x5d, 0x0f, 0xb5, 0x02, 0xc8, 0xff, - 0xc5, 0x97, 0x3b, 0x56, 0x50, 0x11, 0x7d, 0xf1, 0x41, 0x1a, 0x6f, 0x4c, - 0xbf, 0xff, 0x75, 0xf5, 0x87, 0xff, 0x33, 0xc7, 0xaf, 0x3a, 0xcb, 0xd0, - 0x43, 0x59, 0x7e, 0xfb, 0x93, 0x67, 0x56, 0x56, 0x23, 0x63, 0xe3, 0xff, - 0x2a, 0x10, 0xdd, 0xfc, 0x7d, 0x27, 0xff, 0x8b, 0x2f, 0xd0, 0xde, 0xe7, - 0x96, 0x5f, 0x70, 0xe0, 0x0b, 0x2f, 0xfe, 0x9b, 0x35, 0x8e, 0xd8, 0xf1, - 0x8d, 0x65, 0x61, 0xf2, 0x74, 0x86, 0xfe, 0x0b, 0x73, 0xdf, 0x3a, 0xca, - 0x61, 0x30, 0x70, 0x16, 0x94, 0x22, 0xf8, 0x43, 0x7f, 0xf8, 0xc6, 0x4f, - 0xf1, 0x67, 0x70, 0xff, 0x59, 0x7d, 0xb6, 0xcf, 0xba, 0xb2, 0xf8, 0x03, - 0x0e, 0xcb, 0x2f, 0x4b, 0x81, 0x59, 0x7f, 0x17, 0x4f, 0xd2, 0x25, 0x97, - 0xff, 0xff, 0xef, 0x46, 0x6d, 0x23, 0xef, 0x23, 0x58, 0xcc, 0xff, 0x88, - 0xdf, 0x10, 0x40, 0x59, 0x6e, 0xe2, 0x3c, 0x7c, 0x48, 0xe3, 0xbc, 0x2c, - 0xbc, 0x28, 0xa2, 0xac, 0xbf, 0xfe, 0x6e, 0x7d, 0xd2, 0xcd, 0x9b, 0x8d, - 0xc2, 0x48, 0xcc, 0xd0, 0x54, 0x23, 0x08, 0xd8, 0x6f, 0xb6, 0xcf, 0x3a, - 0xcb, 0xf7, 0x9f, 0x59, 0xa5, 0x97, 0xff, 0xa3, 0x62, 0x0e, 0xc1, 0xe7, - 0x79, 0x82, 0xac, 0xb8, 0x2e, 0xb2, 0x80, 0x88, 0xaf, 0x13, 0x92, 0x6d, - 0xee, 0xc0, 0xd6, 0x5f, 0x4b, 0xa1, 0x1a, 0xcb, 0xf4, 0x1c, 0x9f, 0x8b, - 0x2a, 0x0f, 0x97, 0xe1, 0xcd, 0x11, 0xdf, 0xd9, 0xdf, 0x06, 0x3e, 0x59, - 0x7d, 0xd3, 0xd6, 0x2c, 0xbe, 0xfb, 0x86, 0xc0, 0xcf, 0x3f, 0x0b, 0xab, - 0x64, 0xd3, 0x0a, 0x12, 0x9d, 0x7e, 0xbf, 0xd9, 0xc2, 0xcd, 0xfe, 0x35, - 0x97, 0xfe, 0x6c, 0x7c, 0x59, 0xff, 0x23, 0x75, 0x65, 0x68, 0xfd, 0x5a, - 0x67, 0x7f, 0x86, 0x59, 0xbc, 0xf4, 0xeb, 0x2a, 0x7b, 0x55, 0xf1, 0x11, - 0xfc, 0x1c, 0x2a, 0xc2, 0x45, 0x7e, 0xdb, 0x74, 0xf3, 0xe5, 0x97, 0xe3, - 0xe4, 0x6c, 0xd5, 0xd9, 0xfa, 0xbf, 0x43, 0xeb, 0xf0, 0xae, 0xcf, 0xd5, - 0xcf, 0x25, 0xd9, 0xfa, 0xbe, 0x0c, 0xb3, 0x8b, 0xb3, 0xf5, 0x43, 0x3d, - 0x22, 0x23, 0xbf, 0x46, 0x73, 0x09, 0x76, 0x7e, 0xa9, 0x76, 0x7e, 0xae, - 0x7e, 0xae, 0xcf, 0xd3, 0x4b, 0x8b, 0x48, 0x8f, 0xf0, 0x29, 0x57, 0xd9, - 0x3e, 0x7f, 0xae, 0xcf, 0xd5, 0x2e, 0xcf, 0xd5, 0xdf, 0xc2, 0xec, 0xfd, - 0x5f, 0xf6, 0x7e, 0xfa, 0xcd, 0xf8, 0x35, 0xd9, 0xfa, 0xbf, 0xb3, 0xc7, - 0xc0, 0xec, 0xbb, 0x3f, 0x55, 0xfa, 0x29, 0x88, 0x93, 0x88, 0xf7, 0xda, - 0xda, 0x3a, 0xbb, 0x3f, 0x54, 0xbb, 0x3f, 0x58, 0x6c, 0x2e, 0x14, 0x55, - 0xd9, 0xfa, 0xa9, 0x2b, 0x1d, 0x19, 0xae, 0x42, 0x1f, 0xe8, 0x4e, 0xe8, - 0x9d, 0xa6, 0x5c, 0x85, 0xf7, 0x58, 0x05, 0x27, 0xba, 0x18, 0x4d, 0x9f, - 0xa3, 0x34, 0x48, 0x5f, 0xf6, 0xd1, 0xbf, 0x0f, 0x59, 0xb2, 0xcb, 0xff, - 0x9f, 0xc0, 0xf1, 0x93, 0xe9, 0xe4, 0xb2, 0xa4, 0x8b, 0x6d, 0x1c, 0xf4, - 0xee, 0xfe, 0x8c, 0x12, 0x25, 0x25, 0x97, 0xfb, 0x99, 0x29, 0x47, 0x7e, - 0x59, 0x58, 0x89, 0x12, 0x30, 0xe1, 0x6d, 0xff, 0xb0, 0x03, 0xcd, 0x0a, - 0xfe, 0x99, 0x65, 0x2c, 0xbf, 0xf1, 0x64, 0xd1, 0xb7, 0xef, 0xf7, 0x16, - 0x54, 0x1e, 0x67, 0x02, 0xee, 0x96, 0xc9, 0x2f, 0xa6, 0x77, 0xd2, 0xca, - 0xd9, 0x31, 0x5f, 0x8b, 0xbd, 0x08, 0xc2, 0x21, 0xdc, 0x18, 0xb8, 0xf6, - 0x59, 0x5a, 0x5e, 0xa0, 0x79, 0xe3, 0x5e, 0xaa, 0x5f, 0xdc, 0x28, 0xf0, - 0x74, 0xb2, 0xfe, 0xe1, 0x67, 0x73, 0xf5, 0x95, 0xf1, 0xed, 0x34, 0xb6, - 0xff, 0xa6, 0x2c, 0xdf, 0xef, 0x9f, 0x75, 0x65, 0xfd, 0xdc, 0xf4, 0x6b, - 0xf5, 0x97, 0xfe, 0x6c, 0x13, 0x13, 0xb4, 0x79, 0xbd, 0x65, 0xff, 0x68, - 0xdb, 0xc1, 0x23, 0x26, 0x59, 0x7f, 0xc0, 0x8f, 0xc6, 0x17, 0xd4, 0x96, - 0x5f, 0xf9, 0xdf, 0x6c, 0x6b, 0x97, 0xd2, 0x59, 0x79, 0xd8, 0xe6, 0x1f, - 0xc4, 0xc7, 0x57, 0xff, 0x67, 0xa7, 0x77, 0xd8, 0xd1, 0x23, 0xf5, 0x96, - 0x16, 0x72, 0x73, 0xd8, 0x5d, 0xa4, 0x22, 0x85, 0x97, 0x4d, 0x2a, 0x15, - 0x2b, 0xe1, 0x1b, 0xc7, 0xbb, 0x7c, 0x6c, 0x18, 0xab, 0x2f, 0xbb, 0xec, - 0xd9, 0x65, 0x34, 0xf1, 0x88, 0x8e, 0xe1, 0x8a, 0xb2, 0xff, 0x0c, 0x4d, - 0xee, 0xe4, 0x05, 0x95, 0x07, 0xdd, 0x84, 0x26, 0x31, 0x79, 0xbf, 0xe9, - 0x65, 0xe1, 0xf4, 0x96, 0x5f, 0xfe, 0xfb, 0xbe, 0x31, 0x07, 0x98, 0x5c, - 0x35, 0x97, 0xff, 0xe9, 0x6a, 0x37, 0xbc, 0xd0, 0x3f, 0x43, 0x5e, 0x65, - 0x97, 0xfb, 0x71, 0xf8, 0x7c, 0x9b, 0x16, 0x54, 0xe4, 0xc4, 0x99, 0x8f, - 0x60, 0xe7, 0xc9, 0x5a, 0x58, 0xbf, 0xe8, 0xfa, 0x33, 0x9c, 0x6f, 0xcb, - 0x2f, 0x19, 0x49, 0x65, 0x43, 0x77, 0x11, 0xb2, 0xd4, 0xa7, 0x76, 0xf2, - 0x3e, 0xf3, 0x8d, 0x0f, 0x75, 0x0e, 0x64, 0x8d, 0x47, 0xb5, 0xe9, 0x63, - 0x2f, 0x3d, 0xda, 0x52, 0xba, 0xf9, 0x0e, 0x90, 0xc6, 0x7c, 0x2a, 0x7e, - 0xe1, 0xd5, 0xf0, 0x3f, 0xdb, 0x16, 0x52, 0xcb, 0x3e, 0x8d, 0x7b, 0x49, - 0x2f, 0xec, 0x6c, 0xce, 0xf2, 0x59, 0x7f, 0xff, 0x3f, 0xa2, 0x4c, 0xf3, - 0xf8, 0x97, 0x07, 0xe8, 0xd2, 0xcb, 0x18, 0xd1, 0x15, 0xe2, 0xdb, 0xff, - 0x31, 0x1f, 0x14, 0x7b, 0xc1, 0x02, 0xcb, 0xff, 0xb5, 0x18, 0x59, 0x23, - 0xf6, 0x6f, 0x59, 0x7f, 0xfc, 0x4e, 0xc7, 0x33, 0x7c, 0x7d, 0xde, 0x05, - 0xab, 0x28, 0x68, 0x96, 0x24, 0x3b, 0xfc, 0x51, 0xdf, 0xa6, 0x76, 0xac, - 0xbf, 0x74, 0x3d, 0xc1, 0xac, 0xb6, 0x2c, 0xa7, 0x37, 0x1b, 0xca, 0x29, - 0xa8, 0x8e, 0x26, 0xcb, 0xff, 0xbd, 0x1b, 0x73, 0x35, 0xfb, 0xe7, 0xeb, - 0x2f, 0xe2, 0x76, 0x3c, 0xf2, 0x59, 0x7f, 0xe6, 0x96, 0x74, 0xa0, 0x07, - 0x25, 0x96, 0xd2, 0xca, 0x33, 0xcd, 0x73, 0xcb, 0xf0, 0x31, 0xb1, 0xc5, - 0x97, 0x85, 0x14, 0x54, 0x97, 0x84, 0x8f, 0xd2, 0x33, 0x34, 0x17, 0xfc, - 0xf2, 0x13, 0x59, 0xbd, 0xf4, 0xb2, 0xda, 0x59, 0x7f, 0xe2, 0x2c, 0xda, - 0x69, 0x46, 0xb6, 0x59, 0x7b, 0xd9, 0x28, 0x3d, 0x11, 0x04, 0x68, 0x91, - 0x7f, 0xd8, 0x46, 0x5f, 0xe2, 0x91, 0xb7, 0x3e, 0xea, 0xcb, 0xef, 0x80, - 0x64, 0xb2, 0x9c, 0xf5, 0x7a, 0x67, 0x4b, 0x2e, 0xfe, 0x24, 0x6b, 0x19, - 0x64, 0x37, 0xe9, 0xd0, 0x0c, 0xd2, 0xcb, 0xff, 0x4e, 0x82, 0x0b, 0x60, - 0x58, 0xe2, 0xcb, 0x60, 0xcf, 0xa4, 0x8a, 0x6f, 0xfb, 0xae, 0x59, 0xcd, - 0x47, 0x16, 0x5f, 0x4a, 0x3f, 0xf9, 0x65, 0xfd, 0xfc, 0x16, 0x7d, 0xd5, - 0x97, 0x3f, 0xf3, 0x8f, 0x48, 0x42, 0x4b, 0xff, 0xc2, 0x14, 0xcc, 0x38, - 0xfd, 0x80, 0xcd, 0x2c, 0xa3, 0x4f, 0x1b, 0xd0, 0x9a, 0x72, 0x62, 0x84, - 0x4f, 0x0c, 0x6f, 0x6f, 0x8d, 0x2c, 0xbc, 0x1c, 0xf2, 0xca, 0xd9, 0x7e, - 0x42, 0x50, 0xb0, 0x19, 0x46, 0x43, 0x58, 0xe1, 0x61, 0x31, 0x13, 0x51, - 0xbc, 0xf4, 0xe4, 0x1f, 0xa3, 0x94, 0x3b, 0xfb, 0x29, 0xbb, 0x7a, 0x90, - 0xa3, 0xd7, 0x1e, 0xcb, 0x2f, 0xf1, 0x00, 0x67, 0xbe, 0x06, 0xb2, 0x86, - 0x79, 0x61, 0x17, 0xbf, 0xfe, 0xc3, 0xd7, 0xa0, 0xfb, 0xc3, 0x2f, 0xa4, - 0xb2, 0xdf, 0xac, 0xbf, 0xfa, 0x6f, 0x46, 0xc2, 0x77, 0xc1, 0x79, 0x2c, - 0xbf, 0xd1, 0xbb, 0x3b, 0xcf, 0x9a, 0x59, 0x7b, 0x35, 0x0b, 0x2f, 0xbd, - 0xec, 0xf9, 0x65, 0xd8, 0xd9, 0xf3, 0x7c, 0x20, 0xdd, 0x62, 0x29, 0x49, - 0xd6, 0xd3, 0x2c, 0xb3, 0x56, 0x59, 0xa6, 0x68, 0xdc, 0x4a, 0xfd, 0x9f, - 0xf2, 0x24, 0xb2, 0xfc, 0x6d, 0x18, 0xf1, 0x65, 0xbf, 0x23, 0xcf, 0x9f, - 0x28, 0xbf, 0xee, 0xfb, 0x39, 0x3b, 0xa7, 0xb2, 0xcb, 0xfb, 0x26, 0xcd, - 0x0c, 0xd6, 0x54, 0x22, 0x50, 0xca, 0xc8, 0xf2, 0xff, 0x88, 0xc2, 0xcb, - 0xe4, 0xfc, 0x75, 0x65, 0xfe, 0xff, 0x47, 0x9e, 0x0f, 0x16, 0x5e, 0xcf, - 0x9a, 0xb2, 0xfe, 0xcf, 0xf7, 0x3a, 0x6d, 0x59, 0x50, 0x88, 0x22, 0x34, - 0xe8, 0xed, 0xe7, 0xd7, 0xeb, 0x2b, 0x65, 0x7a, 0x52, 0x4e, 0x18, 0x94, - 0xd0, 0xed, 0x6a, 0x27, 0xa3, 0x08, 0x22, 0xde, 0xc3, 0x06, 0x7c, 0xba, - 0xfb, 0x3a, 0x26, 0xcb, 0x2f, 0x0a, 0x28, 0xa9, 0x88, 0x40, 0xbe, 0x03, - 0xb8, 0x13, 0x10, 0x80, 0xcc, 0xd7, 0x5f, 0x3e, 0xb0, 0x55, 0x95, 0xa3, - 0xe3, 0xde, 0x83, 0x78, 0x51, 0x45, 0x4c, 0x41, 0xe5, 0x26, 0x20, 0xf1, - 0x99, 0xae, 0xbf, 0xba, 0xed, 0x6c, 0x35, 0x65, 0xf9, 0xfa, 0xe5, 0xfa, - 0xcb, 0xfb, 0x3b, 0xe0, 0xbc, 0x96, 0x5e, 0x14, 0x51, 0x56, 0x5e, 0xe4, - 0x30, 0x91, 0x99, 0xa0, 0xac, 0x4d, 0x34, 0x0a, 0x5f, 0x15, 0xf8, 0xb4, - 0x89, 0xfa, 0x9b, 0x5b, 0xaa, 0x96, 0x5b, 0x28, 0x0a, 0xf0, 0xb0, 0x4b, - 0x2f, 0xfe, 0xf4, 0x48, 0xfb, 0x9e, 0x04, 0x35, 0x65, 0x42, 0x23, 0x9c, - 0xbf, 0x78, 0xe5, 0xee, 0xc7, 0x16, 0x5f, 0xfb, 0xc6, 0x38, 0x2e, 0xe7, - 0xdd, 0x59, 0x7f, 0x8a, 0x1b, 0xce, 0x04, 0x96, 0x50, 0x0f, 0xc3, 0x87, - 0xd7, 0xff, 0x78, 0xf5, 0xe7, 0xce, 0x1b, 0xec, 0xb2, 0xff, 0xd1, 0xdc, - 0xd6, 0x73, 0x3e, 0xea, 0xca, 0xc4, 0x40, 0x92, 0x1d, 0xff, 0xb6, 0x6e, - 0x37, 0x0b, 0xb8, 0x05, 0x97, 0xd1, 0xd8, 0x6a, 0xca, 0x9e, 0xd3, 0xaf, - 0xfa, 0x11, 0x8d, 0x85, 0x19, 0x10, 0xf4, 0xfa, 0xff, 0xbd, 0x04, 0x0f, - 0xb8, 0xfb, 0xab, 0x2f, 0x88, 0x3b, 0x12, 0xcb, 0xc7, 0xf4, 0x96, 0x54, - 0x8d, 0xff, 0xe4, 0x57, 0xf0, 0xf9, 0x8d, 0x8d, 0xd5, 0x97, 0x82, 0xe2, - 0x2c, 0xbb, 0x6f, 0x96, 0x59, 0xc6, 0x6d, 0xbf, 0x1d, 0xa9, 0x26, 0x55, - 0xf3, 0xdb, 0x91, 0x0a, 0xcd, 0x7e, 0x2e, 0xfb, 0x24, 0xb2, 0xf1, 0xc3, - 0x0b, 0x29, 0xcf, 0x0c, 0x89, 0xef, 0xfb, 0x0a, 0x3d, 0xe8, 0x14, 0xd6, - 0x5e, 0x12, 0x3f, 0x59, 0x5b, 0x1f, 0xab, 0x04, 0x0d, 0x37, 0xbf, 0x02, - 0x3d, 0x0d, 0x49, 0x7e, 0x27, 0x22, 0xc4, 0x97, 0x60, 0x12, 0x5c, 0x28, - 0xa9, 0x2b, 0x0f, 0xeb, 0x84, 0xfd, 0x24, 0x14, 0x5a, 0xff, 0x10, 0x91, - 0xff, 0xb3, 0x71, 0x23, 0x33, 0x79, 0x7f, 0xfb, 0x61, 0xe9, 0xc0, 0x59, - 0xbf, 0x47, 0xc5, 0x95, 0x0a, 0xfd, 0xf2, 0x38, 0x43, 0x87, 0xbb, 0xc3, - 0x9c, 0x29, 0x37, 0xff, 0x47, 0xfc, 0xcc, 0x1b, 0x93, 0xb0, 0xb2, 0xff, - 0x8b, 0xff, 0x3f, 0x7a, 0x7f, 0xac, 0xbf, 0xff, 0x78, 0xf7, 0x99, 0x0f, - 0x91, 0xa3, 0xcf, 0xb8, 0xb2, 0xfe, 0x28, 0xcd, 0x3f, 0xeb, 0x2f, 0xfd, - 0x1a, 0xf4, 0x1f, 0xa0, 0x8d, 0x65, 0xd2, 0xe6, 0x23, 0xdc, 0x07, 0x5d, - 0x56, 0x14, 0xb2, 0xff, 0x41, 0x63, 0x4f, 0xe9, 0x2c, 0xbf, 0xfe, 0xe1, - 0x67, 0xdf, 0xbf, 0x1f, 0x47, 0xf7, 0xeb, 0x2b, 0xe4, 0x66, 0xf5, 0x24, - 0x53, 0x2a, 0xf2, 0xa3, 0x97, 0x94, 0x0f, 0x7b, 0x78, 0x8d, 0x59, 0x7d, - 0xed, 0xb0, 0x55, 0x97, 0xc3, 0x09, 0x49, 0x65, 0xb8, 0xe7, 0x8c, 0x21, - 0x25, 0xfc, 0x60, 0x1e, 0x3f, 0xeb, 0x2f, 0xff, 0xdd, 0xe7, 0xd3, 0x87, - 0x83, 0x87, 0xd6, 0x17, 0xeb, 0x2f, 0xff, 0xfd, 0x3b, 0xb2, 0xcf, 0xe7, - 0xf2, 0x70, 0xf0, 0x70, 0xfa, 0xc2, 0xfd, 0x08, 0x5f, 0xfd, 0x9d, 0x9c, - 0x0f, 0x1f, 0xbc, 0x7f, 0xaa, 0x10, 0xb5, 0x49, 0x19, 0x7c, 0x77, 0xbd, - 0x1b, 0x33, 0xe2, 0x68, 0xdd, 0x8c, 0x8e, 0xfc, 0xde, 0x0a, 0xff, 0x2c, - 0xb7, 0x06, 0x7d, 0x02, 0x1f, 0x5f, 0xd9, 0x34, 0x8f, 0x5c, 0x59, 0x7e, - 0xf8, 0x4e, 0x46, 0x2c, 0xbe, 0xf0, 0x0f, 0x8b, 0x2a, 0x0f, 0x2f, 0xa5, - 0x37, 0xff, 0xff, 0x3e, 0xc2, 0x0f, 0xd1, 0x2e, 0xe6, 0x0b, 0xc2, 0xce, - 0xf4, 0xf6, 0x59, 0x7f, 0x3e, 0xb4, 0xff, 0xc2, 0xca, 0x86, 0xd3, 0xe0, - 0x71, 0x95, 0x64, 0xbf, 0x43, 0x96, 0xf7, 0xa9, 0xdd, 0x67, 0x95, 0x23, - 0xf9, 0x5b, 0x2d, 0x98, 0x8a, 0x39, 0x1e, 0xdf, 0x4a, 0x42, 0xf2, 0x29, - 0x08, 0x8e, 0x97, 0x85, 0x14, 0x54, 0x97, 0x9c, 0x86, 0x91, 0x99, 0xa0, - 0xbe, 0xcd, 0x67, 0x56, 0x57, 0xe7, 0x9d, 0xc2, 0xdb, 0xef, 0x1b, 0xc9, - 0x65, 0xff, 0xe1, 0x08, 0xb3, 0x68, 0xfa, 0x52, 0x86, 0xac, 0xbc, 0x51, - 0x25, 0x97, 0xda, 0xd1, 0xb5, 0x65, 0xb8, 0x33, 0x7a, 0x63, 0x75, 0x24, - 0x57, 0x76, 0x11, 0x17, 0x9b, 0xb0, 0xd6, 0x51, 0x1e, 0x37, 0x4a, 0x2f, - 0xda, 0xc0, 0x47, 0x96, 0x5e, 0x9c, 0xc4, 0xfa, 0xcb, 0xdd, 0x71, 0xac, - 0xad, 0x1b, 0xfe, 0x11, 0xdf, 0xe6, 0x3e, 0xee, 0xa3, 0x3e, 0x59, 0x7f, - 0x02, 0x3f, 0x3d, 0x30, 0x92, 0xfe, 0x13, 0x35, 0x99, 0x32, 0xcb, 0xf3, - 0xfa, 0x70, 0xe1, 0x65, 0x49, 0x54, 0xe0, 0xc8, 0xf2, 0x31, 0x56, 0x08, - 0x4d, 0x99, 0xc8, 0x48, 0xdb, 0x85, 0xfd, 0x2e, 0xbf, 0x3e, 0xb5, 0x9f, - 0x2c, 0xbf, 0xfd, 0xdf, 0x1b, 0xff, 0x9a, 0x1c, 0x14, 0x96, 0x5f, 0xfe, - 0xfa, 0x77, 0xdf, 0xc1, 0x01, 0xf6, 0x27, 0x59, 0x50, 0x8b, 0xfc, 0x28, - 0x24, 0x9b, 0xf4, 0x70, 0x42, 0x92, 0xcb, 0xe9, 0xc0, 0x39, 0x2c, 0xbf, - 0xf0, 0x33, 0x58, 0x7c, 0xf4, 0x6f, 0x59, 0x7e, 0x8d, 0xcd, 0xb0, 0x55, - 0x97, 0xff, 0xff, 0x39, 0xf4, 0xfc, 0x03, 0x9d, 0x23, 0xf3, 0x97, 0x65, - 0x9a, 0xc5, 0x97, 0x67, 0x96, 0x5d, 0x9b, 0x8b, 0x2a, 0x63, 0x5f, 0xe1, - 0x6a, 0xf2, 0x30, 0x5e, 0x13, 0xf7, 0xfc, 0x51, 0xf7, 0x23, 0xb0, 0x35, - 0x97, 0xb8, 0x27, 0x27, 0x1e, 0xfe, 0x13, 0xd0, 0xd3, 0xe5, 0xf8, 0x93, - 0xc7, 0xfd, 0x8d, 0x32, 0xff, 0xb5, 0x12, 0x3e, 0x99, 0x49, 0x65, 0xff, - 0xff, 0xff, 0x47, 0x23, 0xbb, 0x60, 0xba, 0xcf, 0x38, 0x9c, 0xc6, 0x1c, - 0xbf, 0x82, 0x89, 0xbd, 0x0b, 0x2f, 0xdc, 0xf3, 0x82, 0x16, 0x5f, 0x9f, - 0x61, 0x5e, 0x4b, 0x2a, 0x13, 0x1c, 0x23, 0x71, 0x61, 0x2a, 0x21, 0x3d, - 0xff, 0x73, 0xd0, 0xfa, 0xd6, 0x7c, 0xb2, 0xff, 0xff, 0xcc, 0x7d, 0x2e, - 0xe1, 0x77, 0x93, 0xb9, 0xcc, 0xd6, 0x13, 0xc9, 0x65, 0x62, 0x2a, 0x0c, - 0xe6, 0xfd, 0x1f, 0xf7, 0x36, 0x59, 0x7f, 0xf3, 0x31, 0x94, 0x04, 0x18, - 0xc1, 0xe9, 0x65, 0xed, 0x3f, 0x16, 0x5d, 0x82, 0xac, 0xa8, 0x3f, 0x91, - 0xa3, 0x70, 0x72, 0xf7, 0x7d, 0x0b, 0x2b, 0x0f, 0x29, 0xcb, 0xaf, 0xde, - 0x82, 0x7f, 0x2c, 0xbf, 0xb6, 0xf3, 0xf7, 0x50, 0xb2, 0xff, 0x0f, 0xd1, - 0x33, 0xbf, 0xcb, 0x2f, 0x7b, 0xfd, 0xeb, 0x2b, 0x47, 0xa9, 0xb8, 0x69, - 0x71, 0xec, 0xb2, 0xf7, 0xcf, 0xba, 0xb2, 0xb4, 0x6d, 0xfc, 0x2f, 0x52, - 0x4d, 0x14, 0x64, 0x1a, 0x26, 0x78, 0x41, 0x12, 0xe5, 0xff, 0xd9, 0xaf, - 0xda, 0x7c, 0x13, 0x91, 0x8b, 0x2f, 0x47, 0xdb, 0xab, 0x2f, 0xb8, 0x46, - 0xc2, 0xcb, 0x0f, 0x47, 0x85, 0xd2, 0x0b, 0xff, 0x98, 0x16, 0x35, 0xe8, - 0x37, 0xef, 0x16, 0x5f, 0x34, 0xa2, 0x65, 0x97, 0xff, 0xde, 0x39, 0x1e, - 0x9f, 0xfe, 0x94, 0x37, 0x8b, 0x2f, 0xbb, 0x1a, 0xfe, 0x0f, 0xc4, 0x04, - 0x57, 0x6e, 0xf1, 0x65, 0xff, 0x70, 0x1e, 0x71, 0xb2, 0x19, 0x33, 0xda, - 0xca, 0x61, 0x13, 0x4e, 0x73, 0xd1, 0xaa, 0x92, 0xa2, 0xfc, 0x84, 0x39, - 0x94, 0x3c, 0x6a, 0x17, 0xa7, 0xa2, 0xfd, 0x65, 0xfa, 0x04, 0x27, 0x92, - 0xcb, 0xff, 0xda, 0x72, 0xee, 0x7f, 0x3f, 0x03, 0x1c, 0x2c, 0xbf, 0xa5, - 0xa8, 0x93, 0xe9, 0x65, 0xd8, 0xd5, 0x97, 0xff, 0x61, 0x7f, 0x38, 0x4d, - 0x7e, 0xd3, 0xe2, 0xcb, 0xf8, 0xfc, 0x79, 0xf7, 0x56, 0x50, 0xd1, 0x18, - 0xd1, 0x6e, 0xa4, 0xd2, 0xcb, 0xef, 0xfb, 0x9f, 0xac, 0xbf, 0x47, 0x38, - 0x7b, 0xd6, 0x5f, 0x34, 0x8a, 0x16, 0x5f, 0xf1, 0x8f, 0xd1, 0x2c, 0xfb, - 0xab, 0x2f, 0xf8, 0x11, 0xbe, 0x38, 0x7f, 0xfc, 0xb2, 0xe7, 0x62, 0x11, - 0x2a, 0x32, 0x0c, 0x39, 0xa1, 0xaa, 0x83, 0xc2, 0x7f, 0x93, 0x0e, 0x17, - 0x33, 0x18, 0x68, 0x2f, 0xc4, 0x85, 0x0b, 0xeb, 0xd3, 0xff, 0x42, 0xcb, - 0xfe, 0x07, 0x8a, 0x3e, 0x38, 0xf2, 0xca, 0x86, 0x72, 0xbc, 0xa3, 0x42, - 0x19, 0x6e, 0x4a, 0x0d, 0x38, 0xd8, 0x75, 0x0e, 0xb6, 0x90, 0xbc, 0xa3, - 0x12, 0x94, 0xfb, 0xc4, 0x70, 0xca, 0xa5, 0x9f, 0x7c, 0x10, 0x82, 0xff, - 0xce, 0x63, 0x0f, 0x79, 0xb6, 0x0a, 0xb2, 0xe9, 0xe8, 0x96, 0x5f, 0xb9, - 0x8c, 0x47, 0x16, 0x5f, 0xd1, 0xf3, 0x5c, 0xbf, 0x59, 0x7f, 0x6e, 0xf0, - 0xcb, 0xe9, 0x2c, 0xbf, 0xf3, 0xea, 0x7c, 0xfd, 0x8f, 0xf7, 0xeb, 0x2f, - 0xef, 0xc4, 0x2f, 0x67, 0xcb, 0x2f, 0xff, 0xc7, 0xd8, 0x6e, 0x7d, 0xd8, - 0x68, 0x9a, 0x7f, 0xd6, 0x5f, 0x19, 0x38, 0xd6, 0x5f, 0xf7, 0x23, 0x5d, - 0x86, 0x63, 0x35, 0x95, 0x24, 0x58, 0x8d, 0x5f, 0x84, 0x17, 0xff, 0xf6, - 0x7a, 0x76, 0x34, 0xfd, 0x13, 0xb9, 0xcc, 0x2f, 0xd6, 0x5f, 0xfc, 0x7a, - 0x89, 0x7a, 0x26, 0x20, 0xb0, 0xb2, 0xbc, 0x8a, 0x3e, 0x2f, 0x5f, 0xfb, - 0x68, 0x98, 0xa3, 0x99, 0x12, 0x59, 0x70, 0x27, 0xd6, 0x5f, 0xcc, 0x76, - 0x3d, 0x1c, 0x59, 0x7f, 0xdc, 0x2c, 0xef, 0x23, 0x5b, 0x2c, 0xbf, 0xbc, - 0x7f, 0x71, 0xfe, 0x59, 0x7f, 0xb0, 0x79, 0xa9, 0x46, 0x96, 0x5e, 0xf1, - 0xf5, 0x65, 0x42, 0x67, 0x92, 0x3e, 0x31, 0xa9, 0x8b, 0xbf, 0x39, 0xe1, - 0x78, 0x86, 0x57, 0xe7, 0xf6, 0x7d, 0xd5, 0x97, 0xee, 0x83, 0xd0, 0x15, - 0x97, 0xfe, 0x72, 0xd8, 0x5c, 0x21, 0xfa, 0x16, 0x5c, 0x7b, 0x2c, 0xac, - 0x3d, 0x52, 0x3e, 0xbf, 0xc1, 0xfa, 0x5c, 0x12, 0x37, 0x56, 0x5e, 0x04, - 0x6e, 0xac, 0xbf, 0xd3, 0x79, 0xf5, 0xa3, 0x1a, 0xca, 0xc3, 0xd3, 0x71, - 0xfb, 0xfc, 0xff, 0x09, 0xa3, 0x6e, 0x2c, 0xbf, 0x9c, 0xb6, 0x6b, 0xf5, - 0x65, 0x11, 0xf0, 0xf0, 0xd2, 0xf8, 0xfc, 0xed, 0x59, 0x7f, 0xc4, 0x59, - 0xb7, 0x7b, 0x0d, 0x59, 0x52, 0x54, 0x99, 0x85, 0x13, 0x3e, 0xe8, 0x80, - 0xa1, 0x19, 0xc8, 0x40, 0xf4, 0x84, 0x42, 0x1b, 0xf6, 0xb3, 0x86, 0x2a, - 0xcb, 0xe6, 0xc6, 0xb8, 0xb2, 0xff, 0xf4, 0x0f, 0xc1, 0x60, 0x48, 0x1f, - 0x83, 0xc5, 0x97, 0x46, 0xe8, 0xcf, 0xbc, 0x42, 0x2b, 0xd1, 0x3c, 0x5d, - 0x65, 0xfc, 0x24, 0x04, 0x01, 0x6a, 0xcb, 0x8c, 0x96, 0x5f, 0x4a, 0x08, - 0x0b, 0x28, 0x66, 0xdb, 0x05, 0x6d, 0x32, 0xcb, 0xe6, 0x4b, 0xc7, 0xcb, - 0x2d, 0x04, 0x6e, 0x3a, 0x25, 0x53, 0x8f, 0xf4, 0xd6, 0x2f, 0xa3, 0xfc, - 0x25, 0x95, 0x26, 0x48, 0xd0, 0xca, 0x30, 0xb8, 0x06, 0x3f, 0x21, 0x1c, - 0x38, 0x66, 0x86, 0x9e, 0xa3, 0x5f, 0x6c, 0xab, 0x27, 0x7d, 0xfe, 0x12, - 0xfc, 0x31, 0x09, 0x08, 0xb0, 0xe2, 0x9f, 0x23, 0xbe, 0x6b, 0x29, 0x3c, - 0x67, 0x95, 0x97, 0x77, 0x8b, 0x28, 0xcf, 0x2a, 0x63, 0x3b, 0xe1, 0x20, - 0x5e, 0x2c, 0xbb, 0xfe, 0xac, 0xbb, 0xff, 0x2c, 0xbe, 0xd6, 0xb3, 0x8b, - 0x2e, 0xc9, 0x96, 0x5a, 0x53, 0x91, 0x1b, 0xb1, 0x23, 0x46, 0x1c, 0x60, - 0x42, 0x2b, 0xf1, 0xf5, 0xcb, 0x16, 0x5f, 0xb4, 0x3c, 0xc2, 0x59, 0x7c, - 0xc6, 0x9c, 0x55, 0x97, 0xfe, 0x3c, 0xf4, 0x6f, 0xe7, 0xa3, 0xe5, 0x95, - 0x87, 0xc9, 0xba, 0x49, 0x7f, 0x7d, 0xa0, 0xfd, 0xd9, 0x2c, 0xba, 0x36, - 0x59, 0x4e, 0x8f, 0x6e, 0x42, 0x28, 0x24, 0x82, 0x18, 0xdf, 0x85, 0xef, - 0x73, 0x65, 0x97, 0xf3, 0xc7, 0xf9, 0xf4, 0x96, 0x52, 0xcb, 0xfc, 0x5a, - 0xce, 0x61, 0xf9, 0x65, 0x32, 0x4d, 0xe6, 0x05, 0xdf, 0xff, 0x4b, 0xa5, - 0x8f, 0xd2, 0xce, 0xf7, 0x05, 0x59, 0x7f, 0xb5, 0xa3, 0xef, 0xb2, 0x4b, - 0x2f, 0x49, 0xf7, 0x16, 0x5f, 0xff, 0x60, 0xcf, 0xb8, 0xdf, 0x44, 0x01, - 0xae, 0xb2, 0xec, 0xde, 0xb2, 0xff, 0x81, 0xec, 0x1b, 0x4f, 0x58, 0xb2, - 0xa1, 0x13, 0xbb, 0x26, 0xe0, 0xc5, 0xfd, 0x11, 0xaf, 0x46, 0xf5, 0x97, - 0xef, 0xcc, 0xa6, 0xdd, 0x59, 0x7f, 0x46, 0xfc, 0xf7, 0xa1, 0x65, 0xf7, - 0x79, 0x93, 0x2c, 0xf1, 0xae, 0xbf, 0xbc, 0x33, 0xdf, 0x03, 0x59, 0x58, - 0x7c, 0x4e, 0x67, 0x7d, 0xa3, 0x7d, 0x96, 0x5e, 0x3c, 0xfd, 0x65, 0x61, - 0xbe, 0xe1, 0x15, 0xfe, 0x30, 0xeb, 0xd9, 0xbf, 0x8b, 0x2f, 0xff, 0xf6, - 0x74, 0xfe, 0x91, 0x44, 0xee, 0x9e, 0x6e, 0x0f, 0xd8, 0xb2, 0xfb, 0x3a, - 0x7c, 0x59, 0x7f, 0x4f, 0x53, 0x14, 0xf3, 0xb0, 0x56, 0x56, 0xea, 0x3d, - 0x26, 0x35, 0xe3, 0x27, 0x48, 0x6f, 0xfc, 0x17, 0x6f, 0x0c, 0x9f, 0x4c, - 0x2c, 0xa9, 0x2f, 0x2e, 0x0e, 0x31, 0xbc, 0x42, 0x60, 0xa8, 0x0d, 0x5f, - 0x12, 0x1a, 0x74, 0xc6, 0x7a, 0x85, 0xe7, 0x8b, 0xff, 0x2e, 0x28, 0x5e, - 0x71, 0x7b, 0xb1, 0x8a, 0x0a, 0x83, 0x7d, 0xde, 0x9c, 0x96, 0x5f, 0xd8, - 0x29, 0x6f, 0xd4, 0x96, 0x5f, 0xff, 0xba, 0x7c, 0xdb, 0x05, 0xe1, 0xec, - 0x4f, 0xf7, 0x56, 0x5f, 0xf4, 0xb3, 0xb8, 0x33, 0x2f, 0xd6, 0x5e, 0x17, - 0x3c, 0xb2, 0xfe, 0xcd, 0x68, 0x2c, 0x69, 0x65, 0xfc, 0x52, 0x15, 0xfd, - 0xc5, 0x97, 0xe6, 0x3c, 0xe4, 0x6b, 0x2d, 0xcc, 0x3d, 0x53, 0x2e, 0xbe, - 0x19, 0x3b, 0x0b, 0x2f, 0xfe, 0x39, 0x3e, 0xb3, 0x7f, 0xc0, 0x3f, 0x96, - 0x56, 0xc7, 0xd3, 0xd2, 0x2b, 0xe3, 0xe6, 0x0e, 0x15, 0x1a, 0xec, 0x45, - 0x86, 0x1f, 0x2c, 0x39, 0xc1, 0x0e, 0xf6, 0x10, 0x82, 0x42, 0x3e, 0xff, - 0xcf, 0xbb, 0xf8, 0x78, 0x65, 0xf4, 0x96, 0x5b, 0xf5, 0x97, 0xf8, 0x78, - 0x46, 0x2f, 0x82, 0xb2, 0xff, 0xfb, 0xc7, 0x1d, 0x3f, 0xe2, 0x4c, 0xc5, - 0x14, 0x54, 0x97, 0xff, 0x1c, 0x77, 0xf8, 0x93, 0x31, 0x45, 0x15, 0x25, - 0x62, 0x27, 0xfc, 0xab, 0x5b, 0x23, 0xd3, 0xb0, 0xd2, 0xbf, 0xde, 0x0b, - 0xb4, 0x6e, 0xd5, 0x94, 0x47, 0xb9, 0xd2, 0x9b, 0xe1, 0xe6, 0x30, 0x92, - 0xf9, 0xff, 0x7e, 0xac, 0xbf, 0xed, 0x38, 0x27, 0x7a, 0x04, 0x25, 0x97, - 0x83, 0x1a, 0x59, 0x77, 0x78, 0x33, 0xd7, 0x98, 0xee, 0xf9, 0x80, 0xff, - 0xc5, 0x97, 0x10, 0x55, 0x10, 0xca, 0xfe, 0x86, 0xc7, 0x35, 0x8b, 0x2a, - 0x47, 0x9f, 0x31, 0x1d, 0xef, 0x46, 0xcb, 0x2f, 0xdd, 0x89, 0x30, 0xd5, - 0x97, 0x85, 0x14, 0x54, 0x97, 0xb0, 0x80, 0x91, 0x99, 0xa0, 0xbf, 0xf6, - 0x6d, 0x83, 0x79, 0x14, 0x6c, 0xb2, 0xa1, 0x16, 0x9f, 0xa4, 0x91, 0x6d, - 0xfb, 0xbe, 0x72, 0x61, 0x65, 0xfd, 0xf4, 0xb8, 0x4e, 0x05, 0x97, 0xcf, - 0xbb, 0xde, 0x2c, 0xbc, 0x4c, 0xab, 0x3d, 0xac, 0xac, 0x3f, 0xbf, 0x8b, - 0x9c, 0x96, 0xe6, 0x55, 0x65, 0x55, 0x97, 0xec, 0xef, 0x43, 0xb2, 0xcb, - 0xff, 0x1e, 0xde, 0x37, 0x97, 0x4f, 0x65, 0x96, 0x93, 0x2a, 0xa2, 0x34, - 0x89, 0x7a, 0x53, 0x7c, 0x3f, 0x60, 0x16, 0x5e, 0x7d, 0xd8, 0x59, 0x7e, - 0xc1, 0xf9, 0xf7, 0x56, 0x5f, 0x8b, 0x07, 0x0d, 0x59, 0x53, 0xca, 0xf0, - 0x74, 0x46, 0xc5, 0xb1, 0x08, 0xc8, 0xb1, 0xe5, 0x82, 0xff, 0x9d, 0x26, - 0x23, 0xd4, 0x34, 0x5a, 0x5f, 0xe8, 0x51, 0xbc, 0x2e, 0xc8, 0xf0, 0x24, - 0x5b, 0xc7, 0x85, 0x2a, 0xbf, 0x9b, 0x87, 0xa9, 0xa4, 0xb2, 0xff, 0xf9, - 0x81, 0x1c, 0xbc, 0xf2, 0xe6, 0x36, 0x37, 0x56, 0x54, 0x22, 0x04, 0xcb, - 0xaf, 0xa3, 0xa1, 0x11, 0x65, 0xee, 0x9c, 0x2c, 0xbb, 0x09, 0x65, 0x19, - 0xb0, 0x08, 0xdd, 0xf8, 0xa3, 0xe8, 0xe2, 0xcb, 0xff, 0x61, 0x93, 0xf7, - 0x82, 0xc1, 0x2c, 0xbd, 0xe7, 0xd4, 0x1f, 0x1f, 0x09, 0xef, 0x8f, 0x51, - 0xd5, 0x97, 0xdc, 0xc8, 0x92, 0xca, 0x19, 0xe1, 0x11, 0x0d, 0xef, 0x67, - 0xcb, 0x2f, 0xc3, 0xd1, 0xc3, 0x56, 0x5a, 0x24, 0x78, 0x84, 0x3b, 0x7d, - 0x23, 0x80, 0x2c, 0xbb, 0xef, 0xd6, 0x5f, 0xcd, 0x8e, 0x7e, 0x60, 0x59, - 0x7b, 0x90, 0xc7, 0xe7, 0x8f, 0xc1, 0x9b, 0xfc, 0x1c, 0xd7, 0xff, 0x99, - 0x2c, 0xbf, 0x8b, 0xa7, 0xb1, 0x42, 0xcb, 0x71, 0x65, 0xd3, 0xce, 0xcb, - 0x2a, 0x0f, 0x6a, 0x45, 0x8e, 0x23, 0x7f, 0xec, 0x69, 0x8f, 0x58, 0x37, - 0x6a, 0xcb, 0xec, 0x68, 0x83, 0x59, 0x5e, 0x3e, 0x02, 0x3d, 0xbf, 0xf7, - 0x84, 0xe6, 0x68, 0x0e, 0xe0, 0x54, 0x41, 0x8b, 0xff, 0xb6, 0x86, 0x33, - 0x5d, 0xec, 0x67, 0x16, 0x58, 0xc6, 0x89, 0x12, 0x4c, 0xbf, 0xf7, 0x82, - 0xec, 0x67, 0x7b, 0x9e, 0x59, 0x7f, 0xbd, 0x05, 0xdf, 0xdf, 0xab, 0x2f, - 0xff, 0x4b, 0x51, 0x20, 0x78, 0xfc, 0x4e, 0xd5, 0x95, 0xc3, 0xfc, 0x09, - 0x9d, 0xff, 0x00, 0xda, 0xd3, 0x9d, 0xc0, 0xac, 0xbf, 0xf7, 0x3f, 0x7f, - 0xb8, 0x26, 0xbc, 0xeb, 0x2f, 0x83, 0xec, 0x02, 0xca, 0x92, 0x74, 0x63, - 0x27, 0xd4, 0x2e, 0xc8, 0x8b, 0xa7, 0x73, 0xe8, 0x57, 0xff, 0x77, 0x9b, - 0x40, 0x85, 0x1e, 0x3d, 0x96, 0x5f, 0xee, 0x46, 0xa4, 0x03, 0xd9, 0x65, - 0x11, 0xfd, 0x71, 0x1a, 0xfe, 0x0b, 0x05, 0x9b, 0x05, 0x65, 0x41, 0xe8, - 0x78, 0x86, 0xf7, 0x83, 0xba, 0xb2, 0xff, 0xf6, 0x9f, 0x7e, 0x10, 0x3c, - 0x7f, 0x89, 0xd5, 0x95, 0x09, 0xdb, 0xca, 0x32, 0x96, 0x59, 0x08, 0x48, - 0x2f, 0xb3, 0x09, 0x85, 0x95, 0xf2, 0xee, 0x27, 0x8d, 0x4a, 0x11, 0xdc, - 0x84, 0x6f, 0x67, 0x03, 0x37, 0x11, 0xef, 0x14, 0x0a, 0xb2, 0xf8, 0xc0, - 0x63, 0x59, 0x58, 0x6f, 0x7a, 0x39, 0x7d, 0x1d, 0x39, 0x96, 0x5f, 0xc1, - 0x71, 0x02, 0xe2, 0x2c, 0xa9, 0x8f, 0x47, 0x44, 0x57, 0x6f, 0xc5, 0x95, - 0x86, 0xed, 0xc8, 0xef, 0xfe, 0x79, 0x4e, 0xce, 0xe7, 0xa3, 0x5f, 0xac, - 0xbb, 0xff, 0xd6, 0x5f, 0xf0, 0x3c, 0x7a, 0x23, 0xef, 0x16, 0x54, 0x91, - 0x2e, 0xd4, 0x6f, 0xc6, 0x6f, 0xf7, 0xe7, 0xef, 0x67, 0xee, 0xb2, 0xff, - 0x70, 0xf0, 0xb3, 0xe1, 0x56, 0x5f, 0xff, 0xec, 0xef, 0x5f, 0x45, 0x1f, - 0x48, 0x4d, 0x7e, 0xd3, 0xe2, 0xca, 0xdd, 0x44, 0xb3, 0x4c, 0xef, 0xc1, - 0xf8, 0x18, 0xd5, 0x97, 0xfc, 0xd3, 0x17, 0x08, 0x7e, 0x85, 0x97, 0xff, - 0xa3, 0xbc, 0x08, 0x27, 0x79, 0xca, 0x21, 0x65, 0xde, 0x0a, 0xcb, 0xff, - 0xf4, 0x8c, 0x87, 0xec, 0xf8, 0x47, 0x2e, 0x90, 0xd6, 0x5f, 0xff, 0xc6, - 0x2f, 0x9c, 0x10, 0x43, 0xcf, 0xbb, 0xe7, 0x1a, 0xcb, 0xfd, 0x83, 0xf6, - 0x7d, 0x9c, 0x59, 0x78, 0xc5, 0xdd, 0x59, 0x7f, 0xb3, 0x7f, 0x3b, 0xd8, - 0x6a, 0xca, 0xd1, 0xea, 0xf8, 0x82, 0xa1, 0x52, 0x10, 0xc9, 0xb0, 0xa5, - 0x83, 0x83, 0x4a, 0x98, 0x5f, 0x4a, 0xa4, 0xb7, 0xc8, 0x44, 0x5c, 0x29, - 0xac, 0xbf, 0x34, 0x18, 0x40, 0x59, 0x50, 0x6f, 0x8c, 0x5e, 0xff, 0xe7, - 0xdb, 0x8e, 0x38, 0xda, 0x25, 0x0b, 0x2f, 0xec, 0xe4, 0xfe, 0x6a, 0x16, - 0x56, 0x91, 0x25, 0xc1, 0xf9, 0xf4, 0x4b, 0xe3, 0x82, 0x99, 0x65, 0x6c, - 0xce, 0xf3, 0x92, 0x98, 0xe1, 0x07, 0x8e, 0x80, 0x65, 0xf8, 0x98, 0xe7, - 0x8b, 0x26, 0x85, 0x63, 0x61, 0x58, 0xf0, 0xb6, 0xfc, 0xc7, 0x92, 0xc3, - 0x3b, 0x1a, 0x98, 0xa6, 0x77, 0xfb, 0x9c, 0xc2, 0xfe, 0x7f, 0x16, 0x5f, - 0x11, 0xee, 0x42, 0xcb, 0xe1, 0x0b, 0x38, 0xb2, 0xd3, 0x2c, 0xbf, 0xb9, - 0x85, 0xfc, 0xfe, 0x2c, 0xa9, 0xc8, 0xbd, 0xc3, 0x67, 0x23, 0xfc, 0x8b, - 0x82, 0x57, 0xdd, 0x77, 0x25, 0x95, 0xbc, 0xfa, 0xc5, 0x4b, 0xbf, 0xfd, - 0xf4, 0x8f, 0x3c, 0xfe, 0xf4, 0x7d, 0xc5, 0x97, 0xfb, 0xbf, 0x85, 0xb1, - 0x9d, 0x59, 0x4e, 0x7f, 0xe1, 0x4b, 0xbf, 0xfc, 0x5b, 0x4e, 0x98, 0xcb, - 0x07, 0x84, 0xc2, 0xcb, 0xf8, 0xfe, 0xdc, 0xf4, 0x75, 0x65, 0xf8, 0x3c, - 0x33, 0xf9, 0x65, 0xf8, 0xb3, 0xbe, 0x35, 0x97, 0x84, 0xc8, 0x59, 0x7b, - 0xc1, 0x61, 0x65, 0xee, 0xc0, 0x8b, 0x2f, 0xf6, 0x0f, 0x4e, 0x0e, 0xfe, - 0xb2, 0xfd, 0x84, 0x3f, 0x42, 0xca, 0xc3, 0xf7, 0xf0, 0xe8, 0xa6, 0x95, - 0x09, 0xd5, 0xee, 0xa6, 0x4c, 0x63, 0xa2, 0x87, 0x26, 0x21, 0xce, 0x42, - 0x56, 0xf8, 0x7a, 0x79, 0x2c, 0xbf, 0xff, 0xd8, 0x4f, 0xde, 0x66, 0xbf, - 0xfe, 0x33, 0xee, 0xf0, 0xd6, 0x5d, 0x28, 0x59, 0x69, 0xf5, 0x95, 0x38, - 0xd5, 0x60, 0xb5, 0x0d, 0x15, 0xbd, 0x84, 0x5d, 0x42, 0x3d, 0xde, 0x19, - 0xf7, 0xa3, 0x53, 0x2c, 0xa9, 0xce, 0xcb, 0x29, 0x90, 0x81, 0x14, 0x93, - 0x5d, 0xa3, 0x3f, 0x1c, 0x2b, 0xf2, 0x7a, 0xbc, 0x12, 0xc7, 0x3e, 0x84, - 0x91, 0xcf, 0x28, 0xfa, 0x37, 0xa7, 0xa7, 0x8a, 0x7f, 0x28, 0x58, 0xa1, - 0x48, 0x18, 0xf3, 0x05, 0x8d, 0x8a, 0x7c, 0x9a, 0xf7, 0xdb, 0x6f, 0x59, - 0x7e, 0x07, 0xa3, 0xed, 0xc5, 0x97, 0x05, 0x96, 0xb2, 0xfd, 0xe7, 0xd3, - 0x4d, 0x65, 0xe1, 0x23, 0x75, 0x65, 0xfc, 0x20, 0x3d, 0x1f, 0x6e, 0x2c, - 0xa9, 0xc8, 0xc1, 0x91, 0x60, 0x06, 0xf8, 0x4e, 0x12, 0x0b, 0xc6, 0x58, - 0xb2, 0xfe, 0xf1, 0xb2, 0xfd, 0x1b, 0x2c, 0xb0, 0xe4, 0x79, 0x80, 0x1a, - 0xbb, 0xf1, 0x56, 0x5f, 0xde, 0x83, 0xdd, 0x69, 0xac, 0xa9, 0xc7, 0x90, - 0x01, 0x9a, 0xf9, 0x32, 0xc3, 0x84, 0xc7, 0x5c, 0x2f, 0xec, 0x17, 0x30, - 0x98, 0x59, 0x71, 0xec, 0xb2, 0xf3, 0xe7, 0x16, 0x5f, 0x9f, 0x63, 0x0c, - 0x96, 0x5e, 0xff, 0xf8, 0x59, 0x4d, 0x3e, 0x1f, 0x0d, 0x91, 0x45, 0xec, - 0x26, 0x16, 0x51, 0xa3, 0xbd, 0xa5, 0xae, 0xf1, 0xb8, 0x5d, 0x7f, 0xee, - 0x6a, 0x3a, 0x4e, 0xd6, 0x9a, 0xcb, 0xff, 0xd1, 0xce, 0x43, 0x73, 0xa7, - 0xcf, 0x3a, 0xcb, 0xc6, 0x5d, 0x59, 0x40, 0x3e, 0x3f, 0x24, 0x5f, 0xfc, - 0xd8, 0xef, 0x1f, 0x35, 0xfb, 0x71, 0x65, 0xfc, 0x51, 0x26, 0xc1, 0xac, - 0xaf, 0xcf, 0xbc, 0x91, 0x2f, 0xda, 0x76, 0xc0, 0x16, 0x5f, 0xb3, 0x79, - 0x67, 0x16, 0x5f, 0xee, 0x9e, 0xf3, 0xec, 0xa1, 0x25, 0x9a, 0xb2, 0xfe, - 0xc2, 0x63, 0x50, 0xcc, 0xcf, 0x14, 0x43, 0x4b, 0xb1, 0x85, 0x95, 0x39, - 0x52, 0x26, 0x42, 0x80, 0xe1, 0x22, 0xe4, 0x44, 0x4f, 0xc6, 0xd9, 0xf4, - 0x6b, 0xff, 0xcf, 0xbe, 0x30, 0x6f, 0x2c, 0xf1, 0x8a, 0xb2, 0xf0, 0x7e, - 0x92, 0xcb, 0xe9, 0x69, 0xf7, 0xac, 0xa9, 0x22, 0x33, 0x49, 0x44, 0x3d, - 0x7f, 0x8a, 0x45, 0x8d, 0x80, 0x2c, 0xbf, 0x1f, 0x8a, 0x24, 0xb2, 0xf3, - 0xf0, 0xd6, 0x5b, 0x16, 0x5e, 0xcc, 0x61, 0x65, 0x9a, 0x33, 0x59, 0xb8, - 0x21, 0x50, 0x8f, 0x7c, 0x2f, 0xd1, 0x8f, 0x89, 0x9d, 0x1e, 0xff, 0x8f, - 0x7e, 0x68, 0x0e, 0xe0, 0x54, 0x61, 0xab, 0xd3, 0xe1, 0xea, 0xcb, 0x8f, - 0x7a, 0xcb, 0xe7, 0xd3, 0x88, 0xb2, 0xec, 0x61, 0x65, 0xff, 0xd0, 0xd3, - 0x1e, 0x13, 0x1e, 0x86, 0xac, 0xaf, 0x1e, 0xd7, 0x45, 0xe8, 0x69, 0x8e, - 0x01, 0x19, 0xa4, 0x1c, 0x18, 0xeb, 0xe5, 0xc2, 0x79, 0x65, 0xfe, 0x39, - 0x89, 0xc5, 0x11, 0xab, 0x29, 0x83, 0xcd, 0xf0, 0xc5, 0xff, 0xf1, 0xf7, - 0xd1, 0xc8, 0xf4, 0x1e, 0xd0, 0xc2, 0xcb, 0xfd, 0xe8, 0x9a, 0x47, 0xa9, - 0x2c, 0xbf, 0x14, 0xc5, 0x0d, 0x59, 0x7f, 0xba, 0x62, 0xcc, 0x4e, 0x2a, - 0xcb, 0xbc, 0x6b, 0x2f, 0xfb, 0x37, 0xc0, 0xfd, 0x87, 0xd5, 0x97, 0xb8, - 0xff, 0xac, 0xa2, 0x3d, 0x6e, 0x9c, 0xd6, 0xea, 0x23, 0x7a, 0xd9, 0x7f, - 0x04, 0x4f, 0xff, 0x8f, 0x96, 0x5f, 0xa1, 0xbd, 0xc0, 0x2c, 0xbf, 0x44, - 0xbf, 0x2c, 0x59, 0x71, 0xec, 0xb2, 0xa1, 0x51, 0x48, 0xd3, 0xf0, 0xd3, - 0xe2, 0x73, 0x86, 0x14, 0xc4, 0xde, 0x32, 0x22, 0x7e, 0x93, 0xdf, 0x9f, - 0xba, 0x8d, 0xeb, 0x2f, 0xa3, 0xe0, 0xee, 0xac, 0xbf, 0xff, 0x00, 0x3e, - 0x60, 0xca, 0x3d, 0x02, 0xc1, 0x62, 0xca, 0x98, 0xfe, 0x88, 0x9a, 0xf8, - 0xc7, 0xb8, 0x6b, 0x2a, 0x11, 0xd2, 0xf0, 0xa3, 0x14, 0x8a, 0xff, 0xbd, - 0x12, 0x32, 0xc6, 0xc2, 0xcb, 0xe7, 0x1c, 0xb6, 0x59, 0x7f, 0xd9, 0xdf, - 0x63, 0x49, 0xfa, 0xb2, 0xfe, 0xde, 0x7a, 0xfa, 0x37, 0x56, 0x50, 0xcf, - 0xab, 0x0d, 0xeb, 0xc8, 0xae, 0x28, 0x46, 0xdc, 0x5f, 0xac, 0xbf, 0x36, - 0x01, 0xb0, 0xd6, 0x5f, 0x4a, 0x1a, 0xeb, 0x2f, 0xda, 0xfd, 0xa7, 0xc5, - 0x97, 0x77, 0x8c, 0x94, 0x45, 0x60, 0xbb, 0x94, 0x88, 0x43, 0x50, 0x8f, - 0xd0, 0xc2, 0xc6, 0xdc, 0x59, 0x7f, 0x46, 0xd8, 0x46, 0xc2, 0xca, 0xd1, - 0xbe, 0xe0, 0x8d, 0xff, 0xd0, 0x4f, 0xe8, 0xfd, 0x9e, 0xb9, 0xc4, 0x97, - 0xb0, 0x10, 0xb2, 0xb6, 0x55, 0x90, 0x38, 0xf8, 0x71, 0x95, 0xa4, 0x3b, - 0xd1, 0xaf, 0x36, 0x00, 0xb2, 0xfc, 0xf3, 0x1e, 0x71, 0x65, 0xf7, 0x23, - 0x52, 0x59, 0x61, 0xce, 0x3c, 0x9e, 0x13, 0xd4, 0x22, 0x3d, 0xd9, 0x6f, - 0xf8, 0x87, 0xe8, 0xef, 0x61, 0xab, 0x2e, 0x0e, 0xcb, 0x2f, 0xf7, 0xd2, - 0xfb, 0x87, 0xd8, 0x59, 0x78, 0xfe, 0xe2, 0xca, 0xc3, 0xd2, 0x33, 0x5a, - 0xc4, 0x61, 0x19, 0xc7, 0x9a, 0xae, 0xc0, 0x2c, 0xbb, 0x38, 0xb3, 0xa5, - 0xb5, 0xee, 0xe7, 0x96, 0x56, 0x8f, 0x04, 0x24, 0xb7, 0xff, 0xc3, 0x9c, - 0xe7, 0x9c, 0x8d, 0xb0, 0x8d, 0x85, 0x97, 0xfb, 0x4d, 0x8f, 0xba, 0xe0, - 0x59, 0x7f, 0xff, 0x16, 0x77, 0xd9, 0x2c, 0x04, 0x03, 0xa4, 0xed, 0x59, - 0x58, 0x8d, 0xc3, 0x50, 0xe1, 0xa5, 0xff, 0xb4, 0x72, 0x3e, 0x7d, 0x23, - 0x25, 0x97, 0xc6, 0xd8, 0x99, 0x65, 0xff, 0xdc, 0x3f, 0x8b, 0x26, 0xd4, - 0x77, 0x8b, 0x2f, 0xb3, 0x60, 0xc9, 0x65, 0x1a, 0x32, 0x26, 0x3e, 0xfc, - 0x88, 0x54, 0x5b, 0xfd, 0xc8, 0x93, 0xec, 0xed, 0x59, 0x7c, 0xfa, 0x7f, - 0x96, 0x5f, 0xdf, 0xec, 0xf2, 0x8d, 0xd5, 0x97, 0x86, 0x38, 0x59, 0x4c, - 0x1f, 0x87, 0xc4, 0x41, 0x32, 0xa8, 0x4c, 0x4c, 0xcf, 0xde, 0x14, 0x77, - 0xda, 0x8c, 0x6a, 0xcb, 0xb0, 0x55, 0x94, 0x9c, 0x43, 0x0b, 0xfb, 0x82, - 0x46, 0xa1, 0xa9, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, - 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x92, 0x2e, 0x4c, 0x67, 0xf3, 0xc0, - 0x8c, 0xcf, 0x8c, 0xee, 0x0c, 0xdd, 0xec, 0x4e, 0x21, 0x85, 0xfc, 0xef, - 0xd9, 0xa1, 0xa9, 0xc4, 0x30, 0x9c, 0x69, 0x2c, 0xcb, 0x4e, 0x21, 0x85, - 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x52, 0x36, 0x46, 0x33, 0x49, 0xc4, - 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, - 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x6c, 0x89, 0x61, 0x8c, 0x98, 0xcf, 0xe3, - 0x3c, 0x19, 0xde, 0x33, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, 0x8d, - 0x97, 0x06, 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, - 0x27, 0x10, 0xc2, 0xa4, 0x7c, 0x9f, 0x8c, 0xf4, 0x67, 0x70, 0x66, 0x93, - 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2b, - 0x63, 0xe4, 0x60, 0x67, 0x43, 0x3e, 0x19, 0xb3, 0x09, 0xc4, 0x30, 0xa4, - 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, - 0x19, 0xf2, 0x7c, 0x33, 0xf8, 0xc8, 0x46, 0x69, 0x38, 0x86, 0x14, 0x9c, - 0x43, 0x0a, 0x4e, 0x21, 0x85, 0xfb, 0xd1, 0xff, 0x31, 0x38, 0x86, 0x14, - 0x9c, 0x43, 0x0a, 0x92, 0x26, 0x80, 0x33, 0xe1, 0x97, 0x19, 0xfc, 0xda, - 0xc0, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, - 0x30, 0xa4, 0xe2, 0x18, 0x54, 0x8f, 0x93, 0xe1, 0x93, 0x19, 0xde, 0x33, - 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, - 0x15, 0x23, 0xe4, 0x18, 0xcf, 0x86, 0x48, 0x66, 0xde, 0x4e, 0x21, 0x85, - 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x69, 0x27, 0x10, 0xc2, 0x93, 0x88, - 0x61, 0xf1, 0x7f, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, - 0x29, 0x38, 0x86, 0x15, 0xb2, 0x37, 0xa4, 0x32, 0xc1, 0xc0, 0x0a, 0x66, - 0x19, 0xfc, 0x67, 0xa3, 0x36, 0xc4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, - 0x38, 0x86, 0x16, 0x92, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x1f, 0x17, 0xf4, - 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x42, 0x2b, 0x24, 0x32, 0x67, 0x1a, - 0x29, 0x68, 0xcd, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, - 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2a, 0x0f, 0xf7, 0xe1, 0x9d, 0x0c, - 0xb4, 0x64, 0x86, 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, - 0x85, 0x68, 0xf2, 0xf8, 0x33, 0xd1, 0x9a, 0x4e, 0x21, 0x85, 0x27, 0x10, - 0xc2, 0x93, 0x88, 0x61, 0x4d, 0x3c, 0xb2, 0x19, 0xe8, 0xcd, 0x9a, 0x9c, - 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xbf, 0x36, 0x41, 0x19, - 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, - 0x0a, 0x83, 0xe4, 0x98, 0x67, 0xc3, 0x21, 0x19, 0xa8, 0x66, 0x0a, 0x6d, - 0x08, 0x19, 0x26, 0x8d, 0x57, 0x21, 0x6c, 0x08, 0x46, 0x7d, 0x08, 0x53, - 0x85, 0x26, 0xe9, 0xf4, 0xd0, 0x84, 0xd4, 0x36, 0x1a, 0x95, 0xe8, 0x41, - 0xbc, 0x28, 0xbf, 0x3b, 0x28, 0x7e, 0xf1, 0xa3, 0xb0, 0xca, 0x0c, 0x31, - 0x77, 0xc2, 0x4c, 0x57, 0xa9, 0xf2, 0xe1, 0x14, 0x77, 0x21, 0x0d, 0x7e, - 0x91, 0x46, 0x71, 0x38, 0x86, 0x0c, 0xd3, 0x97, 0xbc, 0x70, 0xd4, 0xe2, - 0x18, 0x5f, 0x18, 0x1f, 0x4b, 0xc4, 0x31, 0x78, 0xc7, 0x8b, 0xc4, 0x31, - 0x66, 0x7f, 0x23, 0x23, 0x49, 0x3e, 0x29, 0xe9, 0x75, 0xa3, 0x7b, 0x3e, - 0x24, 0x4a, 0x7a, 0x1d, 0xe3, 0x2d, 0x96, 0x5f, 0xc6, 0x28, 0xf5, 0x1b, - 0x2c, 0xa9, 0x1e, 0x5f, 0x87, 0x2e, 0x7f, 0x96, 0x5f, 0x44, 0xfc, 0x75, - 0x65, 0xe3, 0xde, 0xcb, 0x59, 0x71, 0xee, 0x2c, 0xa0, 0x36, 0x18, 0xbf, - 0x53, 0xea, 0xa6, 0x84, 0x1f, 0x88, 0x88, 0x5f, 0xa4, 0x9b, 0x84, 0x57, - 0xd9, 0x33, 0x88, 0xb2, 0xff, 0xff, 0xd9, 0x84, 0x1e, 0x9f, 0x88, 0x2c, - 0x16, 0x7d, 0xd8, 0xcd, 0x2c, 0xac, 0x44, 0x6c, 0xf9, 0x1d, 0xef, 0xc3, - 0xc5, 0x97, 0xf9, 0xc8, 0x49, 0xa4, 0x64, 0xb2, 0xef, 0xe1, 0x65, 0xfd, - 0xa7, 0x21, 0x23, 0xf5, 0x97, 0x3e, 0x96, 0x58, 0xd6, 0x00, 0xb6, 0xb0, - 0x16, 0x59, 0xab, 0x2c, 0xcc, 0xd1, 0x39, 0xa1, 0x7f, 0x22, 0x38, 0xf8, - 0x82, 0x37, 0xf7, 0xd2, 0xf4, 0x16, 0xcb, 0x29, 0xa9, 0xa7, 0xcf, 0xc3, - 0x3f, 0x71, 0x46, 0xf6, 0x8f, 0x65, 0x97, 0xfa, 0x1b, 0x93, 0x41, 0x6c, - 0xb2, 0x96, 0x56, 0x8f, 0x6f, 0xc3, 0xbf, 0x99, 0xdf, 0xb1, 0xbe, 0x8f, - 0xd6, 0x5f, 0xfd, 0x39, 0xc0, 0x3f, 0x47, 0xf8, 0x5f, 0xac, 0xbb, 0xf8, - 0x59, 0x58, 0x7b, 0xdf, 0xa3, 0xd4, 0x95, 0x6e, 0x64, 0x6d, 0xbf, 0xc2, - 0x5f, 0xa6, 0x01, 0x84, 0x35, 0xff, 0xc4, 0x51, 0xb1, 0x61, 0xef, 0x89, - 0xf5, 0x97, 0xa3, 0xee, 0x2c, 0xa7, 0x3e, 0x3e, 0x23, 0x5e, 0x7d, 0x42, - 0xcb, 0xf1, 0xcf, 0xb9, 0x7e, 0xb2, 0xfc, 0x7f, 0x71, 0xfe, 0x59, 0x52, - 0x3e, 0xe6, 0x8d, 0xf0, 0xaa, 0xfb, 0x7b, 0x60, 0xd6, 0x5f, 0xf0, 0x8e, - 0x3e, 0x63, 0x63, 0x75, 0x65, 0xec, 0xf8, 0x55, 0x97, 0x7f, 0x9a, 0x3d, - 0xa2, 0x3c, 0xbf, 0xfc, 0x7b, 0xa1, 0x60, 0xfe, 0xe6, 0x4d, 0x1d, 0x59, - 0x5f, 0x1f, 0xe3, 0x4b, 0x6e, 0x0c, 0x2c, 0xbd, 0x9a, 0x92, 0xca, 0x19, - 0xb2, 0xde, 0x2d, 0x78, 0x6e, 0x4b, 0x28, 0xcd, 0xf3, 0x91, 0xdf, 0xa0, - 0x0e, 0x4c, 0x2c, 0xbf, 0xf9, 0xf5, 0xa7, 0xfe, 0x19, 0x8a, 0x28, 0xab, - 0x2f, 0x48, 0xff, 0x59, 0x7f, 0xe6, 0x33, 0xee, 0x9f, 0x74, 0x16, 0xac, - 0xb4, 0x4e, 0x45, 0x43, 0xa5, 0x74, 0x76, 0xa1, 0x56, 0xfe, 0x17, 0xbc, - 0x3e, 0x79, 0x09, 0x3e, 0x8f, 0x86, 0x19, 0xf7, 0xff, 0x16, 0x1f, 0xa3, - 0xef, 0xf3, 0xbc, 0x59, 0x7f, 0xf0, 0x44, 0x9a, 0x74, 0x08, 0xe0, 0x8f, - 0x2c, 0xbf, 0xfb, 0x72, 0x34, 0x6d, 0xe6, 0x36, 0x37, 0x56, 0x53, 0x25, - 0xd8, 0x09, 0xc4, 0xa0, 0xed, 0xa3, 0x25, 0x94, 0xa8, 0x21, 0xc7, 0xe9, - 0x91, 0xb1, 0xb1, 0x09, 0x80, 0x4a, 0x4c, 0xfa, 0x36, 0xc3, 0x95, 0xf9, - 0xbb, 0x0e, 0x39, 0xa1, 0xc7, 0xa8, 0x42, 0xb6, 0x1f, 0xde, 0x94, 0x12, - 0xf5, 0x87, 0xc7, 0xf1, 0x84, 0x14, 0xb0, 0x1e, 0x42, 0xff, 0xb2, 0xdb, - 0xa7, 0xd9, 0x44, 0x44, 0xdc, 0x49, 0xbd, 0xfe, 0xd8, 0xb2, 0xf3, 0x78, - 0x05, 0x97, 0x88, 0x10, 0xb2, 0xfb, 0x3a, 0xff, 0x2c, 0xa9, 0xc7, 0xb4, - 0x63, 0xba, 0x1b, 0xbe, 0x96, 0x6a, 0x16, 0x5f, 0xc2, 0xbe, 0xb4, 0xff, - 0x2c, 0xbf, 0xff, 0x73, 0x5a, 0x39, 0xb9, 0xa8, 0xe9, 0x80, 0xc6, 0xb2, - 0x9a, 0x8d, 0x6f, 0xcc, 0x08, 0x84, 0x52, 0xfb, 0xdd, 0x8e, 0x2c, 0xbd, - 0xfc, 0xf9, 0x2c, 0xa6, 0x9b, 0xc2, 0x1c, 0xbd, 0xb1, 0x8d, 0x65, 0x82, - 0xb2, 0xdf, 0x99, 0xae, 0x21, 0xdb, 0x32, 0x56, 0x5f, 0x68, 0xc9, 0x85, - 0x97, 0xfb, 0xb0, 0x10, 0x78, 0xf4, 0xb2, 0xfe, 0xc0, 0x7a, 0x3e, 0x92, - 0xcb, 0xf9, 0xbc, 0x36, 0x3a, 0x2a, 0xcb, 0xf4, 0x7d, 0xe8, 0x92, 0xca, - 0x9e, 0xd1, 0xe1, 0xa1, 0x52, 0x22, 0xe9, 0x98, 0x85, 0xdb, 0x86, 0x17, - 0xfd, 0x9f, 0x16, 0x77, 0xb9, 0xb2, 0xcb, 0xbe, 0xea, 0xcb, 0xf6, 0x16, - 0xc7, 0xa5, 0x97, 0xee, 0xb9, 0x07, 0x16, 0x5f, 0xee, 0x63, 0x4f, 0xbe, - 0x75, 0x96, 0x8c, 0x44, 0xbe, 0x86, 0x08, 0x9f, 0xa4, 0xd7, 0xa7, 0x34, - 0xd6, 0x5f, 0xd9, 0x36, 0xa3, 0xbc, 0x59, 0x71, 0x35, 0x65, 0x48, 0xf8, - 0x88, 0x7b, 0x85, 0xd7, 0xb7, 0x35, 0x0b, 0x2f, 0xfb, 0xc7, 0xaf, 0x3b, - 0x24, 0x51, 0x56, 0x5f, 0xfe, 0x27, 0x17, 0x85, 0x9f, 0x4b, 0xa1, 0xd9, - 0x65, 0xfe, 0xd1, 0xcc, 0x59, 0xbd, 0xd6, 0x5b, 0x93, 0x93, 0x0c, 0x82, - 0xec, 0x1f, 0x98, 0xff, 0x49, 0x97, 0xfb, 0x45, 0x83, 0xf6, 0x12, 0xcb, - 0xe7, 0x20, 0xe2, 0xcb, 0xf0, 0xf9, 0xc8, 0x6a, 0xca, 0xf9, 0x19, 0x6e, - 0xa5, 0xf9, 0x89, 0x10, 0x5f, 0xf1, 0x43, 0xed, 0xe8, 0xd7, 0xeb, 0x2f, - 0xf1, 0xe8, 0xbb, 0xdc, 0xd9, 0x65, 0xcf, 0xbd, 0x65, 0xfd, 0x22, 0x39, - 0x7b, 0x16, 0x5f, 0xb6, 0x3d, 0x44, 0x96, 0x53, 0x08, 0x9f, 0x98, 0xcf, - 0x43, 0x04, 0x59, 0x7e, 0x0f, 0x67, 0xf3, 0xab, 0x2f, 0x0c, 0xd8, 0x59, - 0x50, 0x79, 0x18, 0x57, 0x7f, 0x3f, 0x84, 0xd3, 0xfe, 0xb2, 0xf6, 0xbf, - 0x11, 0x65, 0xff, 0xc7, 0xd8, 0xef, 0x3c, 0xe7, 0xe0, 0xac, 0xa8, 0x3e, - 0x27, 0x1f, 0xbe, 0x22, 0x0c, 0x96, 0x5f, 0xe2, 0x0f, 0x31, 0xb0, 0x05, - 0x97, 0xfe, 0xf4, 0x6b, 0xf2, 0xc1, 0x5f, 0xf5, 0x97, 0xb3, 0x26, 0x59, - 0x6c, 0x61, 0x11, 0xde, 0x32, 0xfd, 0x02, 0xf4, 0x7c, 0x2a, 0xcb, 0xf6, - 0x82, 0xd7, 0x25, 0x95, 0xd3, 0xc5, 0x08, 0xf5, 0xf3, 0x63, 0x36, 0x59, - 0x7e, 0xcd, 0xe5, 0x1f, 0x2c, 0xa3, 0x3c, 0xbe, 0x11, 0x5f, 0x41, 0x74, - 0x0b, 0x28, 0x6b, 0x81, 0x39, 0x0d, 0x8d, 0x42, 0x19, 0xa4, 0x1e, 0x84, - 0x8b, 0x90, 0x14, 0x2b, 0xf8, 0xf9, 0xd6, 0xd9, 0xf2, 0x1b, 0xf4, 0xff, - 0xb3, 0xf7, 0x59, 0x7f, 0xbf, 0x13, 0x08, 0x7e, 0x85, 0x95, 0x09, 0x80, - 0xb6, 0x14, 0x4e, 0x57, 0x7f, 0x73, 0x1a, 0x7e, 0x85, 0x97, 0xbe, 0x97, - 0x16, 0x57, 0xc7, 0x95, 0xa2, 0xcb, 0xdc, 0xfc, 0x55, 0x97, 0xdf, 0x72, - 0x3e, 0x59, 0x7f, 0x3c, 0xbb, 0xc8, 0x61, 0x65, 0xa4, 0x67, 0xa4, 0xd2, - 0x4a, 0x84, 0x5d, 0xe1, 0x1b, 0xb8, 0xdf, 0xf0, 0xa5, 0x9a, 0xe7, 0xb0, - 0x0b, 0x2f, 0xfe, 0x2c, 0xe6, 0x0e, 0x69, 0x46, 0xb6, 0x59, 0x46, 0x7f, - 0xdd, 0x39, 0xbe, 0xc1, 0x99, 0x2c, 0xbe, 0x0b, 0xea, 0x4b, 0x2f, 0xa0, - 0x2c, 0xbe, 0x24, 0xbf, 0x49, 0x98, 0xa2, 0x8a, 0xb2, 0x88, 0xf5, 0x02, - 0x4d, 0x7f, 0xfd, 0xe3, 0x61, 0x88, 0xef, 0x20, 0x8b, 0x3a, 0xb2, 0xf8, - 0xb1, 0xb0, 0xb2, 0xff, 0x47, 0x5f, 0xf7, 0xcd, 0x2c, 0xbf, 0xff, 0xba, - 0x59, 0xfb, 0x97, 0xfd, 0x27, 0xfc, 0x5c, 0xf2, 0xcb, 0x88, 0x00, 0x47, - 0xe9, 0xa7, 0xb4, 0x80, 0x43, 0x2b, 0xdd, 0x6f, 0x56, 0x5f, 0x82, 0x64, - 0x7c, 0x59, 0x4e, 0x78, 0x7c, 0x1d, 0xbf, 0x73, 0x50, 0xe0, 0x59, 0x7e, - 0x82, 0x04, 0x6f, 0x59, 0x58, 0x79, 0xfe, 0x27, 0xa9, 0xca, 0xb4, 0x06, - 0x41, 0x8e, 0xcf, 0x18, 0xf7, 0xf0, 0x8b, 0xeb, 0x85, 0xfe, 0xfc, 0xb3, - 0x7e, 0x8f, 0x8b, 0x2f, 0xf0, 0x84, 0x4e, 0x2b, 0xf9, 0x65, 0x32, 0x5b, - 0x1b, 0xd8, 0x8d, 0x3b, 0x1e, 0xbe, 0x4e, 0x38, 0xc5, 0xb4, 0xbe, 0xd8, - 0x68, 0x3c, 0xa7, 0x9f, 0xe7, 0x51, 0xca, 0x33, 0x9e, 0x42, 0xac, 0x32, - 0xbc, 0x77, 0xb2, 0x8a, 0x6b, 0x79, 0x91, 0x3c, 0x59, 0x2b, 0x2f, 0x48, - 0x9d, 0x65, 0xfe, 0xec, 0x37, 0xe9, 0x67, 0x56, 0x5b, 0xe6, 0x41, 0xfd, - 0x41, 0x5e, 0x0d, 0xdf, 0xb7, 0x22, 0x5a, 0x85, 0x97, 0xba, 0xff, 0xac, - 0xbf, 0x6b, 0x68, 0xd6, 0xcb, 0x2f, 0xec, 0xef, 0x02, 0x5d, 0x59, 0x50, - 0x7a, 0xf8, 0x55, 0x7f, 0xe8, 0x2e, 0xf8, 0x2f, 0x29, 0x42, 0xcb, 0x6c, - 0xb2, 0xfd, 0xa8, 0xf1, 0xb0, 0xb2, 0x98, 0x37, 0x40, 0x12, 0xbf, 0x07, - 0xfc, 0x20, 0x2c, 0xbd, 0xa8, 0x99, 0x65, 0xe2, 0x79, 0x96, 0x5f, 0xb8, - 0x2b, 0xfd, 0xc5, 0x94, 0x67, 0x8c, 0xe3, 0x97, 0xdc, 0xec, 0x35, 0x65, - 0xff, 0x8a, 0x18, 0xf3, 0xf4, 0x4c, 0xfd, 0x65, 0xee, 0x6b, 0x16, 0x5e, - 0x2c, 0x92, 0xcb, 0xf6, 0xbf, 0x20, 0xfe, 0xb2, 0xa0, 0xf1, 0x70, 0x6e, - 0x8d, 0x10, 0x3c, 0x61, 0xb6, 0xea, 0xcb, 0xfb, 0x04, 0x89, 0x8f, 0x8b, - 0x28, 0x8f, 0x0b, 0xa2, 0x95, 0x0a, 0xda, 0xb6, 0x2a, 0x93, 0xa0, 0xc8, - 0x31, 0xdf, 0x44, 0x4d, 0x28, 0xf3, 0x1f, 0xe4, 0x04, 0x45, 0xd8, 0x60, - 0xef, 0x64, 0xbf, 0xe8, 0x3f, 0x43, 0x76, 0xc1, 0x56, 0x5f, 0xfb, 0x90, - 0x63, 0x28, 0x91, 0xfe, 0xb2, 0xfd, 0xe3, 0xd9, 0xc9, 0x65, 0xf8, 0x2c, - 0x39, 0x7e, 0xb2, 0xef, 0x1a, 0xca, 0x83, 0xe6, 0xf1, 0x3e, 0xe1, 0x4d, - 0xff, 0x6c, 0x59, 0x2f, 0x67, 0xfc, 0x59, 0x7f, 0xd0, 0x40, 0x9c, 0x32, - 0x71, 0x56, 0x5f, 0xfb, 0x0b, 0xe9, 0x73, 0x41, 0x8f, 0xd6, 0x5e, 0xe6, - 0x30, 0xb2, 0xe7, 0x6a, 0xcb, 0x67, 0x4d, 0x9e, 0xf1, 0xda, 0xd9, 0x1a, - 0xa6, 0x74, 0xd7, 0x3b, 0xff, 0x6b, 0xc2, 0xb8, 0xf7, 0xf7, 0x00, 0xb2, - 0xf7, 0xb3, 0x71, 0x65, 0xf4, 0x9f, 0xbc, 0x59, 0x6e, 0xce, 0x3c, 0x19, - 0x87, 0xe9, 0xd1, 0x5c, 0x50, 0x83, 0xbc, 0x38, 0xde, 0xb2, 0xe8, 0x99, - 0x65, 0xff, 0xc5, 0x02, 0x8c, 0xa3, 0xe9, 0x19, 0x2c, 0xad, 0x1e, 0xd1, - 0x0b, 0xdf, 0x9b, 0x9e, 0x7d, 0xc5, 0x95, 0x87, 0x96, 0x64, 0x37, 0xef, - 0x80, 0x7d, 0xe2, 0xcb, 0xff, 0xa7, 0x4d, 0x28, 0xd6, 0xd3, 0x85, 0xcf, - 0x2c, 0xa8, 0x3f, 0x57, 0x29, 0xa8, 0x4e, 0x78, 0x64, 0xde, 0x86, 0x19, - 0x42, 0x56, 0xff, 0x7b, 0x3b, 0x81, 0xd6, 0xcb, 0x2f, 0xbe, 0x01, 0xfc, - 0xb2, 0x9a, 0x7b, 0x1c, 0x34, 0xbf, 0xc5, 0x12, 0x9b, 0xd1, 0xb2, 0xcb, - 0x80, 0x6b, 0x2f, 0xf8, 0xca, 0x68, 0x06, 0xb3, 0xe5, 0x94, 0xe7, 0x9f, - 0xc1, 0x6a, 0x1a, 0x29, 0x3b, 0x08, 0x3b, 0xf0, 0xd8, 0x60, 0x3f, 0x2c, - 0xb3, 0x0e, 0x7a, 0x81, 0x28, 0xbf, 0xe8, 0xee, 0x68, 0x0e, 0xe0, 0x54, - 0x5f, 0x0b, 0xff, 0xfd, 0xd3, 0xcf, 0x87, 0xe0, 0xf3, 0x01, 0x3b, 0xc7, - 0x8d, 0x59, 0x7e, 0xcd, 0x47, 0xd2, 0x59, 0x74, 0x34, 0x08, 0xcf, 0xe2, - 0x27, 0x58, 0xef, 0xf9, 0xd8, 0xe1, 0xf0, 0xfe, 0xea, 0xca, 0xf1, 0xfa, - 0x91, 0xdd, 0xff, 0xf8, 0x81, 0x3b, 0xd0, 0x7a, 0x36, 0x9c, 0xfc, 0x35, - 0x65, 0xe7, 0xd6, 0xca, 0x8b, 0xfd, 0x7f, 0xf6, 0x17, 0xe2, 0xe7, 0xdd, - 0xec, 0x35, 0x65, 0xff, 0x8b, 0xba, 0xc8, 0xfa, 0x46, 0xd5, 0x97, 0xb3, - 0x6d, 0xc5, 0x95, 0x09, 0xa3, 0xe1, 0x08, 0x16, 0x3c, 0x54, 0xe8, 0xc4, - 0x7d, 0x7b, 0xa6, 0x2a, 0xcb, 0xf9, 0xf6, 0x10, 0x6f, 0xba, 0xb2, 0xba, - 0x79, 0xe1, 0x1d, 0xbf, 0xda, 0xd6, 0x4c, 0xd8, 0xe2, 0xcb, 0xfe, 0x7e, - 0xf0, 0xcb, 0xe9, 0x35, 0x65, 0xff, 0x1e, 0xb6, 0x0f, 0xff, 0xc7, 0x56, - 0x5f, 0xf4, 0x66, 0xa7, 0x48, 0xfe, 0x92, 0xca, 0x92, 0x60, 0xd8, 0x45, - 0xf9, 0xa7, 0x0e, 0x7a, 0x79, 0x7f, 0xff, 0xbc, 0xfc, 0x38, 0xe4, 0xee, - 0xfb, 0x1b, 0x80, 0x7d, 0x2c, 0xba, 0x37, 0x16, 0x5f, 0x73, 0x8e, 0xd5, - 0x95, 0xe4, 0x4e, 0x7e, 0xc3, 0xd1, 0x9b, 0xfd, 0xf7, 0x44, 0xf7, 0xb3, - 0x75, 0x65, 0xfb, 0x0f, 0x68, 0x61, 0x65, 0xb6, 0xc3, 0xe1, 0xf1, 0xcd, - 0xf7, 0xd2, 0xeb, 0xac, 0xbf, 0xfe, 0x18, 0x3c, 0x65, 0x9b, 0xde, 0x5c, - 0x31, 0xac, 0xbf, 0xb9, 0xd2, 0x8c, 0xf9, 0x65, 0x62, 0x28, 0x1c, 0x8c, - 0x2a, 0x17, 0xff, 0xb3, 0x9e, 0x73, 0xec, 0x34, 0x9d, 0x85, 0x97, 0xef, - 0xf9, 0xdc, 0xf2, 0xcb, 0xf8, 0x5e, 0xe7, 0xa5, 0x8b, 0x2a, 0x0f, 0x5d, - 0xca, 0x6a, 0x13, 0xb5, 0x94, 0x32, 0x30, 0xb8, 0xa1, 0x3f, 0x7f, 0x4e, - 0x1e, 0x67, 0xfc, 0x59, 0x7f, 0xfe, 0xee, 0x6b, 0x63, 0xe1, 0xef, 0xf1, - 0xe7, 0xdd, 0x59, 0x68, 0x6a, 0x22, 0x08, 0xc2, 0xfd, 0xcc, 0x6b, 0xfc, - 0xb2, 0xf3, 0x75, 0xb2, 0xca, 0xc3, 0xc6, 0x32, 0x8b, 0xff, 0x76, 0x39, - 0xc8, 0x3d, 0x9f, 0xab, 0x2f, 0xf8, 0xf0, 0x86, 0xc1, 0xe6, 0x96, 0x51, - 0xa6, 0x05, 0xa6, 0xde, 0x90, 0x6e, 0x1f, 0x5f, 0xf7, 0x33, 0x6e, 0x19, - 0x3e, 0xcb, 0x2e, 0xcf, 0x96, 0x56, 0x1e, 0x87, 0x4e, 0x6f, 0xe7, 0xd7, - 0xd2, 0xce, 0xac, 0xbf, 0xf7, 0x78, 0x7a, 0xe9, 0x05, 0xe4, 0xb2, 0xff, - 0xfc, 0x7c, 0xc1, 0xfb, 0x3a, 0x79, 0xcd, 0xb0, 0x55, 0x97, 0xff, 0x9b, - 0x13, 0xf8, 0x12, 0xcc, 0xdf, 0x1f, 0x2c, 0xbf, 0xf4, 0x66, 0xb3, 0x5f, - 0xb4, 0xf8, 0xb2, 0xf3, 0xfd, 0xb8, 0xb2, 0xfe, 0x7e, 0xf2, 0x33, 0x65, - 0x95, 0x09, 0xcc, 0xe1, 0x70, 0x0f, 0x8d, 0x54, 0x93, 0x77, 0x9f, 0x0a, - 0x41, 0x7e, 0xfd, 0xfe, 0x96, 0x2c, 0xbf, 0xd1, 0xf7, 0x0c, 0xbe, 0x92, - 0xca, 0x83, 0xdd, 0x69, 0x4d, 0xff, 0x06, 0x1b, 0xcc, 0x6c, 0x6e, 0xac, - 0xbf, 0xf6, 0xb6, 0xc1, 0xe7, 0xbd, 0x9b, 0xab, 0x2c, 0xc2, 0xcb, 0xfd, - 0xde, 0x09, 0xbe, 0x33, 0xe5, 0x95, 0x07, 0x92, 0x42, 0x57, 0xfe, 0xd7, - 0x1a, 0x26, 0x68, 0xe2, 0x65, 0x95, 0x87, 0xc0, 0x12, 0x0a, 0xc4, 0xc3, - 0x39, 0x0e, 0xbb, 0xfb, 0x8f, 0x22, 0x86, 0xac, 0xbc, 0x51, 0xba, 0xb2, - 0xff, 0xfa, 0x51, 0xad, 0xba, 0x6c, 0x73, 0x8e, 0x52, 0x59, 0x7f, 0x6d, - 0xcc, 0x6c, 0x6e, 0xac, 0xa9, 0x91, 0x04, 0x22, 0x8d, 0x69, 0x1e, 0x3c, - 0x2c, 0x16, 0x14, 0x17, 0x8f, 0xc6, 0xb2, 0xe1, 0xc9, 0x65, 0xe2, 0xc9, - 0x2c, 0xb4, 0xb4, 0x6c, 0xba, 0x2f, 0x7c, 0xde, 0x9e, 0xcb, 0x2b, 0x0f, - 0x28, 0xc9, 0xef, 0xfe, 0xdf, 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, 0xbb, - 0x6e, 0xac, 0xbf, 0xdb, 0xfc, 0xf2, 0x8c, 0x25, 0x95, 0x07, 0x97, 0x83, - 0x17, 0xd2, 0x7d, 0x49, 0x65, 0xff, 0xe8, 0xd3, 0xf4, 0x3d, 0x3e, 0xf3, - 0xc6, 0xb2, 0xd2, 0x98, 0xfa, 0xfc, 0x45, 0x7f, 0x60, 0xa2, 0x79, 0xfa, - 0xb2, 0xfe, 0x93, 0x7a, 0x41, 0x99, 0x65, 0xff, 0xf0, 0x92, 0x8d, 0xe6, - 0x5f, 0xe8, 0xe1, 0xb8, 0x92, 0xb4, 0x88, 0x0e, 0x97, 0xdf, 0x78, 0x4f, - 0xba, 0xb2, 0xfd, 0x8d, 0xc3, 0xde, 0xb2, 0xf6, 0xd3, 0x6e, 0xac, 0xb0, - 0xab, 0x2a, 0x13, 0x7c, 0xd8, 0xa7, 0x21, 0x5e, 0x02, 0x33, 0x25, 0x09, - 0x44, 0xf9, 0x15, 0xdd, 0xc5, 0x97, 0xed, 0x1e, 0xce, 0xd5, 0x4c, 0x26, - 0xbe, 0xe8, 0x61, 0xd5, 0x30, 0x9a, 0xef, 0xe1, 0x54, 0x09, 0xaf, 0xf1, - 0x3b, 0x1d, 0x8d, 0x7e, 0xaa, 0x04, 0xd7, 0xfb, 0x99, 0xe3, 0xe0, 0x76, - 0x54, 0xc2, 0x6b, 0xb0, 0x6a, 0x98, 0x4d, 0x70, 0xa2, 0xae, 0x61, 0x35, - 0x62, 0x6a, 0x5f, 0x1a, 0x99, 0x73, 0x49, 0x38, 0x83, 0xbd, 0x04, 0x52, - 0x3b, 0x75, 0x33, 0x09, 0x8c, 0xcf, 0x9e, 0xbe, 0x54, 0x02, 0x2c, 0x79, - 0xf7, 0xd8, 0x30, 0x92, 0xca, 0x33, 0xce, 0x72, 0xdb, 0xff, 0xf7, 0xed, - 0x79, 0x73, 0xd1, 0xbf, 0x04, 0x1b, 0xc9, 0x65, 0x42, 0xf5, 0xc1, 0x9b, - 0x7a, 0x12, 0xee, 0x40, 0x50, 0x91, 0xe4, 0xa0, 0x7e, 0xca, 0xba, 0x09, - 0x05, 0xff, 0xda, 0x91, 0x3b, 0x13, 0x48, 0xf5, 0x25, 0x97, 0xcf, 0xbf, - 0x05, 0x59, 0x7f, 0xfe, 0xf3, 0xcb, 0xd1, 0x07, 0xde, 0x19, 0x7d, 0x25, - 0x97, 0xa6, 0x8e, 0x2c, 0xbc, 0x5f, 0xb5, 0x65, 0xff, 0x40, 0x7a, 0x47, - 0xbc, 0x46, 0xac, 0xba, 0x1a, 0xb2, 0xec, 0xe4, 0x22, 0x2f, 0x07, 0x74, - 0x3b, 0x3e, 0x77, 0x58, 0x9c, 0x96, 0x91, 0x9c, 0x90, 0xa1, 0xbf, 0x7f, - 0x74, 0x2f, 0xce, 0x75, 0x65, 0xfb, 0x91, 0x9f, 0xc2, 0xcb, 0xf3, 0xff, - 0xe2, 0xcf, 0x8f, 0x57, 0xa5, 0xd7, 0xd8, 0x7a, 0x61, 0x65, 0xdb, 0x69, - 0x65, 0xdf, 0xcc, 0xb2, 0xff, 0xe6, 0xcd, 0x27, 0x2d, 0x87, 0x05, 0xb2, - 0xca, 0x83, 0xf7, 0x18, 0xc6, 0x0c, 0xde, 0xce, 0x49, 0x65, 0xf1, 0xf9, - 0xda, 0xb2, 0xfb, 0x51, 0xcd, 0x96, 0x56, 0x8f, 0x83, 0xa3, 0x82, 0x10, - 0xd4, 0x37, 0xe4, 0x9b, 0x46, 0x1e, 0x39, 0x4f, 0x99, 0x09, 0xe6, 0x23, - 0x1a, 0x04, 0xab, 0x3f, 0xa3, 0xa9, 0x38, 0x73, 0xcd, 0x29, 0x1f, 0x51, - 0xe7, 0xb6, 0x12, 0x1e, 0x8e, 0xeb, 0xf8, 0x60, 0x91, 0x0f, 0x23, 0x47, - 0xec, 0xfe, 0x8e, 0xf9, 0x43, 0x42, 0xc2, 0x56, 0x7c, 0xfc, 0x48, 0x4c, - 0xee, 0x42, 0x36, 0xfb, 0x66, 0xf7, 0x8b, 0x2f, 0x46, 0x12, 0xcb, 0xb3, - 0x8b, 0x2a, 0x46, 0xc3, 0xf1, 0xab, 0xfa, 0x53, 0x4a, 0x0b, 0xab, 0x2f, - 0xec, 0x91, 0x05, 0xf8, 0xb2, 0xfb, 0xee, 0x1c, 0x2c, 0xbf, 0xd8, 0x5b, - 0x9d, 0x32, 0x61, 0x65, 0x7c, 0x8b, 0x1d, 0x17, 0x78, 0xb3, 0xf2, 0x2b, - 0xec, 0xd1, 0xb0, 0xb2, 0xf0, 0xbb, 0x35, 0x65, 0xff, 0x7a, 0x1a, 0x4f, - 0x2c, 0xf2, 0xca, 0x84, 0x5b, 0x8c, 0xff, 0x08, 0xb8, 0x3f, 0x7f, 0x7a, - 0x04, 0x2f, 0xbf, 0x59, 0x76, 0x6e, 0x2c, 0xbe, 0x8f, 0x09, 0xc5, 0x95, - 0x3c, 0x9b, 0xc9, 0x0c, 0xde, 0xcc, 0x15, 0x65, 0xc6, 0xc2, 0xca, 0xd8, - 0xd9, 0x98, 0xe5, 0xfb, 0xb9, 0x31, 0xb5, 0x65, 0xfa, 0x3e, 0xff, 0xf8, - 0x59, 0x50, 0x7a, 0x44, 0x51, 0x7e, 0x8d, 0xf0, 0x5d, 0x59, 0x7e, 0x3d, - 0xfd, 0x3d, 0x96, 0x5f, 0xbb, 0xe8, 0xd4, 0x96, 0x5f, 0xfb, 0x1b, 0x05, - 0x1f, 0xb5, 0xe4, 0xb2, 0xff, 0xcd, 0x23, 0x62, 0x3b, 0xc3, 0xd2, 0xcb, - 0xe9, 0x77, 0x00, 0xb2, 0xb0, 0xf8, 0x1c, 0xfa, 0xe2, 0x85, 0x97, 0xfd, - 0xe7, 0x94, 0x4c, 0x50, 0xd5, 0x97, 0xe2, 0xc1, 0x32, 0x65, 0x97, 0xff, - 0xec, 0x07, 0xf0, 0xdc, 0xe9, 0xf3, 0x30, 0x98, 0x59, 0x7f, 0x34, 0xe1, - 0xae, 0x4b, 0x2b, 0xc7, 0xff, 0xfa, 0xa5, 0xff, 0xc6, 0xd1, 0x85, 0xf5, - 0x2c, 0xfb, 0xab, 0x2c, 0x58, 0x7d, 0x00, 0x23, 0xbf, 0xf3, 0x97, 0xff, - 0x77, 0x51, 0x82, 0xac, 0xbf, 0xf7, 0x3c, 0x73, 0xbe, 0x94, 0x66, 0xcb, - 0x2d, 0x9b, 0xa8, 0x82, 0xfd, 0x02, 0xff, 0xbc, 0xed, 0xf1, 0xc7, 0xd2, - 0x59, 0x7d, 0xe7, 0x76, 0xac, 0xbe, 0x7f, 0x78, 0xd6, 0x51, 0x1e, 0x16, - 0xf2, 0x1b, 0xf1, 0x4a, 0x7d, 0xf6, 0x59, 0x50, 0x79, 0xc2, 0x11, 0xd4, - 0x27, 0x7f, 0x28, 0x54, 0x19, 0x67, 0xf0, 0xc9, 0xb9, 0x83, 0x59, 0x5b, - 0x2e, 0x68, 0x0c, 0x80, 0x05, 0x1f, 0x15, 0x6e, 0x94, 0x6a, 0x13, 0xad, - 0x20, 0xf0, 0xa9, 0x1c, 0x76, 0x56, 0x74, 0xfa, 0x3d, 0xfe, 0xf7, 0xd2, - 0xe7, 0xb3, 0x65, 0x97, 0xfc, 0xfe, 0x98, 0xcb, 0xd9, 0xf2, 0xca, 0x83, - 0xef, 0xc3, 0x6b, 0xc1, 0xfb, 0x65, 0x97, 0xe9, 0xa5, 0x1d, 0xe2, 0xcb, - 0xb9, 0xfa, 0xca, 0xf1, 0xf0, 0x7e, 0x3f, 0x3e, 0x53, 0x7f, 0xff, 0xfd, - 0xec, 0x2f, 0xf0, 0xbb, 0xec, 0xf4, 0x64, 0xc7, 0xa9, 0xbc, 0x7f, 0x75, - 0x65, 0xfd, 0xa3, 0x07, 0xb2, 0x65, 0x97, 0xff, 0xc5, 0x93, 0x3f, 0xf9, - 0xd8, 0xde, 0x65, 0xfa, 0xca, 0x69, 0xff, 0xf4, 0xba, 0xb1, 0x31, 0xf7, - 0x87, 0xed, 0xf1, 0x46, 0x0a, 0xb2, 0xf7, 0xdc, 0x75, 0x97, 0xdc, 0x8d, - 0x42, 0xca, 0x83, 0x7d, 0xd1, 0xda, 0x87, 0x5c, 0x53, 0xb4, 0x2b, 0x64, - 0x72, 0x38, 0x51, 0xe5, 0x7e, 0xaa, 0x08, 0xe5, 0x7e, 0x54, 0x38, 0xe2, - 0xb7, 0x4e, 0xe6, 0x6c, 0xd2, 0xcb, 0xce, 0xa1, 0x94, 0x63, 0xbd, 0x84, - 0x00, 0x63, 0x52, 0xde, 0x4e, 0x22, 0xfd, 0xff, 0xf1, 0x96, 0x36, 0x04, - 0x20, 0xc8, 0xb1, 0xab, 0x2f, 0xc4, 0x19, 0x67, 0x16, 0x5f, 0xf6, 0x0f, - 0xd1, 0xdf, 0x47, 0x16, 0x5c, 0x33, 0xc3, 0xdf, 0x22, 0x7b, 0xfe, 0xd6, - 0xa0, 0x1e, 0xf9, 0xf7, 0x56, 0x5e, 0x28, 0xe2, 0xcb, 0xec, 0x2c, 0x6a, - 0xca, 0x59, 0x50, 0x78, 0xd2, 0x1b, 0x09, 0x05, 0xfc, 0x00, 0xb8, 0xdb, - 0x0b, 0x2f, 0xfb, 0xc7, 0x2f, 0x3c, 0x8d, 0xab, 0x2f, 0xfd, 0xc3, 0x2f, - 0xa5, 0xd3, 0xe1, 0xac, 0xac, 0x3f, 0x6e, 0x9c, 0x5f, 0xcf, 0xdf, 0x40, - 0x59, 0x6b, 0x2f, 0xfc, 0x6d, 0xc1, 0xf8, 0xf8, 0x58, 0xb2, 0xf9, 0xb0, - 0x38, 0x59, 0x44, 0x7b, 0xbc, 0x3c, 0xa9, 0x2a, 0xfb, 0xc8, 0x56, 0x19, - 0x5c, 0xd0, 0x83, 0xd1, 0x73, 0x61, 0x46, 0x44, 0x3d, 0x84, 0x75, 0xf7, - 0xb3, 0xf7, 0x59, 0x7c, 0x51, 0xa9, 0x2c, 0xbf, 0xef, 0x44, 0x8c, 0x88, - 0x3f, 0x2c, 0xbf, 0xe8, 0x91, 0xf6, 0x50, 0x5f, 0xac, 0xbf, 0xe8, 0xce, - 0x89, 0xff, 0xf1, 0xf2, 0xcb, 0xd8, 0x4c, 0x2c, 0xb6, 0xa1, 0x1d, 0x38, - 0x43, 0xa3, 0x86, 0x9c, 0x32, 0xcf, 0x2f, 0xe2, 0x80, 0x6a, 0x24, 0xb2, - 0xff, 0xf3, 0x9f, 0x64, 0x12, 0xef, 0x3c, 0xf2, 0x58, 0x21, 0xac, 0xba, - 0x3c, 0xb2, 0xbc, 0x7e, 0x1b, 0xd6, 0xaf, 0xfd, 0xc1, 0x3a, 0x64, 0x19, - 0x67, 0x16, 0x5c, 0x3e, 0x2c, 0xad, 0xd3, 0xfa, 0xf1, 0x21, 0x1f, 0xdf, - 0xff, 0xd9, 0xf6, 0x71, 0xcb, 0xc7, 0x1d, 0xf0, 0x5d, 0xab, 0x2a, 0x72, - 0xaf, 0xd8, 0x8c, 0x2d, 0xe3, 0x68, 0x23, 0x1b, 0xcd, 0x3c, 0x59, 0x7e, - 0x0b, 0x4f, 0xd0, 0xb2, 0xfd, 0x9a, 0x04, 0x62, 0xca, 0x23, 0xcd, 0x10, - 0x9e, 0xff, 0xb1, 0xb9, 0xa3, 0xd9, 0xda, 0xb2, 0xfd, 0xd7, 0x76, 0xf1, - 0x65, 0xd9, 0xb2, 0xcb, 0xfe, 0x28, 0xfa, 0x7d, 0x8e, 0xe7, 0x96, 0x5d, - 0xd9, 0xf5, 0x96, 0x76, 0x9e, 0xb9, 0x1e, 0xdf, 0xff, 0x9c, 0xba, 0xef, - 0xe2, 0x8e, 0xf0, 0x5c, 0xf2, 0xcb, 0xfc, 0x26, 0xb3, 0x7c, 0x14, 0x96, - 0x5f, 0xfc, 0xde, 0x3c, 0xb5, 0x1c, 0x82, 0xd9, 0x65, 0xff, 0x47, 0x7d, - 0x8d, 0xcd, 0x62, 0xcb, 0xf7, 0x7c, 0x71, 0xc5, 0x97, 0xb6, 0x72, 0xd1, - 0xef, 0x70, 0xde, 0xff, 0xa3, 0xfe, 0x0c, 0x2f, 0xa9, 0x2c, 0xbd, 0xae, - 0x71, 0x71, 0x01, 0xaf, 0x80, 0xee, 0x05, 0x44, 0x06, 0x66, 0x6a, 0xad, - 0x92, 0x45, 0x26, 0x99, 0x2f, 0xfa, 0x3c, 0x03, 0xe3, 0x9e, 0xcb, 0x2d, - 0x13, 0x8f, 0x83, 0x45, 0x17, 0x9a, 0xf2, 0x59, 0x5e, 0x3c, 0x5f, 0xca, - 0x6e, 0x7f, 0xd6, 0x54, 0x1b, 0xae, 0x91, 0xd8, 0x0b, 0x2b, 0x46, 0xc4, - 0x88, 0x2b, 0x15, 0x54, 0xbc, 0x28, 0x84, 0x8f, 0x9e, 0x86, 0xb8, 0xc1, - 0xf1, 0xc6, 0x89, 0xfc, 0xdd, 0xf9, 0x31, 0x29, 0xf6, 0x56, 0xf5, 0xf0, - 0xfd, 0x13, 0xeb, 0x2f, 0xff, 0xe3, 0x19, 0x67, 0x23, 0x53, 0xb9, 0xe7, - 0x1c, 0x0d, 0x65, 0xed, 0xf1, 0xe5, 0x95, 0x0b, 0xbe, 0xf8, 0xd0, 0x73, - 0x90, 0x4e, 0xdf, 0xc2, 0x51, 0x16, 0xef, 0xf8, 0xb6, 0xe4, 0x35, 0xfe, - 0xea, 0xcb, 0x9f, 0xe5, 0x97, 0xbc, 0xfb, 0xab, 0x2f, 0xa3, 0xf9, 0xfc, - 0x59, 0x7c, 0xd6, 0xbf, 0x56, 0x56, 0x22, 0xdd, 0xa7, 0x5f, 0x8b, 0xf4, - 0x7c, 0x42, 0x5b, 0xfb, 0x37, 0x1d, 0xfd, 0xc5, 0x97, 0xff, 0x67, 0x3a, - 0xff, 0x09, 0xb9, 0x05, 0x25, 0x97, 0xff, 0xf8, 0xc3, 0xb4, 0xce, 0xfb, - 0x77, 0x26, 0x28, 0x6f, 0x9d, 0x65, 0xfe, 0x2d, 0x86, 0x7a, 0x8d, 0xeb, - 0x2f, 0x8b, 0xbf, 0x85, 0x65, 0xf9, 0xac, 0x86, 0x43, 0x22, 0x7a, 0x59, - 0x7f, 0xff, 0x4b, 0x38, 0x7a, 0xd1, 0xb4, 0x4e, 0xfb, 0x05, 0xea, 0xca, - 0x84, 0x77, 0xe1, 0xa9, 0x91, 0xb9, 0xd5, 0xfb, 0x6f, 0x3f, 0xa1, 0x65, - 0xff, 0xa0, 0xfd, 0xec, 0xef, 0xb2, 0x4b, 0x2f, 0xf6, 0x14, 0xb3, 0x82, - 0x35, 0x65, 0xd8, 0x5a, 0x3f, 0x0e, 0x9e, 0xd3, 0xa3, 0x10, 0x58, 0x4c, - 0x5f, 0xfe, 0x96, 0x7d, 0x21, 0x23, 0xf6, 0x62, 0x8a, 0x2a, 0x4b, 0xf3, - 0x45, 0xc3, 0xde, 0xb2, 0xf4, 0xb0, 0xa6, 0x3f, 0xd1, 0x14, 0xea, 0x11, - 0xb2, 0xf0, 0xa5, 0xbf, 0xff, 0x3e, 0xa4, 0x3f, 0x47, 0x0b, 0x05, 0x7d, - 0x30, 0xb2, 0xa1, 0x71, 0x94, 0x69, 0x78, 0x5f, 0xa4, 0x8f, 0x46, 0xa2, - 0x51, 0xeb, 0x04, 0x9a, 0xff, 0x8c, 0xa5, 0xc6, 0x55, 0x9e, 0x99, 0x13, - 0xd2, 0xcb, 0xe9, 0xb9, 0x93, 0x2c, 0xbf, 0x7f, 0x1d, 0xcd, 0xd5, 0x97, - 0xfc, 0x39, 0xf3, 0x61, 0x88, 0x2e, 0xac, 0xbf, 0xb9, 0xad, 0x1c, 0xdc, - 0x59, 0x7f, 0xa3, 0x34, 0x07, 0x70, 0x2a, 0x20, 0x95, 0xff, 0x47, 0x73, - 0x40, 0x77, 0x02, 0xa2, 0xf9, 0x5f, 0x9c, 0x7e, 0x86, 0x16, 0x5f, 0xff, - 0xf6, 0x1e, 0xb0, 0x7e, 0x8f, 0xa5, 0xa8, 0xef, 0x04, 0x29, 0x2c, 0xbf, - 0xf1, 0x67, 0x7a, 0x7c, 0xee, 0x7e, 0xb2, 0xec, 0xe3, 0x25, 0x37, 0xe1, - 0x97, 0x80, 0xf9, 0xa8, 0x84, 0x51, 0xc6, 0x7a, 0xc5, 0x44, 0x25, 0x1d, - 0xdd, 0x12, 0xa7, 0x5d, 0xf2, 0x93, 0x2f, 0xfe, 0x8f, 0x1b, 0x19, 0xad, - 0x9a, 0x1f, 0x96, 0x5f, 0xf0, 0xf5, 0x8d, 0xc9, 0x38, 0xd6, 0x5f, 0xff, - 0x82, 0xfc, 0xc2, 0x07, 0x8c, 0x7e, 0xcf, 0xb7, 0x16, 0x56, 0x2b, 0x9d, - 0x39, 0x53, 0x3e, 0x2d, 0x74, 0x72, 0x38, 0xbf, 0x4b, 0x3f, 0x13, 0xab, - 0x2f, 0xef, 0x4f, 0xf8, 0xc1, 0xe5, 0x94, 0xe7, 0xb6, 0x12, 0xab, 0xf7, - 0xf1, 0x2e, 0x62, 0xcb, 0xff, 0xfa, 0x02, 0x0f, 0x46, 0xb3, 0x84, 0x17, - 0x93, 0x0e, 0xb2, 0xff, 0xdd, 0x86, 0xf2, 0x0f, 0x67, 0xea, 0xcb, 0xff, - 0x6c, 0xff, 0x4f, 0xe7, 0x49, 0xf7, 0xac, 0xbf, 0xfe, 0xce, 0xc1, 0x77, - 0x99, 0x8c, 0x30, 0xf2, 0x59, 0x7f, 0x31, 0x9d, 0xee, 0x0d, 0x65, 0xff, - 0xb0, 0x71, 0x28, 0xf6, 0x7e, 0xeb, 0x2f, 0xe7, 0x90, 0x64, 0xe3, 0x59, - 0x7f, 0xff, 0xde, 0x0b, 0xed, 0xa8, 0xf3, 0x9f, 0x39, 0x8c, 0x39, 0x7e, - 0xb2, 0xfc, 0x7b, 0x73, 0x8e, 0xb2, 0x86, 0x88, 0xff, 0x33, 0xde, 0x14, - 0x51, 0x52, 0x5f, 0xbd, 0x80, 0x7d, 0x24, 0x66, 0x68, 0x2f, 0xff, 0xf4, - 0xda, 0x8d, 0xf3, 0x98, 0x79, 0xc2, 0x4d, 0xc9, 0xd9, 0xf7, 0x56, 0x54, - 0x23, 0xaf, 0xa8, 0x62, 0x1c, 0xdf, 0xf7, 0x8c, 0x5e, 0xcd, 0xa8, 0xea, - 0xcb, 0xff, 0x1f, 0x43, 0x9d, 0x76, 0xe1, 0x2c, 0xb1, 0xc8, 0xfd, 0xf4, - 0x77, 0x5b, 0x2b, 0x73, 0x02, 0x26, 0x93, 0xda, 0x5d, 0xf9, 0xe9, 0x47, - 0x4f, 0xd8, 0x53, 0xd2, 0xca, 0x59, 0x74, 0xb8, 0x29, 0x6d, 0xb8, 0x17, - 0x7f, 0xe6, 0xc7, 0xdc, 0x2c, 0xd8, 0x49, 0x2c, 0xbf, 0xff, 0xc7, 0xe7, - 0x2f, 0xa4, 0x24, 0xa0, 0xa4, 0xed, 0xc1, 0xac, 0xbf, 0xfd, 0x99, 0xe1, - 0xfa, 0x39, 0x9e, 0x3f, 0xd6, 0x5f, 0xa6, 0x94, 0x6b, 0x8b, 0x2f, 0xf6, - 0x10, 0x65, 0xcd, 0x9d, 0x65, 0x98, 0x9c, 0x7b, 0x83, 0x29, 0xbf, 0xf1, - 0xf7, 0x60, 0xf2, 0x76, 0xb5, 0x0b, 0x2a, 0x13, 0xe3, 0xd8, 0xc2, 0x48, - 0x23, 0x60, 0x38, 0x52, 0xf4, 0xae, 0xfa, 0x71, 0xf8, 0x2b, 0x2f, 0xd9, - 0x2f, 0x46, 0x96, 0x50, 0x0f, 0x2f, 0x74, 0x92, 0xfc, 0x7e, 0x62, 0x3e, - 0x59, 0x7e, 0xc1, 0x94, 0x7c, 0xb2, 0xdd, 0x83, 0xd0, 0x22, 0x9b, 0xff, - 0xff, 0xf7, 0xdd, 0x28, 0x6f, 0x07, 0xe8, 0xe6, 0x48, 0xd8, 0x61, 0xfa, - 0x50, 0xde, 0x2c, 0xbf, 0xfb, 0xbc, 0x79, 0x73, 0x01, 0x0d, 0x35, 0x97, - 0xff, 0xbe, 0x29, 0xc0, 0xf1, 0xff, 0xfc, 0x6a, 0x4b, 0x2a, 0x13, 0xb1, - 0x37, 0x57, 0x26, 0x0c, 0x21, 0x04, 0x43, 0xbf, 0xf6, 0xdf, 0x41, 0xb7, - 0x0b, 0x37, 0x56, 0x5f, 0xb6, 0xf4, 0x07, 0x16, 0x5f, 0xc7, 0xcc, 0x18, - 0x98, 0xb2, 0xfd, 0xb8, 0x65, 0x9b, 0xd6, 0x5f, 0xd8, 0x33, 0x08, 0x3c, - 0x03, 0xd8, 0x72, 0xdb, 0xfb, 0x92, 0x36, 0xbc, 0x96, 0x54, 0x23, 0xc3, - 0x50, 0x80, 0xfd, 0x0e, 0xff, 0x70, 0xb3, 0x7f, 0x9e, 0x4b, 0x2f, 0x72, - 0x5b, 0xd6, 0x51, 0x9e, 0x9e, 0xe9, 0xa5, 0xff, 0xe8, 0xd8, 0x4f, 0x47, - 0xdd, 0xcd, 0x88, 0x6b, 0x2b, 0x15, 0x15, 0x1c, 0x66, 0x2f, 0x08, 0x82, - 0x24, 0xbf, 0xf9, 0xe5, 0x83, 0x23, 0x7f, 0x43, 0x56, 0x5c, 0xfe, 0x59, - 0x5e, 0x3d, 0x7e, 0xa0, 0xdf, 0xe8, 0xc2, 0xeb, 0x24, 0x50, 0x2c, 0xbf, - 0xde, 0xcd, 0xf3, 0xb9, 0x20, 0x2c, 0xae, 0x1f, 0x7f, 0x4d, 0xeb, 0xa8, - 0xb3, 0x0c, 0x24, 0x6f, 0xff, 0xe2, 0xfc, 0xb3, 0xbe, 0xcf, 0x13, 0xfd, - 0x23, 0xc5, 0x97, 0xf1, 0x4e, 0x13, 0x5e, 0x75, 0x97, 0xfe, 0x0b, 0xca, - 0x74, 0x18, 0xf1, 0xab, 0x28, 0xd1, 0x90, 0xeb, 0x24, 0x61, 0x7f, 0xed, - 0x1f, 0xfb, 0x7a, 0x38, 0x1e, 0x2c, 0xbf, 0x66, 0x9f, 0xe1, 0x56, 0x5a, - 0x4b, 0x2f, 0xff, 0xc2, 0x96, 0x0f, 0x46, 0x1d, 0x87, 0xe8, 0x2d, 0x96, - 0x5b, 0x68, 0x3e, 0x8c, 0x11, 0xad, 0x91, 0x71, 0xc8, 0x48, 0xdf, 0xe9, - 0x89, 0xc5, 0xee, 0x79, 0x65, 0xef, 0x60, 0x16, 0x5e, 0x14, 0x51, 0x52, - 0x5f, 0xdf, 0xc1, 0x67, 0xdd, 0x48, 0xcc, 0xd0, 0x54, 0xe4, 0x58, 0x4f, - 0x9a, 0x08, 0x79, 0x7f, 0xff, 0x32, 0xe7, 0x03, 0xc6, 0x31, 0xe0, 0xb3, - 0xbb, 0xcc, 0xd9, 0x65, 0x79, 0x13, 0x81, 0x36, 0xa8, 0x55, 0x22, 0x70, - 0xf9, 0x78, 0xdd, 0x6f, 0xf8, 0x48, 0xe6, 0x0a, 0x21, 0x75, 0x65, 0x6c, - 0xda, 0xcb, 0xca, 0x5f, 0x58, 0xe1, 0x55, 0x84, 0x20, 0x28, 0xf9, 0x68, - 0xe5, 0xd8, 0xea, 0x53, 0x5b, 0x65, 0x2c, 0x7a, 0x53, 0xc1, 0x46, 0xa1, - 0xc8, 0x78, 0x76, 0x55, 0xf0, 0x87, 0x57, 0xfe, 0xc3, 0x2d, 0x9c, 0xbb, - 0x8d, 0x59, 0x7f, 0xf3, 0x02, 0x74, 0xf8, 0x59, 0xbc, 0xc6, 0xb2, 0xfe, - 0x2c, 0x1f, 0x9c, 0x55, 0x95, 0xa3, 0xf4, 0x6a, 0x3d, 0xe2, 0x76, 0xac, - 0xbf, 0x87, 0xec, 0xec, 0xfe, 0x2c, 0xb1, 0xf8, 0xf2, 0xc5, 0x1b, 0xa8, - 0x44, 0xaf, 0x9b, 0x6f, 0x89, 0xfe, 0xea, 0xcb, 0xd8, 0x5f, 0xac, 0xbe, - 0xce, 0xcd, 0x25, 0x97, 0xff, 0x6e, 0x14, 0x6e, 0x71, 0xc8, 0x4f, 0xf8, - 0xb2, 0xbc, 0x7d, 0xce, 0x47, 0x7f, 0xec, 0xec, 0x6b, 0x9e, 0x82, 0xea, - 0xe2, 0x08, 0x5f, 0xd9, 0xa0, 0x3b, 0x81, 0x51, 0x04, 0x19, 0x9e, 0x55, - 0xe8, 0x19, 0xac, 0xa8, 0x3e, 0x7e, 0x26, 0x5d, 0xbc, 0x6b, 0x2f, 0x6f, - 0x86, 0xac, 0xbe, 0xfb, 0x99, 0xa5, 0x97, 0xed, 0xb3, 0x51, 0x25, 0x97, - 0xda, 0xd1, 0x8a, 0xb2, 0x9a, 0x79, 0x7e, 0x28, 0xa8, 0x44, 0x83, 0xb7, - 0x5f, 0xdb, 0xa3, 0x15, 0xca, 0x4b, 0x2b, 0x64, 0xc6, 0x70, 0x64, 0xa1, - 0x5c, 0x12, 0x1b, 0xff, 0xd3, 0x48, 0xcb, 0xb1, 0xfc, 0xc4, 0x73, 0x2c, - 0xb8, 0xa6, 0x59, 0x68, 0x19, 0xf1, 0xe2, 0x65, 0x6c, 0xae, 0x0d, 0x82, - 0x2f, 0x42, 0x2b, 0xf8, 0x69, 0x14, 0x67, 0x5b, 0xe1, 0x4b, 0x7e, 0xf1, - 0xc6, 0xbf, 0x59, 0x7f, 0xd9, 0xaf, 0x1e, 0x8b, 0x36, 0x59, 0x7f, 0x7b, - 0x3b, 0xd3, 0x6a, 0xcb, 0xff, 0xb8, 0x32, 0x3d, 0x84, 0xd1, 0x46, 0x2c, - 0xbf, 0xba, 0x26, 0x79, 0xfe, 0x59, 0x5f, 0x22, 0x83, 0xc5, 0xa4, 0x89, - 0x7f, 0xc5, 0xb6, 0x6b, 0xf2, 0x0f, 0xeb, 0x2f, 0xec, 0xfb, 0xba, 0xd4, - 0x2c, 0xbf, 0xfb, 0x84, 0xfd, 0x76, 0x89, 0x1b, 0x62, 0xca, 0x19, 0xf9, - 0x70, 0xba, 0xa1, 0x1f, 0xe6, 0x60, 0x18, 0x56, 0xdf, 0xd8, 0x01, 0x37, - 0xfb, 0x16, 0x5f, 0xb7, 0x8f, 0xd1, 0xc5, 0x96, 0x6a, 0xcb, 0xfd, 0x1d, - 0x1f, 0x82, 0xfc, 0x58, 0x21, 0x63, 0x7f, 0xdb, 0x3c, 0xa0, 0xbb, 0x3f, - 0x8b, 0x2f, 0xff, 0xc4, 0x3d, 0x60, 0x3d, 0x1e, 0xcd, 0x6a, 0x18, 0x59, - 0x50, 0x89, 0x03, 0x3b, 0xba, 0x18, 0x59, 0x7f, 0xb3, 0x47, 0xfb, 0x5e, - 0x4b, 0x2e, 0x32, 0x59, 0x61, 0x56, 0x50, 0xcd, 0x38, 0x82, 0xb7, 0x88, - 0x3b, 0x2c, 0xbd, 0xb1, 0x42, 0xcb, 0xf7, 0x9e, 0x58, 0x4b, 0x2f, 0xe3, - 0xe9, 0x67, 0x8d, 0x65, 0xbd, 0x38, 0xf4, 0x60, 0x9a, 0xff, 0xa3, 0x9e, - 0x3d, 0x69, 0xe4, 0xb2, 0xb0, 0xf8, 0x48, 0xa6, 0xe7, 0x16, 0x72, 0x73, - 0xc3, 0x17, 0xc5, 0xaf, 0x11, 0x38, 0xef, 0x61, 0x9d, 0x7f, 0x46, 0xdd, - 0xe6, 0x75, 0x65, 0x42, 0xec, 0xf4, 0xa3, 0xd7, 0xc3, 0x33, 0x30, 0xd1, - 0xdf, 0xa1, 0xa6, 0x51, 0xdf, 0x8a, 0xd3, 0x7f, 0x70, 0xc6, 0x3c, 0x25, - 0x97, 0xff, 0xff, 0x67, 0x61, 0xa3, 0xce, 0xc6, 0x14, 0x8b, 0x3e, 0x94, - 0x67, 0x56, 0x5f, 0xff, 0xbd, 0x9c, 0xe6, 0x60, 0x75, 0xb6, 0x04, 0xba, - 0xb2, 0x89, 0x18, 0x7d, 0x6e, 0xbf, 0xef, 0x46, 0xba, 0x51, 0x9f, 0x2c, - 0xbf, 0xff, 0xe3, 0xda, 0x25, 0xcd, 0x68, 0xfe, 0x9a, 0x4f, 0xa6, 0xe7, - 0xcb, 0x2f, 0xf4, 0x3e, 0xcf, 0xa7, 0x11, 0x65, 0xef, 0x61, 0x0d, 0x1a, - 0xbe, 0x38, 0xeb, 0x55, 0x62, 0xa2, 0x63, 0x87, 0x7f, 0x61, 0xef, 0x7e, - 0x8d, 0x4d, 0xcd, 0x96, 0x5f, 0xf7, 0xa3, 0x35, 0x2e, 0x05, 0xab, 0x2b, - 0x63, 0xe3, 0x01, 0x55, 0xc7, 0xc5, 0x97, 0xfd, 0x9b, 0x3f, 0x7f, 0x10, - 0xa4, 0xb2, 0xfe, 0x7e, 0xce, 0x89, 0x30, 0xb2, 0xfe, 0x11, 0xbc, 0x15, - 0xfe, 0x59, 0x50, 0x9b, 0x96, 0x42, 0x75, 0x82, 0x3d, 0x0b, 0x39, 0xdf, - 0x4c, 0x2f, 0x6b, 0x3c, 0xb2, 0xf7, 0x0d, 0xab, 0x2b, 0x46, 0xe3, 0xa3, - 0x97, 0x1e, 0xcb, 0x2a, 0x0d, 0xc6, 0xe1, 0x0d, 0x99, 0x2b, 0x2f, 0xfc, - 0x70, 0x53, 0x9c, 0xa4, 0x6d, 0x59, 0x58, 0x7a, 0x5e, 0x15, 0xbe, 0x39, - 0x8c, 0x55, 0x97, 0xfe, 0x7f, 0x84, 0xe9, 0xea, 0x02, 0xcb, 0x59, 0x70, - 0x9b, 0x2c, 0xa6, 0x9e, 0xef, 0x51, 0x2e, 0xdf, 0xa5, 0x97, 0xff, 0xe0, - 0xec, 0x51, 0x9e, 0x67, 0x1d, 0xcf, 0x07, 0x4b, 0x2f, 0xbb, 0xc1, 0x39, - 0x39, 0x33, 0x31, 0x90, 0xe4, 0x20, 0x08, 0x88, 0x41, 0x9b, 0x88, 0x55, - 0x97, 0xee, 0x37, 0x3b, 0xc5, 0x97, 0xf7, 0xfa, 0x80, 0x61, 0x2c, 0xbf, - 0xf3, 0x19, 0xd3, 0xf6, 0x76, 0x34, 0xb2, 0xa0, 0xfa, 0xcc, 0xb6, 0xfc, - 0xf2, 0x23, 0x85, 0x97, 0xe7, 0x2e, 0xe1, 0x2c, 0xbf, 0xf3, 0x04, 0xfd, - 0xe6, 0x6f, 0xf1, 0xac, 0xa8, 0x3e, 0x57, 0x25, 0xbf, 0xf4, 0xc4, 0xe2, - 0xcd, 0x27, 0xd4, 0x96, 0x5f, 0xc7, 0xad, 0x46, 0x12, 0xcb, 0xfe, 0x89, - 0x73, 0x00, 0x51, 0xa5, 0x94, 0xc1, 0xf1, 0x68, 0xae, 0xc6, 0xb2, 0xfe, - 0xe1, 0xe8, 0x1e, 0xc5, 0x97, 0x89, 0xd8, 0xc3, 0xe0, 0x01, 0x1f, 0xc2, - 0x15, 0x25, 0xcc, 0x9c, 0x8e, 0xa0, 0x0d, 0x46, 0x2f, 0xa8, 0x49, 0xb4, - 0x80, 0xa1, 0x15, 0xc2, 0x00, 0xc6, 0x07, 0x7d, 0xf0, 0x0c, 0x6b, 0x2f, - 0xde, 0x39, 0xf3, 0x61, 0x65, 0xf6, 0x7e, 0x7b, 0xd6, 0x5f, 0x7f, 0xf8, - 0x7f, 0x59, 0x40, 0x3f, 0x52, 0x2b, 0x10, 0x92, 0xf8, 0x3a, 0xe9, 0xac, - 0xbf, 0x14, 0xb9, 0xb7, 0xeb, 0x2f, 0xff, 0xe9, 0x74, 0xe6, 0x07, 0x8f, - 0xee, 0x88, 0x59, 0xbf, 0x16, 0x5f, 0xfd, 0xfc, 0x71, 0xb0, 0x7a, 0xd1, - 0x8a, 0xb2, 0xf3, 0xbc, 0x96, 0x50, 0xd3, 0x0b, 0xc2, 0x2f, 0x8a, 0x8d, - 0x7f, 0xf4, 0x5b, 0xf3, 0x4f, 0xbd, 0x85, 0x97, 0x8f, 0x05, 0x59, 0x7c, - 0x7c, 0xc1, 0x99, 0xe1, 0x91, 0x3d, 0xfc, 0x5c, 0xc6, 0xc6, 0xea, 0xcb, - 0xed, 0xdf, 0x66, 0xcb, 0x2f, 0xf4, 0x0f, 0x3a, 0x7e, 0x0a, 0xca, 0x83, - 0xd8, 0x19, 0x35, 0xf3, 0x07, 0xf7, 0x16, 0x54, 0x23, 0x31, 0xb0, 0x87, - 0xe9, 0x0d, 0xff, 0xba, 0x27, 0xf0, 0x24, 0x7f, 0x1f, 0xac, 0xbf, 0x9f, - 0x86, 0x51, 0xc5, 0x97, 0x79, 0xd6, 0x5f, 0x82, 0x37, 0x2f, 0xfc, 0x78, - 0x2c, 0xb2, 0xbb, 0xff, 0xff, 0x35, 0xcb, 0xf9, 0x1f, 0x02, 0xdf, 0x1c, - 0x77, 0xc1, 0x76, 0xac, 0xbf, 0xfe, 0x20, 0xf6, 0x47, 0xff, 0x9c, 0xfa, - 0xed, 0x59, 0x74, 0xed, 0xd5, 0x97, 0xff, 0xe7, 0x3e, 0x98, 0xf0, 0x79, - 0xd3, 0x69, 0xe9, 0x65, 0xf4, 0xb9, 0x0d, 0x59, 0x7f, 0xfa, 0x00, 0x3c, - 0x13, 0xa7, 0xa8, 0x0b, 0x2d, 0x65, 0xe0, 0xe0, 0xd6, 0x5e, 0xd3, 0xf3, - 0x13, 0x49, 0xd2, 0x7f, 0x87, 0x1d, 0x48, 0x88, 0xa7, 0xd3, 0xad, 0xd9, - 0x2a, 0x61, 0x74, 0x30, 0xc7, 0x6b, 0x5f, 0x2b, 0x22, 0x39, 0x5c, 0xb7, - 0x4a, 0x16, 0x5f, 0xfe, 0xd8, 0x7e, 0x8f, 0x67, 0xdf, 0xe7, 0x78, 0xb2, - 0x9c, 0xf8, 0xc2, 0x2d, 0x50, 0xbe, 0xd0, 0x38, 0x4c, 0x64, 0x67, 0x40, - 0x84, 0x71, 0xc6, 0x04, 0xf2, 0xd5, 0x8a, 0x11, 0xf7, 0xb5, 0xa8, 0x59, - 0x7f, 0x6a, 0x36, 0x32, 0xea, 0xcb, 0x84, 0x6a, 0xcb, 0x99, 0x13, 0xd2, - 0xca, 0x19, 0xb8, 0xe0, 0xc5, 0xf8, 0xa0, 0x79, 0x32, 0xcb, 0xee, 0x07, - 0x4c, 0x2c, 0xbf, 0x47, 0xbb, 0x12, 0x59, 0x7c, 0x30, 0xf7, 0x90, 0x7e, - 0x5f, 0x13, 0xfe, 0x49, 0x7b, 0xc2, 0x69, 0x65, 0xfe, 0x82, 0x7f, 0x04, - 0xb6, 0x59, 0x7f, 0xfe, 0xf1, 0xeb, 0xcf, 0x04, 0xc3, 0xcc, 0xef, 0xb2, - 0xcb, 0xec, 0x3f, 0xf8, 0xb2, 0xf8, 0xf9, 0x12, 0xc3, 0xf7, 0xd2, 0xad, - 0xed, 0x87, 0x0b, 0x2f, 0x36, 0x3c, 0xb2, 0xf4, 0x49, 0x92, 0xb2, 0xdf, - 0xe1, 0xbc, 0x21, 0xcb, 0xfe, 0x8e, 0x47, 0x79, 0x85, 0x25, 0x97, 0xff, - 0xff, 0xb3, 0x6e, 0x43, 0x0f, 0xce, 0xcb, 0x18, 0x63, 0x3e, 0xee, 0xa3, - 0x3e, 0x59, 0x7e, 0x89, 0xda, 0x29, 0x2c, 0xaf, 0x23, 0x73, 0x86, 0xe1, - 0x7c, 0xbc, 0xcb, 0xf6, 0x2c, 0xa9, 0xed, 0x70, 0x14, 0x63, 0x98, 0xca, - 0x70, 0x93, 0x99, 0x21, 0xa3, 0xde, 0x85, 0x4b, 0x9b, 0x92, 0xcf, 0x63, - 0x02, 0x09, 0x85, 0xc2, 0x71, 0x65, 0xff, 0xbb, 0xcc, 0x99, 0xff, 0xe6, - 0x6c, 0xb2, 0xb4, 0x7b, 0x24, 0x31, 0x7e, 0xc1, 0x7a, 0x23, 0x56, 0x5f, - 0xff, 0xf7, 0x04, 0x8f, 0xc7, 0xe8, 0xd6, 0x11, 0xbc, 0xb9, 0x9d, 0x59, - 0x77, 0x36, 0x59, 0x7f, 0x14, 0x0b, 0xa8, 0x6a, 0xca, 0x19, 0xe2, 0xe0, - 0xc5, 0x69, 0x19, 0x9d, 0x85, 0x5d, 0xff, 0xa2, 0x5c, 0x0e, 0xbf, 0xcf, - 0x3a, 0xcb, 0xfd, 0xbf, 0x06, 0xe4, 0xfb, 0xd6, 0x5f, 0xf7, 0xa3, 0xee, - 0xc7, 0x9f, 0x75, 0x65, 0x2c, 0xa9, 0xc7, 0x8e, 0xca, 0xcf, 0x2d, 0xf2, - 0xcb, 0xb0, 0x55, 0x97, 0x77, 0xa6, 0x6a, 0x7a, 0x25, 0x50, 0x7f, 0xe6, - 0xa7, 0x7f, 0xe7, 0x20, 0x66, 0x80, 0xee, 0x05, 0x44, 0x22, 0xba, 0x5b, - 0x2c, 0xa8, 0x55, 0xf5, 0x84, 0x27, 0x0f, 0x66, 0x94, 0x39, 0xff, 0xf0, - 0xfb, 0x09, 0x06, 0xf4, 0x9b, 0xed, 0xb9, 0xfb, 0xac, 0xbf, 0xed, 0x38, - 0xf0, 0xf7, 0xbb, 0x56, 0x56, 0x1e, 0xee, 0x89, 0x2f, 0xff, 0xff, 0x7b, - 0x03, 0xa6, 0x3c, 0x7f, 0x47, 0x43, 0xe2, 0xcf, 0xba, 0x17, 0xe2, 0xcb, - 0xff, 0xb3, 0xe1, 0x3a, 0x64, 0x19, 0x67, 0x16, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0xb6, 0x27, 0x1c, 0x16, 0xd1, 0xa1, 0xe1, 0x67, 0x78, - 0x60, 0xc2, 0x13, 0x6c, 0xd4, 0x70, 0x9d, 0x8e, 0x61, 0xff, 0xf8, 0x7f, - 0x27, 0x1c, 0x16, 0xd1, 0xa5, 0x97, 0xe7, 0xdc, 0xcf, 0xba, 0xb2, 0xfe, - 0x91, 0x66, 0x05, 0x96, 0xb2, 0xff, 0x3f, 0x65, 0x9a, 0xce, 0x2c, 0xa8, - 0x4f, 0x73, 0x11, 0x7d, 0x18, 0x53, 0x95, 0x91, 0x85, 0xff, 0x9c, 0xb0, - 0xf4, 0x51, 0xf4, 0x96, 0x5f, 0xfd, 0xd7, 0x2d, 0xbe, 0x91, 0x46, 0x71, - 0x65, 0xff, 0xfa, 0x3f, 0x9a, 0x51, 0xb1, 0x3b, 0x1c, 0x28, 0x92, 0xcb, - 0xff, 0x09, 0x9e, 0x76, 0xb3, 0x14, 0x51, 0x56, 0x5f, 0xff, 0xb0, 0x1e, - 0x82, 0x19, 0x1e, 0xd8, 0x46, 0xc2, 0xcb, 0x3e, 0xc8, 0x98, 0x92, 0x2d, - 0x49, 0x31, 0x87, 0x87, 0x7d, 0xff, 0xfd, 0x31, 0x47, 0xfc, 0x07, 0x8f, - 0x53, 0x14, 0x7f, 0xc5, 0x97, 0xff, 0xf7, 0x79, 0x0c, 0x48, 0xfc, 0xe5, - 0xd9, 0x66, 0xb1, 0x65, 0xff, 0x8f, 0x98, 0x39, 0xcf, 0xfc, 0xfe, 0x2c, - 0xb8, 0x3b, 0xd6, 0x5f, 0xe8, 0x6f, 0xdd, 0x8c, 0xf9, 0x65, 0xff, 0xbc, - 0x7b, 0xfc, 0xf2, 0xd4, 0x30, 0xb2, 0xb1, 0x32, 0xb0, 0x2d, 0x69, 0x0f, - 0xc3, 0x3d, 0x34, 0xbf, 0x83, 0xd3, 0x09, 0x30, 0xb2, 0xfe, 0xc1, 0x70, - 0x83, 0xfa, 0xcb, 0xf4, 0xb3, 0xb1, 0xfa, 0xcb, 0xa1, 0xbb, 0x1e, 0xb7, - 0xc5, 0xd7, 0xff, 0xff, 0x7e, 0xd7, 0x97, 0x9c, 0xfa, 0x63, 0xc1, 0xe7, - 0x4d, 0xa7, 0xa5, 0x95, 0xc4, 0x4f, 0x84, 0xbe, 0xff, 0xfc, 0x59, 0xcc, - 0xf3, 0xee, 0x03, 0xc6, 0xd8, 0x02, 0xcb, 0xf6, 0xcd, 0x81, 0xc2, 0xca, - 0x92, 0xff, 0xd0, 0xe5, 0x2b, 0x01, 0x37, 0xe3, 0xc9, 0xa3, 0x5c, 0xd1, - 0x47, 0xa3, 0x89, 0xe2, 0x57, 0x63, 0x23, 0xde, 0x46, 0x22, 0xb5, 0xff, - 0xa1, 0x86, 0x20, 0xb3, 0xbe, 0x35, 0x97, 0xfa, 0x39, 0xc8, 0xdb, 0x05, - 0x59, 0x7f, 0xfc, 0x3e, 0x85, 0xfe, 0xef, 0xf8, 0x39, 0xde, 0x35, 0x97, - 0xff, 0xdb, 0xdf, 0xde, 0x31, 0xe7, 0x78, 0x12, 0xea, 0xcb, 0xfb, 0x1b, - 0x9e, 0x09, 0x2c, 0xa8, 0x3f, 0xdf, 0x28, 0xd0, 0xd3, 0x26, 0x73, 0x4e, - 0xc3, 0x46, 0xfb, 0x34, 0xc1, 0xac, 0xa8, 0x65, 0x47, 0xe5, 0x20, 0x6c, - 0xe1, 0x72, 0xf1, 0xb2, 0x04, 0xd6, 0xf0, 0xa2, 0x8a, 0x92, 0xff, 0xb3, - 0xf7, 0xd6, 0x6f, 0xc1, 0xa4, 0x66, 0x68, 0x2e, 0x14, 0x54, 0x97, 0x85, - 0x14, 0x54, 0x97, 0xf3, 0xec, 0x3f, 0x47, 0x12, 0x33, 0x34, 0x14, 0x48, - 0xc5, 0x15, 0x32, 0x7c, 0xe6, 0xfc, 0x03, 0x18, 0x8d, 0x48, 0xcc, 0xd9, - 0xde, 0x14, 0x51, 0x52, 0x5e, 0xe4, 0x69, 0x23, 0x33, 0x41, 0x7c, 0xe5, - 0xf7, 0x56, 0x5b, 0xf3, 0x45, 0x5f, 0x56, 0xc5, 0x2e, 0xba, 0x7e, 0x7a, - 0x59, 0x7e, 0x28, 0x93, 0x81, 0x65, 0xec, 0x98, 0xd6, 0x50, 0xcf, 0x08, - 0x42, 0x6b, 0xf7, 0x03, 0xb4, 0xf9, 0x2c, 0xbf, 0x0c, 0xf7, 0xc0, 0xd6, - 0x5f, 0x61, 0x66, 0xea, 0xca, 0xd1, 0xe6, 0x34, 0xa6, 0x8d, 0x13, 0x42, - 0x3c, 0x5f, 0xfd, 0xe7, 0x91, 0x3b, 0x13, 0x11, 0xcc, 0xb2, 0xff, 0xb6, - 0x8f, 0xb8, 0x65, 0x9f, 0xac, 0xbe, 0x79, 0x1f, 0xeb, 0x2b, 0x47, 0xb9, - 0xe3, 0xab, 0xf6, 0x6c, 0xdc, 0x6a, 0xcb, 0xfa, 0x36, 0x1f, 0xa3, 0x8b, - 0x2f, 0xf4, 0x60, 0x33, 0x79, 0x8d, 0x65, 0xb0, 0x07, 0xc2, 0x45, 0xd5, - 0x88, 0xd1, 0x22, 0x29, 0xf8, 0x44, 0xdf, 0xde, 0xcd, 0xf9, 0xde, 0x2c, - 0xa0, 0x27, 0xaf, 0xfc, 0x6e, 0x5d, 0x36, 0xa9, 0x2b, 0x50, 0xd3, 0x0f, - 0xa1, 0x7a, 0x51, 0xfd, 0x5f, 0x6d, 0xf8, 0x7f, 0x59, 0x76, 0xdd, 0x59, - 0x50, 0xb8, 0x1d, 0x92, 0xe1, 0xdd, 0x24, 0x89, 0xaf, 0xdb, 0x4f, 0xfb, - 0x00, 0xb2, 0xe6, 0x55, 0x9e, 0x96, 0x5e, 0xe4, 0x75, 0x65, 0xdf, 0x8a, - 0xb2, 0xdc, 0x98, 0xda, 0xb8, 0xe5, 0x62, 0x2a, 0xfe, 0x2c, 0xea, 0xc5, - 0xf8, 0x11, 0xe8, 0x6a, 0xcb, 0x9f, 0xab, 0x2f, 0xb7, 0x5c, 0xbf, 0xc3, - 0x7a, 0x44, 0xf7, 0xff, 0x86, 0xe5, 0xf9, 0x3b, 0x8f, 0xa1, 0x75, 0x95, - 0x88, 0x81, 0x09, 0xcd, 0xff, 0x41, 0x48, 0x87, 0xe8, 0xd9, 0x65, 0xfc, - 0x3c, 0xd4, 0xfb, 0x46, 0xb2, 0xf7, 0x8e, 0x64, 0x95, 0xa3, 0xce, 0xe1, - 0x8d, 0xff, 0x3f, 0xdd, 0xc9, 0x83, 0xa6, 0x16, 0x58, 0x06, 0x7b, 0xc1, - 0x22, 0xbf, 0xc5, 0x9f, 0x4b, 0x86, 0xc2, 0xcb, 0xda, 0x0e, 0xcb, 0x2f, - 0x3e, 0x98, 0x59, 0x5a, 0x37, 0x6e, 0x3d, 0x66, 0x16, 0x5f, 0xfd, 0x80, - 0xf4, 0x7b, 0x35, 0xa8, 0x61, 0x65, 0xe3, 0xff, 0x90, 0x7a, 0xda, 0x12, - 0xa9, 0xc9, 0x8c, 0x6c, 0xde, 0x4e, 0xd7, 0xfd, 0x98, 0x0f, 0xe3, 0x3e, - 0x92, 0xcb, 0xff, 0xbb, 0xa0, 0xf3, 0xcf, 0x2f, 0xcc, 0x6b, 0x2f, 0xa1, - 0xdb, 0xbd, 0x25, 0xff, 0xde, 0x37, 0xff, 0xf8, 0xfe, 0x3d, 0xc5, 0x97, - 0xf7, 0xb1, 0xad, 0x79, 0x2c, 0xbc, 0x28, 0xa2, 0xa4, 0xbf, 0xc5, 0xdf, - 0x1c, 0x16, 0xc9, 0x19, 0x9a, 0x0b, 0xd1, 0xfe, 0x49, 0x12, 0x38, 0x9b, - 0x5d, 0x4c, 0x28, 0x48, 0x6b, 0xdf, 0xd9, 0x3b, 0xaf, 0xff, 0x16, 0x50, - 0x13, 0x87, 0x6c, 0x65, 0xbb, 0xca, 0xaf, 0xf9, 0xff, 0x2c, 0x9a, 0x51, - 0xf2, 0xca, 0x85, 0x48, 0x19, 0x1e, 0x69, 0x9c, 0xdf, 0xe7, 0x21, 0x34, - 0x41, 0x92, 0xcb, 0xff, 0xfa, 0x5e, 0x79, 0x03, 0xc7, 0xd9, 0x67, 0xbc, - 0xf2, 0x59, 0x7e, 0x8f, 0xe3, 0xdc, 0x59, 0x58, 0x88, 0x3f, 0xd6, 0xef, - 0xfe, 0x10, 0xa0, 0xc7, 0xec, 0x97, 0x8d, 0x65, 0xff, 0x84, 0x8d, 0x7f, - 0xdf, 0x38, 0xcd, 0x65, 0xfb, 0x5a, 0x3e, 0xf1, 0x65, 0x4e, 0x45, 0x58, - 0xd0, 0xc4, 0x40, 0xbf, 0xfe, 0xfe, 0x7f, 0x23, 0x9e, 0x8f, 0xba, 0xc0, - 0x74, 0xb2, 0xff, 0xdf, 0xcf, 0xe4, 0x48, 0xfa, 0x50, 0xb2, 0xa1, 0x19, - 0x38, 0x66, 0xea, 0xd7, 0xe8, 0x91, 0xcb, 0x8b, 0x2a, 0x19, 0x16, 0xb2, - 0x87, 0x73, 0x04, 0x5f, 0x43, 0x90, 0xe3, 0x3f, 0x98, 0xcf, 0xd2, 0x9e, - 0x5c, 0xd7, 0xf8, 0x5b, 0x14, 0x72, 0xfc, 0x2d, 0xbf, 0xff, 0xba, 0x6d, - 0xc2, 0xef, 0x21, 0x8e, 0x04, 0x7e, 0x35, 0x97, 0xef, 0xf0, 0xfc, 0xc2, - 0xcb, 0xff, 0xec, 0x04, 0x13, 0xf7, 0x83, 0x0b, 0xea, 0x4b, 0x2b, 0xe3, - 0xf7, 0x69, 0x4d, 0xfd, 0x04, 0x06, 0x44, 0xf1, 0x9e, 0x56, 0x5f, 0xa1, - 0xba, 0x8d, 0xeb, 0x2f, 0x4a, 0x09, 0x65, 0xff, 0xd0, 0x0e, 0x94, 0x0b, - 0x9d, 0xe7, 0x16, 0x5f, 0xf9, 0xfd, 0xa8, 0xe9, 0x80, 0xc6, 0xb2, 0xff, - 0xbb, 0xec, 0x3d, 0x48, 0x46, 0xac, 0xbb, 0x3f, 0x59, 0x5e, 0x44, 0x77, - 0x0f, 0x7a, 0x75, 0x5a, 0x4c, 0x0b, 0xf8, 0x69, 0x5f, 0xff, 0xfc, 0x4e, - 0xd8, 0xd0, 0x07, 0xe8, 0xe0, 0x5c, 0xe5, 0xcf, 0x3c, 0x96, 0x5e, 0x0f, - 0x78, 0xb2, 0xfc, 0x2b, 0xfa, 0x1a, 0xb2, 0xf0, 0x23, 0x8b, 0x2f, 0xfe, - 0x12, 0x59, 0xe7, 0xf1, 0xeb, 0x50, 0xb2, 0xa1, 0x11, 0x18, 0x51, 0xf8, - 0xe5, 0xfd, 0xec, 0x93, 0x97, 0xeb, 0x2f, 0x73, 0x7e, 0x2c, 0xba, 0x34, - 0xb2, 0xba, 0x6d, 0x27, 0xc7, 0xaf, 0xec, 0xdb, 0x9b, 0xa6, 0x05, 0x95, - 0x07, 0xaa, 0x44, 0x97, 0xe0, 0xe9, 0x8f, 0x1a, 0xca, 0x9c, 0xb9, 0xc9, - 0x10, 0xd2, 0x19, 0x18, 0x0f, 0x0c, 0xa7, 0x51, 0x8e, 0xb9, 0x57, 0xee, - 0x05, 0x0a, 0x5e, 0x17, 0xf6, 0x16, 0xd3, 0xe4, 0x16, 0x15, 0x65, 0xff, - 0x10, 0x5d, 0x8f, 0xdb, 0x12, 0x59, 0x5a, 0x3c, 0xcf, 0xc4, 0xaf, 0xf1, - 0x38, 0xb8, 0x4e, 0xc2, 0xcb, 0xff, 0xb3, 0xbc, 0x13, 0x8d, 0x28, 0xd4, - 0x2c, 0xbd, 0xbf, 0x08, 0x67, 0xec, 0xd3, 0x2b, 0xff, 0x85, 0x8d, 0x13, - 0xed, 0x1a, 0x89, 0x2c, 0xa3, 0x3f, 0x8f, 0x1a, 0x5f, 0xff, 0xef, 0x18, - 0xb9, 0xb8, 0x6d, 0x7e, 0xf0, 0x32, 0xcf, 0xba, 0xb2, 0xff, 0xed, 0x1f, - 0xe2, 0x7a, 0x1a, 0xef, 0xd5, 0x94, 0x34, 0x55, 0x69, 0x96, 0xa1, 0x3f, - 0xfc, 0x8c, 0x45, 0xe1, 0x97, 0x7f, 0xd3, 0x03, 0xc6, 0xd8, 0xd3, 0x0b, - 0x2f, 0xf1, 0xea, 0x6c, 0xec, 0x4c, 0xb2, 0xfd, 0xb9, 0xb8, 0x64, 0x05, - 0x97, 0xed, 0xa7, 0x06, 0x26, 0x59, 0x69, 0x2c, 0xbc, 0x21, 0x4c, 0xb2, - 0xa4, 0x6b, 0xff, 0x11, 0xac, 0x4c, 0x64, 0x07, 0x7a, 0x34, 0x72, 0xde, - 0x2d, 0xd4, 0x3f, 0x88, 0xce, 0xd2, 0xe0, 0xa5, 0x3c, 0x82, 0x39, 0xd7, - 0xbc, 0xad, 0x81, 0xd8, 0x87, 0xf0, 0x23, 0x45, 0x39, 0x74, 0xbb, 0xae, - 0x53, 0x4e, 0xe3, 0x6a, 0x70, 0x69, 0xb3, 0xb2, 0x9e, 0x9f, 0xfc, 0x79, - 0xc8, 0x9f, 0xe7, 0x00, 0x0a, 0x96, 0xd1, 0xc9, 0xe2, 0xfe, 0xd2, 0x68, - 0xc3, 0x3b, 0x44, 0x2c, 0xb0, 0xa1, 0x23, 0x52, 0xba, 0x1a, 0xb2, 0xf8, - 0x7e, 0xce, 0x2c, 0xbd, 0xb8, 0x7b, 0xd6, 0x5c, 0x7e, 0x59, 0x7d, 0x98, - 0x5d, 0x59, 0x74, 0x12, 0xca, 0xf1, 0xe5, 0xf0, 0x5b, 0x79, 0x05, 0xff, - 0xf6, 0x13, 0x3e, 0xb0, 0x7f, 0x73, 0xd9, 0xfb, 0xac, 0xa9, 0x22, 0x10, - 0x66, 0x37, 0x9d, 0xc5, 0x59, 0x77, 0xf0, 0xb2, 0xfc, 0x0c, 0xef, 0x8d, - 0x65, 0x9c, 0x67, 0xb4, 0x63, 0x84, 0x2f, 0x7f, 0xff, 0xd9, 0xe7, 0x13, - 0x98, 0xc3, 0x97, 0xf0, 0x51, 0x37, 0xa1, 0x65, 0xa1, 0x65, 0xff, 0xfa, - 0x35, 0xe8, 0x6e, 0xe0, 0x60, 0xa2, 0x6f, 0x42, 0xcb, 0xf1, 0xea, 0x68, - 0xf6, 0x91, 0x9b, 0xfb, 0x31, 0x08, 0x54, 0x95, 0x6d, 0xe1, 0x17, 0xd0, - 0xf0, 0x6b, 0xe8, 0x90, 0xff, 0xbf, 0x4d, 0xe8, 0xdb, 0x16, 0x5b, 0xcb, - 0x2a, 0x46, 0xe8, 0x65, 0x36, 0x65, 0x6b, 0x2f, 0xfd, 0xdf, 0x3c, 0xbb, - 0x31, 0x43, 0x56, 0x5f, 0xf9, 0xcb, 0xf9, 0xc3, 0x0b, 0xea, 0x4b, 0x2f, - 0x8c, 0xb6, 0x85, 0x97, 0xbb, 0xa8, 0x59, 0x7f, 0xc5, 0x0d, 0x32, 0xc6, - 0xc2, 0xcb, 0xde, 0x39, 0x2c, 0xb8, 0xc7, 0x87, 0xdb, 0x30, 0xe7, 0x4d, - 0x6b, 0x75, 0x30, 0x9d, 0x20, 0x94, 0x23, 0xaf, 0xfe, 0x2e, 0xf3, 0xcf, - 0x29, 0xd9, 0xf7, 0x56, 0x54, 0xf1, 0x4f, 0x7a, 0x05, 0xf2, 0x34, 0x80, - 0x9c, 0x5f, 0xf3, 0xee, 0xcd, 0xc8, 0xf3, 0xee, 0xac, 0xbf, 0xe1, 0x22, - 0x61, 0x23, 0x4f, 0x32, 0xcb, 0xd0, 0x5b, 0x2c, 0xbe, 0x3f, 0x1b, 0x56, - 0x51, 0x9b, 0xd9, 0x87, 0x2f, 0xfd, 0xde, 0x32, 0x44, 0x81, 0x7c, 0x12, - 0x59, 0x5e, 0x3e, 0x62, 0x21, 0xbd, 0xce, 0x9a, 0xcb, 0xa6, 0x0a, 0xcb, - 0xa0, 0x10, 0x6d, 0x08, 0x72, 0xff, 0xa3, 0xbe, 0x7f, 0xdf, 0xee, 0x2c, - 0xa1, 0x9f, 0x21, 0x15, 0x5f, 0xff, 0xe2, 0x0b, 0x83, 0x81, 0x73, 0x94, - 0x10, 0x33, 0xee, 0xac, 0xbf, 0xef, 0xe7, 0x78, 0xc0, 0x1d, 0x7e, 0xb2, - 0xf6, 0xe4, 0x6e, 0xac, 0xad, 0x1f, 0x06, 0xe1, 0xf5, 0xe9, 0x83, 0xa5, - 0x97, 0xb0, 0xfa, 0xb2, 0xff, 0x8f, 0x59, 0xf3, 0x31, 0x45, 0x15, 0x65, - 0x78, 0xf6, 0x9c, 0x6e, 0xa1, 0x17, 0xce, 0x4b, 0xc7, 0x8b, 0xff, 0xe2, - 0x89, 0x4e, 0x13, 0xa6, 0x41, 0x96, 0x71, 0x65, 0xff, 0xfb, 0xc1, 0xe3, - 0x63, 0xe0, 0x78, 0xda, 0x47, 0xb2, 0xca, 0x1a, 0xe0, 0x66, 0x43, 0x7c, - 0x10, 0xb9, 0x69, 0x0f, 0xa3, 0x7d, 0xfc, 0xbb, 0x8a, 0x37, 0x70, 0x2b, - 0x2f, 0xef, 0x1b, 0x40, 0x63, 0x59, 0x7b, 0xf7, 0x6a, 0xcb, 0xb3, 0xf5, - 0x95, 0x06, 0xd3, 0x07, 0x6f, 0x3e, 0x35, 0x65, 0xc5, 0x2d, 0x91, 0x65, - 0x82, 0xe4, 0xc3, 0xb8, 0x3f, 0x7d, 0x1e, 0x0e, 0x96, 0x5f, 0xdc, 0x2c, - 0x19, 0x3a, 0xca, 0x23, 0xcd, 0x14, 0x8a, 0xe0, 0x1a, 0xcb, 0xf1, 0x46, - 0xd1, 0xf2, 0xcb, 0x70, 0x06, 0xf8, 0xc5, 0xaa, 0x13, 0x1d, 0x38, 0x4b, - 0xbb, 0x05, 0xf7, 0x0a, 0x36, 0x59, 0x7f, 0xdb, 0x3f, 0x9c, 0x64, 0xe0, - 0x59, 0x5a, 0x3d, 0xa2, 0x22, 0xbf, 0xfe, 0x17, 0x01, 0xcc, 0xec, 0xd8, - 0xc1, 0x67, 0xeb, 0x2b, 0x0f, 0xcc, 0xc8, 0x6f, 0xfb, 0x05, 0xcd, 0x01, - 0xdc, 0x0a, 0x8c, 0x39, 0x7f, 0xf0, 0x78, 0x3f, 0x3b, 0x7e, 0x91, 0x92, - 0xcb, 0xf7, 0x7c, 0xe5, 0xfa, 0xca, 0xd9, 0x16, 0x5e, 0x45, 0x74, 0x5b, - 0xff, 0x3f, 0x72, 0x67, 0x82, 0x89, 0x96, 0x5f, 0xfb, 0xc7, 0x82, 0x64, - 0xc2, 0xc7, 0xcb, 0x2c, 0x7a, 0x45, 0x77, 0x8c, 0x38, 0x7b, 0x70, 0x00, - 0xa8, 0xc1, 0x15, 0x24, 0xf6, 0x41, 0x1c, 0x07, 0xe6, 0xb7, 0xfa, 0x7a, - 0xe0, 0xcb, 0x3c, 0xc9, 0x59, 0x76, 0x12, 0xca, 0x59, 0x7f, 0xf4, 0x10, - 0x33, 0xbe, 0x3d, 0x7e, 0x05, 0x94, 0x47, 0x9f, 0xd0, 0xbb, 0xe3, 0xe7, - 0x8d, 0x65, 0xec, 0xfb, 0xab, 0x28, 0x66, 0xf9, 0xa4, 0x37, 0xf1, 0x96, - 0x77, 0xc6, 0xb2, 0xd1, 0x87, 0x99, 0xc2, 0x1a, 0x1a, 0x66, 0xb8, 0xc8, - 0x18, 0x55, 0xdf, 0xfe, 0xf1, 0xcd, 0xe3, 0xfb, 0xa5, 0x9b, 0xdd, 0x65, - 0xff, 0xbc, 0x7b, 0xfd, 0x9a, 0xd1, 0xef, 0x59, 0x7f, 0xfb, 0x0b, 0xbc, - 0x86, 0x38, 0x11, 0xf8, 0xd6, 0x5f, 0xcd, 0xe7, 0x1c, 0xb6, 0x59, 0x73, - 0x5a, 0xb2, 0xa0, 0xf1, 0x5c, 0xba, 0xff, 0xbf, 0xe4, 0x8f, 0xce, 0x7b, - 0x2c, 0xbe, 0xe6, 0x17, 0x56, 0x5e, 0xdc, 0x8d, 0x2c, 0xa3, 0x3f, 0xa7, - 0x3a, 0x09, 0x0d, 0xef, 0x3f, 0x56, 0x5e, 0xeb, 0xee, 0xac, 0xbf, 0xdd, - 0xf1, 0xb3, 0xfd, 0xcd, 0x65, 0xfe, 0x63, 0xd1, 0x20, 0xbe, 0x96, 0x58, - 0x96, 0x51, 0x9e, 0x20, 0x4d, 0x2e, 0x13, 0x16, 0x56, 0xcb, 0x8e, 0xc3, - 0x8d, 0xc4, 0x06, 0xb3, 0x26, 0x35, 0x0b, 0xd0, 0x8f, 0x28, 0x4d, 0x70, - 0xb7, 0xa3, 0x81, 0x1f, 0x9f, 0x79, 0x10, 0x86, 0xfc, 0xc7, 0xe7, 0x37, - 0x16, 0x5f, 0x78, 0xde, 0x4b, 0x2f, 0x0d, 0xe4, 0xb2, 0xa0, 0xde, 0xe1, - 0x0d, 0x83, 0x08, 0x87, 0xfd, 0xa2, 0xff, 0xf4, 0xe2, 0x7e, 0xc6, 0x83, - 0x2d, 0x44, 0x96, 0x5f, 0xa3, 0xbe, 0x89, 0x96, 0x5d, 0xde, 0x2c, 0xbf, - 0x3b, 0x02, 0xc6, 0x96, 0x51, 0xa2, 0xcf, 0xc9, 0x6e, 0x50, 0x42, 0xf7, - 0xf8, 0xcb, 0xb2, 0xcd, 0x62, 0xcb, 0xff, 0x8c, 0x05, 0x8d, 0x89, 0x87, - 0x1b, 0x2c, 0xbf, 0xfa, 0x45, 0x8d, 0x72, 0xcf, 0x3b, 0x56, 0x5f, 0xec, - 0xec, 0x6f, 0x32, 0xfd, 0x65, 0xff, 0xf7, 0xed, 0x79, 0x4b, 0x3f, 0x13, - 0xbb, 0x70, 0x2b, 0x28, 0x08, 0x89, 0xd1, 0xa5, 0xfe, 0xd4, 0x18, 0xc9, - 0xe4, 0xb2, 0xff, 0xb3, 0x7c, 0x67, 0xdf, 0x75, 0x95, 0x56, 0x5f, 0xc1, - 0x8e, 0xf3, 0x0a, 0x71, 0xfa, 0x78, 0xc6, 0xfc, 0x0f, 0x7c, 0xfb, 0xab, - 0x2f, 0xf7, 0x22, 0x4c, 0x31, 0x9b, 0xab, 0x2f, 0xfc, 0x32, 0x0f, 0x79, - 0x05, 0x1c, 0x59, 0x50, 0x7e, 0xa6, 0x71, 0x66, 0x5a, 0xca, 0x92, 0xaf, - 0x10, 0x18, 0xfc, 0x88, 0x70, 0xca, 0x28, 0x4b, 0x85, 0x17, 0x7c, 0x28, - 0x45, 0x20, 0xbf, 0xf3, 0xeb, 0x37, 0xe0, 0xf4, 0x42, 0xac, 0xbf, 0xff, - 0x04, 0xa5, 0x85, 0xd3, 0x9f, 0xce, 0x93, 0xc9, 0x65, 0xfe, 0x8f, 0xe3, - 0xd9, 0xf4, 0x96, 0x51, 0xa2, 0x24, 0x95, 0x6b, 0xf4, 0x75, 0x76, 0x19, - 0x37, 0xd3, 0x3c, 0xce, 0xb2, 0xf9, 0xfa, 0x19, 0x2c, 0xa9, 0xc7, 0x8a, - 0x44, 0x77, 0xfd, 0xe7, 0x2c, 0x9a, 0x51, 0xf2, 0xcb, 0xff, 0xbc, 0x7a, - 0xce, 0x16, 0x6f, 0xf1, 0xac, 0xbf, 0x16, 0x70, 0x33, 0xb0, 0xff, 0x66, - 0x39, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x40, 0xcb, 0xf9, 0xf6, 0xfd, 0xc8, - 0x68, 0xac, 0x1e, 0xbd, 0x9c, 0x0e, 0x1f, 0x84, 0xf9, 0xa5, 0xef, 0x3c, - 0xa7, 0x23, 0x94, 0xa1, 0x61, 0x7f, 0xde, 0x3c, 0x2c, 0x00, 0xf1, 0x65, - 0x35, 0x53, 0x19, 0x37, 0x76, 0x38, 0x5d, 0xe7, 0x57, 0xba, 0x18, 0x59, - 0x7d, 0xfe, 0xb9, 0xc5, 0x97, 0xfb, 0xfe, 0x9e, 0xcd, 0x80, 0x2c, 0xaf, - 0x8f, 0xd5, 0xc7, 0x08, 0x92, 0xfc, 0x39, 0xe5, 0xc7, 0x3c, 0xac, 0xbf, - 0x81, 0xf7, 0xbe, 0x7d, 0xd5, 0x97, 0xfa, 0x34, 0xfa, 0xee, 0x01, 0x65, - 0xff, 0xc6, 0x39, 0xd9, 0x9f, 0x7e, 0xe5, 0xd5, 0x96, 0x94, 0x8f, 0xe3, - 0x86, 0x55, 0x08, 0xd3, 0x78, 0x55, 0xd4, 0x2e, 0xf2, 0xe4, 0xbd, 0x13, - 0x85, 0xdb, 0x97, 0x06, 0x30, 0x5b, 0x8e, 0x4b, 0x2f, 0xef, 0xba, 0x3c, - 0xc6, 0x16, 0x5f, 0x64, 0xc6, 0xd5, 0x94, 0x33, 0xe7, 0xc1, 0x61, 0x0b, - 0xed, 0x0b, 0x2f, 0xa0, 0x8f, 0xf5, 0x96, 0xcf, 0x1b, 0x1e, 0x88, 0x5f, - 0xed, 0x13, 0x8a, 0x27, 0xc2, 0xac, 0xbb, 0xfd, 0xeb, 0x28, 0x67, 0xa3, - 0xe3, 0x7b, 0xff, 0xc7, 0xf8, 0x3c, 0x7e, 0x28, 0xcd, 0x62, 0xcb, 0xfe, - 0xf8, 0x71, 0xc3, 0x1f, 0xa1, 0x65, 0xe7, 0xd6, 0xca, 0x8c, 0x15, 0x7f, - 0xe7, 0xd6, 0x17, 0xfc, 0xef, 0x3e, 0x59, 0x7f, 0xff, 0xff, 0x67, 0x7c, - 0xe4, 0xc4, 0xee, 0x69, 0xdf, 0xbb, 0xf0, 0x73, 0xb1, 0xae, 0x5f, 0x49, - 0x71, 0x05, 0xaf, 0xfc, 0xee, 0xc0, 0x1c, 0x73, 0x98, 0x15, 0x71, 0x05, - 0xaf, 0xfe, 0xf1, 0xf8, 0xe0, 0xbb, 0x39, 0x81, 0x57, 0x10, 0x5a, 0xff, - 0x41, 0x97, 0x67, 0x30, 0x2a, 0xe2, 0x0b, 0x5f, 0xcd, 0xc1, 0xce, 0x60, - 0x55, 0xc4, 0x16, 0xbf, 0xff, 0xe7, 0x22, 0x36, 0xce, 0xe0, 0x3c, 0x7a, - 0x36, 0x36, 0xc1, 0x57, 0x10, 0x5a, 0xef, 0xa7, 0x0d, 0x39, 0xc0, 0x28, - 0x69, 0x51, 0xd0, 0xc8, 0xfe, 0xa1, 0x56, 0x7f, 0x90, 0x0a, 0x51, 0xbd, - 0xfe, 0x38, 0x63, 0x9d, 0xe7, 0xcb, 0x2f, 0x9f, 0x5f, 0xba, 0xcb, 0xff, - 0xbc, 0x7e, 0x38, 0x2e, 0xce, 0x60, 0x55, 0xc4, 0x16, 0xbf, 0xe9, 0xb8, - 0x03, 0xda, 0x73, 0x02, 0xae, 0x20, 0xb5, 0xfb, 0xbc, 0x86, 0xce, 0x02, - 0x28, 0x44, 0x54, 0xbf, 0xfd, 0x38, 0x1e, 0x30, 0x47, 0x79, 0x39, 0x81, - 0x57, 0x10, 0x5a, 0xff, 0xff, 0xe2, 0x23, 0x6c, 0xe0, 0xe4, 0xee, 0x03, - 0xc7, 0xa3, 0x63, 0x6c, 0x15, 0x71, 0x05, 0xab, 0x13, 0x25, 0xf9, 0x0d, - 0xd7, 0xaf, 0xfb, 0xc7, 0xa3, 0x63, 0x6c, 0x15, 0x71, 0x05, 0xaf, 0xff, - 0x9d, 0xfe, 0x97, 0x3c, 0x63, 0x1c, 0x6a, 0x12, 0x5f, 0xfb, 0x25, 0x20, - 0xf3, 0x45, 0xb4, 0xfa, 0xe2, 0x0b, 0x50, 0x11, 0xcf, 0xa4, 0x8e, 0x27, - 0xdf, 0xf8, 0x07, 0xae, 0xbf, 0xfc, 0x9c, 0x2a, 0xe2, 0x0b, 0x5f, 0xde, - 0x3f, 0x78, 0xff, 0x54, 0x01, 0x6b, 0xf6, 0x7f, 0x39, 0x81, 0x57, 0x10, - 0x5a, 0xec, 0xe8, 0x0f, 0xd7, 0xc7, 0x75, 0xf2, 0x3c, 0xb9, 0x0c, 0x5b, - 0xf9, 0xb8, 0x39, 0xcc, 0x0a, 0xb8, 0x82, 0xd7, 0xfe, 0x07, 0x8f, 0x46, - 0xc6, 0xd8, 0x2a, 0xe2, 0x0b, 0x5d, 0x93, 0x9d, 0x11, 0xbc, 0x3f, 0xbf, - 0xc1, 0x36, 0xb9, 0x7d, 0x25, 0xc4, 0x16, 0xbf, 0xf6, 0x1e, 0xfc, 0x2c, - 0x1b, 0xc9, 0x71, 0x05, 0x9a, 0x78, 0x14, 0x35, 0xe0, 0xdd, 0x1b, 0xfe, - 0x6a, 0x51, 0xf4, 0x72, 0x31, 0x7e, 0xc6, 0x44, 0x18, 0x5b, 0x0a, 0xdf, - 0x77, 0xf0, 0xa8, 0x82, 0xcc, 0xd1, 0x19, 0x73, 0x81, 0x65, 0xb8, 0x36, - 0x50, 0xc8, 0x0e, 0x7f, 0xa4, 0xc9, 0x74, 0xe2, 0xe9, 0x6e, 0x2c, 0xbd, - 0x12, 0xdc, 0x59, 0x50, 0x6e, 0x48, 0x6a, 0xb6, 0x66, 0x01, 0x8d, 0x83, - 0xe7, 0x7d, 0x11, 0x7f, 0x4a, 0x61, 0x28, 0x45, 0x5f, 0xfd, 0x92, 0x2c, - 0xef, 0x8f, 0x3e, 0xea, 0xcb, 0xfd, 0x1e, 0x31, 0x7e, 0x97, 0x16, 0x5f, - 0xa3, 0xbc, 0xf1, 0xac, 0xbf, 0xf6, 0xb1, 0x8f, 0x63, 0x43, 0xad, 0x96, - 0x5f, 0xf7, 0xc5, 0x86, 0xdc, 0x2f, 0xd6, 0x5f, 0xff, 0xff, 0x9e, 0x62, - 0x71, 0x73, 0x79, 0xf3, 0xd9, 0xfc, 0xfe, 0x77, 0x8e, 0xdc, 0xfb, 0xab, - 0x2f, 0xd2, 0xef, 0x30, 0x96, 0x5f, 0xfe, 0x70, 0x41, 0x0c, 0xb3, 0x7e, - 0x8f, 0x8b, 0x2f, 0xfd, 0xc9, 0xa4, 0x11, 0xcd, 0x20, 0x8d, 0x65, 0x6c, - 0xa8, 0x46, 0x46, 0xa3, 0x27, 0xc4, 0x16, 0x0e, 0x3e, 0x84, 0x4f, 0x89, - 0xfa, 0x93, 0x7f, 0xd9, 0xd1, 0x70, 0x87, 0xe8, 0x59, 0x7f, 0xf4, 0x7d, - 0x21, 0x1b, 0xce, 0xc7, 0xc2, 0xac, 0xbf, 0x4b, 0x73, 0x70, 0x3b, 0x2c, - 0xb7, 0x8c, 0xfe, 0x5d, 0x26, 0xfb, 0xa5, 0x0d, 0x59, 0x7e, 0xd4, 0x7d, - 0x2e, 0x2c, 0xad, 0x93, 0x21, 0x94, 0x2c, 0x4c, 0x9b, 0x44, 0x37, 0x9a, - 0xfd, 0x59, 0x73, 0xf1, 0x65, 0xff, 0xf8, 0x84, 0xe9, 0x90, 0x65, 0x9c, - 0xff, 0xbd, 0xf9, 0x65, 0xff, 0x83, 0xc9, 0xfc, 0xd7, 0xed, 0x3e, 0x2c, - 0xbd, 0x9a, 0x61, 0x65, 0xff, 0xdb, 0xf7, 0xc7, 0x1f, 0xdf, 0x4b, 0x3a, - 0xb2, 0xb1, 0x30, 0x1f, 0xd6, 0x27, 0xd0, 0xc4, 0x1d, 0xbf, 0xdf, 0x87, - 0xa5, 0x1d, 0xe2, 0xca, 0x92, 0x75, 0x2c, 0x0e, 0x7f, 0x18, 0xbf, 0x10, - 0xaa, 0x15, 0xe6, 0xe4, 0x73, 0x6f, 0x1f, 0x65, 0xe6, 0x9f, 0x16, 0x5f, - 0xa5, 0x1b, 0xdf, 0xcb, 0x2b, 0x63, 0xc5, 0x71, 0xcb, 0xff, 0xb3, 0xee, - 0xf0, 0xca, 0x3f, 0x76, 0xac, 0xbf, 0xff, 0x67, 0x7c, 0x73, 0x98, 0x79, - 0xc5, 0x82, 0xbf, 0xeb, 0x2f, 0xf7, 0x1f, 0xc7, 0xc8, 0x92, 0xcb, 0xff, - 0x32, 0xf0, 0x8b, 0x04, 0x82, 0xfd, 0x65, 0xfe, 0xcf, 0x1f, 0x0c, 0x32, - 0x59, 0x5b, 0x26, 0x86, 0x48, 0x9d, 0x5a, 0x09, 0x96, 0xe2, 0x0d, 0xf7, - 0xdc, 0x8f, 0x96, 0x5f, 0xfa, 0x59, 0xf4, 0xb5, 0x1d, 0x7e, 0xac, 0xbc, - 0xd8, 0x92, 0xcb, 0xf6, 0x0f, 0xc1, 0x15, 0x65, 0x4e, 0x45, 0x44, 0xc4, - 0x8e, 0x7e, 0x43, 0x97, 0xfc, 0x0f, 0x18, 0xfd, 0x1d, 0xe2, 0xcb, 0xc3, - 0x7e, 0xac, 0xbf, 0xff, 0xc5, 0x1f, 0x77, 0xb9, 0x34, 0xb3, 0x6f, 0xa0, - 0xa3, 0x8b, 0x2f, 0xfd, 0xc8, 0x28, 0x97, 0x7d, 0x84, 0xb2, 0xb4, 0x99, - 0x8b, 0x4f, 0x9c, 0xe7, 0xf1, 0xce, 0x31, 0x5e, 0x39, 0xfc, 0x59, 0x7f, - 0x60, 0xbc, 0x3f, 0xba, 0xb2, 0xfe, 0xe1, 0x8f, 0x05, 0xe2, 0xcb, 0xf9, - 0xf4, 0xe3, 0x3c, 0x59, 0x76, 0xbf, 0x59, 0x76, 0x0a, 0xb2, 0x9c, 0xd7, - 0xf4, 0x62, 0xdf, 0x42, 0x3d, 0x76, 0x1e, 0xf8, 0xbf, 0xc5, 0xdd, 0x5a, - 0xbe, 0x17, 0x3c, 0xeb, 0x2f, 0x98, 0xd1, 0x8a, 0xb2, 0xfd, 0xb3, 0xfa, - 0x37, 0x56, 0x5f, 0xb6, 0xec, 0xfe, 0x75, 0x65, 0x4f, 0x47, 0xf7, 0x84, - 0x81, 0x2b, 0xbf, 0x98, 0xf4, 0x7d, 0xdc, 0x59, 0x7f, 0x8b, 0x07, 0xe8, - 0x14, 0x96, 0x54, 0x1f, 0x0e, 0x8b, 0xea, 0x17, 0x9c, 0x32, 0x36, 0x53, - 0x94, 0x4e, 0xf1, 0xa0, 0x7e, 0xa4, 0x50, 0x9d, 0x0c, 0x25, 0x2f, 0x8a, - 0x6e, 0x62, 0xcb, 0xf4, 0xb3, 0x6e, 0xc2, 0xcb, 0xff, 0x8a, 0x36, 0x6f, - 0x8f, 0x5a, 0x79, 0x2c, 0xa5, 0x94, 0x68, 0x99, 0x98, 0x88, 0x8a, 0x27, - 0xd1, 0x2f, 0xf6, 0xdb, 0x41, 0x7d, 0x9d, 0x59, 0x7e, 0x1e, 0x61, 0x01, - 0x65, 0xfb, 0xee, 0x93, 0xf9, 0x65, 0xd1, 0x32, 0xca, 0xd8, 0xf9, 0x64, - 0x4d, 0xf9, 0x45, 0x62, 0x61, 0x46, 0x7e, 0x18, 0x4d, 0x5f, 0xfd, 0xa2, - 0x0f, 0xdd, 0x2c, 0xd9, 0xc9, 0x65, 0xff, 0xfc, 0x3f, 0x07, 0x63, 0xcd, - 0x6b, 0x23, 0xe9, 0x1b, 0x56, 0x5f, 0xe7, 0x98, 0x83, 0xd2, 0x85, 0x97, - 0xf9, 0xc6, 0x27, 0x7a, 0x62, 0xac, 0xbc, 0xfa, 0xd9, 0x65, 0xdf, 0xc2, - 0xcb, 0xe3, 0x86, 0xe2, 0xca, 0x59, 0x7f, 0x3b, 0x1d, 0x8d, 0x7e, 0xb2, - 0x86, 0x6e, 0x88, 0x2e, 0xff, 0xff, 0x41, 0x8c, 0xa0, 0x20, 0xee, 0x00, - 0x70, 0x01, 0x1a, 0xb2, 0xef, 0xe1, 0x65, 0xd0, 0xc2, 0xcb, 0xfe, 0xce, - 0xf2, 0x1a, 0x26, 0x4c, 0xb2, 0xff, 0x73, 0x3c, 0x7c, 0x0e, 0xcb, 0x2e, - 0x14, 0x54, 0x97, 0xfc, 0x59, 0xbd, 0xe5, 0xc3, 0x1a, 0xca, 0x02, 0x7f, - 0x86, 0x3b, 0xa1, 0x76, 0xad, 0x78, 0x83, 0xf6, 0x06, 0x58, 0xb9, 0x0b, - 0xf0, 0xe8, 0x53, 0x41, 0x06, 0x6f, 0x0a, 0x28, 0xa9, 0x2c, 0xd4, 0x8c, - 0xcd, 0x05, 0xf4, 0xce, 0xfa, 0x48, 0xcd, 0x1c, 0x22, 0x42, 0xfa, 0xb6, - 0x5c, 0x2d, 0x02, 0x27, 0xcb, 0x9e, 0x32, 0x79, 0x62, 0x57, 0xf7, 0x63, - 0x3d, 0x9b, 0x2c, 0xbb, 0x1a, 0xb2, 0xbe, 0x3c, 0x3e, 0x16, 0xdc, 0x7c, - 0x59, 0x4c, 0x97, 0xc0, 0xa7, 0x89, 0x5e, 0x3b, 0x42, 0x46, 0x51, 0xff, - 0x8d, 0x23, 0x27, 0x12, 0xd8, 0x94, 0x8d, 0xf4, 0xad, 0x93, 0x9c, 0xae, - 0xd4, 0x68, 0x8d, 0x86, 0xe7, 0xa9, 0x22, 0x0f, 0x4c, 0xc5, 0xfd, 0xac, - 0xa7, 0x88, 0x79, 0x3d, 0xe1, 0xd9, 0x44, 0x61, 0x9c, 0x61, 0xdf, 0x09, - 0x89, 0xf2, 0x3b, 0x84, 0xea, 0xcb, 0xfb, 0x3f, 0xfc, 0xf5, 0x25, 0x97, - 0x03, 0x16, 0x50, 0xcf, 0x15, 0xcb, 0xef, 0xfd, 0x0d, 0x9f, 0x7d, 0xb0, - 0x66, 0x2a, 0xcb, 0xb0, 0x55, 0x97, 0x47, 0x56, 0x56, 0xc6, 0xb4, 0x02, - 0xf6, 0x6a, 0xca, 0x92, 0x28, 0xb1, 0xbf, 0xa4, 0x57, 0xfa, 0x46, 0x58, - 0xd0, 0xf9, 0x65, 0xfb, 0xce, 0x64, 0xeb, 0x2f, 0xfd, 0x9d, 0xe7, 0x8d, - 0xaf, 0x9a, 0x59, 0x50, 0x89, 0x46, 0x0c, 0x88, 0x96, 0xfd, 0x93, 0xb3, - 0xfe, 0xac, 0xbe, 0x9d, 0xd8, 0xde, 0xb2, 0xfd, 0x80, 0x86, 0x9a, 0xcb, - 0xec, 0x6e, 0x75, 0x65, 0xfd, 0xe8, 0x10, 0xe3, 0x65, 0x97, 0xfc, 0x7b, - 0xf5, 0x93, 0x67, 0xdd, 0x59, 0x40, 0x3e, 0xaf, 0x17, 0x5c, 0xec, 0x2c, - 0xad, 0x1b, 0x9e, 0x91, 0x5f, 0x3b, 0x5e, 0x65, 0x97, 0xe3, 0x81, 0x62, - 0x65, 0x97, 0xcf, 0xdf, 0xb8, 0xb2, 0x8c, 0xf2, 0xc8, 0xa2, 0xff, 0xff, - 0xcf, 0x30, 0x64, 0x10, 0x4e, 0xf1, 0xf7, 0xb1, 0xf4, 0x6d, 0x1c, 0x59, - 0x7e, 0x27, 0xdd, 0xda, 0x65, 0x97, 0xd3, 0x72, 0x3a, 0xb2, 0x80, 0x8c, - 0x09, 0x9c, 0x42, 0x59, 0x61, 0x56, 0x5f, 0xff, 0xe2, 0x77, 0xdf, 0x12, - 0xf4, 0x6b, 0x68, 0xef, 0x1e, 0x4b, 0x2f, 0xe8, 0x07, 0x78, 0xff, 0x2c, - 0xbe, 0xc6, 0xbf, 0xcb, 0x2b, 0x75, 0x16, 0x24, 0xc2, 0x21, 0x75, 0xe3, - 0xfa, 0x65, 0x97, 0xc1, 0x65, 0xb4, 0xd6, 0x5f, 0xb3, 0x36, 0x0f, 0x16, - 0x5f, 0x68, 0x8f, 0xf5, 0x97, 0xc6, 0x07, 0xd2, 0xcb, 0xa3, 0xf5, 0x97, - 0xc1, 0xd8, 0x2c, 0xfc, 0x6e, 0x04, 0x21, 0xa3, 0x44, 0xbf, 0x96, 0xad, - 0xfa, 0xcb, 0xb0, 0x0b, 0x2f, 0xd9, 0xad, 0x1e, 0x96, 0x56, 0xe9, 0xe7, - 0xf8, 0x4b, 0xf1, 0x6b, 0xf3, 0xc7, 0xd8, 0x05, 0x97, 0xfd, 0xe7, 0xe7, - 0x8f, 0x67, 0x25, 0x97, 0xcf, 0xb0, 0x92, 0x59, 0x4c, 0x96, 0x40, 0x5c, - 0xf6, 0xbb, 0x10, 0xc3, 0x94, 0x30, 0xc6, 0x5f, 0x85, 0x4c, 0x13, 0x7c, - 0x4c, 0x70, 0xc4, 0xdd, 0x21, 0x99, 0xb7, 0x50, 0xe0, 0xf1, 0x8b, 0xc3, - 0x0f, 0xf3, 0x36, 0x58, 0xf7, 0x09, 0xbb, 0x0b, 0xf0, 0xb8, 0x8a, 0x66, - 0x21, 0x3e, 0xe1, 0xc5, 0xfc, 0x41, 0x1b, 0x5e, 0x4b, 0x2f, 0x1e, 0xc1, - 0x59, 0x7e, 0x8f, 0xcf, 0xec, 0x59, 0x73, 0x42, 0xb2, 0xfc, 0xfd, 0xf0, - 0x49, 0x65, 0xcd, 0xde, 0xb2, 0xc3, 0x83, 0xff, 0x32, 0x8f, 0x0b, 0x91, - 0x3d, 0xff, 0xe9, 0x14, 0x4e, 0x69, 0x43, 0x1d, 0x3d, 0x96, 0x5f, 0x9d, - 0xb9, 0xe6, 0xac, 0xaf, 0x8f, 0xcf, 0xa9, 0x96, 0x15, 0x65, 0xee, 0xea, - 0x16, 0x5f, 0x66, 0xc2, 0x49, 0x65, 0xe1, 0x0b, 0xf5, 0x94, 0x47, 0x85, - 0xd2, 0x4b, 0xfb, 0xbb, 0xf0, 0xb0, 0x6b, 0x2a, 0x63, 0xcf, 0xe1, 0x0d, - 0xfd, 0x9c, 0xc9, 0x1e, 0x96, 0x5e, 0x0e, 0xee, 0xe2, 0xcb, 0x6f, 0x59, - 0x7f, 0xda, 0xf3, 0x88, 0xfe, 0x3f, 0xd6, 0x54, 0x1e, 0x69, 0x89, 0xdf, - 0xc6, 0x5b, 0x78, 0x3c, 0x59, 0x5e, 0x3c, 0xee, 0x90, 0x5f, 0x6b, 0x68, - 0xea, 0xcb, 0xdc, 0x96, 0xcb, 0x2b, 0x64, 0xc8, 0x72, 0x17, 0xce, 0x44, - 0x21, 0x1d, 0x42, 0xe0, 0x84, 0x8b, 0x72, 0x13, 0x87, 0x0b, 0x29, 0x88, - 0xda, 0x24, 0xf0, 0xad, 0x22, 0x3e, 0xc6, 0x9b, 0x79, 0xe7, 0x08, 0xb2, - 0xf4, 0xc7, 0xe5, 0x97, 0xf4, 0x69, 0xe6, 0x3f, 0x2c, 0xbf, 0x70, 0x70, - 0x5b, 0x39, 0xe5, 0x70, 0x76, 0xfe, 0xcd, 0xa3, 0xde, 0x85, 0x97, 0xec, - 0x9b, 0xd8, 0x4b, 0x2f, 0xe8, 0xc1, 0x08, 0x3f, 0xac, 0xad, 0x22, 0x0b, - 0xc5, 0xa4, 0x4f, 0x79, 0xb0, 0xd5, 0x95, 0xf2, 0x61, 0x7a, 0x86, 0x03, - 0x4b, 0xef, 0xff, 0x8a, 0x53, 0xb0, 0x67, 0xcf, 0xba, 0x17, 0xe2, 0xcb, - 0xf7, 0x82, 0x51, 0xbd, 0x65, 0xfc, 0x4f, 0xd9, 0x43, 0x0b, 0x2a, 0x0f, - 0x58, 0x42, 0x9b, 0xff, 0xdc, 0x8d, 0x03, 0xbc, 0x3e, 0xfb, 0x06, 0xb2, - 0xfb, 0x33, 0xe9, 0x2c, 0xbd, 0xc3, 0x99, 0x65, 0x98, 0x23, 0x7f, 0xc2, - 0x2b, 0xfe, 0xd1, 0xc7, 0x73, 0x7b, 0x8d, 0x65, 0xff, 0xb6, 0x28, 0xf8, - 0xc6, 0x51, 0xb2, 0xcb, 0xfd, 0xff, 0x3a, 0x50, 0xde, 0x2c, 0xbf, 0xcd, - 0x8f, 0x3f, 0x23, 0x75, 0x65, 0x41, 0xf4, 0xb9, 0xa5, 0x3a, 0x32, 0x0a, - 0x15, 0x14, 0x04, 0xf5, 0xf5, 0x08, 0x9f, 0x13, 0x94, 0x60, 0x37, 0xe9, - 0xde, 0x8d, 0x49, 0x65, 0x4e, 0x5c, 0xbe, 0x88, 0xdd, 0x30, 0xdc, 0x10, - 0xa8, 0x78, 0xfe, 0x45, 0x48, 0xbc, 0xde, 0x42, 0xcb, 0xfb, 0x69, 0xa5, - 0x3d, 0xeb, 0x65, 0x97, 0xcd, 0xc7, 0xf2, 0xcb, 0x6c, 0xb2, 0xfd, 0xdf, - 0x1b, 0x74, 0xb2, 0xa4, 0x6e, 0xb4, 0x25, 0x7b, 0xc3, 0x35, 0x97, 0xef, - 0x61, 0xcb, 0x8b, 0x2f, 0xff, 0xbd, 0x02, 0x33, 0xe9, 0x3f, 0xfc, 0xe4, - 0x7e, 0x92, 0xfd, 0x9d, 0x70, 0xb2, 0xd6, 0x5f, 0xb4, 0x07, 0x70, 0x2e, - 0x20, 0x45, 0xee, 0x47, 0xcb, 0x2f, 0x8f, 0x9a, 0x92, 0xcb, 0x7f, 0x87, - 0xe7, 0xf1, 0xa3, 0x47, 0x6f, 0x8b, 0x05, 0xdc, 0x59, 0x71, 0xec, 0xb2, - 0x8c, 0xde, 0x74, 0x96, 0xf0, 0x48, 0x0b, 0x2f, 0xb6, 0x27, 0x6a, 0xcb, - 0x9c, 0x96, 0x54, 0x1b, 0x7d, 0x88, 0xaa, 0x4a, 0x87, 0xc6, 0x4f, 0xf2, - 0xa6, 0xa1, 0x3c, 0xd7, 0x2f, 0x10, 0x75, 0x4e, 0xfe, 0x7d, 0x66, 0xfc, - 0x1a, 0xcb, 0xf0, 0x1d, 0x8f, 0x1a, 0xca, 0xfc, 0xf5, 0x88, 0xba, 0xf0, - 0xde, 0x4b, 0x2d, 0x25, 0x95, 0x06, 0xb7, 0x70, 0x72, 0xfb, 0xbb, 0x39, - 0x2c, 0xbc, 0xd8, 0x02, 0xcb, 0x9d, 0x85, 0x95, 0x86, 0xcc, 0x87, 0x2d, - 0x25, 0x97, 0xf6, 0x6c, 0x1e, 0xef, 0xea, 0xca, 0x83, 0xc2, 0x60, 0x46, - 0xff, 0x9e, 0x5a, 0x8d, 0x9f, 0x40, 0x59, 0x63, 0x59, 0x79, 0x83, 0xea, - 0xcb, 0xdc, 0x7e, 0xac, 0xa8, 0x3c, 0x96, 0x04, 0x3e, 0x1d, 0xba, 0x77, - 0x96, 0x5f, 0xcd, 0xe9, 0x8c, 0x30, 0xb2, 0xf3, 0x7a, 0x05, 0x96, 0xec, - 0x1e, 0x56, 0x16, 0xdf, 0xd0, 0xdc, 0x62, 0x38, 0xb2, 0xb6, 0x54, 0xc7, - 0x84, 0x60, 0x55, 0xd3, 0x0b, 0x48, 0xbd, 0x08, 0x2f, 0xcc, 0x09, 0x8f, - 0xa4, 0xd7, 0xcd, 0xcd, 0x62, 0xcb, 0xfe, 0xff, 0xd9, 0xf4, 0xba, 0x73, - 0x2c, 0xac, 0x3d, 0xd0, 0x90, 0xdd, 0x9b, 0x2c, 0xb0, 0x56, 0x50, 0xcd, - 0x46, 0x85, 0xef, 0xf1, 0x38, 0xbc, 0xe4, 0x7e, 0xb2, 0xf4, 0x3e, 0x96, - 0x5f, 0xfb, 0xce, 0x5d, 0xe1, 0x05, 0xc4, 0x59, 0x7f, 0xda, 0xd1, 0xfd, - 0x2e, 0xbf, 0xcb, 0x2f, 0x4f, 0xbb, 0x0b, 0x2f, 0xfa, 0x1b, 0x2c, 0xdb, - 0x02, 0xcb, 0x59, 0x7f, 0xd1, 0xf9, 0xcb, 0xc6, 0x5f, 0xac, 0xb6, 0xcb, - 0x2e, 0x7e, 0xe8, 0xf2, 0xd9, 0x67, 0x35, 0x88, 0xd9, 0x32, 0x07, 0x84, - 0x45, 0xe1, 0x60, 0x45, 0x97, 0x9c, 0x86, 0xba, 0xbe, 0x97, 0xd2, 0x0c, - 0x30, 0xb2, 0xdf, 0xac, 0xac, 0x36, 0xae, 0x47, 0x50, 0xaa, 0x38, 0x64, - 0x2c, 0x1a, 0x00, 0x6c, 0xcf, 0xb5, 0x18, 0xa7, 0x8c, 0xbf, 0x1e, 0xea, - 0xed, 0xfe, 0xef, 0xb2, 0x5e, 0x3d, 0xeb, 0x2f, 0x9b, 0xa0, 0xec, 0xb2, - 0xff, 0xf8, 0x8d, 0x86, 0x7c, 0xef, 0x82, 0xf2, 0x94, 0x2c, 0xa8, 0x3f, - 0x6c, 0x24, 0xbf, 0x7b, 0x3b, 0xc8, 0x59, 0x7e, 0x2e, 0x87, 0x3c, 0xb2, - 0xe9, 0xc1, 0x59, 0x50, 0x78, 0x1b, 0x13, 0xd6, 0xc9, 0xed, 0x4a, 0x10, - 0xcc, 0x42, 0xac, 0x04, 0x1a, 0x67, 0xbc, 0x37, 0x92, 0xcb, 0x8f, 0x4b, - 0x2b, 0x0d, 0x97, 0x87, 0x2f, 0xce, 0x44, 0x6d, 0x59, 0x7b, 0x37, 0x88, - 0xb2, 0xe3, 0xf2, 0xcb, 0xc3, 0x79, 0x2c, 0xbe, 0x76, 0xe3, 0x56, 0x5f, - 0x1b, 0x63, 0x75, 0x65, 0xc7, 0xa9, 0xc7, 0x8b, 0x84, 0x34, 0x34, 0x52, - 0xe0, 0xb7, 0x98, 0x6f, 0xc6, 0xd7, 0x2c, 0x59, 0x78, 0xe2, 0x4b, 0x2a, - 0x73, 0x38, 0x49, 0x90, 0x39, 0x06, 0xf2, 0x5b, 0x19, 0x0e, 0x4a, 0x3b, - 0x62, 0x18, 0x47, 0x2a, 0xcb, 0xd0, 0xe2, 0x79, 0xcb, 0x1f, 0xe1, 0x12, - 0x44, 0x1c, 0x25, 0x0c, 0x31, 0x27, 0xcb, 0xf7, 0x09, 0x6f, 0xfe, 0xec, - 0x1f, 0x9f, 0x50, 0xc6, 0x4c, 0xb2, 0xfc, 0x38, 0xf4, 0x08, 0xb2, 0x9c, - 0xfb, 0x02, 0x89, 0x7f, 0x67, 0xb0, 0x01, 0xc5, 0x97, 0x69, 0xab, 0x2f, - 0x8f, 0xb1, 0x25, 0x97, 0xf8, 0x2e, 0x72, 0x82, 0x02, 0xca, 0xc3, 0xe9, - 0xf0, 0xbf, 0x08, 0x6f, 0xfc, 0x7a, 0xf3, 0xf1, 0x8d, 0x74, 0x0b, 0x2f, - 0xc7, 0xd8, 0xef, 0x12, 0x5f, 0x02, 0x3b, 0xc4, 0x97, 0x0a, 0x2a, 0x4a, - 0x91, 0xf1, 0x61, 0x38, 0xa4, 0x54, 0x91, 0x99, 0xaf, 0xaf, 0x23, 0xb8, - 0x58, 0x68, 0xde, 0x72, 0xfd, 0x65, 0xe7, 0xf3, 0xac, 0xac, 0x3e, 0x06, - 0x0a, 0x7c, 0x39, 0x7d, 0x31, 0x38, 0xab, 0x2f, 0x4d, 0xe3, 0x59, 0x7f, - 0xfd, 0xd8, 0x06, 0x61, 0x77, 0xc7, 0x05, 0xb2, 0xcb, 0xff, 0xc2, 0xbf, - 0x3a, 0x7e, 0x3c, 0x60, 0xf4, 0xb2, 0x96, 0x56, 0x22, 0x8b, 0xc9, 0xbc, - 0x4a, 0xa1, 0xab, 0x72, 0x98, 0x85, 0xb0, 0x95, 0xfe, 0x37, 0xc2, 0x2f, - 0xe1, 0x18, 0xb0, 0xbf, 0xbf, 0xfc, 0x51, 0xf7, 0xf8, 0x51, 0x2d, 0x6a, - 0x16, 0x5f, 0xfb, 0xbc, 0xc0, 0x79, 0xcb, 0xbc, 0x59, 0x78, 0xcb, 0xf5, - 0x93, 0x8d, 0xf5, 0x35, 0x16, 0xbb, 0xe1, 0x0f, 0x7f, 0xfa, 0x18, 0x69, - 0xe3, 0x7b, 0xc0, 0x97, 0x56, 0x54, 0x1f, 0xa7, 0x8a, 0xaf, 0xe8, 0xf4, - 0x7a, 0x36, 0x59, 0x7b, 0xb0, 0x35, 0x97, 0xff, 0x48, 0xdf, 0xe9, 0x77, - 0x84, 0x6c, 0x2c, 0xa8, 0x3e, 0x1c, 0x1c, 0xad, 0x91, 0x5d, 0x28, 0x47, - 0x5c, 0xfc, 0x59, 0x6f, 0x41, 0xbf, 0x72, 0x9b, 0xf4, 0xbc, 0x18, 0xd2, - 0xcb, 0xfd, 0x1b, 0xcf, 0x79, 0x07, 0x8b, 0x2f, 0xe3, 0xe3, 0xfd, 0x2c, - 0x59, 0x73, 0xb7, 0x47, 0xc7, 0x3e, 0x6d, 0x7f, 0x8e, 0x3a, 0x50, 0xde, - 0x2c, 0xaf, 0x91, 0xd9, 0xe8, 0x45, 0x91, 0x85, 0xfb, 0x02, 0xd8, 0xe2, - 0xca, 0x59, 0x76, 0x4d, 0xa3, 0x65, 0xc2, 0x7b, 0xfe, 0x30, 0xb2, 0xfd, - 0x02, 0x16, 0xcb, 0x2f, 0xfa, 0x36, 0x8f, 0xba, 0x59, 0xb2, 0xcb, 0xdb, - 0x86, 0x2a, 0xca, 0xc4, 0x62, 0x80, 0xb4, 0xcf, 0xb7, 0x0e, 0xaf, 0xfe, - 0x13, 0x87, 0xc9, 0x8c, 0x78, 0x5f, 0xac, 0xbd, 0x22, 0x75, 0x97, 0xcf, - 0xdc, 0xd9, 0x65, 0xd1, 0xf2, 0xcb, 0x8a, 0x16, 0x59, 0xb0, 0x7d, 0x3e, - 0x1b, 0x22, 0x2e, 0x8b, 0xdf, 0xff, 0x82, 0xfb, 0xa2, 0x14, 0x79, 0xcf, - 0xb1, 0xde, 0x2c, 0xa1, 0xa6, 0x8c, 0xf0, 0xaf, 0x24, 0x0b, 0xe0, 0x1e, - 0xb1, 0x65, 0x4c, 0xac, 0x17, 0x51, 0x96, 0x7a, 0x38, 0x42, 0x34, 0xbe, - 0xcf, 0x66, 0xcb, 0x2f, 0x49, 0xf4, 0xb2, 0xfe, 0xfd, 0xaf, 0x2c, 0x1a, - 0xcb, 0x05, 0x65, 0xfb, 0x9e, 0x82, 0xea, 0xcb, 0x67, 0x0d, 0xc6, 0xf1, - 0x1b, 0xec, 0xee, 0x0d, 0x25, 0xff, 0x39, 0x31, 0x84, 0xfd, 0xe2, 0xcb, - 0xe7, 0x63, 0xf1, 0x56, 0x54, 0x8f, 0xf7, 0xc4, 0x24, 0x6f, 0x7d, 0x04, - 0x50, 0xb2, 0xa6, 0x4d, 0xd3, 0x43, 0x84, 0xcd, 0xd8, 0x52, 0x88, 0x5d, - 0x7f, 0x38, 0xaf, 0xd7, 0x61, 0x65, 0xf7, 0xfc, 0x6e, 0x96, 0x53, 0x0a, - 0x8e, 0x4e, 0x39, 0x6d, 0x28, 0xf4, 0xba, 0xff, 0xfe, 0xfa, 0x59, 0xd6, - 0x4c, 0xf7, 0x83, 0x0f, 0x4f, 0xb1, 0xa5, 0x97, 0xf7, 0x4f, 0x50, 0x16, - 0x5a, 0xcb, 0xb4, 0xfe, 0x44, 0xb0, 0x8c, 0xb7, 0xfb, 0x3d, 0x93, 0xbd, - 0x9b, 0x2c, 0xa7, 0x3e, 0x42, 0x2f, 0xbf, 0xfb, 0xa7, 0xb7, 0x78, 0x1d, - 0xde, 0xbf, 0x96, 0x5f, 0xff, 0x16, 0x74, 0xf0, 0xbd, 0x9d, 0xf1, 0x81, - 0x65, 0xff, 0x74, 0xdb, 0xcf, 0x40, 0x84, 0xb2, 0xff, 0xa0, 0x80, 0xfd, - 0x7f, 0xbf, 0x9c, 0x88, 0x5f, 0x93, 0x2a, 0x49, 0x91, 0x7f, 0x0c, 0xeb, - 0xf8, 0x2c, 0xb3, 0xd6, 0xb1, 0x65, 0xfe, 0xf6, 0x30, 0xf0, 0x73, 0xeb, - 0x2f, 0xf6, 0x73, 0x37, 0x7d, 0x03, 0x59, 0x74, 0x6c, 0xb2, 0xf7, 0xa2, - 0x65, 0x97, 0xfa, 0x0c, 0xb3, 0x61, 0x24, 0xb2, 0xdf, 0x0c, 0xf9, 0xf0, - 0x5f, 0xc3, 0xb7, 0xe7, 0x98, 0x8e, 0x65, 0x96, 0xe0, 0x13, 0x2e, 0xf1, - 0xa8, 0x61, 0x39, 0xbc, 0xd6, 0xfb, 0xac, 0x67, 0x96, 0x5d, 0xa9, 0x2c, - 0xbf, 0xf1, 0x67, 0x7a, 0x1d, 0xbb, 0x80, 0x59, 0x7e, 0x18, 0x5f, 0x52, - 0x59, 0x78, 0xb0, 0x55, 0x97, 0xcd, 0xe0, 0x8d, 0x59, 0x50, 0x78, 0x18, - 0x39, 0x6e, 0x2c, 0xb0, 0xab, 0x2e, 0x3f, 0xd6, 0x5f, 0x0a, 0xe5, 0x25, - 0x97, 0x0c, 0xd6, 0x5d, 0xe3, 0x59, 0x6e, 0x4e, 0x3e, 0x51, 0x8b, 0x80, - 0x8a, 0x61, 0x6a, 0x34, 0x5e, 0x05, 0xde, 0x9d, 0x1d, 0xff, 0xc3, 0x36, - 0xef, 0xe1, 0x65, 0xdf, 0xc2, 0xcb, 0xf0, 0x65, 0x84, 0xcc, 0xcd, 0x77, - 0xe2, 0xf5, 0x0a, 0xa1, 0x46, 0x46, 0xc0, 0xb9, 0x9f, 0xe9, 0xa3, 0xf8, - 0xc3, 0xc9, 0x5a, 0xff, 0xf1, 0x3f, 0xdc, 0x61, 0x87, 0x9c, 0x06, 0xfe, - 0xb2, 0xfa, 0x35, 0x1e, 0x59, 0x58, 0x7e, 0x2e, 0xa1, 0x7f, 0xd8, 0x7f, - 0x77, 0x51, 0x9f, 0x2c, 0xbf, 0xfb, 0xbe, 0xc6, 0x89, 0x1f, 0xe7, 0xdd, - 0x59, 0x7f, 0xbe, 0x01, 0xe8, 0x48, 0x1a, 0xcb, 0xef, 0xda, 0xf2, 0x9c, - 0x8d, 0x52, 0x20, 0xe1, 0xcf, 0x51, 0xee, 0x0f, 0x56, 0x5f, 0xdf, 0xb4, - 0x4e, 0x09, 0xb2, 0xcb, 0xfb, 0x86, 0x45, 0x1f, 0x2c, 0xbb, 0x3e, 0x59, - 0x5f, 0x1f, 0xb7, 0x4c, 0xe7, 0xcb, 0x2f, 0xff, 0x09, 0x02, 0xc4, 0xd2, - 0x72, 0xcf, 0xba, 0xb2, 0xfb, 0xfd, 0x1e, 0x96, 0x54, 0x27, 0x0b, 0x25, - 0x67, 0x84, 0x6f, 0x0c, 0xc5, 0x4c, 0xbf, 0xb9, 0xc8, 0x94, 0x69, 0x65, - 0xff, 0x6a, 0x1a, 0x73, 0x43, 0xee, 0xac, 0xac, 0x3e, 0x80, 0x16, 0xde, - 0x0f, 0xdd, 0x59, 0x67, 0x59, 0x74, 0xdc, 0x59, 0x44, 0x7c, 0xfc, 0x21, - 0xe8, 0xf0, 0x82, 0x17, 0x60, 0xab, 0x2f, 0xfa, 0x3e, 0xcf, 0xe3, 0x7e, - 0x6c, 0xb2, 0xfe, 0x2c, 0xef, 0x1f, 0xf5, 0x95, 0xa4, 0x40, 0x7e, 0x2f, - 0xc3, 0xcb, 0xfc, 0x5b, 0x1e, 0xbe, 0xf6, 0xcb, 0x2f, 0xfa, 0x36, 0xe6, - 0xb0, 0x11, 0xb2, 0xcb, 0xfd, 0x85, 0xb6, 0x0d, 0xfc, 0xb2, 0xa6, 0x3e, - 0xc1, 0x4e, 0xaf, 0xec, 0x6e, 0x0c, 0xc5, 0x59, 0x73, 0x61, 0x65, 0x34, - 0xf0, 0xdc, 0xb6, 0xfd, 0x93, 0x78, 0xfa, 0xb2, 0xff, 0xfe, 0xc2, 0x76, - 0x26, 0x8c, 0xec, 0x36, 0x3d, 0x1f, 0xac, 0xa2, 0x44, 0x17, 0x0a, 0x2f, - 0xb3, 0x3d, 0xc5, 0x95, 0x09, 0xf7, 0xe4, 0x28, 0x9d, 0x9f, 0xb0, 0xa3, - 0xdc, 0x22, 0xbc, 0x28, 0xa2, 0xa4, 0xbf, 0x63, 0x04, 0x1e, 0x24, 0x66, - 0x68, 0x2f, 0x99, 0x8a, 0x28, 0xab, 0x2e, 0xcf, 0xd6, 0x56, 0x1b, 0xfe, - 0x94, 0x54, 0x22, 0x67, 0xaf, 0x37, 0xff, 0xc7, 0x27, 0xe3, 0x5a, 0xf2, - 0x76, 0x3c, 0x6b, 0x2f, 0x8f, 0x5f, 0xf1, 0x65, 0xff, 0x82, 0xcb, 0xc9, - 0xf2, 0xc1, 0x5f, 0xf5, 0x97, 0xff, 0x6d, 0x1f, 0xc4, 0xa3, 0x5a, 0xc1, - 0x56, 0x54, 0x22, 0x30, 0xd1, 0xaf, 0xfb, 0x9a, 0x80, 0xf4, 0x8f, 0x7a, - 0xcb, 0xff, 0x16, 0x70, 0x1e, 0x30, 0x41, 0x2c, 0xbf, 0xff, 0xcc, 0x0a, - 0xfa, 0x61, 0x9f, 0x32, 0x44, 0x17, 0xe6, 0x12, 0xca, 0x84, 0x6d, 0x61, - 0xd1, 0x9e, 0x5f, 0xda, 0x08, 0x3c, 0x7c, 0x59, 0x7c, 0x2b, 0x94, 0x96, - 0x5f, 0xf7, 0x63, 0xef, 0xdf, 0xde, 0x35, 0x96, 0xf2, 0xca, 0xc3, 0xcb, - 0x01, 0xd5, 0xf7, 0x0d, 0xb0, 0xb2, 0xfc, 0x59, 0xd8, 0xd2, 0xcb, 0xc2, - 0x8a, 0x2a, 0x4b, 0xf3, 0xb1, 0xe3, 0xea, 0x46, 0x66, 0x82, 0xa1, 0x10, - 0x06, 0x8d, 0x7c, 0xde, 0x47, 0x56, 0x5e, 0xdf, 0x0d, 0x59, 0x7b, 0xa6, - 0x2a, 0xcb, 0xdc, 0x7d, 0x2c, 0xaf, 0x8d, 0xcf, 0x47, 0x6f, 0x7a, 0x06, - 0xb2, 0xa1, 0x16, 0xf8, 0x44, 0x6a, 0xee, 0x45, 0x7d, 0xfe, 0x64, 0xcb, - 0x2f, 0xb9, 0x85, 0xd5, 0x95, 0x87, 0x88, 0xe4, 0x76, 0xe4, 0xe5, 0x46, - 0xff, 0x10, 0xea, 0x14, 0x3e, 0x86, 0xc1, 0x3e, 0xde, 0x9f, 0xcf, 0x96, - 0x5a, 0x43, 0x56, 0x45, 0x92, 0xa9, 0x0d, 0x7a, 0xa7, 0xb5, 0x71, 0xa1, - 0x96, 0xa1, 0x7f, 0x43, 0x63, 0xd1, 0xfa, 0xcb, 0xd1, 0xb0, 0x56, 0x59, - 0x97, 0x87, 0x95, 0xe2, 0xdb, 0xff, 0x8f, 0xb1, 0xac, 0x2e, 0xbb, 0x92, - 0xca, 0x99, 0x79, 0x2b, 0x50, 0xaf, 0xf4, 0x3e, 0xca, 0x5d, 0xd0, 0x5e, - 0xf7, 0x95, 0xdf, 0xfd, 0x18, 0x58, 0x37, 0x91, 0x46, 0xcb, 0x2f, 0x81, - 0xa8, 0x92, 0xcb, 0xb7, 0xc2, 0xcb, 0xff, 0x1e, 0x81, 0xe3, 0x07, 0x8c, - 0x96, 0x5f, 0xff, 0xfe, 0x72, 0xff, 0xbe, 0xc6, 0xf7, 0x99, 0xbf, 0xc6, - 0x0f, 0x18, 0x81, 0xd9, 0x65, 0x6c, 0x8b, 0x9f, 0xcf, 0x6a, 0x11, 0xed, - 0x90, 0xd1, 0xac, 0x64, 0x42, 0x9c, 0xf4, 0xce, 0x9b, 0x5d, 0x04, 0xa3, - 0x18, 0xbc, 0x51, 0xbd, 0x65, 0xff, 0xda, 0x80, 0x78, 0x9f, 0xa5, 0x02, - 0xac, 0xb9, 0x96, 0x6b, 0x2e, 0x3f, 0x2c, 0xad, 0x8d, 0x86, 0x86, 0xaa, - 0x11, 0x2a, 0xee, 0x77, 0xa6, 0x7d, 0x96, 0x5e, 0xe0, 0x77, 0x56, 0x56, - 0x1b, 0xee, 0x8f, 0x5f, 0xe8, 0x29, 0x11, 0xc7, 0xcb, 0x2a, 0x1d, 0x16, - 0x14, 0xa3, 0xa1, 0x1c, 0x61, 0xd9, 0x38, 0x2c, 0xc4, 0xa8, 0x40, 0x46, - 0x7f, 0xf4, 0x68, 0x46, 0x55, 0x34, 0x6b, 0xfa, 0x95, 0xa1, 0xe9, 0x66, - 0xcf, 0x18, 0xf7, 0xf0, 0xbc, 0x29, 0x44, 0x1c, 0x8c, 0x3b, 0xb4, 0x8a, - 0x7d, 0xeb, 0x13, 0xf0, 0xb2, 0x11, 0x7f, 0x70, 0x82, 0xfc, 0x73, 0x48, - 0xc9, 0x65, 0xd3, 0xd1, 0xac, 0xbf, 0xe9, 0xbb, 0xb9, 0xc8, 0x98, 0x3a, - 0x59, 0x7f, 0x87, 0x04, 0xd8, 0x1c, 0x2c, 0xa8, 0x3f, 0x07, 0x3f, 0xbf, - 0xef, 0x46, 0xda, 0x89, 0x3e, 0x96, 0x5f, 0x89, 0x81, 0x23, 0xf5, 0x97, - 0xfe, 0x27, 0xfb, 0xbe, 0x80, 0x64, 0xcb, 0x2f, 0xc6, 0x3f, 0x1b, 0x0b, - 0x2f, 0x08, 0xe4, 0xb2, 0xb1, 0x15, 0xa4, 0x55, 0xd3, 0xfd, 0xc2, 0x8b, - 0xfb, 0x68, 0x23, 0x6e, 0x2c, 0xbf, 0xf1, 0xfa, 0x07, 0xe0, 0xc7, 0xdc, - 0x59, 0x78, 0x8b, 0x16, 0x56, 0x1e, 0xcb, 0x9f, 0xde, 0x1b, 0x1f, 0xac, - 0xbf, 0x37, 0x5a, 0x7e, 0xac, 0xbf, 0xf3, 0x47, 0x05, 0x9b, 0xcb, 0x38, - 0xb2, 0xa7, 0x22, 0x16, 0x07, 0xcc, 0xa2, 0xff, 0xe9, 0x9c, 0x1e, 0x89, - 0x74, 0xb1, 0xab, 0x2f, 0xed, 0x61, 0x13, 0xec, 0xb2, 0x80, 0x7e, 0x06, - 0x89, 0x7f, 0xf4, 0x0b, 0xf4, 0xb9, 0x3b, 0x3d, 0x84, 0xb2, 0xff, 0xf3, - 0x7e, 0x97, 0x27, 0x61, 0x16, 0x1f, 0xeb, 0x2f, 0xe7, 0xd0, 0x63, 0xe9, - 0x2c, 0xa3, 0x3f, 0xa7, 0x4c, 0xbf, 0x9a, 0xf8, 0x33, 0xde, 0xb2, 0xf1, - 0xf8, 0x2b, 0x2f, 0xe3, 0x17, 0x01, 0x1f, 0xac, 0xa9, 0xcb, 0xa7, 0x4c, - 0x82, 0x79, 0x42, 0x2c, 0x64, 0x19, 0x0e, 0x63, 0x3e, 0xd4, 0x21, 0x7d, - 0x0a, 0x57, 0x85, 0x01, 0x10, 0xf6, 0x18, 0x21, 0x20, 0xde, 0x5d, 0xb8, - 0x39, 0x66, 0x6c, 0x89, 0x62, 0x27, 0x33, 0xd4, 0x3d, 0x99, 0x31, 0xdb, - 0x4f, 0x32, 0x83, 0xe7, 0xb8, 0xc4, 0x59, 0x5c, 0x7b, 0xb3, 0xc6, 0x50, - 0x4b, 0x2a, 0xc3, 0x55, 0x94, 0x84, 0xec, 0xf0, 0x84, 0x54, 0x5a, 0x04, - 0x6d, 0xa9, 0x25, 0x92, 0xac, 0x49, 0x47, 0x5b, 0xfc, 0xe5, 0xf3, 0x21, - 0xb1, 0x3b, 0xf2, 0x0a, 0xe5, 0xa7, 0xea, 0xcc, 0x18, 0xeb, 0x50, 0x8d, - 0xd9, 0x4d, 0x93, 0x57, 0xaa, 0x5a, 0xaf, 0x71, 0xdb, 0x59, 0x28, 0x7a, - 0xd9, 0xd6, 0x3d, 0xb1, 0x51, 0xfe, 0xb3, 0x7c, 0x65, 0xc6, 0xe8, 0x56, - 0xc7, 0x2f, 0x97, 0xea, 0x7b, 0xdb, 0xc2, 0x5e, 0x0d, 0x26, 0x63, 0x7c, - 0xeb, 0x70, 0xb3, 0xaa, 0x13, 0xf4, 0xe7, 0xd1, 0x2d, 0x3d, 0x86, 0xe4, - 0xf5, 0xb5, 0x33, 0x96, 0x2a, 0xeb, 0x2d, 0x62, 0x41, 0xf7, 0x9b, 0x9d, - 0x59, 0x7f, 0x9d, 0xb1, 0xd3, 0xe1, 0xac, 0xbf, 0x66, 0x84, 0xef, 0x16, - 0x59, 0x9f, 0xe7, 0xec, 0x43, 0x9c, 0x31, 0xbf, 0xcc, 0xf3, 0x40, 0x77, - 0x02, 0xa2, 0xe3, 0x5f, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x75, 0xaf, - 0xfe, 0x66, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x12, 0x8a, 0xa2, 0x58, - 0xf5, 0x54, 0xa1, 0x5c, 0x32, 0xa6, 0x21, 0x8a, 0x02, 0x93, 0x9c, 0x5e, - 0xdd, 0x87, 0xb3, 0xeb, 0x15, 0xcf, 0xfe, 0x16, 0x9c, 0x37, 0xea, 0x0e, - 0xe2, 0x0d, 0xff, 0xe6, 0x6d, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, - 0x69, 0x7f, 0xd3, 0xc3, 0xc7, 0xba, 0xf1, 0xf6, 0xe2, 0xcb, 0xff, 0xff, - 0x85, 0xdc, 0xec, 0xf6, 0x36, 0xcf, 0x64, 0x6c, 0xab, 0xd6, 0x5e, 0xa7, - 0x99, 0xd3, 0xbd, 0x3e, 0xb2, 0xf3, 0xb8, 0x15, 0x11, 0xba, 0xfd, 0xf4, - 0xc5, 0x03, 0x59, 0x6d, 0x00, 0xf4, 0x5c, 0xa2, 0xff, 0x68, 0xd9, 0x60, - 0xf4, 0x0a, 0xb2, 0xf0, 0x67, 0xc5, 0x59, 0x7d, 0xa0, 0xc7, 0xeb, 0x28, - 0xcf, 0xf2, 0x63, 0x81, 0x08, 0x6f, 0xff, 0xff, 0xb7, 0x96, 0x73, 0x83, - 0x8c, 0xd0, 0x1d, 0xc0, 0xce, 0x47, 0xd8, 0xef, 0x15, 0x18, 0x7a, 0xde, - 0x84, 0x5e, 0x19, 0x85, 0xfd, 0xc6, 0x62, 0xf3, 0x74, 0x45, 0x97, 0xed, - 0xc6, 0x7a, 0x65, 0x8a, 0xb2, 0xf8, 0x65, 0x9f, 0xac, 0xbe, 0x81, 0x5a, - 0x35, 0x95, 0x87, 0x8b, 0xa2, 0x2b, 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, - 0x05, 0x44, 0xbe, 0xb6, 0x2c, 0xbd, 0xe7, 0xea, 0xcb, 0x77, 0x86, 0xb0, - 0x41, 0x0b, 0xf8, 0x43, 0xfb, 0x73, 0x42, 0xac, 0xa8, 0x3d, 0xc3, 0x28, - 0xbf, 0xa0, 0xf7, 0x73, 0xe9, 0x2c, 0xbf, 0x69, 0x8f, 0x07, 0x8b, 0x2b, - 0xc7, 0xb4, 0x21, 0x85, 0xe8, 0xd4, 0x2c, 0xac, 0x37, 0xc6, 0x47, 0x7a, - 0x4f, 0xe5, 0x97, 0xbf, 0x81, 0x56, 0x5f, 0xec, 0x3d, 0x4b, 0xc6, 0x2a, - 0xca, 0xdd, 0x3d, 0x1f, 0x0f, 0x5f, 0x07, 0xc7, 0xa5, 0x97, 0xdc, 0xf4, - 0x79, 0x65, 0xfe, 0x8d, 0xa0, 0xb6, 0xcd, 0xc5, 0x97, 0x73, 0x4b, 0x2a, - 0x0f, 0xbf, 0x62, 0x29, 0x8d, 0xac, 0xcd, 0x95, 0x57, 0xa0, 0xe1, 0x17, - 0x21, 0xd6, 0x08, 0xd7, 0xfe, 0x27, 0xdd, 0x36, 0xd3, 0xc3, 0x48, 0x7d, - 0x0d, 0x42, 0x85, 0xc7, 0x07, 0xfa, 0xdb, 0x3e, 0x4a, 0x24, 0x24, 0x6f, - 0xff, 0xc5, 0x00, 0x67, 0xdf, 0x80, 0x7c, 0x2c, 0xde, 0xeb, 0x2f, 0xfe, - 0x97, 0x4e, 0x66, 0x63, 0x3d, 0xf0, 0x35, 0x97, 0xe1, 0x59, 0x9b, 0x1b, - 0x2c, 0xbf, 0xcc, 0xff, 0x7f, 0xbf, 0x3f, 0x96, 0x50, 0xd3, 0x07, 0xf9, - 0x60, 0xd2, 0x48, 0xb6, 0xff, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x8a, 0xad, - 0x74, 0xfb, 0x21, 0x65, 0xc7, 0xb8, 0xb2, 0xec, 0xd2, 0xcb, 0xd9, 0xf7, - 0x56, 0x5f, 0x1b, 0x5f, 0x7a, 0xca, 0x60, 0xfb, 0xdc, 0x67, 0xf1, 0x6e, - 0x8e, 0xde, 0x2d, 0xc1, 0x56, 0x5f, 0xde, 0x8d, 0xe1, 0x1e, 0x2c, 0xbf, - 0x9f, 0xd3, 0x14, 0x0d, 0x65, 0xff, 0xf7, 0x7f, 0x68, 0x47, 0x99, 0xdf, - 0xda, 0x1f, 0x96, 0x5f, 0xfd, 0xdf, 0x47, 0x09, 0xc2, 0xcb, 0x3d, 0x2c, - 0xbd, 0x12, 0xc5, 0x97, 0xf1, 0x84, 0x05, 0x13, 0x2c, 0xa9, 0x26, 0x7e, - 0x32, 0xfc, 0x2d, 0xf9, 0x52, 0x64, 0x7f, 0x0d, 0xdf, 0xf3, 0x18, 0x59, - 0xf7, 0x5d, 0xab, 0x2f, 0x6e, 0x47, 0x56, 0x5f, 0xd0, 0xd1, 0x20, 0x80, - 0xb2, 0xe8, 0xd2, 0xca, 0xd1, 0xe1, 0xf0, 0xb6, 0xe7, 0xf9, 0x65, 0xe1, - 0x23, 0xf5, 0x95, 0xf1, 0xb5, 0xe8, 0xbd, 0xfd, 0x8d, 0x99, 0xdf, 0x65, - 0x97, 0xba, 0xff, 0x2c, 0xbf, 0xfe, 0x97, 0x9e, 0x4c, 0x3f, 0x30, 0x3c, - 0xe1, 0xac, 0xa5, 0x95, 0x87, 0xb7, 0xb8, 0xa1, 0x46, 0x8c, 0xa7, 0x2e, - 0x27, 0x8b, 0x86, 0x6b, 0x2f, 0xda, 0x03, 0xb8, 0x15, 0x12, 0x02, 0xfb, - 0x58, 0x5d, 0x59, 0x58, 0x7a, 0xba, 0x34, 0xa9, 0xc8, 0x8c, 0x66, 0xd7, - 0x7e, 0xe3, 0x93, 0xfc, 0xb2, 0xec, 0x25, 0x97, 0x06, 0x16, 0x54, 0x8f, - 0xe7, 0xe2, 0x7d, 0xd2, 0x7d, 0x0a, 0xdf, 0xd1, 0xad, 0xa3, 0x5b, 0x2c, - 0xbe, 0x36, 0xc7, 0x16, 0x54, 0x8f, 0x41, 0x82, 0xfb, 0xfd, 0xad, 0x9b, - 0x05, 0x2e, 0x2c, 0xa8, 0x3d, 0x7c, 0x23, 0xbf, 0xfd, 0xe3, 0x86, 0xb8, - 0xc4, 0xdc, 0x82, 0x92, 0xcb, 0xdb, 0x38, 0xd6, 0x5f, 0xe0, 0x1e, 0x0a, - 0x12, 0xea, 0xca, 0xc3, 0xd0, 0xf8, 0x76, 0xfe, 0x12, 0x7b, 0xd1, 0xc3, - 0x56, 0x5d, 0xc9, 0x2c, 0xa7, 0x3c, 0xae, 0x19, 0xdc, 0xc9, 0xf2, 0xcb, - 0xff, 0xa6, 0xf3, 0xb7, 0xbe, 0x8e, 0x85, 0xab, 0x2f, 0xfe, 0xc1, 0xc4, - 0xa3, 0x07, 0x05, 0xd5, 0x95, 0x88, 0x87, 0x6a, 0x35, 0xed, 0xc8, 0xea, - 0xca, 0x86, 0x45, 0x2e, 0xd0, 0x8d, 0x19, 0xee, 0x46, 0xbe, 0xc2, 0xce, - 0xe9, 0xcc, 0xcc, 0x4d, 0x57, 0xf4, 0x3b, 0x1e, 0x33, 0x22, 0x87, 0x3f, - 0x08, 0x3b, 0x09, 0xc0, 0xb6, 0x4f, 0x90, 0x89, 0x0a, 0x2d, 0xc2, 0x2b, - 0xff, 0x4a, 0x33, 0xff, 0x66, 0x10, 0x16, 0x5f, 0xa0, 0x8b, 0x3a, 0xb2, - 0xfb, 0x5a, 0x30, 0x2c, 0xbe, 0x2c, 0xd9, 0x9e, 0x22, 0x12, 0x7c, 0xf4, - 0x42, 0x5b, 0xfc, 0xcf, 0xce, 0xdc, 0x81, 0xac, 0xa6, 0x6a, 0x87, 0x35, - 0x1c, 0xe4, 0xfa, 0x65, 0xfe, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x16, 0x42, - 0xff, 0xff, 0x79, 0xf4, 0xcf, 0xcf, 0xd2, 0x0e, 0xdc, 0xc6, 0xc6, 0xea, - 0xcb, 0xf8, 0xf7, 0xb3, 0xe4, 0x7c, 0xb2, 0xff, 0xff, 0xd1, 0x20, 0x8f, - 0x19, 0x89, 0x9e, 0x20, 0xbe, 0xee, 0x31, 0x1c, 0x59, 0x5c, 0x45, 0x1f, - 0x4c, 0xa8, 0x69, 0x96, 0x1c, 0x61, 0x37, 0xf9, 0x9e, 0x68, 0x0e, 0xe0, - 0x54, 0x5a, 0xeb, 0xff, 0xd8, 0x24, 0x6c, 0xcf, 0x26, 0xe8, 0xe0, 0x96, - 0x5f, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x72, 0x2f, 0xda, 0x03, 0xb8, - 0x15, 0x17, 0x62, 0xff, 0xcf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x47, - 0x2c, 0xcf, 0x11, 0x00, 0xd3, 0x4b, 0xe2, 0x89, 0x35, 0x65, 0xfa, 0x46, - 0x5f, 0x9a, 0xcb, 0xff, 0x4f, 0x6c, 0x96, 0xc6, 0xa5, 0x87, 0xbd, 0x65, - 0xa4, 0xb2, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x4a, 0xaf, 0xf8, 0x1e, 0x39, - 0xbd, 0x1b, 0x62, 0xcb, 0xff, 0xde, 0x8d, 0xa3, 0xc7, 0xbd, 0xc7, 0xe3, - 0x58, 0xcc, 0xdd, 0x5d, 0x26, 0x78, 0x8c, 0xb9, 0x9b, 0xab, 0xe4, 0xc3, - 0x5e, 0x1b, 0x97, 0xfe, 0x73, 0xec, 0x82, 0x37, 0x2f, 0xd6, 0x5d, 0xe0, - 0xac, 0xb3, 0x31, 0xaa, 0x1c, 0xc2, 0x1f, 0x89, 0xdb, 0x1a, 0xb7, 0x8a, - 0x78, 0x7d, 0x7f, 0xff, 0xf3, 0xf7, 0x3f, 0x89, 0x33, 0x11, 0xb8, 0x38, - 0x94, 0x0d, 0xdd, 0x85, 0x95, 0xb3, 0x74, 0xad, 0x29, 0xed, 0xdc, 0x8f, - 0xdf, 0xe3, 0xd3, 0xa5, 0x81, 0x34, 0xf5, 0xe3, 0x6d, 0xfc, 0xa4, 0x90, - 0x78, 0x9b, 0xd8, 0x60, 0xef, 0x94, 0x8c, 0x2b, 0x3d, 0xff, 0x49, 0x9e, - 0x68, 0x0e, 0xe0, 0x54, 0x47, 0x0b, 0xfe, 0x36, 0x79, 0xa0, 0x3b, 0x81, - 0x51, 0x5a, 0xac, 0xcd, 0xd1, 0x1b, 0xd4, 0x7b, 0xff, 0xcc, 0xda, 0xf2, - 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x12, 0xda, 0xc0, 0x59, 0x78, 0x3a, 0xfd, - 0x65, 0xd9, 0xf2, 0xcb, 0xf3, 0x5b, 0x07, 0xc5, 0x97, 0xf4, 0x6b, 0xf7, - 0xfb, 0x8b, 0x2c, 0x3c, 0x3d, 0x6f, 0x13, 0xdf, 0xbb, 0x1e, 0x13, 0x8b, - 0x2f, 0x6f, 0x0c, 0x96, 0x53, 0x25, 0x30, 0xb0, 0x08, 0xfc, 0x3c, 0x6d, - 0xa4, 0x4f, 0xbc, 0xa6, 0xf7, 0x87, 0x25, 0x97, 0xe3, 0xdc, 0x1c, 0x7c, - 0xb2, 0xff, 0xb3, 0xe2, 0xcf, 0xff, 0x79, 0x2c, 0xb9, 0xa0, 0x59, 0x7f, - 0x1f, 0xdc, 0x1e, 0x12, 0xcb, 0xfb, 0xec, 0x94, 0x6b, 0xf5, 0x95, 0x87, - 0xb8, 0xe5, 0xb7, 0xff, 0xd0, 0x5b, 0x70, 0x2e, 0x72, 0xe7, 0x9e, 0x4b, - 0x2a, 0x13, 0x1c, 0x91, 0xd6, 0x9c, 0xfc, 0x41, 0x7c, 0x51, 0xf4, 0x96, - 0x5f, 0xf8, 0xcb, 0xbc, 0x18, 0x5f, 0x52, 0x59, 0x7f, 0x6d, 0x00, 0x7d, - 0x7e, 0xb2, 0xff, 0xfc, 0xff, 0x7e, 0x3f, 0x3c, 0xb3, 0x84, 0x17, 0x11, - 0x65, 0xf7, 0xf9, 0xa9, 0x96, 0x5f, 0x8f, 0xd0, 0x24, 0xcb, 0x2f, 0x76, - 0x1a, 0xb2, 0x80, 0x9a, 0x7c, 0xc4, 0x5a, 0x3e, 0xf1, 0x7f, 0xea, 0xfd, - 0x24, 0xdc, 0x29, 0xbf, 0xf9, 0x88, 0x2e, 0xe6, 0x8f, 0x67, 0x6a, 0xcb, - 0xe7, 0x93, 0x06, 0xb2, 0xcc, 0x2c, 0xf1, 0xa2, 0xbf, 0x8f, 0x44, 0x7d, - 0xe2, 0xcb, 0xf6, 0x9c, 0xb2, 0x16, 0x52, 0xa2, 0x1b, 0x19, 0xf9, 0xf8, - 0x89, 0xcb, 0x2e, 0x82, 0x59, 0x7b, 0x0c, 0x6b, 0x2f, 0x0f, 0x1a, 0xb2, - 0xe3, 0x21, 0x9b, 0x73, 0x1b, 0xa8, 0x3f, 0x69, 0x26, 0x5f, 0xc0, 0xf1, - 0xea, 0x06, 0xb2, 0xfb, 0x26, 0x96, 0x2c, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, - 0x0e, 0xe0, 0x54, 0x4c, 0x0b, 0xf0, 0x5f, 0xa7, 0xd5, 0x97, 0xfb, 0x67, - 0xef, 0xe2, 0x14, 0x96, 0x5a, 0x16, 0x5d, 0xb1, 0xac, 0xac, 0x34, 0xe4, - 0x21, 0x77, 0x21, 0x65, 0x42, 0x2e, 0x4c, 0x9d, 0xd7, 0x42, 0x3f, 0x78, - 0x53, 0xfd, 0x65, 0xd3, 0xf8, 0xb2, 0xfb, 0x8e, 0x5f, 0xac, 0xbc, 0x51, - 0xb2, 0xca, 0x98, 0xfd, 0x7c, 0x3d, 0xf8, 0xcb, 0x2c, 0x8a, 0xff, 0x07, - 0xed, 0x1c, 0x37, 0x16, 0x5f, 0xbc, 0x70, 0x5b, 0x2c, 0xbf, 0xe8, 0xdb, - 0xa5, 0x01, 0xef, 0x16, 0x57, 0x91, 0x27, 0xc3, 0x39, 0xf2, 0x7b, 0xe2, - 0xce, 0x42, 0xca, 0xe9, 0xe9, 0xef, 0x33, 0xbd, 0x23, 0xfd, 0x65, 0xf8, - 0x8b, 0x3a, 0x6b, 0x2f, 0xbe, 0x01, 0xb0, 0xb2, 0xfc, 0xec, 0x67, 0x9d, - 0x65, 0x62, 0x2c, 0x66, 0x24, 0x71, 0xde, 0x92, 0x84, 0x92, 0xff, 0xf4, - 0xbd, 0x84, 0x28, 0x9a, 0xf1, 0xc3, 0x56, 0x5f, 0xc7, 0xdc, 0x6c, 0x79, - 0x65, 0xff, 0x1f, 0xfb, 0x7a, 0x38, 0x1e, 0x2c, 0xbf, 0xd2, 0x7e, 0xf0, - 0xca, 0x16, 0x5a, 0x34, 0x7d, 0x84, 0x77, 0x5f, 0x26, 0x13, 0xa4, 0xbe, - 0xc2, 0x62, 0xff, 0xd8, 0xdc, 0xd6, 0x7d, 0x2c, 0xea, 0xcb, 0xf8, 0xfc, - 0x6d, 0xc6, 0x16, 0x57, 0x8f, 0xaf, 0x87, 0xd7, 0xfc, 0xfe, 0xd4, 0x1c, - 0x9f, 0x8b, 0x2f, 0xff, 0x3e, 0xde, 0x38, 0x2c, 0x98, 0xf4, 0x6b, 0x2b, - 0x13, 0x43, 0xec, 0x28, 0x82, 0x44, 0x29, 0xbd, 0x89, 0x65, 0xa7, 0xd6, - 0x5f, 0x00, 0xf0, 0x6b, 0x2e, 0x06, 0x2c, 0xb8, 0x3f, 0xa4, 0xa6, 0x41, - 0xf9, 0xec, 0x21, 0xf0, 0xa1, 0x90, 0xe8, 0x5a, 0xfc, 0xc4, 0x4b, 0x06, - 0xb2, 0xff, 0x60, 0xcb, 0x3b, 0xec, 0x59, 0x74, 0xf6, 0x05, 0xc6, 0x14, - 0xbb, 0xbf, 0xac, 0xbb, 0x72, 0x4b, 0x2b, 0x63, 0x65, 0xa1, 0x8b, 0xf0, - 0x93, 0xee, 0x5f, 0xac, 0xbf, 0xb3, 0xce, 0x21, 0x75, 0x65, 0x6c, 0x7b, - 0x23, 0x2c, 0xbc, 0xee, 0x05, 0x97, 0xf6, 0x77, 0xb1, 0xae, 0x2c, 0xbf, - 0x9c, 0xbf, 0xdb, 0xfe, 0xac, 0xa8, 0x44, 0xde, 0xc4, 0x64, 0x37, 0x3e, - 0x5b, 0x66, 0x70, 0xce, 0xe6, 0xd9, 0x76, 0x43, 0xa3, 0x8d, 0x1f, 0x23, - 0x8c, 0x61, 0xa8, 0x10, 0xd9, 0xfa, 0x16, 0xf3, 0x10, 0xe8, 0xb5, 0xa4, - 0x5e, 0x8c, 0x15, 0xe1, 0x5e, 0x51, 0xec, 0xf2, 0x54, 0xaf, 0x61, 0x6c, - 0x14, 0xed, 0xe5, 0x02, 0x98, 0xcf, 0xad, 0x89, 0x18, 0xb5, 0xe6, 0x87, - 0x49, 0x2f, 0xfc, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, 0x1a, 0xe8, - 0xdc, 0x59, 0x76, 0xb1, 0x65, 0xa3, 0x46, 0xbf, 0xc3, 0x36, 0x66, 0x68, - 0xbe, 0x68, 0xef, 0x9e, 0xef, 0xf8, 0x67, 0xbd, 0x9f, 0xdf, 0x89, 0x25, - 0x97, 0xf3, 0x25, 0x91, 0x3c, 0x65, 0x2f, 0x2c, 0xbc, 0xca, 0xe4, 0x35, - 0x94, 0xc8, 0x3e, 0x06, 0x50, 0xf6, 0xfe, 0xd6, 0x82, 0x59, 0xe5, 0x97, - 0xd1, 0xb4, 0x69, 0x65, 0xee, 0xc4, 0xcb, 0x2f, 0xd9, 0x13, 0x1b, 0x56, - 0x5f, 0x6c, 0x11, 0xee, 0xac, 0xbf, 0xed, 0xc3, 0xfe, 0x76, 0x4d, 0x0d, - 0x59, 0x46, 0x8c, 0xc9, 0x88, 0xb4, 0x3a, 0x21, 0x3e, 0xe1, 0x3d, 0xa4, - 0xb2, 0xfc, 0xd8, 0xce, 0xf1, 0x65, 0x4f, 0x26, 0xe0, 0x62, 0x37, 0xfb, - 0xd1, 0xad, 0x84, 0x0f, 0xeb, 0x2f, 0x83, 0xb3, 0x92, 0xcb, 0x9f, 0x8b, - 0x2f, 0xa7, 0x77, 0x3c, 0xb2, 0xd1, 0xe3, 0x75, 0xc1, 0x6b, 0xd0, 0x5b, - 0x2c, 0xbf, 0xff, 0xfe, 0x97, 0x3d, 0x81, 0x17, 0x9e, 0xc0, 0x67, 0x27, - 0x67, 0xd2, 0xe1, 0x91, 0xac, 0xbc, 0xee, 0x05, 0x45, 0x62, 0xbe, 0x71, - 0x21, 0x85, 0x94, 0x03, 0xcb, 0xd1, 0x45, 0xfb, 0xc6, 0xd8, 0xd2, 0xcb, - 0xff, 0xc1, 0x7d, 0xb5, 0x8d, 0xf4, 0x6c, 0x41, 0x59, 0x46, 0x7e, 0x44, - 0x4f, 0x7f, 0xe9, 0xfc, 0xe9, 0x60, 0x60, 0xba, 0xb2, 0xff, 0x16, 0x73, - 0xfc, 0xc1, 0xac, 0xa6, 0x15, 0x19, 0x00, 0x9b, 0xe1, 0xcd, 0x43, 0x2f, - 0xd0, 0x94, 0xe9, 0x06, 0xf3, 0xfb, 0xff, 0x98, 0x0f, 0x78, 0x59, 0xbc, - 0xb3, 0x8b, 0x2f, 0xfe, 0x2e, 0xb0, 0x18, 0x2c, 0x04, 0x69, 0x65, 0xfe, - 0xd6, 0xdd, 0xe3, 0xfc, 0x05, 0x95, 0x07, 0xf2, 0xe8, 0x77, 0xfd, 0x2c, - 0xee, 0x14, 0x0b, 0x3e, 0xb2, 0xff, 0xde, 0x8d, 0xef, 0xa0, 0x79, 0xf7, - 0x16, 0x5f, 0xe8, 0x2e, 0xfb, 0x3f, 0x75, 0x97, 0xd0, 0xd7, 0xea, 0xca, - 0x91, 0xe9, 0xf0, 0xca, 0xfd, 0xb9, 0xdc, 0xfa, 0x65, 0x97, 0xdc, 0x98, - 0xd8, 0x59, 0x7f, 0xff, 0xff, 0x9f, 0xbd, 0xcf, 0x71, 0xe4, 0x65, 0xd9, - 0x66, 0xb3, 0x99, 0xe7, 0xd8, 0xa2, 0x4b, 0x2f, 0x76, 0x26, 0x59, 0x50, - 0x8f, 0x9c, 0x2d, 0xe1, 0x20, 0x90, 0x8b, 0xbf, 0x83, 0x3e, 0x0f, 0x1b, - 0x2d, 0x65, 0xf7, 0xd2, 0x8f, 0x2c, 0xbf, 0xdc, 0x1f, 0xb0, 0x01, 0xdd, - 0x59, 0x6c, 0xe1, 0xed, 0x04, 0x8e, 0xe8, 0xde, 0xb2, 0xbc, 0x6f, 0xc8, - 0x9e, 0xfe, 0xf1, 0x8c, 0xb0, 0x2b, 0x2f, 0xf4, 0xcf, 0x87, 0x21, 0x1a, - 0xb2, 0x86, 0x88, 0x00, 0x10, 0x19, 0x65, 0xfe, 0xfa, 0x53, 0x49, 0xf5, - 0xb2, 0xcb, 0xe9, 0x74, 0xf6, 0x59, 0x50, 0x7b, 0x4e, 0x6f, 0x50, 0x9f, - 0xbe, 0x46, 0x9c, 0x70, 0x89, 0xba, 0x5d, 0x59, 0x7f, 0x66, 0xd8, 0x59, - 0x25, 0x95, 0x07, 0x87, 0xa1, 0x7b, 0xff, 0xb9, 0xec, 0xdc, 0x3e, 0x9c, - 0xb8, 0x15, 0x97, 0xf3, 0x7a, 0x17, 0xda, 0x16, 0x58, 0xfe, 0x3f, 0x51, - 0x11, 0xef, 0xf6, 0x8c, 0x3b, 0x7f, 0xc9, 0x2c, 0xbc, 0x71, 0xb2, 0xca, - 0x19, 0xe9, 0x4c, 0x6d, 0x7e, 0x07, 0xa0, 0x98, 0x59, 0x58, 0x79, 0x6e, - 0x47, 0x7c, 0xd7, 0xfb, 0xab, 0x2f, 0xfe, 0xda, 0x3b, 0x38, 0x40, 0x09, - 0xb8, 0x27, 0x16, 0x5f, 0xfc, 0xfb, 0xb8, 0x4e, 0x37, 0xcf, 0xba, 0xb2, - 0xff, 0xb5, 0x1c, 0x7d, 0x14, 0x49, 0x65, 0x69, 0x19, 0x7e, 0x4f, 0xde, - 0x8b, 0x7a, 0x4f, 0xb2, 0xcb, 0xd3, 0xb6, 0x6a, 0xcb, 0xf8, 0xa3, 0x62, - 0x8d, 0x96, 0x5b, 0xab, 0x2f, 0xfc, 0xc7, 0x39, 0x9e, 0x3e, 0x07, 0x65, - 0x94, 0x33, 0xd2, 0x08, 0x8d, 0x4f, 0x69, 0xff, 0x64, 0x3b, 0xbe, 0x32, - 0x31, 0xd7, 0x20, 0x27, 0xfb, 0xff, 0x13, 0x8f, 0xd1, 0xbf, 0xce, 0x4b, - 0x2e, 0x8d, 0xd5, 0x97, 0xff, 0xfe, 0x0e, 0xd8, 0x09, 0xc4, 0x1d, 0xc9, - 0xd9, 0xf4, 0xb0, 0x25, 0xff, 0x16, 0x5f, 0xfe, 0xdb, 0x3e, 0xef, 0x0c, - 0xa3, 0xf7, 0x6a, 0xcb, 0xfd, 0xf1, 0x60, 0xfc, 0xe2, 0xac, 0xac, 0x3f, - 0xf7, 0x4b, 0xa1, 0xa6, 0xd8, 0xe7, 0xc4, 0x33, 0xc8, 0x7a, 0xdf, 0x76, - 0x50, 0x6b, 0x2f, 0xfb, 0x07, 0xb6, 0x0b, 0x9e, 0x75, 0x97, 0xf6, 0xd3, - 0x4a, 0x7b, 0xd6, 0xcb, 0x2f, 0x88, 0xb3, 0xab, 0x2f, 0xc7, 0xbb, 0xad, - 0x1a, 0xca, 0x64, 0x22, 0x06, 0x0d, 0xfc, 0x41, 0x7f, 0x6c, 0x24, 0xfb, - 0x97, 0xeb, 0x2f, 0xb7, 0x63, 0x84, 0xb2, 0xff, 0xde, 0x76, 0xf7, 0xd1, - 0xd0, 0xb5, 0x65, 0x61, 0xf1, 0xcc, 0x49, 0x7f, 0xf6, 0x63, 0x0d, 0x83, - 0xd6, 0x8c, 0x55, 0x97, 0x9d, 0xf4, 0xb2, 0xff, 0x8e, 0x47, 0xe0, 0xb5, - 0xa6, 0xb2, 0xec, 0xea, 0xca, 0x84, 0xd9, 0x72, 0x12, 0xda, 0x22, 0xf2, - 0x27, 0x46, 0xe7, 0xce, 0x2f, 0x13, 0xee, 0x2c, 0xbd, 0xe3, 0x66, 0xca, - 0xdb, 0x2f, 0xd6, 0x55, 0x2b, 0x88, 0x7c, 0xed, 0x08, 0x69, 0x13, 0x0c, - 0xdf, 0x25, 0x47, 0x30, 0xe8, 0x08, 0x5f, 0xfc, 0x40, 0x67, 0x73, 0x42, - 0x5b, 0x51, 0x8d, 0xfa, 0x51, 0xc3, 0xbe, 0x7f, 0x09, 0x62, 0x86, 0x37, - 0x25, 0x0f, 0x76, 0x3c, 0xb0, 0xa0, 0xef, 0x21, 0x9f, 0x85, 0xd0, 0x91, - 0xcc, 0x6e, 0x2f, 0x5e, 0x9e, 0x13, 0xec, 0x85, 0x97, 0x48, 0x96, 0x5f, - 0xda, 0xd4, 0x0f, 0x1a, 0xb2, 0xdb, 0xab, 0x2e, 0x3d, 0xc5, 0x97, 0xdb, - 0x6a, 0x36, 0x59, 0x70, 0x9f, 0xac, 0xbd, 0xe3, 0x6a, 0xcb, 0x4c, 0xb2, - 0x9c, 0xd7, 0x04, 0x72, 0xfc, 0xe5, 0xb0, 0x78, 0xb2, 0xfd, 0x83, 0xd3, - 0x81, 0x65, 0xf3, 0xed, 0x1a, 0x59, 0x74, 0x0f, 0xc7, 0x92, 0x44, 0xf4, - 0x69, 0xc1, 0x4c, 0x5a, 0xd1, 0x47, 0x19, 0xfc, 0x90, 0x91, 0xf8, 0x41, - 0xd7, 0x1b, 0x79, 0x65, 0xee, 0x09, 0xc5, 0x97, 0xdf, 0x6d, 0x0c, 0x2c, - 0xad, 0x8f, 0x50, 0x62, 0x21, 0x1e, 0xbb, 0xb0, 0xb2, 0xff, 0x7d, 0xa8, - 0x39, 0x3f, 0x16, 0x5f, 0x61, 0x44, 0x96, 0x56, 0x1e, 0x9b, 0x4c, 0xed, - 0x3e, 0xb2, 0xfd, 0xcc, 0xe9, 0xe9, 0x65, 0xec, 0xfb, 0xab, 0x2d, 0x9f, - 0x9e, 0x27, 0x09, 0xee, 0x71, 0xac, 0xbd, 0xdc, 0xe2, 0xca, 0x91, 0xb2, - 0x08, 0xb5, 0xc5, 0xba, 0xb2, 0xf6, 0x9c, 0x96, 0x52, 0xcb, 0x4f, 0xac, - 0xbf, 0x8b, 0x37, 0xe8, 0xf8, 0xb2, 0xb6, 0x3c, 0x21, 0x45, 0x2d, 0xf2, - 0xca, 0x84, 0x4f, 0x60, 0xd9, 0xa6, 0x84, 0x92, 0xfd, 0x9a, 0x94, 0x35, - 0x65, 0xfc, 0x7b, 0x61, 0x1b, 0x0b, 0x2f, 0xf3, 0xea, 0x5f, 0x9f, 0xdc, - 0x59, 0x7d, 0xce, 0x47, 0xeb, 0x2a, 0x15, 0x48, 0x8c, 0x87, 0x16, 0x0d, - 0x69, 0xa4, 0x3e, 0x85, 0xbb, 0x9d, 0x11, 0x38, 0x4b, 0x45, 0x35, 0xbf, - 0xf6, 0x16, 0x30, 0x59, 0xdf, 0x1a, 0xcb, 0xf9, 0xd8, 0xc1, 0xbc, 0x96, - 0x57, 0x8f, 0xa4, 0x8f, 0x2f, 0xe3, 0x22, 0xcd, 0xee, 0xb2, 0xf4, 0x84, - 0xea, 0xcb, 0xda, 0xd3, 0xac, 0xbe, 0x97, 0xe1, 0x92, 0xcb, 0xed, 0x09, - 0x1f, 0xac, 0xa8, 0x3c, 0x83, 0x24, 0xbf, 0xc7, 0xb3, 0xb7, 0xff, 0xe1, - 0x65, 0xc6, 0x35, 0x97, 0x3f, 0xcb, 0x2f, 0xef, 0x64, 0xc5, 0x03, 0x59, - 0x7f, 0xd2, 0x86, 0xf3, 0x35, 0x1c, 0x59, 0x40, 0x3e, 0x5f, 0x8b, 0x68, - 0x68, 0x9f, 0x37, 0xcb, 0xdd, 0x3f, 0xd6, 0x5f, 0x7f, 0x04, 0x05, 0x96, - 0x65, 0xac, 0xa6, 0x0f, 0x53, 0xe1, 0xd0, 0x91, 0x5f, 0x4b, 0xb8, 0x22, - 0xcb, 0xc0, 0x8f, 0xd6, 0x5e, 0xd4, 0x35, 0x65, 0x1a, 0x23, 0x5c, 0xc4, - 0x24, 0x62, 0x8e, 0xdf, 0x6c, 0x26, 0x4c, 0xb2, 0xf4, 0x6b, 0x65, 0x95, - 0x07, 0x84, 0x64, 0xb4, 0xb2, 0xf0, 0x23, 0xf5, 0x97, 0x41, 0x48, 0xd4, - 0x60, 0x5d, 0xf7, 0x48, 0xf7, 0x16, 0x5c, 0x1e, 0x2c, 0xbf, 0x06, 0x5c, - 0xf0, 0xd6, 0x54, 0x1e, 0x01, 0x0b, 0xd4, 0x97, 0x14, 0x06, 0x43, 0xf1, - 0x61, 0x8f, 0x4c, 0xc9, 0xa2, 0x06, 0x9a, 0xfa, 0x16, 0xa5, 0x18, 0x1f, - 0x1f, 0xba, 0x90, 0x12, 0xad, 0xec, 0x97, 0xf3, 0xcb, 0x73, 0x70, 0x3b, - 0x2c, 0xb1, 0x2c, 0xba, 0x5b, 0xab, 0x2b, 0xc7, 0xbf, 0xc3, 0x5e, 0x88, - 0x5a, 0x7d, 0x65, 0xfd, 0x9b, 0x0f, 0xc7, 0xa5, 0x95, 0xe3, 0xc2, 0x21, - 0x4b, 0xff, 0x46, 0x72, 0x74, 0x18, 0xc4, 0x92, 0xcb, 0xf8, 0xc5, 0xe6, - 0xd8, 0x2a, 0xca, 0x23, 0xf0, 0xea, 0x05, 0xc5, 0x0b, 0x2f, 0xd0, 0x3e, - 0xe0, 0x16, 0x5e, 0x82, 0x02, 0xcb, 0xff, 0xf9, 0xc5, 0x1b, 0xbe, 0xb6, - 0xf3, 0xf7, 0xc7, 0xa9, 0x2c, 0xbf, 0x00, 0x1e, 0x8d, 0x2c, 0xaf, 0x22, - 0x7c, 0x86, 0xc2, 0xb9, 0x52, 0x4c, 0xac, 0x04, 0x3c, 0x15, 0xec, 0x31, - 0xaf, 0x9c, 0x9e, 0x65, 0x97, 0xe3, 0xe9, 0x64, 0x96, 0x5f, 0x40, 0xb1, - 0x32, 0xcb, 0xff, 0x73, 0x7b, 0xfa, 0x18, 0xce, 0xf1, 0x65, 0xc2, 0x35, - 0x65, 0xf8, 0xb3, 0x41, 0xc5, 0x97, 0x9f, 0xe2, 0x59, 0x7f, 0x74, 0x9f, - 0xfc, 0x25, 0x97, 0xe2, 0x7f, 0xf0, 0x96, 0x54, 0xe3, 0xd2, 0xe9, 0x65, - 0x0d, 0x12, 0x41, 0x6e, 0xad, 0x93, 0x9e, 0x60, 0x84, 0xc9, 0xa6, 0x23, - 0xf2, 0x0f, 0xe3, 0x05, 0x0b, 0x8b, 0xee, 0x61, 0x01, 0x65, 0xfd, 0x05, - 0xd0, 0x07, 0x65, 0x97, 0xfa, 0x05, 0x18, 0x5f, 0x52, 0x59, 0x7b, 0x91, - 0x25, 0x97, 0xef, 0x66, 0x8f, 0x8b, 0x2e, 0x3d, 0x7c, 0x78, 0x7d, 0x1c, - 0xb6, 0xf5, 0x95, 0x09, 0x83, 0xc8, 0x87, 0x45, 0xde, 0x77, 0xdc, 0x2e, - 0xbc, 0x46, 0xc2, 0xcb, 0xec, 0x19, 0xef, 0x59, 0x74, 0x37, 0x0d, 0xfb, - 0x8e, 0x5f, 0xa5, 0xd3, 0x6f, 0x56, 0x5f, 0xcf, 0xf7, 0xa0, 0x42, 0x59, - 0x6c, 0xf8, 0xf5, 0x85, 0x28, 0xbf, 0x9e, 0x4e, 0x59, 0xb8, 0xb2, 0xfb, - 0x9e, 0x79, 0x2c, 0xa3, 0x47, 0xce, 0xa1, 0x00, 0xe5, 0x21, 0x2e, 0xbd, - 0x85, 0x32, 0xcb, 0x7c, 0xb2, 0xef, 0xe1, 0x25, 0xc2, 0x8a, 0x92, 0x8c, - 0xd8, 0x0a, 0x2f, 0x7e, 0x2c, 0xef, 0x8d, 0x23, 0x33, 0x43, 0x7c, 0xc1, - 0x67, 0x16, 0x54, 0x8f, 0x68, 0x67, 0x17, 0xf9, 0xd8, 0x82, 0x2c, 0xea, - 0xcb, 0xc7, 0xfb, 0xac, 0xa8, 0x4d, 0x20, 0x63, 0x8f, 0x0b, 0xd2, 0x22, - 0x09, 0x8d, 0xef, 0x40, 0xab, 0x2f, 0x3f, 0xdc, 0x59, 0x6e, 0x2c, 0xbe, - 0x13, 0xcf, 0xd5, 0x95, 0xb1, 0xf7, 0x0c, 0x77, 0xe1, 0xde, 0x88, 0xde, - 0x82, 0x99, 0x65, 0xc5, 0x0b, 0x29, 0x65, 0x2c, 0xa9, 0x8b, 0x66, 0x85, - 0xdd, 0xe9, 0x96, 0x5c, 0x7f, 0xac, 0xa8, 0x35, 0xff, 0x8c, 0x54, 0xc8, - 0xb8, 0xd0, 0xe3, 0x95, 0xfe, 0xa1, 0x7f, 0xf3, 0x06, 0x40, 0xe4, 0x35, - 0xfe, 0xea, 0xcb, 0xdf, 0xe6, 0xe2, 0xcb, 0xff, 0xe2, 0xcf, 0xf1, 0xa1, - 0x8d, 0x68, 0xc2, 0x05, 0x97, 0xc5, 0x0d, 0x99, 0x65, 0x30, 0x8d, 0x6d, - 0x22, 0x91, 0x07, 0x53, 0xef, 0x9b, 0xc0, 0xb5, 0x65, 0x98, 0x59, 0x69, - 0xf5, 0x97, 0x69, 0x85, 0x95, 0x07, 0xc2, 0x64, 0x61, 0x12, 0x10, 0x52, - 0xff, 0xfb, 0xd9, 0x2e, 0x47, 0x65, 0x9b, 0xae, 0x5f, 0xac, 0xbf, 0xe3, - 0xef, 0xb3, 0xee, 0x86, 0x16, 0x5f, 0x09, 0x1a, 0xfd, 0x65, 0x48, 0xf7, - 0x7c, 0x73, 0x76, 0x71, 0x65, 0x41, 0xb8, 0x91, 0x15, 0x71, 0x30, 0x7e, - 0xc3, 0x9e, 0xe8, 0xe2, 0xcb, 0x7e, 0xb2, 0xfc, 0x70, 0xd8, 0x6a, 0xcb, - 0x62, 0xca, 0x34, 0x43, 0xe8, 0xa5, 0xc5, 0xb8, 0x25, 0x3e, 0x4d, 0x66, - 0x16, 0x54, 0x2e, 0x67, 0x64, 0x3d, 0x8e, 0x31, 0x4f, 0x42, 0x79, 0xe3, - 0xc9, 0xdc, 0x4b, 0xbe, 0x81, 0x43, 0x32, 0xcb, 0xdc, 0x89, 0x96, 0x5f, - 0xd8, 0x3c, 0xde, 0x7a, 0x59, 0x4b, 0x2c, 0xd5, 0x95, 0xd2, 0xf3, 0x78, - 0x5d, 0xf0, 0xdd, 0xfe, 0x59, 0x7e, 0xfc, 0xf4, 0x6c, 0x2c, 0xb9, 0xd8, - 0x59, 0x76, 0x7c, 0xb2, 0x80, 0x99, 0x34, 0xc4, 0x8d, 0x1d, 0xf2, 0x53, - 0x91, 0x7e, 0x44, 0x45, 0x33, 0xe2, 0xf7, 0x67, 0x96, 0x5d, 0x9a, 0x59, - 0x4b, 0x29, 0x65, 0xa1, 0x65, 0x32, 0xcd, 0x31, 0x05, 0xf4, 0x2e, 0xf6, - 0x6f, 0x75, 0x97, 0xde, 0xf6, 0x7e, 0xb2, 0xd1, 0xe3, 0xc0, 0x10, 0x76, - 0xa1, 0x1d, 0x6d, 0x16, 0x73, 0xcf, 0xdc, 0x6f, 0xe3, 0xee, 0x79, 0xd8, - 0x59, 0x7f, 0x74, 0x67, 0xfc, 0x12, 0xcb, 0xdb, 0x78, 0xd6, 0x5d, 0xe0, - 0xfc, 0x79, 0x4e, 0x5b, 0x78, 0x51, 0x45, 0x49, 0x7f, 0xa3, 0x61, 0x33, - 0xcf, 0xf2, 0x46, 0x66, 0x82, 0xff, 0x18, 0xdc, 0xbe, 0x97, 0x16, 0x50, - 0xcf, 0xeb, 0xc8, 0xf7, 0x66, 0xcb, 0x2f, 0xcd, 0x12, 0x35, 0xfa, 0xca, - 0x59, 0x4b, 0x2d, 0x0d, 0x2d, 0xbf, 0x0b, 0xa8, 0x3e, 0x69, 0x20, 0x5f, - 0xfb, 0x91, 0x2f, 0x66, 0x14, 0xb8, 0xb2, 0x86, 0x9e, 0x28, 0x21, 0x90, - 0x64, 0x53, 0x3e, 0xf4, 0x86, 0xf4, 0x34, 0xd6, 0x5e, 0x96, 0x01, 0x65, - 0x62, 0x21, 0xc0, 0xa1, 0xf0, 0xdd, 0xf1, 0xeb, 0x70, 0x6b, 0x2f, 0xde, - 0x8f, 0x9f, 0x75, 0x65, 0xff, 0xf4, 0x77, 0x83, 0xce, 0x9f, 0x83, 0x9f, - 0x75, 0x65, 0x78, 0xfe, 0xfa, 0x57, 0x78, 0xb3, 0xcb, 0x2d, 0xa5, 0x97, - 0xfb, 0x30, 0x02, 0x6f, 0xf6, 0x2c, 0xbf, 0xe8, 0x2e, 0x96, 0x76, 0x05, - 0x59, 0x7f, 0xb0, 0x5e, 0x19, 0x7d, 0x25, 0x94, 0xb2, 0x8c, 0xfd, 0xb4, - 0x6e, 0xe6, 0x97, 0xbb, 0xa0, 0xac, 0xb7, 0x16, 0x51, 0x1a, 0xe0, 0x8e, - 0xdf, 0xe7, 0xdf, 0x83, 0xdb, 0x05, 0x59, 0x7f, 0xfe, 0xc1, 0xc6, 0x7c, - 0x27, 0x4c, 0x83, 0x2c, 0xe2, 0xcb, 0xec, 0xf0, 0x9a, 0x59, 0x73, 0x7f, - 0x59, 0x73, 0x92, 0xca, 0xf1, 0xad, 0x71, 0x8b, 0xf3, 0x4f, 0xbf, 0xba, - 0xca, 0xd9, 0x59, 0xbe, 0x42, 0x80, 0xc8, 0xb7, 0x46, 0xe6, 0x11, 0xd4, - 0x2a, 0xdd, 0x6f, 0xf2, 0x02, 0x36, 0xe2, 0xaf, 0x54, 0x02, 0x41, 0x76, - 0x98, 0x59, 0x7d, 0x0d, 0x7f, 0x2c, 0xbd, 0xde, 0xba, 0xcb, 0xed, 0x06, - 0x37, 0xac, 0xbf, 0x66, 0xeb, 0x97, 0xe3, 0x3e, 0x17, 0x21, 0xe8, 0xe5, - 0xf7, 0xba, 0x7b, 0x2c, 0xbf, 0xc0, 0x3e, 0x16, 0x6f, 0x75, 0x97, 0xd1, - 0xb3, 0xc9, 0x65, 0xf7, 0x79, 0xe3, 0x59, 0x7f, 0x13, 0xf7, 0x6c, 0x15, - 0x65, 0x2c, 0xa2, 0x37, 0x3d, 0x2e, 0xa8, 0x3f, 0xbc, 0x5b, 0xbf, 0x66, - 0xc5, 0x9f, 0x2c, 0xbe, 0xe9, 0x97, 0x16, 0x5f, 0x4e, 0xcf, 0xba, 0xb2, - 0xfe, 0xe4, 0x7d, 0x2c, 0xea, 0xca, 0x01, 0xe9, 0xf0, 0x96, 0xfb, 0x3a, - 0x7c, 0x59, 0x4b, 0x2b, 0xe3, 0x58, 0xe4, 0x35, 0x88, 0xe3, 0x37, 0x47, - 0x4e, 0xa8, 0x56, 0x23, 0x27, 0x9c, 0x4d, 0xf8, 0x8f, 0x46, 0x7e, 0x84, - 0xe9, 0x10, 0x72, 0x30, 0xbb, 0xc2, 0x04, 0x45, 0x97, 0x88, 0xf7, 0x56, - 0x5f, 0x0e, 0x7d, 0xd8, 0x59, 0x50, 0x78, 0x98, 0x3d, 0x69, 0xf5, 0x97, - 0x40, 0xd6, 0x53, 0x24, 0xd5, 0x78, 0x52, 0xdc, 0x59, 0x66, 0xac, 0xb6, - 0x96, 0x53, 0x9a, 0x20, 0x88, 0xd6, 0x8f, 0x4f, 0xc6, 0x74, 0xb0, 0xcd, - 0x15, 0xfe, 0x82, 0x93, 0xb7, 0x06, 0xb2, 0xfb, 0xad, 0x6e, 0x96, 0x5f, - 0xfd, 0xfc, 0x10, 0x1f, 0xbf, 0x88, 0x52, 0x59, 0x7a, 0x47, 0xe5, 0x97, - 0xdd, 0x2c, 0x92, 0xcb, 0xe0, 0xb2, 0xf8, 0xeb, 0x2f, 0xdb, 0x0d, 0xdc, - 0x55, 0x95, 0x87, 0x9e, 0x12, 0x6b, 0xff, 0xc7, 0xcf, 0x60, 0xcb, 0x37, - 0x96, 0x71, 0x65, 0x49, 0x39, 0x06, 0x0c, 0x7e, 0x23, 0x99, 0x1b, 0x43, - 0x84, 0xe1, 0xd2, 0x1b, 0x84, 0x02, 0xca, 0x64, 0x3a, 0xb3, 0xb9, 0xec, - 0xaa, 0x23, 0x98, 0xda, 0x18, 0xb2, 0x30, 0x1c, 0xaf, 0xac, 0x9d, 0x47, - 0x62, 0x32, 0x10, 0x38, 0xfd, 0x1d, 0xe1, 0xc7, 0xc3, 0x34, 0x6e, 0x7a, - 0x8e, 0x15, 0xb1, 0xc4, 0x7a, 0x76, 0x25, 0xe3, 0x95, 0xfe, 0x36, 0x06, - 0x59, 0xe1, 0x4a, 0xc3, 0xe4, 0xb6, 0x7e, 0xcb, 0xc4, 0x0b, 0xe6, 0xf6, - 0x31, 0x52, 0xa7, 0xe1, 0x34, 0x24, 0x75, 0x5b, 0x8c, 0xf7, 0xfc, 0xcf, - 0xa7, 0x9b, 0x9c, 0x0c, 0x2c, 0xbf, 0xff, 0xe0, 0xc3, 0x3e, 0xf0, 0xfc, - 0xe7, 0xdc, 0xd7, 0xed, 0x79, 0x2c, 0xa6, 0x6a, 0xa7, 0x36, 0x8f, 0xdc, - 0x67, 0xb7, 0xed, 0x01, 0xdc, 0x0a, 0x8a, 0xdd, 0x7f, 0xe7, 0x93, 0x3c, - 0xd0, 0x1d, 0xc0, 0xa8, 0x9c, 0x16, 0x67, 0x88, 0x80, 0x69, 0xa5, 0xd3, - 0xd8, 0xd6, 0x5b, 0xcb, 0x2d, 0xc5, 0x94, 0x13, 0x45, 0x3e, 0x23, 0x7e, - 0xc1, 0x78, 0x62, 0xac, 0xbd, 0x2e, 0x71, 0x65, 0xf0, 0x1d, 0xc0, 0xa8, - 0xb4, 0x57, 0xff, 0xb0, 0x7e, 0x76, 0x26, 0x98, 0xf8, 0x16, 0xac, 0xad, - 0x1f, 0xdf, 0x8b, 0xaf, 0x19, 0x01, 0x65, 0xe7, 0x2f, 0xd6, 0x56, 0x1b, - 0x70, 0x0d, 0xdf, 0x7f, 0x04, 0x05, 0x97, 0xfb, 0x37, 0x79, 0xad, 0x3f, - 0x56, 0x5f, 0xd1, 0xb3, 0xf9, 0xda, 0xb2, 0xa6, 0x3e, 0x3f, 0x1b, 0x5d, - 0xee, 0x2c, 0xbf, 0xa1, 0xc8, 0x23, 0xc5, 0x97, 0xed, 0x0c, 0x3d, 0xe2, - 0xcb, 0xfe, 0x8d, 0xbd, 0x9c, 0xf6, 0x6e, 0xac, 0xbf, 0xfa, 0x01, 0xcc, - 0x01, 0x47, 0xfc, 0x85, 0x97, 0xfd, 0xbf, 0x99, 0xec, 0x21, 0x06, 0xb2, - 0xa0, 0xff, 0xb1, 0x0e, 0xbc, 0x8d, 0xa2, 0x85, 0xd5, 0xfe, 0xcd, 0x7f, - 0x93, 0x09, 0xc5, 0x96, 0x61, 0x65, 0xff, 0x64, 0x6d, 0x93, 0x68, 0xf8, - 0xb2, 0x8c, 0xf2, 0xe6, 0x12, 0xbf, 0xff, 0x6d, 0x1d, 0x81, 0xea, 0x3c, - 0xfc, 0x2c, 0xfd, 0x65, 0xff, 0xa3, 0xe7, 0xdd, 0xf1, 0x3e, 0xee, 0xcb, - 0x2f, 0xfd, 0x1a, 0xff, 0x0f, 0x35, 0xd0, 0xac, 0xa8, 0x46, 0xc7, 0x95, - 0x78, 0x8b, 0x43, 0x4f, 0x44, 0xc9, 0xe6, 0x84, 0x0f, 0x21, 0xf5, 0x7f, - 0x46, 0xf2, 0x7e, 0xf1, 0x65, 0xff, 0xf7, 0x60, 0x7e, 0x0b, 0xb0, 0x0c, - 0x32, 0x02, 0xcb, 0xe6, 0x99, 0x49, 0x65, 0x19, 0xf8, 0x71, 0x3e, 0xa1, - 0x5e, 0xde, 0x4a, 0xd4, 0xf2, 0x43, 0xc2, 0x7a, 0x96, 0x5e, 0xd4, 0x30, - 0xb2, 0xfc, 0x7d, 0x28, 0x6a, 0xca, 0x64, 0x1e, 0x74, 0xc1, 0x7e, 0x1d, - 0xbf, 0xd0, 0xdd, 0x68, 0xff, 0xe2, 0xcb, 0xc0, 0xc1, 0x56, 0x5b, 0x26, - 0x3d, 0x1f, 0x1a, 0x58, 0x55, 0x97, 0xfb, 0x51, 0xdf, 0xa5, 0x9d, 0x59, - 0x7f, 0xff, 0x64, 0xce, 0x5b, 0x7e, 0x7f, 0x70, 0x18, 0x64, 0x05, 0x97, - 0x60, 0xd6, 0x5e, 0xd9, 0xda, 0xb2, 0xf4, 0x7f, 0xa8, 0x36, 0x66, 0x2d, - 0x7f, 0xf7, 0xdc, 0xe9, 0x66, 0xfe, 0xf4, 0xc6, 0xb2, 0x8d, 0x34, 0xd9, - 0x84, 0x88, 0xd3, 0x90, 0x8f, 0x09, 0x8d, 0xc7, 0x25, 0x97, 0xf6, 0x6f, - 0xe8, 0x60, 0x0b, 0x2f, 0xf7, 0xbc, 0x16, 0x1b, 0x1c, 0x59, 0x7f, 0xfe, - 0x3e, 0x16, 0x6f, 0x7e, 0x96, 0x73, 0xcf, 0x32, 0xcb, 0xf4, 0x77, 0x82, - 0x79, 0x65, 0x42, 0x3e, 0x06, 0x2d, 0x85, 0xf3, 0x1a, 0x92, 0xad, 0xf1, - 0x1f, 0xd2, 0x59, 0x7b, 0xf7, 0xf2, 0xcb, 0xfd, 0xb6, 0x18, 0xdd, 0xd8, - 0x59, 0x58, 0x7a, 0x0e, 0x3b, 0x7f, 0x6a, 0x07, 0x05, 0x32, 0xcb, 0x71, - 0x65, 0x6c, 0x6f, 0xbc, 0x5b, 0x66, 0x6c, 0x96, 0x5b, 0x94, 0xf2, 0x7d, - 0xb1, 0x20, 0xca, 0x72, 0x13, 0x00, 0x59, 0xf8, 0x82, 0x68, 0x42, 0xe8, - 0x8d, 0xa2, 0xfe, 0x9c, 0x06, 0xfe, 0x12, 0xc5, 0x08, 0x5e, 0x46, 0xeb, - 0xd8, 0xd1, 0xc2, 0x91, 0x3e, 0xe4, 0x22, 0xf5, 0xee, 0x37, 0x8b, 0x2f, - 0xf3, 0x26, 0x0f, 0xb2, 0xce, 0x2c, 0xbf, 0xfe, 0x3e, 0x9e, 0x9f, 0xf8, - 0xf1, 0x82, 0x3f, 0x59, 0x74, 0xa4, 0xb2, 0xff, 0xec, 0x28, 0xc6, 0x22, - 0x5d, 0xcd, 0x96, 0x5f, 0xf9, 0xfd, 0x3a, 0x33, 0xbe, 0x36, 0xac, 0xbf, - 0xff, 0xc7, 0xd8, 0xf1, 0x67, 0x75, 0x1e, 0x2c, 0xde, 0x10, 0x2c, 0xbf, - 0xfe, 0x8c, 0xef, 0x9e, 0x5a, 0x08, 0xe0, 0xa1, 0x65, 0x49, 0x39, 0x5d, - 0xd4, 0xff, 0x0b, 0x85, 0x0f, 0x79, 0xfe, 0xe3, 0x05, 0xff, 0xe3, 0xf3, - 0x9e, 0xdd, 0x32, 0x3f, 0xf8, 0xb2, 0xff, 0x8a, 0x25, 0x9c, 0xc3, 0x85, - 0x96, 0xd9, 0x65, 0x41, 0xe3, 0x91, 0xad, 0xff, 0xff, 0x47, 0xed, 0x79, - 0x4e, 0xef, 0xb1, 0xb8, 0x08, 0xf4, 0x35, 0x65, 0xff, 0xf1, 0x97, 0x43, - 0xe3, 0xe4, 0xfb, 0xf7, 0x06, 0xb2, 0xbc, 0x8b, 0x9e, 0xb4, 0x5f, 0xc7, - 0xb4, 0xe7, 0x2f, 0xd6, 0x5f, 0x01, 0xdc, 0x0a, 0x8b, 0x69, 0x7f, 0xff, - 0x43, 0xf6, 0x3d, 0x1c, 0x33, 0x91, 0xeb, 0x06, 0xb2, 0xfe, 0xf4, 0x36, - 0x0c, 0x6b, 0x28, 0xd3, 0x04, 0x98, 0x8f, 0x46, 0x1c, 0x2e, 0xea, 0xbd, - 0xfc, 0xf2, 0x1f, 0x8d, 0xab, 0x2f, 0xf6, 0x4c, 0x50, 0xd9, 0xc0, 0x59, - 0x77, 0x8c, 0x67, 0xc5, 0xd2, 0xdb, 0xff, 0xde, 0xc9, 0x39, 0x75, 0xe4, - 0x6c, 0x42, 0xcb, 0xfe, 0xcc, 0x04, 0xf8, 0x7c, 0x7a, 0x59, 0x7f, 0xf7, - 0xb3, 0x6e, 0x1e, 0xa3, 0x71, 0xc9, 0x65, 0xd8, 0x6b, 0x2d, 0x00, 0x3d, - 0xbd, 0xe8, 0xd6, 0x9e, 0x96, 0x5f, 0xfd, 0x9d, 0x86, 0x93, 0xb0, 0x59, - 0xfa, 0xcb, 0x7e, 0xb2, 0xa6, 0x3e, 0xb2, 0x16, 0xea, 0x1d, 0xff, 0x8c, - 0x87, 0x10, 0xdd, 0xc7, 0x92, 0xcb, 0xfe, 0x8f, 0xfd, 0x1b, 0x16, 0x71, - 0x65, 0x41, 0xfc, 0x04, 0xfe, 0xfb, 0xd1, 0xa6, 0x16, 0x5f, 0xfe, 0x3d, - 0x46, 0x78, 0x27, 0xcf, 0x67, 0xeb, 0x2f, 0xff, 0x86, 0x1e, 0xf0, 0x79, - 0x2f, 0x46, 0xf1, 0xc2, 0xca, 0x92, 0x2f, 0x86, 0x46, 0x69, 0x37, 0xfd, - 0x12, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, 0xff, 0xe8, 0x97, 0xa0, 0x98, 0x2c, - 0xd8, 0x49, 0x2c, 0xbf, 0xff, 0xd0, 0x64, 0xfd, 0x0f, 0x70, 0x70, 0xd1, - 0xfa, 0x3e, 0x59, 0x7f, 0x8d, 0xa3, 0x8e, 0x09, 0xc5, 0x97, 0xbb, 0x80, - 0x59, 0x7f, 0xfc, 0x47, 0xbc, 0xfb, 0xe8, 0xef, 0x23, 0x7c, 0x2c, 0xa3, - 0x4d, 0x2f, 0x49, 0x7e, 0x5f, 0xe9, 0xa0, 0x47, 0x2f, 0xf0, 0xf0, 0xa4, - 0x7e, 0x0a, 0xcb, 0x0d, 0x65, 0xf3, 0xfd, 0xcf, 0x2c, 0xa3, 0x3e, 0x67, - 0x32, 0xe0, 0x8d, 0xff, 0xdd, 0x73, 0xc8, 0xd3, 0xc8, 0xfc, 0xb2, 0xfc, - 0xe3, 0xc2, 0xfd, 0x65, 0x48, 0xfa, 0x0d, 0x06, 0xff, 0xa3, 0x53, 0xb9, - 0x1e, 0x73, 0x59, 0x7f, 0xbc, 0x6f, 0x2e, 0x9e, 0xcb, 0x2f, 0xc3, 0x8c, - 0x23, 0x59, 0x53, 0xd3, 0x30, 0xc9, 0x92, 0x3b, 0x11, 0xe5, 0xc9, 0x80, - 0x70, 0x90, 0xc8, 0xf7, 0x41, 0x0a, 0xd3, 0x2d, 0x99, 0x23, 0x50, 0x96, - 0x6c, 0x25, 0x3d, 0x0a, 0x77, 0x86, 0xf9, 0x17, 0xf2, 0x38, 0x5e, 0xc2, - 0xc0, 0x30, 0x95, 0x14, 0x86, 0x7c, 0xe4, 0x43, 0x3b, 0xfa, 0x19, 0xeb, - 0x31, 0x85, 0x97, 0xfd, 0x1a, 0x7e, 0xfe, 0x21, 0x49, 0x65, 0xff, 0xfd, - 0xa8, 0xe9, 0x80, 0xc7, 0x07, 0xa3, 0x91, 0xf1, 0x65, 0xfc, 0xc3, 0xe8, - 0x61, 0x25, 0x97, 0xfd, 0x1d, 0x30, 0x18, 0xfe, 0x25, 0x97, 0xff, 0xff, - 0xfe, 0x19, 0x40, 0x3e, 0x01, 0xfc, 0xd7, 0x26, 0x30, 0x9f, 0xe1, 0x41, - 0xe3, 0x98, 0x8d, 0xbc, 0x59, 0x7f, 0xe3, 0xec, 0x74, 0xf7, 0xc1, 0x01, - 0x65, 0xdf, 0x49, 0x65, 0x62, 0x3c, 0x9e, 0x13, 0x81, 0x3e, 0xbf, 0x8a, - 0x7c, 0xf5, 0x8c, 0x2c, 0xbb, 0xbe, 0x59, 0x7f, 0xd9, 0xde, 0x09, 0xce, - 0xe7, 0x96, 0x56, 0xc7, 0xa2, 0xd1, 0x7b, 0xf1, 0xec, 0xd8, 0x02, 0xcb, - 0xf3, 0xfd, 0x21, 0x38, 0xb2, 0xff, 0xc7, 0x37, 0x37, 0xb9, 0x6c, 0x11, - 0xac, 0xb3, 0x3d, 0x95, 0xaa, 0xe1, 0xd3, 0x0b, 0x1a, 0x2e, 0xf4, 0x65, - 0x44, 0x67, 0xc8, 0x40, 0xf4, 0x8f, 0x79, 0x40, 0x85, 0x54, 0xcd, 0x75, - 0xf3, 0x23, 0x55, 0xfe, 0x5c, 0x25, 0xcd, 0xf2, 0xcb, 0xf6, 0x80, 0xee, - 0x05, 0x45, 0xca, 0xbf, 0x9c, 0x7e, 0x82, 0xd9, 0x65, 0xcc, 0x79, 0x65, - 0x99, 0x8d, 0x12, 0x18, 0x2f, 0xe3, 0x47, 0x2d, 0xbf, 0x68, 0x0e, 0xe0, - 0x54, 0x5d, 0xab, 0xdb, 0x60, 0xab, 0x2f, 0xf8, 0xe5, 0x23, 0x2f, 0xe2, - 0x4b, 0x2e, 0x6c, 0xfa, 0xcb, 0xe3, 0xd3, 0xfe, 0xb2, 0xf3, 0xed, 0x0b, - 0x2c, 0xcf, 0x11, 0xc4, 0xd3, 0x47, 0x1e, 0x23, 0x8e, 0x0d, 0x04, 0x8a, - 0xa1, 0xfd, 0xe3, 0x36, 0x2a, 0x95, 0x60, 0x96, 0x39, 0x44, 0x98, 0x6e, - 0xc5, 0x67, 0x3c, 0x76, 0xbe, 0x43, 0x76, 0x17, 0x7e, 0xa5, 0xce, 0x15, - 0x65, 0xc9, 0xc8, 0x69, 0x76, 0x32, 0x5b, 0xfc, 0xcf, 0x34, 0x07, 0x70, - 0x2a, 0x2a, 0x75, 0xf8, 0x99, 0xeb, 0x9c, 0x59, 0x76, 0xd8, 0xb2, 0xfb, - 0x85, 0xee, 0xac, 0xbf, 0xde, 0x8e, 0x43, 0x43, 0x32, 0xca, 0x91, 0xeb, - 0x0c, 0x8a, 0xfe, 0x0f, 0xcd, 0x77, 0x25, 0x96, 0xea, 0xcb, 0xef, 0xb9, - 0x03, 0x59, 0x60, 0xac, 0xbd, 0x0f, 0xb4, 0xe3, 0x69, 0xf9, 0x1d, 0x19, - 0xfd, 0x12, 0x2d, 0xf0, 0x1d, 0xc0, 0xa8, 0xae, 0x57, 0x36, 0x16, 0x5f, - 0xb4, 0x07, 0x70, 0x2a, 0x2c, 0xe5, 0x99, 0xc1, 0xe5, 0x60, 0xb5, 0xcf, - 0x25, 0x97, 0xf4, 0xbb, 0xf0, 0x0f, 0x8b, 0x29, 0xcf, 0x14, 0x22, 0xd7, - 0xf1, 0xf3, 0x09, 0xc5, 0x59, 0x78, 0x32, 0x85, 0x95, 0xa4, 0xd3, 0xbc, - 0xf0, 0x4d, 0xbd, 0x21, 0xde, 0x59, 0x7f, 0xfb, 0xb1, 0xc9, 0xc1, 0xe7, - 0x62, 0x69, 0x8d, 0x65, 0xff, 0xf9, 0xfd, 0x8d, 0x86, 0xce, 0xcc, 0x61, - 0x87, 0x92, 0xcb, 0xf8, 0xdb, 0xb0, 0x75, 0x25, 0x97, 0xe6, 0xe4, 0xcf, - 0xfa, 0xcb, 0xed, 0xbc, 0xfd, 0x59, 0x4e, 0x79, 0x81, 0x29, 0xbf, 0xd1, - 0xe9, 0xcd, 0x9e, 0x59, 0x3d, 0x59, 0x58, 0x9c, 0x04, 0xc9, 0xde, 0x57, - 0x27, 0xbd, 0xe4, 0x37, 0xfc, 0x50, 0xde, 0x06, 0x4e, 0xc2, 0xcb, 0xf6, - 0xb3, 0xa6, 0xd5, 0x97, 0x37, 0x7a, 0xcb, 0xc5, 0x03, 0x59, 0x58, 0x6d, - 0x1c, 0x66, 0xef, 0x62, 0xcb, 0xf6, 0x4d, 0x30, 0x76, 0x59, 0x66, 0x30, - 0xf0, 0x7c, 0x2d, 0x7e, 0x9a, 0x1b, 0x02, 0x2c, 0xba, 0x4d, 0x59, 0x50, - 0x7d, 0x18, 0x50, 0x45, 0x37, 0xff, 0xbc, 0x73, 0xbc, 0xe7, 0xd8, 0xc1, - 0x9a, 0xcb, 0xff, 0x1e, 0xa7, 0x43, 0x4f, 0x75, 0xe6, 0x59, 0x7c, 0x07, - 0x70, 0x2a, 0x24, 0x25, 0x30, 0x7e, 0x3a, 0x43, 0xbf, 0xec, 0xef, 0x03, - 0x28, 0xda, 0x16, 0x5f, 0xff, 0x8f, 0x40, 0xf6, 0x4e, 0xd6, 0xb0, 0x59, - 0xf8, 0x6a, 0xca, 0x92, 0x25, 0x38, 0x73, 0x7d, 0xdd, 0x1f, 0xcb, 0x2f, - 0xfd, 0x8d, 0xc7, 0xd6, 0xd3, 0xbe, 0x6a, 0xcb, 0xfd, 0xf7, 0x3a, 0x50, - 0xde, 0x2c, 0xbf, 0xfc, 0xe4, 0x09, 0xc3, 0x27, 0x97, 0x9e, 0x4b, 0x28, - 0xcf, 0xf8, 0x26, 0x97, 0xf6, 0x11, 0xff, 0xc8, 0x59, 0x66, 0x72, 0x55, - 0x89, 0x90, 0xba, 0xfa, 0x16, 0xe6, 0x47, 0xe2, 0x3f, 0xe1, 0x81, 0xc2, - 0x1b, 0x8f, 0xcb, 0x2f, 0xfc, 0xe2, 0x4c, 0x47, 0xd2, 0x8f, 0xd6, 0x54, - 0x91, 0xa5, 0xf3, 0xef, 0x45, 0xaf, 0xfe, 0xf1, 0xb7, 0x39, 0x3b, 0xe9, - 0x67, 0x56, 0x5f, 0x4b, 0xc2, 0x71, 0x65, 0xd3, 0xc6, 0x79, 0x59, 0x7d, - 0x06, 0x1e, 0x2c, 0xb3, 0x36, 0x56, 0x78, 0x7e, 0x22, 0xa8, 0x46, 0xf6, - 0x23, 0xbb, 0x3d, 0xf4, 0xf3, 0xe8, 0x6a, 0xcb, 0xfb, 0xdc, 0xe6, 0x6b, - 0x65, 0x97, 0x40, 0xab, 0x2f, 0xfb, 0xfc, 0x19, 0x3f, 0xf1, 0xbd, 0x65, - 0x62, 0x20, 0x4c, 0xbd, 0xc5, 0xef, 0x37, 0x7c, 0x96, 0x5f, 0xfe, 0xf4, - 0x7e, 0xd7, 0x97, 0x3b, 0x98, 0xd5, 0x97, 0xa6, 0x6c, 0xcb, 0x2c, 0xcd, - 0x95, 0x59, 0x8e, 0x70, 0xdb, 0xb1, 0x10, 0xe1, 0x4f, 0x91, 0xb7, 0x1c, - 0x79, 0x93, 0x26, 0x68, 0xe5, 0xab, 0x7e, 0x86, 0x43, 0xcb, 0xc2, 0x28, - 0xc3, 0xf8, 0x5b, 0xd8, 0x54, 0x04, 0xb4, 0x41, 0xfd, 0xc4, 0xab, 0xff, - 0xd9, 0xf3, 0x31, 0x85, 0xf5, 0x2f, 0x0a, 0xeb, 0x2f, 0xfe, 0x67, 0xe7, - 0xe1, 0x67, 0x7b, 0x1f, 0xac, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, - 0x3b, 0x81, 0x51, 0x3e, 0x2f, 0xff, 0x49, 0x9e, 0x6f, 0x36, 0x39, 0xc8, - 0x68, 0x56, 0x5f, 0x07, 0x51, 0xc5, 0x97, 0xe6, 0x1f, 0xb8, 0x2a, 0xcb, - 0x33, 0x19, 0xe5, 0x84, 0x8a, 0x9d, 0x18, 0x9d, 0x84, 0xd5, 0x01, 0x9f, - 0xb2, 0x68, 0x3b, 0xb4, 0xc9, 0xdd, 0x46, 0x44, 0xd4, 0xef, 0x23, 0x3c, - 0x63, 0xd7, 0xff, 0xf0, 0x49, 0xd8, 0x9d, 0xd6, 0x20, 0xa5, 0x9e, 0x36, - 0xac, 0xb8, 0xfe, 0x59, 0x7f, 0xfd, 0x2d, 0x99, 0x48, 0x9e, 0x76, 0x06, - 0xa7, 0x4e, 0xf4, 0xfa, 0xca, 0x91, 0xfe, 0x7e, 0x2f, 0x7f, 0xf8, 0xb6, - 0xf4, 0x1f, 0x78, 0x65, 0xf4, 0x96, 0x5f, 0xfb, 0xac, 0x41, 0x4b, 0x3c, - 0x6d, 0x59, 0x7f, 0xcc, 0x41, 0x4b, 0x3c, 0x6d, 0x59, 0x7c, 0x12, 0x76, - 0x27, 0x1f, 0xb7, 0x4f, 0xaf, 0xda, 0xfc, 0xfd, 0x0b, 0x29, 0xa7, 0xc6, - 0x13, 0xbb, 0xf6, 0x6b, 0x32, 0x65, 0x96, 0x66, 0xd5, 0x4d, 0x1e, 0x86, - 0xcb, 0x91, 0xf2, 0x32, 0x31, 0x08, 0xaf, 0xda, 0x03, 0xb8, 0x15, 0x15, - 0x92, 0xff, 0xcf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x37, 0x2c, 0xcf, - 0x11, 0x00, 0xd3, 0x4a, 0x02, 0x61, 0x27, 0x0d, 0xfb, 0xe0, 0x3b, 0x81, - 0x51, 0x2b, 0x2f, 0xff, 0xb5, 0xb1, 0x46, 0x9c, 0x64, 0xfa, 0x8d, 0xeb, - 0x2b, 0x47, 0xfc, 0x12, 0xeb, 0xf1, 0x40, 0xdf, 0xcb, 0x2f, 0xf4, 0x19, - 0x44, 0xa3, 0x71, 0x65, 0xf3, 0x5e, 0x4c, 0xf0, 0xfe, 0xcc, 0x8b, 0x84, - 0xd7, 0xe6, 0x6f, 0x37, 0x31, 0x65, 0xf9, 0x9e, 0x4a, 0x3f, 0x59, 0x4c, - 0xd1, 0x35, 0xb2, 0x34, 0x8a, 0xaf, 0xfd, 0xdc, 0x67, 0x9a, 0x3d, 0x9d, - 0xab, 0x2f, 0xff, 0x4f, 0x4c, 0x86, 0x4f, 0x31, 0xe4, 0x79, 0xac, 0x59, - 0x7f, 0xe3, 0xe0, 0x5a, 0x47, 0xbc, 0x2e, 0xb2, 0xff, 0xfb, 0xd1, 0x23, - 0xff, 0x59, 0xe7, 0x27, 0x92, 0xcb, 0xfa, 0x09, 0xc0, 0xfb, 0xab, 0x2f, - 0xfa, 0x01, 0x1a, 0x3e, 0xc0, 0x16, 0x54, 0x91, 0xe5, 0xf1, 0xfb, 0x53, - 0xba, 0x5d, 0x6d, 0x2c, 0xbf, 0xf7, 0xfd, 0xcf, 0x41, 0x76, 0x7f, 0x16, - 0x50, 0xcf, 0x48, 0x22, 0x37, 0xed, 0x01, 0xdc, 0x0a, 0x89, 0x71, 0x7f, - 0x9e, 0x5d, 0x28, 0x6f, 0x16, 0x5f, 0xfc, 0x7c, 0x0b, 0x1c, 0xc6, 0x9f, - 0xa1, 0x65, 0x19, 0xfb, 0x39, 0x95, 0xfa, 0x53, 0xe7, 0xe7, 0x59, 0x7a, - 0x27, 0xe1, 0x65, 0xff, 0xfd, 0x81, 0x07, 0xa0, 0xa2, 0x4e, 0x38, 0xfb, - 0x46, 0xb2, 0xff, 0xdc, 0x32, 0x0f, 0x67, 0xcf, 0x7b, 0x56, 0x5e, 0x32, - 0x85, 0x95, 0x24, 0x7f, 0x0c, 0xab, 0x74, 0x79, 0xab, 0x3b, 0xd0, 0xef, - 0xfe, 0x20, 0xcb, 0xcf, 0x2c, 0xfa, 0x50, 0xb2, 0xff, 0xe0, 0xc8, 0x8e, - 0x51, 0xd2, 0x0c, 0x96, 0x5f, 0xa3, 0x9f, 0xb7, 0xab, 0x28, 0xcf, 0xb3, - 0xc8, 0x75, 0xc4, 0x68, 0xf6, 0x16, 0x16, 0x02, 0xca, 0x73, 0x73, 0xf9, - 0x45, 0xfd, 0x2f, 0x61, 0x60, 0x16, 0x5e, 0x97, 0xba, 0xb2, 0xef, 0x41, - 0x9e, 0x4f, 0x8b, 0x2f, 0xfe, 0x23, 0xff, 0x9a, 0x83, 0x93, 0xf1, 0x65, - 0xc7, 0xc5, 0x95, 0x88, 0x85, 0x32, 0xc9, 0xf4, 0x3b, 0xfb, 0x46, 0xd2, - 0x79, 0x2c, 0xbf, 0xf7, 0xd2, 0xce, 0xe6, 0x81, 0x18, 0xb2, 0xf3, 0xc9, - 0x9c, 0xf1, 0x5e, 0xa4, 0x88, 0xd1, 0xe5, 0x09, 0x0c, 0x22, 0xf4, 0x2a, - 0x9e, 0x31, 0xee, 0x46, 0xb3, 0xd8, 0x77, 0x84, 0xc7, 0x70, 0xb2, 0xff, - 0xc1, 0x6b, 0x3e, 0x41, 0x77, 0x34, 0xb2, 0xff, 0x87, 0x8c, 0xe3, 0x47, - 0xe0, 0xac, 0xbf, 0xf8, 0x70, 0xcf, 0x73, 0x3e, 0x97, 0xa3, 0x8b, 0x2c, - 0xcc, 0xd9, 0x0e, 0x0d, 0x9e, 0xe4, 0xe4, 0x32, 0x02, 0x81, 0xbc, 0xea, - 0xff, 0xe6, 0x6f, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x1d, 0xaf, 0xff, - 0x83, 0x1f, 0x48, 0xda, 0x2e, 0x10, 0xfd, 0x0b, 0x2f, 0xcd, 0xfb, 0xa6, - 0x2a, 0xcb, 0xb6, 0x66, 0x33, 0xfa, 0x11, 0x42, 0xff, 0x7b, 0x24, 0xcd, - 0xcb, 0x8b, 0x2b, 0x0f, 0x9b, 0xa6, 0x57, 0xfc, 0xc9, 0x9f, 0xc6, 0x0f, - 0xa5, 0x0b, 0x2f, 0xe9, 0xec, 0xa0, 0x18, 0x4b, 0x2e, 0x0f, 0x96, 0x5f, - 0xcc, 0x92, 0xcf, 0x3f, 0x56, 0x58, 0x55, 0x97, 0xd8, 0xdd, 0x42, 0xcb, - 0xf6, 0x11, 0xfe, 0x22, 0xca, 0x23, 0xc9, 0xe1, 0x0d, 0xec, 0xd4, 0x2c, - 0xbf, 0xff, 0x48, 0xc7, 0xe3, 0xdf, 0x3b, 0x07, 0xa3, 0x08, 0x16, 0x5f, - 0x46, 0xa3, 0x4b, 0x2a, 0x7b, 0x4c, 0x44, 0xd6, 0xf4, 0x43, 0xd1, 0xb1, - 0x16, 0x6f, 0x4d, 0x1b, 0x2c, 0xbe, 0x82, 0xef, 0x16, 0x5d, 0x82, 0xc1, - 0xbf, 0xe0, 0xf5, 0xff, 0xd9, 0xce, 0xe7, 0xa0, 0xbb, 0xe3, 0x59, 0x74, - 0xf5, 0xc5, 0x97, 0xf7, 0xe5, 0x9f, 0x77, 0x16, 0x5d, 0xb6, 0xea, 0xcb, - 0xf3, 0xb1, 0xec, 0xfd, 0x65, 0xfc, 0x5f, 0xbe, 0x9c, 0x45, 0x95, 0x3c, - 0xa2, 0xf2, 0x07, 0x36, 0x2e, 0xd0, 0xdb, 0x94, 0xdf, 0xff, 0xfd, 0xe7, - 0x19, 0x3c, 0xee, 0x7a, 0x39, 0x38, 0x2f, 0x3a, 0x59, 0xbe, 0x16, 0x5f, - 0x30, 0x59, 0x25, 0x97, 0x7a, 0x3c, 0x89, 0xa2, 0x78, 0xbf, 0x6b, 0x51, - 0xbf, 0x8b, 0x2f, 0xfc, 0x7a, 0x9d, 0xc2, 0xc6, 0xc0, 0x16, 0x5f, 0xe0, - 0xf4, 0xdf, 0x7b, 0xc9, 0x65, 0xfc, 0xfb, 0xc7, 0x84, 0xc2, 0xcb, 0x41, - 0x1f, 0x18, 0x86, 0x97, 0xff, 0xff, 0x7f, 0x04, 0x07, 0xeb, 0xfd, 0xfc, - 0xec, 0x23, 0x80, 0xfb, 0xd0, 0xb2, 0xff, 0xc4, 0x19, 0x4e, 0xc3, 0x28, - 0x6a, 0xcb, 0xfb, 0x92, 0x30, 0x3e, 0x96, 0x5e, 0x77, 0x02, 0xa2, 0xa1, - 0x5f, 0xb0, 0x3d, 0x0b, 0x56, 0x54, 0x1f, 0xe8, 0x0b, 0x74, 0x51, 0x7f, - 0x44, 0xd2, 0x0f, 0xd2, 0x59, 0x7f, 0xe3, 0xff, 0x93, 0xb9, 0xfb, 0xe4, - 0xcb, 0x2f, 0xe0, 0x80, 0xd8, 0x70, 0x2c, 0xbf, 0xec, 0xf6, 0x13, 0xeb, - 0x46, 0xb2, 0xa4, 0xad, 0x4f, 0x0b, 0x58, 0x2a, 0x04, 0x28, 0xbe, 0x27, - 0x37, 0x3d, 0x42, 0xed, 0xa5, 0xde, 0x30, 0x24, 0x3e, 0x17, 0x5e, 0xdd, - 0x78, 0x59, 0x6c, 0x59, 0x7f, 0xfc, 0x6d, 0x80, 0x4e, 0x07, 0x8f, 0x72, - 0x1b, 0x0b, 0x2f, 0xfe, 0x0b, 0xed, 0xcc, 0x30, 0x03, 0x37, 0xac, 0xa9, - 0x22, 0xa7, 0xc2, 0x04, 0xa7, 0x7f, 0xd2, 0xe9, 0xe9, 0xc0, 0x64, 0xb2, - 0xf7, 0xfc, 0xc5, 0x97, 0xfb, 0x81, 0x99, 0xc6, 0xf3, 0x2c, 0xbf, 0xff, - 0xb8, 0x2b, 0xee, 0x70, 0xf5, 0x37, 0x21, 0xaf, 0xf7, 0x56, 0x5e, 0xd1, - 0xfc, 0xb2, 0xa4, 0x8d, 0x0f, 0x87, 0x66, 0x35, 0xeb, 0x0d, 0xfa, 0x45, - 0x0d, 0x61, 0x65, 0xff, 0xcd, 0xcd, 0x16, 0x1e, 0xf3, 0xd3, 0xac, 0xaf, - 0x8f, 0xad, 0xca, 0x2f, 0xff, 0xc7, 0xa9, 0xd9, 0xd0, 0xc6, 0x6d, 0xec, - 0x39, 0x2c, 0xbf, 0xf1, 0x64, 0xdd, 0xf6, 0x68, 0xf8, 0xb2, 0xff, 0xe7, - 0x6c, 0xe6, 0xbf, 0x67, 0x7b, 0xba, 0x59, 0x5e, 0x44, 0x39, 0x1f, 0x5f, - 0xbe, 0x23, 0x69, 0xac, 0xbf, 0x44, 0xf7, 0xb6, 0x0a, 0xb2, 0xfa, 0x7c, - 0x3b, 0x90, 0xb2, 0xa1, 0x39, 0xe1, 0x91, 0x64, 0x37, 0x4c, 0x8b, 0x44, - 0xe1, 0x2e, 0xbf, 0xba, 0xfe, 0x9c, 0x38, 0x59, 0x7f, 0xdd, 0xe0, 0x9c, - 0x7f, 0xa5, 0x8b, 0x2f, 0xf3, 0xca, 0x77, 0x03, 0xfb, 0xac, 0xbe, 0x8f, - 0x46, 0xcb, 0x2c, 0x63, 0x3d, 0x8f, 0x1b, 0x54, 0x23, 0xa7, 0x0b, 0xc3, - 0x09, 0x3b, 0xf7, 0x0f, 0xd8, 0x35, 0x97, 0xe9, 0x47, 0x73, 0x65, 0x95, - 0xba, 0x79, 0xfa, 0x27, 0xbd, 0xf7, 0x71, 0x65, 0xfd, 0xc3, 0x20, 0x7a, - 0x16, 0x56, 0x1f, 0x76, 0x89, 0x7a, 0x3b, 0x7f, 0xec, 0xef, 0x35, 0x93, - 0x78, 0xd8, 0x59, 0x7f, 0xff, 0x1f, 0x3f, 0xc9, 0x14, 0x7e, 0xfe, 0xfa, - 0x59, 0xd5, 0x97, 0xff, 0x00, 0xf5, 0xa7, 0x93, 0x80, 0x3f, 0x2c, 0xbf, - 0xec, 0x63, 0x1a, 0x73, 0xf0, 0xd5, 0x95, 0xa4, 0x6e, 0x79, 0x70, 0x91, - 0x6f, 0xfa, 0x73, 0x96, 0x6e, 0x4e, 0xf0, 0x56, 0x5f, 0x85, 0x3d, 0x63, - 0x0b, 0x2a, 0x13, 0xe1, 0x32, 0xe7, 0x8c, 0x70, 0x25, 0xe2, 0x1f, 0xdf, - 0xf7, 0x4f, 0x86, 0x16, 0x58, 0xe1, 0x65, 0xd1, 0xf2, 0xcb, 0xfa, 0x3b, - 0x84, 0xfb, 0xab, 0x28, 0xd1, 0x03, 0xa3, 0xcf, 0xc5, 0xef, 0xe8, 0xd6, - 0xd1, 0xad, 0x96, 0x5f, 0x07, 0x68, 0x92, 0xca, 0x91, 0xe9, 0x70, 0xbe, - 0xff, 0xdc, 0xc2, 0xef, 0x32, 0x47, 0xe5, 0x97, 0xf7, 0x33, 0x79, 0x47, - 0xcb, 0x2e, 0x0f, 0x96, 0x57, 0x11, 0x07, 0xd3, 0xd9, 0xf2, 0xfb, 0xff, - 0xe8, 0xff, 0x0a, 0x73, 0xf6, 0x77, 0xb3, 0xf7, 0x59, 0x71, 0x6c, 0xb2, - 0xa1, 0x34, 0x2c, 0x85, 0x29, 0x99, 0x92, 0x9d, 0xfe, 0x1e, 0x36, 0x77, - 0x1f, 0xcb, 0x2f, 0x06, 0x38, 0xb2, 0x8c, 0xf4, 0x7c, 0x6b, 0x7f, 0xfb, - 0xd0, 0xd2, 0x76, 0x0b, 0x3f, 0xfb, 0xf5, 0x97, 0xf6, 0xf7, 0x6f, 0x85, - 0x75, 0x97, 0xff, 0xf8, 0xe3, 0xaf, 0xe6, 0x7c, 0xf6, 0x17, 0x67, 0x7f, - 0x2e, 0x2c, 0xa9, 0x23, 0x84, 0xd3, 0x08, 0xc2, 0xf7, 0x03, 0xa5, 0x97, - 0x8f, 0xc6, 0xb2, 0xfe, 0xd3, 0x97, 0xff, 0xc2, 0xca, 0x84, 0xe5, 0xb2, - 0x30, 0x23, 0x2e, 0x71, 0xd1, 0x06, 0xef, 0xfa, 0x45, 0x9d, 0xe7, 0xe7, - 0xf2, 0xcb, 0xf4, 0x35, 0xfe, 0xea, 0xcb, 0xb3, 0x65, 0x97, 0xff, 0x0f, - 0x99, 0xa2, 0xcf, 0xf9, 0x9a, 0x59, 0x5c, 0x44, 0x1f, 0x4a, 0x02, 0x2f, - 0x7e, 0xc0, 0x05, 0xf6, 0x59, 0x5e, 0x3d, 0x82, 0x30, 0xbf, 0xfe, 0xd1, - 0x07, 0xe2, 0xc3, 0xd0, 0x3d, 0x1c, 0x59, 0x7f, 0xff, 0x01, 0xfd, 0x92, - 0x8d, 0x47, 0xfa, 0x81, 0x1c, 0x96, 0x54, 0x22, 0xa7, 0x13, 0xef, 0xd9, - 0xb3, 0x96, 0xf5, 0x97, 0xff, 0xff, 0xfa, 0x25, 0x3b, 0xbe, 0x38, 0xe4, - 0xec, 0x08, 0x23, 0x7c, 0xec, 0xd6, 0xb3, 0x78, 0x5f, 0xcb, 0x2f, 0xbc, - 0x4f, 0xb8, 0xb2, 0xa1, 0x57, 0x26, 0x46, 0x2b, 0xe8, 0x65, 0x11, 0x0f, - 0x0a, 0x7b, 0x09, 0x7b, 0xfc, 0xff, 0x70, 0xdb, 0x00, 0x59, 0x7d, 0xb3, - 0xc6, 0x96, 0x5e, 0x12, 0x7d, 0xd6, 0x5f, 0xff, 0xdb, 0xa7, 0xb7, 0x9c, - 0xfb, 0x1e, 0x3e, 0xf3, 0x06, 0xb2, 0xbc, 0x7f, 0xae, 0x41, 0x4e, 0x8c, - 0x00, 0xc2, 0x7e, 0xff, 0xdb, 0xde, 0x58, 0x43, 0x28, 0x92, 0xcb, 0xb6, - 0x85, 0x96, 0x2c, 0x3d, 0x50, 0x9f, 0x5e, 0x31, 0x66, 0x59, 0x7f, 0xcf, - 0xe3, 0xe7, 0x02, 0xff, 0xac, 0xa1, 0x9e, 0xbb, 0x8f, 0x59, 0x9c, 0xf4, - 0xdd, 0x8b, 0x32, 0x4f, 0xe7, 0x93, 0x09, 0xec, 0x5e, 0x23, 0x41, 0xda, - 0x11, 0xf2, 0x2c, 0x1c, 0x3f, 0xb2, 0x70, 0xed, 0x88, 0x51, 0x82, 0x18, - 0xff, 0x17, 0x9c, 0x60, 0xfa, 0x94, 0x90, 0xd8, 0xd0, 0xfd, 0x2b, 0x45, - 0xe1, 0xa0, 0x51, 0xe2, 0x72, 0x51, 0x37, 0x65, 0x99, 0x05, 0x9a, 0x7e, - 0x1e, 0x62, 0x3e, 0x6e, 0x3e, 0xde, 0x23, 0x15, 0x65, 0xf0, 0x1d, 0xc0, - 0xa8, 0xaa, 0x17, 0xfb, 0x51, 0xbf, 0xe9, 0x67, 0x56, 0x56, 0x8f, 0x90, - 0x25, 0xd7, 0xf9, 0x88, 0xef, 0x37, 0xe0, 0xd6, 0x5f, 0xf9, 0xe4, 0xcf, - 0x34, 0x07, 0x70, 0x2a, 0x26, 0xb5, 0xff, 0x7a, 0x1b, 0xce, 0x39, 0x01, - 0x65, 0xf4, 0x6a, 0x3a, 0xb2, 0xe7, 0xea, 0xca, 0x19, 0xb7, 0x69, 0x0d, - 0x99, 0xc9, 0x3b, 0x4c, 0x84, 0x03, 0x04, 0x4d, 0x36, 0xf2, 0x63, 0xb7, - 0xdf, 0xff, 0x6e, 0x98, 0xf1, 0xb3, 0xbb, 0x9b, 0xa7, 0xbf, 0x8b, 0x2f, - 0xda, 0x03, 0xb8, 0x15, 0x15, 0x62, 0xf6, 0xa1, 0xab, 0x2f, 0xfa, 0x25, - 0x1a, 0xda, 0x35, 0xb2, 0xcb, 0x33, 0x84, 0x71, 0xe2, 0xce, 0x8d, 0x08, - 0x72, 0xf8, 0xb0, 0x2c, 0xb5, 0x97, 0xf7, 0xdd, 0x8f, 0x3e, 0xea, 0xcb, - 0xf3, 0xfb, 0x35, 0x8b, 0x2a, 0x0f, 0x5d, 0xcc, 0x6f, 0xed, 0x06, 0x6e, - 0x47, 0x56, 0x54, 0x23, 0x2f, 0xcf, 0x81, 0x20, 0xbf, 0xfb, 0xfc, 0x26, - 0x72, 0xff, 0x9b, 0x39, 0x2c, 0xa6, 0x67, 0xef, 0x05, 0xf7, 0xf1, 0xb4, - 0xfb, 0xe8, 0x59, 0x7d, 0x13, 0x47, 0xcb, 0x2b, 0xc7, 0x9f, 0xc2, 0xcb, - 0xfe, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x91, 0x17, 0xf6, 0xd1, 0xaf, - 0x39, 0xac, 0xb3, 0x3c, 0x44, 0xb3, 0x91, 0x71, 0x1e, 0xfd, 0xa0, 0x3b, - 0x81, 0x51, 0x69, 0x2f, 0xfc, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, - 0xea, 0xcc, 0xf1, 0x10, 0x0d, 0x34, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, - 0xa0, 0x3b, 0x81, 0x51, 0x42, 0x2f, 0xfe, 0xc1, 0x59, 0xf5, 0x87, 0xe1, - 0xf6, 0x16, 0x5f, 0xba, 0x10, 0x3f, 0x16, 0x5f, 0x1e, 0xd1, 0xa5, 0x94, - 0xd3, 0xca, 0xf1, 0x45, 0xfb, 0x40, 0x77, 0x02, 0xa2, 0x8f, 0x5f, 0xf4, - 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xff, 0xff, 0xf8, 0x43, 0xd4, 0xd1, - 0xed, 0x67, 0x9c, 0x4e, 0x63, 0x0e, 0x5f, 0xc1, 0x44, 0xde, 0x85, 0x97, - 0xe7, 0xe1, 0xf6, 0x16, 0x5f, 0xf4, 0x4d, 0x05, 0x13, 0x7a, 0x16, 0x54, - 0x23, 0xb9, 0x88, 0x48, 0x11, 0x35, 0xff, 0xfd, 0x83, 0xf4, 0x08, 0xcf, - 0xa4, 0xff, 0xf3, 0x91, 0xfa, 0x4b, 0xcf, 0x26, 0x70, 0xa8, 0x47, 0x08, - 0x88, 0xd3, 0xb1, 0x94, 0x4f, 0x9a, 0x5f, 0xfd, 0x9e, 0x67, 0xd6, 0x1f, - 0x87, 0xd8, 0x59, 0x66, 0x7b, 0x2b, 0x4d, 0x6c, 0xaa, 0x2e, 0xb2, 0xd4, - 0x3b, 0x18, 0x2d, 0xa9, 0x14, 0x72, 0x64, 0xc8, 0xcd, 0x18, 0xae, 0xcd, - 0xc1, 0x2d, 0xd3, 0xe8, 0xd1, 0xce, 0x38, 0x49, 0xa3, 0x08, 0xf4, 0x2d, - 0xbf, 0x2a, 0xec, 0xba, 0x7b, 0xff, 0xe1, 0x41, 0x3d, 0x32, 0x7f, 0x65, - 0xea, 0x79, 0x9d, 0x3b, 0xd3, 0xeb, 0x2f, 0xff, 0xfd, 0xb9, 0xd9, 0xec, - 0x6d, 0x9e, 0xc8, 0xd9, 0x57, 0xac, 0xbd, 0x4f, 0x33, 0xa7, 0x7a, 0x7d, - 0x65, 0x79, 0x30, 0x11, 0x5b, 0xaf, 0xfe, 0xf4, 0x1e, 0x8d, 0x96, 0x0f, - 0x40, 0xab, 0x2f, 0xfd, 0xc6, 0x59, 0xb1, 0x3a, 0x77, 0xa7, 0xd9, 0xc1, - 0xf6, 0x80, 0x96, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x11, 0x2f, 0xf7, 0x03, - 0x13, 0x74, 0xf7, 0xac, 0xb3, 0x3c, 0x3e, 0xa9, 0x8d, 0x2f, 0xec, 0xd0, - 0x1d, 0xc0, 0xa8, 0x8a, 0xd7, 0xfd, 0xba, 0xcf, 0x34, 0x07, 0x70, 0x2a, - 0x2b, 0x85, 0x33, 0x44, 0x1b, 0x9c, 0xdf, 0x79, 0xf4, 0x6b, 0x2f, 0xdd, - 0xfc, 0x42, 0x92, 0xcb, 0xf7, 0xf0, 0x40, 0x67, 0x07, 0x96, 0xe4, 0x37, - 0xcc, 0xf6, 0x9b, 0x75, 0x65, 0x8f, 0xe3, 0xe9, 0xfc, 0xfe, 0xff, 0x32, - 0x67, 0xa2, 0x80, 0x3f, 0xcb, 0x2f, 0xb3, 0xcf, 0xd5, 0x97, 0xfb, 0x0f, - 0x5f, 0xfe, 0x1e, 0x2c, 0xb3, 0x24, 0x8f, 0x5b, 0x84, 0x37, 0xf6, 0xa3, - 0xae, 0x58, 0xb2, 0xff, 0xfd, 0xc3, 0xf3, 0x9c, 0x8c, 0xba, 0x1f, 0x6b, - 0x16, 0x51, 0x9f, 0xf7, 0x4a, 0xef, 0xe8, 0xff, 0x9d, 0x28, 0x59, 0x7c, - 0x07, 0x70, 0x2a, 0x29, 0xe5, 0xff, 0x8a, 0x37, 0x9f, 0x65, 0x18, 0x4b, - 0x2b, 0x47, 0xd7, 0xd2, 0xeb, 0xfc, 0x3f, 0xe7, 0x46, 0xec, 0x49, 0x65, - 0xfe, 0x69, 0x8c, 0x2f, 0xa9, 0x2c, 0xb9, 0xa6, 0xb2, 0xa0, 0xf2, 0x40, - 0x67, 0x7f, 0xff, 0x47, 0x78, 0x16, 0x80, 0xff, 0x8c, 0xf1, 0x84, 0x0b, - 0x2f, 0xe8, 0x6f, 0x20, 0xf6, 0x59, 0x52, 0x44, 0x47, 0x56, 0xef, 0xff, - 0xe7, 0xd3, 0xfb, 0xe9, 0x67, 0x70, 0x83, 0xd0, 0xb0, 0xb2, 0xfa, 0x51, - 0x9b, 0x2c, 0xbf, 0xff, 0x68, 0x3a, 0xd4, 0x16, 0x30, 0x7e, 0xf6, 0x08, - 0xb2, 0xf6, 0x8f, 0xe5, 0x94, 0x04, 0x78, 0xfc, 0xb9, 0xa2, 0x2e, 0xab, - 0x5e, 0x32, 0xea, 0xcb, 0xff, 0x9e, 0x4c, 0xdc, 0x79, 0x2f, 0x40, 0x16, - 0x5f, 0xf8, 0xf4, 0xfb, 0x0c, 0x2f, 0xa9, 0x2c, 0xbf, 0xec, 0x2f, 0xe1, - 0xa7, 0xa9, 0x2c, 0xbf, 0xc7, 0xc3, 0x0b, 0x2c, 0x70, 0xb2, 0xa4, 0x7d, - 0xdd, 0x38, 0xb3, 0xac, 0xbf, 0xfe, 0x6e, 0x1f, 0x43, 0xd8, 0x91, 0x8f, - 0x06, 0xb2, 0x8d, 0x10, 0x1e, 0x22, 0xfc, 0x42, 0xfe, 0x8d, 0x6d, 0x1a, - 0xd9, 0x65, 0xfd, 0x1b, 0x38, 0xdf, 0xab, 0x2a, 0x47, 0xb9, 0xb8, 0x5f, - 0x7d, 0x38, 0x9e, 0x4b, 0x2f, 0xcf, 0x9e, 0x36, 0xac, 0xae, 0x1e, 0x4e, - 0xf2, 0x3a, 0x84, 0x49, 0x63, 0x75, 0xff, 0x6f, 0x76, 0xce, 0x1f, 0x8d, - 0xab, 0x2f, 0xf8, 0xa1, 0xb1, 0x22, 0xc6, 0xac, 0xbf, 0xfc, 0xd8, 0xd6, - 0xd1, 0xf6, 0x05, 0x97, 0x83, 0x59, 0x58, 0x8c, 0x23, 0x3d, 0x73, 0x6b, - 0xf0, 0x30, 0xca, 0x65, 0x97, 0xf8, 0x81, 0x9b, 0xf3, 0xbc, 0x59, 0x73, - 0xb0, 0xb2, 0xa0, 0xf2, 0xf4, 0x69, 0x7e, 0x7d, 0xa3, 0x41, 0x59, 0x53, - 0xcb, 0x24, 0x26, 0x7b, 0x84, 0x94, 0x42, 0xa6, 0x44, 0x39, 0x09, 0x86, - 0x08, 0x81, 0x08, 0x2f, 0xa1, 0x52, 0x71, 0x8a, 0x4c, 0x7c, 0xd1, 0xbf, - 0x22, 0xbc, 0x65, 0xa5, 0x18, 0xf7, 0x21, 0xc7, 0xd2, 0xdd, 0xee, 0x53, - 0xe4, 0x37, 0xff, 0x9e, 0x4c, 0xc6, 0x4e, 0x2f, 0x39, 0x1f, 0xac, 0xbf, - 0xfd, 0xff, 0xe1, 0xe3, 0x31, 0x09, 0xda, 0x50, 0xb2, 0xff, 0xe2, 0xcf, - 0xdc, 0xbf, 0x66, 0xd3, 0x6a, 0xca, 0xd2, 0x25, 0x3a, 0x9d, 0x7e, 0x7f, - 0x78, 0xe6, 0x59, 0x7f, 0xf6, 0x70, 0xcb, 0xf2, 0xce, 0xfb, 0x16, 0x5f, - 0xf8, 0xcb, 0xf2, 0xce, 0xfb, 0x19, 0xf8, 0xfa, 0x84, 0x28, 0xa6, 0x6a, - 0xbe, 0x47, 0x19, 0xa1, 0xc3, 0x87, 0x90, 0x8d, 0xb6, 0x2c, 0xbf, 0x14, - 0x05, 0x97, 0xc5, 0x97, 0xf3, 0x1a, 0x71, 0xb9, 0x2c, 0xa1, 0x9f, 0x46, - 0x08, 0x39, 0x5d, 0xff, 0xc6, 0x3d, 0x3f, 0xcc, 0xf5, 0xa8, 0xd9, 0x65, - 0x33, 0x3f, 0x5f, 0x16, 0xda, 0x16, 0x5f, 0xdc, 0x80, 0x14, 0x0d, 0x65, - 0x0c, 0xde, 0x18, 0x85, 0xff, 0xfb, 0xd1, 0xac, 0x91, 0xbf, 0x70, 0x66, - 0x10, 0x24, 0xbf, 0x44, 0xbf, 0x0c, 0x96, 0x5f, 0x01, 0xdc, 0x0a, 0x8a, - 0xcd, 0x53, 0x1e, 0xbe, 0x8a, 0x6f, 0xba, 0x6d, 0xe2, 0xcb, 0xb8, 0xc2, - 0xcb, 0xdc, 0x08, 0x16, 0x53, 0x06, 0xd7, 0x83, 0x17, 0xdc, 0xd4, 0x6f, - 0x59, 0x7f, 0x6f, 0x22, 0x8d, 0xd9, 0x96, 0x5f, 0x9b, 0x05, 0x2e, 0x2c, - 0xa8, 0x3d, 0x9d, 0x8c, 0xaf, 0xbb, 0xc1, 0x38, 0xb2, 0xfb, 0x9c, 0x81, - 0x56, 0x59, 0xd6, 0x56, 0x1e, 0xb9, 0x92, 0x70, 0x8e, 0xed, 0x8d, 0x65, - 0xfe, 0xe4, 0xc6, 0x5e, 0xcf, 0x96, 0x54, 0x1e, 0x5e, 0x0b, 0xdc, 0xfd, - 0x59, 0x7d, 0xf8, 0x85, 0x25, 0x94, 0x33, 0x75, 0xd1, 0x6b, 0xff, 0xe8, - 0x6f, 0x73, 0x0b, 0xbc, 0xf6, 0x7e, 0xeb, 0x2f, 0xf3, 0x63, 0xee, 0x6a, - 0x37, 0xac, 0xb9, 0xf8, 0xb2, 0xa0, 0xf3, 0x02, 0x6d, 0x7f, 0xa4, 0x61, - 0xdd, 0x9e, 0x7f, 0x6a, 0xcb, 0xf1, 0x47, 0x8f, 0x16, 0x56, 0x1f, 0x13, - 0x9e, 0xd8, 0xd6, 0x5f, 0xde, 0xc2, 0x27, 0xea, 0xce, 0x16, 0x17, 0xe2, - 0xef, 0xa3, 0x7a, 0xcb, 0xce, 0xed, 0x59, 0x7e, 0xc9, 0xb6, 0x0f, 0xeb, - 0x2f, 0xee, 0xc6, 0xbf, 0x89, 0x96, 0x59, 0x9c, 0x2e, 0xba, 0x0c, 0x83, - 0x21, 0x55, 0xf1, 0x19, 0xab, 0xcc, 0x45, 0xa7, 0xd6, 0xbc, 0xf9, 0xe1, - 0xd6, 0xbf, 0x21, 0x28, 0x4d, 0x72, 0x10, 0x7d, 0x30, 0x09, 0xd6, 0xf2, - 0x91, 0x06, 0xf7, 0x0a, 0xef, 0xf8, 0xfa, 0xfa, 0xda, 0x0c, 0x6b, 0x2f, - 0xe8, 0x6e, 0xc1, 0xd4, 0x96, 0x57, 0x8f, 0x9f, 0xa7, 0x17, 0xfb, 0x6f, - 0x60, 0x3d, 0x1a, 0x59, 0x7f, 0xd0, 0x52, 0xe3, 0x5c, 0x98, 0x59, 0x50, - 0x7d, 0x9d, 0x34, 0xba, 0x06, 0xb2, 0xff, 0x82, 0xdc, 0x06, 0xbe, 0x71, - 0x56, 0x54, 0x8f, 0xcb, 0x84, 0x3d, 0x16, 0xbf, 0xda, 0x86, 0x30, 0x8d, - 0x85, 0x97, 0xff, 0xec, 0x1f, 0xa3, 0x93, 0xb0, 0xf4, 0x6d, 0x86, 0x16, - 0x5f, 0xfe, 0x81, 0x44, 0x69, 0x67, 0xdd, 0x8c, 0x15, 0x65, 0xfb, 0xa6, - 0x58, 0xd5, 0x97, 0xd2, 0x72, 0x67, 0x8a, 0x8a, 0xbe, 0x8c, 0x03, 0x45, - 0xe4, 0x66, 0x22, 0xb6, 0xe2, 0x65, 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, - 0x02, 0xa2, 0x45, 0x5f, 0xff, 0xbb, 0xec, 0x26, 0x7d, 0x77, 0xfb, 0x8c, - 0x30, 0xeb, 0x2f, 0xfc, 0xfd, 0x67, 0x07, 0xa3, 0xe8, 0x56, 0x53, 0x34, - 0x72, 0x42, 0x63, 0xac, 0xdf, 0xf6, 0xb4, 0x62, 0xe4, 0xc6, 0xd5, 0x97, - 0xc0, 0x8f, 0x42, 0xca, 0x33, 0xdb, 0x23, 0xab, 0xf6, 0x80, 0xee, 0x05, - 0x45, 0x92, 0xa8, 0x3d, 0x4c, 0x20, 0xbf, 0x6c, 0x65, 0x2e, 0x2c, 0xbf, - 0xc1, 0xdb, 0xd1, 0xde, 0x1a, 0xcb, 0xf8, 0x23, 0x3d, 0x3f, 0x16, 0x5c, - 0x7d, 0x59, 0x7e, 0xef, 0x04, 0xe3, 0x3c, 0x44, 0xfe, 0x8a, 0x38, 0x69, - 0xd2, 0xda, 0x66, 0x98, 0xe6, 0x42, 0xfe, 0xfb, 0x05, 0xe7, 0x96, 0x5f, - 0xed, 0xc3, 0x6c, 0x78, 0x41, 0xac, 0xbf, 0xbc, 0x7a, 0x89, 0x71, 0x65, - 0xfc, 0xde, 0x9f, 0x9d, 0xab, 0x2f, 0xff, 0x1f, 0x7d, 0x9d, 0xc2, 0x8e, - 0xc0, 0xd6, 0x54, 0x1f, 0xa3, 0x96, 0xdf, 0xf3, 0x9f, 0x43, 0xa7, 0xe3, - 0x3d, 0x93, 0x1b, 0xc2, 0x30, 0x1b, 0xfa, 0x14, 0x37, 0xff, 0xfb, 0xaf, - 0xf7, 0xec, 0xc6, 0x51, 0xf4, 0xba, 0x65, 0xff, 0x16, 0x5f, 0xd9, 0xa0, - 0x3b, 0x81, 0x51, 0x6c, 0x2f, 0xff, 0xde, 0x9c, 0x59, 0xae, 0xf3, 0xd3, - 0x4e, 0x9d, 0xe9, 0xf5, 0x97, 0xef, 0x3e, 0x8d, 0xab, 0x29, 0x92, 0x88, - 0x80, 0x30, 0xde, 0xd0, 0x7c, 0xb2, 0xee, 0xb3, 0x83, 0xc4, 0xd1, 0x3d, - 0x33, 0x4c, 0xd0, 0xe3, 0x05, 0xbd, 0x9c, 0xc5, 0x97, 0xc0, 0x77, 0x02, - 0xa2, 0xdb, 0x5c, 0xfa, 0x59, 0x69, 0x2c, 0xb7, 0x36, 0x34, 0xe1, 0x16, - 0xad, 0x1f, 0xef, 0x55, 0x6f, 0xde, 0xe9, 0xfe, 0x15, 0x97, 0xff, 0xa3, - 0x6e, 0x98, 0xf0, 0xa4, 0x7e, 0x0a, 0xca, 0x33, 0xf2, 0xf1, 0x4d, 0xff, - 0x44, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7d, 0x13, 0x70, 0xd6, 0x54, 0x93, - 0xa9, 0xc8, 0x4c, 0x4d, 0x09, 0x42, 0x21, 0xdc, 0x3a, 0xbf, 0xf0, 0xf4, - 0x61, 0xd9, 0x9f, 0x35, 0xd5, 0x94, 0xcd, 0x13, 0x58, 0xaf, 0x7b, 0xd9, - 0xb2, 0xcb, 0xf9, 0xc7, 0x98, 0x4c, 0x2c, 0xbe, 0xc2, 0xfd, 0x9c, 0xc7, - 0x92, 0xd1, 0xdb, 0xa7, 0xb2, 0x59, 0x7a, 0x7b, 0xf0, 0xd6, 0x5e, 0xdb, - 0xc6, 0xb2, 0xff, 0xd3, 0xdc, 0xf6, 0xca, 0xfb, 0xec, 0x28, 0xfd, 0x65, - 0xe9, 0xe3, 0x3c, 0x27, 0x8a, 0xcb, 0xf7, 0x63, 0xcf, 0x32, 0xcb, 0xfa, - 0x0a, 0x43, 0x0b, 0x56, 0x5f, 0xef, 0x18, 0x93, 0x70, 0x3f, 0x2c, 0xbf, - 0xec, 0xd6, 0xa2, 0x4f, 0xf0, 0xab, 0x2f, 0x80, 0xee, 0x05, 0x45, 0xe0, - 0xbf, 0x77, 0xe0, 0x1e, 0x96, 0x5f, 0xf8, 0xff, 0xe4, 0xee, 0x7e, 0xf9, - 0x32, 0xcb, 0xff, 0x3f, 0x63, 0x7e, 0xb5, 0x9f, 0x71, 0x65, 0xff, 0xcf, - 0xa1, 0x3a, 0x7e, 0x2c, 0xee, 0x2c, 0xad, 0x26, 0x3c, 0xd2, 0xef, 0x14, - 0x92, 0x1e, 0xf4, 0x1b, 0xf6, 0xba, 0xca, 0xb9, 0x32, 0xcb, 0x9f, 0x8b, - 0x2f, 0x4f, 0xe7, 0x96, 0x57, 0xe6, 0xd7, 0xa2, 0xd7, 0xe6, 0xc1, 0x49, - 0xd6, 0x5f, 0xd0, 0x5d, 0xde, 0xe0, 0x59, 0x7f, 0x4a, 0x37, 0xc6, 0xbe, - 0x59, 0x7f, 0xff, 0x3e, 0xd3, 0x4a, 0x35, 0xb7, 0x65, 0x9b, 0xae, 0x5f, - 0xac, 0xa9, 0x22, 0xff, 0x0b, 0x9c, 0xc2, 0xfb, 0xc5, 0x93, 0x2c, 0xbf, - 0xba, 0xfe, 0x9c, 0x38, 0x59, 0x7f, 0xcf, 0xde, 0x41, 0x8f, 0x1a, 0xb2, - 0xa0, 0xf9, 0x88, 0xbe, 0xf8, 0xb0, 0xd8, 0x59, 0x7f, 0xcd, 0xfa, 0x5d, - 0xc2, 0xef, 0x16, 0x53, 0x4f, 0x6c, 0x42, 0x1b, 0xb1, 0x85, 0x97, 0xe7, - 0x97, 0x4f, 0x65, 0x97, 0xff, 0x8f, 0xb0, 0x40, 0x36, 0xb4, 0xf8, 0x15, - 0x95, 0x08, 0xaa, 0xc2, 0x33, 0x17, 0x72, 0x8b, 0xb1, 0xab, 0x2f, 0xc7, - 0xe1, 0x9f, 0x16, 0x58, 0xf6, 0x37, 0xb2, 0x16, 0xbf, 0x61, 0x7f, 0xb9, - 0x0b, 0x2f, 0x84, 0x0b, 0xf1, 0x65, 0xfa, 0x6d, 0x1e, 0xcd, 0x59, 0x50, - 0x79, 0xb8, 0x47, 0x74, 0xc3, 0x59, 0x7f, 0xf3, 0x60, 0x13, 0xb0, 0x83, - 0x2c, 0xe2, 0xcb, 0xfd, 0xe3, 0x15, 0x8d, 0x38, 0xab, 0x2f, 0xff, 0xfc, - 0xe7, 0xd7, 0x6b, 0x97, 0xe0, 0xf1, 0xea, 0x42, 0x4b, 0x09, 0x65, 0xfd, - 0x1f, 0x7d, 0x27, 0xf9, 0x65, 0x0d, 0x32, 0xec, 0x18, 0x02, 0x2f, 0x8d, - 0x82, 0xd7, 0x7f, 0x9c, 0xbf, 0xec, 0xfe, 0x79, 0x65, 0xff, 0x79, 0xe4, - 0xd3, 0x8d, 0x49, 0x65, 0xb3, 0x74, 0xfb, 0xbc, 0x6d, 0x73, 0x78, 0xb2, - 0xfa, 0x0a, 0x5b, 0xab, 0x2f, 0xff, 0x7d, 0xfb, 0x97, 0xe5, 0x9b, 0xfd, - 0x83, 0x59, 0x7f, 0xf1, 0xbf, 0xfd, 0x3e, 0x7a, 0x0b, 0xab, 0x2f, 0xb3, - 0xa2, 0x81, 0x65, 0xd1, 0xfa, 0xca, 0x92, 0x65, 0xf8, 0x54, 0xc0, 0xb9, - 0x92, 0x79, 0x37, 0x88, 0x7d, 0x23, 0xbf, 0xcf, 0xe7, 0x11, 0xb9, 0xc5, - 0x96, 0x02, 0xcb, 0x81, 0x25, 0x94, 0x03, 0x51, 0xd1, 0x1a, 0x64, 0x32, - 0xde, 0x19, 0x23, 0x73, 0xd9, 0x14, 0xf1, 0x1d, 0x9e, 0x09, 0xf0, 0x5f, - 0xb1, 0x44, 0x8b, 0x46, 0x6f, 0x91, 0xac, 0x30, 0x99, 0xf3, 0x29, 0x91, - 0x4d, 0x0e, 0x5d, 0x17, 0x36, 0x11, 0x1e, 0x8c, 0x95, 0xdd, 0xbf, 0x27, - 0x27, 0x7e, 0x46, 0x9d, 0xd8, 0xf9, 0xf7, 0xb2, 0x4f, 0xad, 0xde, 0xec, - 0x0d, 0x65, 0xf7, 0xef, 0xae, 0x2c, 0xbb, 0xe6, 0x70, 0x6f, 0xf0, 0x72, - 0xff, 0x7e, 0xce, 0x69, 0x41, 0x75, 0x65, 0x33, 0x54, 0x53, 0x11, 0xe2, - 0x68, 0xba, 0xf8, 0x86, 0x27, 0xcb, 0x2e, 0xcf, 0x96, 0x5f, 0x3f, 0x03, - 0xb2, 0xca, 0x33, 0x75, 0xa1, 0x7b, 0xf6, 0x80, 0xee, 0x05, 0x45, 0xe8, - 0xbf, 0x67, 0x4a, 0x36, 0x59, 0x7f, 0xe7, 0x3e, 0x87, 0x4f, 0xbf, 0x06, - 0xb2, 0xf0, 0xc3, 0xc5, 0x97, 0xe8, 0x6b, 0xfa, 0x16, 0x5e, 0x69, 0xf5, - 0x65, 0xff, 0x3f, 0x65, 0x0c, 0x74, 0xf6, 0x59, 0x5a, 0x3f, 0xc6, 0x93, - 0x10, 0xe5, 0xfb, 0x1b, 0xe7, 0x1a, 0xca, 0x85, 0x40, 0xc3, 0x5e, 0xc2, - 0x0d, 0x1a, 0x78, 0x9d, 0xcf, 0xc4, 0x84, 0xce, 0xe1, 0x75, 0xff, 0xd8, - 0x3f, 0x63, 0x5a, 0xf2, 0xc2, 0x59, 0x78, 0x31, 0xfa, 0xcb, 0xed, 0xf8, - 0x4c, 0xc6, 0x7b, 0xfa, 0x42, 0xbf, 0xcc, 0xfb, 0x93, 0x49, 0xc6, 0xb2, - 0x8c, 0xfc, 0xbc, 0x79, 0x4c, 0xd3, 0x6b, 0xc8, 0xd2, 0xa9, 0x94, 0x76, - 0x8b, 0x11, 0x0c, 0xed, 0xa1, 0x5b, 0x28, 0x6c, 0x65, 0x30, 0xac, 0x11, - 0x96, 0x9c, 0xee, 0xa4, 0xd2, 0xe8, 0xb5, 0x1a, 0xf3, 0x63, 0xfb, 0xf4, - 0x68, 0xae, 0xe5, 0xfc, 0x73, 0x45, 0x29, 0xbb, 0x8d, 0xa1, 0xa6, 0xee, - 0x8b, 0x2e, 0xaa, 0xe0, 0xf9, 0x65, 0xff, 0xc1, 0x89, 0x8b, 0x37, 0xbb, - 0x5a, 0x6b, 0x2f, 0xb3, 0xcf, 0xd5, 0x97, 0xfb, 0x0f, 0x5f, 0xfe, 0x1e, - 0x2c, 0xb3, 0x25, 0x84, 0x4d, 0x92, 0x2f, 0x08, 0x6f, 0xff, 0x77, 0x81, - 0x8e, 0x67, 0x4d, 0xaf, 0x25, 0x97, 0xa3, 0xed, 0x96, 0x51, 0x1f, 0x3f, - 0x52, 0x6f, 0xfb, 0xbc, 0xcf, 0xa5, 0xe0, 0xb0, 0xb2, 0xf7, 0x22, 0x65, - 0x94, 0x67, 0xf4, 0x44, 0x3c, 0x3c, 0xbc, 0x4f, 0xe5, 0x97, 0xb7, 0xc4, - 0x96, 0x5e, 0xf6, 0x71, 0x65, 0xff, 0x11, 0xb1, 0xdf, 0x80, 0x7e, 0x59, - 0x50, 0x7e, 0x83, 0x1e, 0xc1, 0xcb, 0xf9, 0xf5, 0x22, 0x0b, 0xac, 0xb8, - 0xda, 0xb2, 0x82, 0x78, 0x5b, 0x85, 0x97, 0xcd, 0x09, 0x0d, 0x65, 0xed, - 0xef, 0xf2, 0xcb, 0xce, 0xe0, 0x54, 0x44, 0x6b, 0xe6, 0x00, 0xfa, 0x59, - 0x40, 0x3c, 0xb3, 0x28, 0xbf, 0x4f, 0x7d, 0xe3, 0xfe, 0xb2, 0xfc, 0x6e, - 0xdc, 0xd2, 0xcb, 0xc0, 0x11, 0xab, 0x2f, 0xff, 0xfa, 0x26, 0xec, 0x73, - 0x51, 0xd3, 0x01, 0x8e, 0x73, 0x04, 0xeb, 0x2a, 0x11, 0x0c, 0x43, 0xd7, - 0xff, 0x1f, 0x3d, 0x8c, 0x30, 0xf3, 0x87, 0xf2, 0xca, 0xd9, 0x3f, 0x13, - 0x22, 0xd3, 0x53, 0x48, 0x7c, 0x5d, 0xd8, 0x56, 0x6f, 0x21, 0xbf, 0xe1, - 0xe9, 0xfe, 0xf6, 0x18, 0xab, 0x2f, 0xfe, 0xe7, 0x31, 0xa5, 0x9b, 0xe7, - 0x44, 0xf4, 0xb2, 0xde, 0x34, 0x43, 0x04, 0xea, 0xff, 0x6d, 0xac, 0xef, - 0x4f, 0xab, 0x29, 0x65, 0xff, 0xde, 0xce, 0x94, 0x4d, 0x39, 0x82, 0x75, - 0x97, 0x06, 0x26, 0x3d, 0x1e, 0x85, 0xd4, 0x22, 0xcf, 0x90, 0x85, 0xbc, - 0x51, 0xf2, 0xca, 0x91, 0xe1, 0x8c, 0x9e, 0xe7, 0xf2, 0xcb, 0xfd, 0xac, - 0xe6, 0x39, 0x6c, 0xb2, 0x86, 0x79, 0x18, 0x2d, 0x70, 0xda, 0xb2, 0xfc, - 0xfb, 0x08, 0x63, 0x59, 0x7f, 0xf6, 0x0a, 0x18, 0xdb, 0xa3, 0x8e, 0xf1, - 0x65, 0x62, 0x21, 0x9c, 0x5c, 0x8a, 0x6f, 0xff, 0x48, 0xd8, 0x61, 0xf9, - 0x07, 0xb3, 0xf5, 0x65, 0xff, 0xfc, 0xe7, 0xd8, 0xf1, 0x67, 0x7c, 0x7e, - 0xc3, 0x15, 0x65, 0x1a, 0x28, 0xfc, 0x97, 0x7f, 0xff, 0xfb, 0xbd, 0x36, - 0xe8, 0xf3, 0xe2, 0x0f, 0x63, 0xd3, 0xb7, 0x9f, 0x66, 0x85, 0x97, 0xfb, - 0x0c, 0x8f, 0x5a, 0xc5, 0x97, 0xfd, 0x8e, 0x5f, 0xe8, 0x31, 0xfa, 0xca, - 0x84, 0xc1, 0xf0, 0x8b, 0xe7, 0xcd, 0x18, 0x5f, 0xff, 0x9b, 0xba, 0x6e, - 0xf3, 0x77, 0xd9, 0x2f, 0x1e, 0xf5, 0x97, 0xf7, 0xd2, 0xd0, 0x63, 0xf5, - 0x97, 0xee, 0xc6, 0xa3, 0xf5, 0x97, 0xf3, 0x73, 0x52, 0x86, 0xac, 0xa8, - 0x46, 0xfe, 0x2d, 0x19, 0x83, 0x94, 0x5d, 0xb3, 0x52, 0x5c, 0x28, 0xa9, - 0x2f, 0xfc, 0xcc, 0x1e, 0x39, 0xbd, 0x1b, 0x33, 0xfc, 0xd8, 0x8a, 0x31, - 0x7d, 0xbe, 0x3b, 0x0b, 0x2f, 0x6f, 0x7d, 0x2c, 0xbe, 0xcf, 0x16, 0x2c, - 0xac, 0x37, 0xdc, 0x1e, 0xa9, 0x23, 0x78, 0xd7, 0x7a, 0xc3, 0x7e, 0x76, - 0xe7, 0xdd, 0x59, 0x7b, 0x8f, 0xba, 0xb2, 0xb0, 0xf1, 0xcc, 0xa2, 0xf6, - 0xd1, 0xba, 0xb2, 0xff, 0xfb, 0xc6, 0xc7, 0x0f, 0x0b, 0xf1, 0xe9, 0xc0, - 0xb2, 0xff, 0x47, 0xb2, 0x69, 0x3e, 0xcb, 0x2f, 0xfe, 0x2c, 0xfa, 0x5c, - 0x19, 0xef, 0x81, 0xac, 0xad, 0x91, 0xd4, 0x32, 0x00, 0xa8, 0x6e, 0x1a, - 0x5f, 0xe7, 0xfb, 0x8e, 0x41, 0xc5, 0x97, 0xc7, 0xa7, 0xfd, 0x65, 0x7e, - 0x7a, 0x9c, 0x32, 0xbf, 0xdf, 0xc6, 0xf7, 0xf7, 0x8d, 0x65, 0x33, 0x3d, - 0x8e, 0x91, 0xdf, 0xf7, 0x03, 0xad, 0x1c, 0x1e, 0x96, 0x56, 0x26, 0x92, - 0xf0, 0xed, 0xe9, 0x25, 0xb7, 0x56, 0x5f, 0x17, 0xd3, 0x42, 0xcb, 0xfe, - 0x8c, 0xfa, 0x1e, 0x4f, 0x25, 0x97, 0xf6, 0x7f, 0x38, 0xb3, 0xf5, 0x97, - 0x34, 0x0b, 0x28, 0x67, 0x8e, 0xe6, 0x17, 0xfe, 0xc1, 0x67, 0x38, 0xce, - 0x63, 0x85, 0x97, 0xcd, 0xef, 0xee, 0xb2, 0xf8, 0xb1, 0xf7, 0x56, 0x5f, - 0xa0, 0x51, 0x3d, 0x0b, 0x29, 0x90, 0x9c, 0x2c, 0x0a, 0x0c, 0x8f, 0x1f, - 0xb4, 0x42, 0xe8, 0x1c, 0x23, 0x10, 0x8e, 0xfc, 0x59, 0xe7, 0xea, 0xcb, - 0xd3, 0xb8, 0x05, 0x95, 0xba, 0x78, 0xbe, 0x26, 0xbf, 0xc6, 0xff, 0xeb, - 0x41, 0xf2, 0xcb, 0xfa, 0x18, 0xc2, 0x36, 0x16, 0x5f, 0xd9, 0xdd, 0xce, - 0xe7, 0x96, 0x56, 0x22, 0xdb, 0xc4, 0xa4, 0x69, 0xc2, 0xdb, 0xfd, 0x1b, - 0x4d, 0x1c, 0x0f, 0xcb, 0x2f, 0xff, 0xe0, 0x33, 0xd3, 0x91, 0xf5, 0x9e, - 0xa3, 0xa4, 0xff, 0xac, 0xbc, 0xf8, 0x4b, 0x2f, 0xfe, 0xe9, 0x47, 0xef, - 0xdf, 0xc4, 0x29, 0x2c, 0xbf, 0x0c, 0xe6, 0x38, 0x59, 0x7e, 0xce, 0xcf, - 0xe7, 0x56, 0x5f, 0x78, 0xf5, 0x39, 0xcf, 0x44, 0x89, 0xea, 0x79, 0x6d, - 0x05, 0x27, 0xb8, 0x59, 0x44, 0x63, 0x7b, 0x16, 0xca, 0x11, 0xe3, 0x6f, - 0xc9, 0x42, 0xc0, 0x87, 0x97, 0xd1, 0x8f, 0x1b, 0x54, 0xd0, 0xa7, 0xd4, - 0x7a, 0xfe, 0x8c, 0x71, 0xe3, 0x48, 0xfd, 0xd8, 0xa5, 0x29, 0xf2, 0x3b, - 0x9e, 0xc6, 0xde, 0x13, 0xbd, 0xe6, 0xd3, 0xeb, 0xc2, 0x0d, 0x6e, 0x42, - 0x5e, 0xf0, 0x9e, 0xf2, 0xcb, 0xb7, 0x3c, 0xb2, 0xfd, 0xa0, 0x3b, 0x81, - 0x51, 0x17, 0x2f, 0xdd, 0xfc, 0x42, 0x92, 0x4b, 0xf7, 0x3b, 0xe8, 0xfd, - 0x65, 0xf9, 0xf6, 0x8d, 0x05, 0x65, 0x99, 0xc2, 0x39, 0xf6, 0x1e, 0xc1, - 0xa7, 0x34, 0x09, 0x54, 0xf9, 0x4d, 0x33, 0x55, 0xc7, 0x29, 0x50, 0x77, - 0xff, 0x35, 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x26, 0x65, 0xff, 0xc3, - 0x66, 0x41, 0x71, 0x07, 0xe3, 0x61, 0x65, 0xef, 0x1f, 0x16, 0x5f, 0x32, - 0x79, 0x1d, 0x59, 0x7f, 0x47, 0x0a, 0x3b, 0xc5, 0x94, 0xca, 0xcf, 0x49, - 0xa4, 0xd5, 0x3c, 0xa2, 0x59, 0x94, 0x6e, 0xbe, 0xc0, 0xeb, 0x65, 0x97, - 0x4f, 0xb2, 0x16, 0x54, 0xf6, 0x78, 0x2c, 0xac, 0x8e, 0xfe, 0x65, 0x56, - 0x43, 0x21, 0x93, 0xc8, 0x59, 0x74, 0x71, 0x65, 0x32, 0xb3, 0xd7, 0xf9, - 0x06, 0xff, 0xf3, 0x27, 0xb2, 0xcf, 0x79, 0xe4, 0x66, 0x4b, 0x2f, 0x00, - 0xda, 0xb2, 0xff, 0x99, 0x1f, 0xb4, 0x4d, 0x1e, 0xd0, 0xb2, 0xfa, 0x7b, - 0xeb, 0x92, 0xcb, 0xe9, 0xea, 0x78, 0x72, 0x16, 0x58, 0x2b, 0x29, 0x95, - 0x4d, 0xf1, 0x96, 0xdd, 0x3e, 0xc8, 0x59, 0x7d, 0x9f, 0xc7, 0xeb, 0x2e, - 0xc0, 0xac, 0xbf, 0xfa, 0x1a, 0xfd, 0xcf, 0xbf, 0x68, 0x9e, 0x59, 0x7f, - 0xf8, 0x1a, 0x0e, 0xdf, 0x70, 0xf4, 0x0f, 0x62, 0xcb, 0xe3, 0xde, 0xff, - 0xac, 0xa8, 0x3f, 0x1e, 0xa6, 0xd7, 0x91, 0xb2, 0x50, 0xb8, 0xbe, 0x3d, - 0x82, 0x4b, 0x2f, 0xd9, 0xb6, 0x7f, 0x32, 0xca, 0x9c, 0x79, 0x9d, 0x22, - 0xbf, 0xb4, 0x7b, 0x8c, 0x18, 0x16, 0x5f, 0xe9, 0xd8, 0x4f, 0xaf, 0xe7, - 0xd6, 0x5c, 0x52, 0x59, 0x7f, 0xfc, 0xfe, 0xcf, 0xbf, 0xf0, 0xaf, 0xe9, - 0xbc, 0x15, 0x94, 0x67, 0xd4, 0xd1, 0x6b, 0xfb, 0x39, 0x02, 0x14, 0x2c, - 0xa1, 0xa3, 0xbf, 0x21, 0x45, 0xe2, 0x1b, 0x62, 0xcb, 0x9d, 0xab, 0x2b, - 0x86, 0x9b, 0x70, 0x42, 0xed, 0xce, 0xac, 0xb3, 0x2d, 0x65, 0xbf, 0x83, - 0x5e, 0x11, 0xab, 0xf4, 0x63, 0x5f, 0xab, 0x2f, 0xff, 0xf8, 0xa0, 0x05, - 0x0d, 0x9d, 0x1a, 0xd1, 0xef, 0xd3, 0xbf, 0xeb, 0x2f, 0xe3, 0x14, 0xf9, - 0x80, 0x59, 0x46, 0x89, 0x5e, 0x34, 0x5f, 0x1f, 0x62, 0x4b, 0x2f, 0xbb, - 0xc7, 0x99, 0x65, 0x32, 0x17, 0x37, 0x06, 0x3c, 0x02, 0x33, 0x87, 0x7c, - 0xce, 0x7a, 0x24, 0xf4, 0x64, 0x0e, 0xb5, 0xfa, 0x99, 0x13, 0xf6, 0x17, - 0x7b, 0xc8, 0x84, 0x21, 0xbc, 0xe4, 0x05, 0x97, 0xba, 0x50, 0xb2, 0xf8, - 0x8b, 0x3a, 0xb2, 0x99, 0x26, 0xee, 0x06, 0xeb, 0x87, 0xf4, 0x2a, 0xb5, - 0xf3, 0xf8, 0xe6, 0x59, 0x7c, 0x53, 0x40, 0xd6, 0x5d, 0xf7, 0x56, 0x5f, - 0x7a, 0x68, 0x1a, 0xca, 0xc4, 0x51, 0x00, 0x8c, 0xc8, 0xa6, 0x22, 0x71, - 0x8b, 0xf4, 0x34, 0xb2, 0x65, 0x97, 0xf1, 0xe1, 0x0f, 0xd0, 0xb2, 0xcd, - 0x59, 0x43, 0x3e, 0x30, 0x13, 0xee, 0x95, 0xd2, 0xcb, 0xfb, 0x50, 0x41, - 0xcf, 0x2c, 0xbe, 0xd4, 0x61, 0x2c, 0xbe, 0x7e, 0xcb, 0xf5, 0x96, 0x0a, - 0xcb, 0xfc, 0x60, 0x7c, 0xd6, 0x75, 0x65, 0x7e, 0x78, 0x5c, 0x11, 0xbf, - 0xcf, 0xa3, 0x8d, 0xd3, 0x6a, 0xca, 0x02, 0x61, 0x0d, 0x2c, 0xf1, 0x07, - 0x59, 0x77, 0x91, 0xdf, 0xf6, 0xa3, 0x25, 0x1e, 0x8f, 0xd6, 0x5f, 0xfe, - 0x9d, 0xe7, 0x3e, 0xfe, 0x12, 0x27, 0x92, 0xcb, 0xfe, 0x11, 0xb9, 0xc7, - 0x7f, 0xa4, 0xb2, 0xf4, 0xf1, 0x64, 0x32, 0x56, 0x56, 0x2a, 0x7a, 0x01, - 0x91, 0xc6, 0x27, 0xa4, 0xd6, 0x9c, 0x7e, 0x96, 0x47, 0x57, 0xff, 0xff, - 0xff, 0xff, 0xa7, 0x8b, 0x27, 0x27, 0x8c, 0xf6, 0xca, 0xd9, 0x58, 0x19, - 0x71, 0x3c, 0x27, 0xbd, 0x6d, 0xb9, 0x81, 0x1b, 0x2a, 0xc4, 0xff, 0xc2, - 0x7a, 0x7b, 0x88, 0x9e, 0xf7, 0x59, 0x4e, 0xce, 0x9d, 0xe9, 0xf5, 0x97, - 0xff, 0xef, 0xfe, 0x97, 0x83, 0x1a, 0x67, 0xe3, 0x03, 0xe9, 0x65, 0xff, - 0xbd, 0x85, 0x8c, 0x61, 0x60, 0xd6, 0x5f, 0xfd, 0xf0, 0xb1, 0xd1, 0x9e, - 0xef, 0x21, 0xab, 0x2f, 0xb9, 0x9f, 0x75, 0x65, 0xf8, 0x7e, 0x82, 0xd9, - 0x65, 0xf1, 0x97, 0x78, 0xb2, 0xff, 0xff, 0x9a, 0x7a, 0xf0, 0x79, 0x28, - 0xdf, 0xa8, 0x2e, 0xfb, 0x24, 0xb2, 0xa4, 0x88, 0x93, 0x21, 0xbf, 0xf1, - 0xf4, 0xc0, 0x63, 0xee, 0x01, 0x65, 0x49, 0x3b, 0x8c, 0x3c, 0xd2, 0x49, - 0x11, 0xf6, 0x16, 0x3b, 0x84, 0x57, 0xf8, 0x05, 0x9e, 0xf6, 0x7e, 0xb2, - 0xf9, 0xc5, 0x7d, 0xd5, 0x94, 0xe7, 0xb0, 0x46, 0x77, 0xdd, 0x9f, 0xcf, - 0x2c, 0xbf, 0xff, 0xce, 0x40, 0x2c, 0x1f, 0x83, 0x3b, 0xd1, 0x2d, 0x46, - 0xcb, 0x2b, 0x11, 0x0e, 0x12, 0x5b, 0xf8, 0x42, 0x8f, 0x44, 0x96, 0x5f, - 0xff, 0xcc, 0x16, 0x7e, 0x1e, 0x4e, 0x91, 0xfa, 0x00, 0x4e, 0xb2, 0x9a, - 0x88, 0xa7, 0x2d, 0xbe, 0x16, 0x1b, 0xd5, 0x97, 0xfb, 0x05, 0x8e, 0x93, - 0xf1, 0x65, 0xe3, 0xf1, 0xac, 0xa8, 0x3f, 0x03, 0x23, 0xe9, 0x95, 0xff, - 0x3e, 0xa5, 0x3b, 0x00, 0x3c, 0x59, 0x53, 0xda, 0xf2, 0x24, 0x46, 0x61, - 0x92, 0x84, 0xb5, 0x0b, 0x6f, 0x42, 0x9d, 0xe1, 0x58, 0x50, 0x92, 0x09, - 0x6d, 0xe7, 0xdf, 0xba, 0xb2, 0x96, 0x5f, 0xff, 0x70, 0xe7, 0xf0, 0x1e, - 0x32, 0x20, 0xeb, 0x65, 0x95, 0xa3, 0xdd, 0xe8, 0x5d, 0xfd, 0xdc, 0x6f, - 0xd8, 0xd5, 0x95, 0x87, 0xa0, 0x64, 0x57, 0xf9, 0xad, 0x79, 0x70, 0xe4, - 0xb2, 0xff, 0x31, 0x3a, 0x3e, 0xff, 0x50, 0xb2, 0xb0, 0xfa, 0xdc, 0xce, - 0x8d, 0x37, 0x9f, 0x43, 0x38, 0xa1, 0x17, 0x7f, 0xfd, 0x9b, 0xf0, 0x7e, - 0x8d, 0xed, 0x82, 0x71, 0x16, 0x5f, 0xc3, 0x79, 0x70, 0xe4, 0xb2, 0xb4, - 0x7f, 0xe1, 0x52, 0xbe, 0x09, 0x77, 0x8b, 0x2f, 0xbd, 0x1a, 0x85, 0x94, - 0x03, 0xc3, 0xd1, 0x15, 0xe9, 0x4f, 0x8a, 0xb2, 0xef, 0xcd, 0x65, 0xf9, - 0xb2, 0xf0, 0x9c, 0x59, 0x6d, 0x4e, 0x3c, 0x11, 0x05, 0xef, 0xce, 0x29, - 0x60, 0xd6, 0x54, 0x22, 0xd0, 0xd8, 0xb4, 0x57, 0x7f, 0xe2, 0x80, 0x30, - 0xf9, 0xa3, 0xfd, 0x65, 0xfd, 0xcc, 0x3d, 0x69, 0xd6, 0x5f, 0xb9, 0x3b, - 0xf7, 0xea, 0xca, 0xd9, 0x12, 0xbf, 0x9f, 0x74, 0xb2, 0xe8, 0xd2, 0xcb, - 0xff, 0xb6, 0xce, 0x1b, 0xf9, 0x98, 0xa2, 0x8a, 0x92, 0xc7, 0xf9, 0xf0, - 0x10, 0xb5, 0xff, 0x05, 0xf5, 0x3e, 0x1f, 0x1e, 0x96, 0x54, 0x23, 0xd4, - 0x70, 0x92, 0xf1, 0x3d, 0xfd, 0xf6, 0x78, 0x3f, 0x7e, 0xb2, 0xfd, 0xe8, - 0xdb, 0xc1, 0x59, 0x7e, 0x30, 0x80, 0xf6, 0x59, 0x58, 0x88, 0x2e, 0x98, - 0xcf, 0x94, 0xdf, 0xf1, 0x64, 0x30, 0xfd, 0x76, 0x16, 0x5f, 0xe6, 0xe0, - 0x09, 0xf0, 0x0b, 0x2e, 0x0c, 0xcb, 0x2e, 0x97, 0x20, 0xf2, 0x7f, 0x31, - 0xbc, 0x00, 0x81, 0x65, 0x7c, 0x79, 0x61, 0x2e, 0xbf, 0xed, 0xb3, 0xf1, - 0x85, 0xf5, 0x25, 0x97, 0xf3, 0xb8, 0xf7, 0xe0, 0xd6, 0x5e, 0x77, 0x02, - 0xa2, 0xcf, 0x5f, 0xe8, 0x26, 0x34, 0x18, 0x25, 0x97, 0xf7, 0xee, 0x52, - 0x36, 0xac, 0xad, 0x91, 0xe0, 0x33, 0xb0, 0x17, 0x19, 0x47, 0xe6, 0x57, - 0xfb, 0xdd, 0xe3, 0xfc, 0x23, 0x56, 0x5f, 0xe8, 0x91, 0xf6, 0x3b, 0xc5, - 0x97, 0xdf, 0x89, 0xe8, 0x59, 0x5e, 0x3d, 0x62, 0x32, 0xa8, 0x45, 0x69, - 0xc2, 0x32, 0xff, 0x98, 0x72, 0xcd, 0xe5, 0x9c, 0x59, 0x7f, 0xe7, 0x9d, - 0x9b, 0xcb, 0x39, 0x84, 0xb2, 0xda, 0x60, 0xfe, 0x3c, 0x73, 0x7f, 0x8c, - 0x78, 0xd1, 0x73, 0xcb, 0x2d, 0xb2, 0xcb, 0xf7, 0x06, 0x70, 0x4b, 0x2a, - 0x0f, 0xad, 0xa6, 0x7d, 0x12, 0xbf, 0xfb, 0x9d, 0x39, 0x85, 0x71, 0xc7, - 0xdc, 0x59, 0x46, 0x98, 0x4b, 0xc2, 0x50, 0x25, 0xd7, 0x85, 0x14, 0x54, - 0x97, 0xfe, 0x79, 0x70, 0xb0, 0x03, 0xcd, 0x24, 0x66, 0x68, 0x2f, 0xdb, - 0x81, 0x6e, 0x0d, 0x65, 0xfe, 0xef, 0xb3, 0x7c, 0xe9, 0x35, 0x65, 0x61, - 0xf1, 0x84, 0xae, 0xff, 0xdf, 0x48, 0x83, 0xfc, 0xe0, 0x37, 0xf5, 0x97, - 0x43, 0x0b, 0x2f, 0xf8, 0x70, 0x51, 0xfc, 0xbc, 0x6b, 0x2a, 0x11, 0x29, - 0xb2, 0x29, 0x8b, 0xdf, 0xef, 0x18, 0xc9, 0xde, 0x65, 0x97, 0xf8, 0x7e, - 0x0b, 0xff, 0x3f, 0x8b, 0x2a, 0x0f, 0xa4, 0xcc, 0xaf, 0xa3, 0xb9, 0xb2, - 0xcb, 0xfd, 0x13, 0xbb, 0x9c, 0xe4, 0x2c, 0xbf, 0x86, 0x20, 0xc3, 0xde, - 0x2c, 0xa6, 0x11, 0x0d, 0xa2, 0x22, 0x34, 0xbf, 0xb3, 0x92, 0xf0, 0x9c, - 0x59, 0x46, 0x7b, 0xe4, 0x61, 0x7a, 0x09, 0x85, 0x95, 0x26, 0x65, 0x28, - 0xe1, 0x71, 0x8c, 0xac, 0x43, 0x58, 0x11, 0xdc, 0x7d, 0x0b, 0x63, 0x32, - 0x9a, 0x19, 0x9a, 0x8c, 0x4d, 0xb0, 0xf8, 0xf4, 0x74, 0xff, 0xaa, 0x14, - 0x2c, 0xb9, 0x0b, 0x5e, 0xc2, 0x63, 0x7c, 0x60, 0xa2, 0x10, 0x5d, 0xff, - 0x16, 0x5f, 0x8b, 0xb9, 0xfb, 0x56, 0x5f, 0x68, 0xe3, 0xab, 0x2f, 0xee, - 0x16, 0x4d, 0x0d, 0x59, 0x5f, 0x9e, 0x77, 0x48, 0x69, 0xd1, 0x32, 0x17, - 0x6b, 0xa3, 0xab, 0x2f, 0xbf, 0x71, 0x7a, 0xb2, 0xff, 0x38, 0xbe, 0x38, - 0xd4, 0x2c, 0xbf, 0x1e, 0xf8, 0x2e, 0xac, 0xa1, 0xa6, 0xce, 0xc4, 0x2c, - 0x7e, 0x22, 0x31, 0x6d, 0x12, 0x70, 0xca, 0xff, 0xda, 0x3e, 0x48, 0x4f, - 0x41, 0x42, 0xcb, 0xed, 0x1c, 0x35, 0x65, 0xff, 0xfb, 0xac, 0x06, 0x30, - 0x7e, 0xce, 0x7d, 0x28, 0xf2, 0xca, 0xd2, 0x2d, 0x9a, 0x7c, 0x44, 0x37, - 0xdf, 0x87, 0x5b, 0x2c, 0xb9, 0xe4, 0xb2, 0xff, 0xff, 0xfe, 0x27, 0x17, - 0xb9, 0xe2, 0xce, 0x87, 0xf6, 0xbc, 0x9c, 0x70, 0x4f, 0xa7, 0x92, 0xcb, - 0xfd, 0x9e, 0xf0, 0x7a, 0xe4, 0xb2, 0xe3, 0x1a, 0xcb, 0xfb, 0xc0, 0x7d, - 0x3c, 0x96, 0x58, 0x12, 0x3c, 0x3c, 0x16, 0xbc, 0x73, 0x71, 0x65, 0x41, - 0xe2, 0x34, 0x9e, 0xff, 0xee, 0x9f, 0x9d, 0xb3, 0xe1, 0xf1, 0xe9, 0x65, - 0xfc, 0xfd, 0x6c, 0x67, 0x56, 0x53, 0x9f, 0x98, 0x51, 0xef, 0x7a, 0x38, - 0xb2, 0xc6, 0x35, 0x44, 0xd3, 0x0b, 0x6a, 0x10, 0xcd, 0x85, 0xc9, 0x42, - 0x53, 0xa4, 0x37, 0xe3, 0xf3, 0xb4, 0xd6, 0x5e, 0x72, 0xfd, 0x65, 0x4e, - 0x3c, 0x20, 0x13, 0x5e, 0xdf, 0x83, 0x59, 0x6d, 0x6c, 0x78, 0x53, 0x12, - 0x5e, 0xd3, 0xf9, 0x65, 0xfe, 0xdc, 0xd6, 0x6e, 0x10, 0x45, 0x59, 0x5b, - 0x1e, 0xb0, 0xa3, 0x97, 0xb7, 0x0c, 0x6b, 0x2b, 0x0f, 0x0d, 0xc9, 0x2a, - 0x17, 0x13, 0x8c, 0xbf, 0xd2, 0x92, 0xde, 0x1e, 0x25, 0x0c, 0x3b, 0xff, - 0xff, 0xef, 0xf9, 0x98, 0x4c, 0x09, 0xa2, 0x8c, 0xf3, 0x3e, 0x16, 0x6c, - 0xdc, 0x6a, 0xcb, 0xb5, 0x8b, 0x2e, 0xe1, 0xac, 0xad, 0x8d, 0x66, 0x85, - 0xaf, 0xa0, 0x84, 0x6a, 0xca, 0xc3, 0xc4, 0x10, 0x8a, 0xb1, 0x31, 0x2e, - 0xc3, 0xc2, 0xef, 0xf8, 0xb2, 0xf9, 0xfd, 0x02, 0x2c, 0xac, 0x37, 0x5b, - 0xc6, 0x2f, 0xa0, 0x5c, 0x1a, 0xcb, 0xff, 0xe0, 0xfd, 0x2e, 0x0f, 0xd1, - 0xa1, 0xbb, 0x8a, 0xb2, 0xb1, 0x1f, 0x06, 0xc5, 0xa2, 0x22, 0x22, 0xbc, - 0x4d, 0x35, 0x97, 0xc2, 0xc7, 0xdc, 0x59, 0x7b, 0xa2, 0x62, 0xcb, 0xa3, - 0x65, 0x94, 0xe6, 0xd3, 0x83, 0xb7, 0x87, 0x12, 0x59, 0x7f, 0xd1, 0x80, - 0xf1, 0xef, 0x7d, 0x2c, 0xbb, 0x3c, 0xb2, 0x9c, 0xfa, 0xc8, 0x72, 0x7c, - 0xe6, 0xec, 0x1a, 0xcb, 0xba, 0xcb, 0x59, 0x52, 0x4e, 0x67, 0x0e, 0xbc, - 0x37, 0xc5, 0x8e, 0xc2, 0x2f, 0x79, 0x84, 0xf8, 0xb5, 0xfd, 0x9a, 0xfd, - 0xa7, 0xc5, 0x97, 0xbc, 0x11, 0x56, 0x5f, 0xb9, 0xd3, 0x8f, 0x96, 0x5c, - 0x10, 0x2c, 0xa9, 0x1b, 0xff, 0xca, 0x2f, 0x77, 0x04, 0x59, 0x7f, 0x34, - 0x3c, 0xee, 0x75, 0x65, 0xf9, 0xfd, 0xf4, 0xb8, 0xb2, 0xa0, 0xf5, 0xc2, - 0x5d, 0x7e, 0xce, 0x7f, 0x13, 0x2c, 0xbf, 0xa3, 0xee, 0x4e, 0xd4, 0x2c, - 0xbc, 0x30, 0x81, 0x65, 0xf0, 0xca, 0x24, 0xb2, 0x8c, 0xdf, 0x38, 0xed, - 0xff, 0xe1, 0x27, 0x7d, 0xd2, 0x8c, 0x9d, 0x9f, 0x75, 0x65, 0x42, 0xa4, - 0x81, 0x97, 0x7c, 0xba, 0x64, 0x53, 0x3a, 0x68, 0x85, 0xa5, 0x3e, 0x6e, - 0x08, 0xfd, 0xfe, 0x39, 0x9c, 0x8f, 0xee, 0x2c, 0xbb, 0x00, 0xb2, 0xff, - 0x17, 0x78, 0x51, 0xde, 0x2c, 0xbf, 0xde, 0x2c, 0x3f, 0xe3, 0xf5, 0x97, - 0xe3, 0xdf, 0x85, 0xc5, 0x95, 0x88, 0x8d, 0x33, 0x2d, 0x19, 0xdf, 0xdf, - 0x77, 0x3c, 0x1d, 0xd5, 0x97, 0xf6, 0xb3, 0xde, 0x0f, 0x56, 0x5f, 0xbc, - 0x51, 0x9a, 0x51, 0x7f, 0x66, 0xb6, 0x0b, 0x8d, 0x51, 0x06, 0x99, 0x9a, - 0x6b, 0x6b, 0x64, 0x50, 0xc9, 0x52, 0xf8, 0xbd, 0x9f, 0x2c, 0xa8, 0x4c, - 0x7c, 0xe1, 0xa6, 0xe5, 0x57, 0xe7, 0x01, 0xb6, 0x16, 0x5f, 0xd2, 0xf1, - 0x3f, 0xdd, 0x59, 0x40, 0x3d, 0x42, 0x26, 0xbe, 0x10, 0x9f, 0x65, 0x95, - 0x87, 0x89, 0xc2, 0x1b, 0xf4, 0x76, 0x73, 0x45, 0x59, 0x79, 0xb0, 0x05, - 0x97, 0xc5, 0xf8, 0x78, 0xb2, 0xc7, 0x86, 0xff, 0x43, 0x97, 0xfc, 0x3e, - 0x73, 0x34, 0x3f, 0x62, 0xcb, 0xfe, 0xe3, 0x94, 0x4c, 0x63, 0xd9, 0x65, - 0xfe, 0x91, 0xb6, 0x3c, 0x20, 0xd6, 0x5f, 0xfe, 0x8c, 0x2f, 0xbb, 0x9a, - 0x3d, 0x9d, 0xab, 0x2e, 0xcf, 0x4e, 0x45, 0xb7, 0x0e, 0x7a, 0x69, 0x76, - 0x71, 0x65, 0x85, 0xe9, 0xe9, 0xcf, 0x9e, 0xd4, 0x26, 0xdc, 0xf1, 0xa1, - 0x54, 0xe5, 0xd3, 0x49, 0xe4, 0xce, 0x21, 0x47, 0x28, 0xd3, 0x72, 0x19, - 0x7a, 0x21, 0xf3, 0x51, 0x47, 0x27, 0x76, 0x49, 0x65, 0xff, 0xf8, 0xc0, - 0x63, 0xec, 0x82, 0x5d, 0xe7, 0x9e, 0x4b, 0x2b, 0x87, 0xd7, 0xd1, 0x6b, - 0xb0, 0x45, 0x97, 0xdf, 0xfa, 0x06, 0xb2, 0xfe, 0xf1, 0x8a, 0x50, 0x35, - 0x97, 0xfd, 0x1f, 0xb6, 0x30, 0xbb, 0xc5, 0x97, 0xfd, 0xcc, 0x17, 0xce, - 0xd3, 0xe2, 0xcb, 0xf6, 0x6b, 0x60, 0xf1, 0x65, 0x1a, 0x3a, 0xa6, 0x23, - 0xf1, 0x6f, 0x0e, 0x37, 0x9c, 0xdf, 0x8f, 0xe9, 0x19, 0x2c, 0xbc, 0x7e, - 0xc5, 0x97, 0xf7, 0x5d, 0xad, 0x86, 0xac, 0xac, 0x3e, 0xf0, 0x13, 0xfc, - 0x37, 0x4b, 0x2d, 0x0d, 0x37, 0x42, 0x97, 0xde, 0xe0, 0x49, 0x65, 0xff, - 0x82, 0xc3, 0x43, 0xdf, 0x40, 0x59, 0x6b, 0x2b, 0xe3, 0xe1, 0x21, 0xcb, - 0xe6, 0xc6, 0x98, 0x59, 0x7d, 0x9f, 0xfe, 0xeb, 0x2b, 0x0f, 0x18, 0x88, - 0xeb, 0x64, 0x44, 0x0a, 0xd1, 0x7c, 0x3e, 0x7a, 0x16, 0x5f, 0x8b, 0x42, - 0xbe, 0xcb, 0x2a, 0x0f, 0xc3, 0x09, 0x5c, 0x8a, 0xfd, 0x9d, 0xe1, 0xb5, - 0x65, 0xc1, 0x25, 0x97, 0x8b, 0x36, 0x59, 0x50, 0xb8, 0x3b, 0x22, 0x2c, - 0x8c, 0x04, 0xe1, 0xeb, 0xa8, 0xe0, 0x08, 0xb3, 0x84, 0xe2, 0x0b, 0x5a, - 0x4b, 0x2f, 0xb8, 0x18, 0xfd, 0x65, 0x78, 0xda, 0x7e, 0x23, 0x7b, 0xd8, - 0x4b, 0x2f, 0xf6, 0x16, 0x7d, 0xd9, 0x35, 0x65, 0xdd, 0x85, 0x95, 0x07, - 0x92, 0xe6, 0x77, 0xfc, 0xf2, 0x19, 0x85, 0x96, 0x7a, 0x59, 0x7e, 0xc2, - 0x28, 0x1a, 0xcb, 0xef, 0x3f, 0xa1, 0x65, 0xfd, 0x1b, 0x35, 0xe6, 0x85, - 0x96, 0xd2, 0xca, 0x91, 0xf0, 0x4c, 0x42, 0x12, 0xeb, 0xff, 0xe7, 0x63, - 0xb1, 0xaf, 0xf5, 0x1d, 0x27, 0xfd, 0x65, 0xfe, 0x80, 0x0f, 0xc1, 0x7e, - 0x2c, 0xbe, 0x00, 0x9d, 0xe2, 0xcb, 0xf8, 0xb3, 0xfc, 0x29, 0x2c, 0xbf, - 0xfe, 0x62, 0x70, 0x84, 0xfd, 0xe1, 0xfd, 0xe3, 0x15, 0x65, 0x62, 0x20, - 0x5c, 0xb2, 0x8d, 0x18, 0xc5, 0x0a, 0x5a, 0x85, 0x60, 0xf8, 0x45, 0xa6, - 0x46, 0x90, 0x78, 0xf1, 0xe1, 0x0a, 0x46, 0x1c, 0x51, 0x0c, 0x3e, 0x6e, - 0xe6, 0xf5, 0x97, 0x1f, 0x56, 0x5f, 0x19, 0x38, 0xd6, 0x5f, 0xf9, 0xb9, - 0xde, 0x09, 0xc7, 0x96, 0x2c, 0xbf, 0x72, 0x35, 0xd8, 0x58, 0xcc, 0xdf, - 0xd0, 0xd1, 0x31, 0xc5, 0xfb, 0x8d, 0x96, 0xb2, 0xf8, 0x5c, 0x91, 0xac, - 0xbd, 0x86, 0xc2, 0xcb, 0xe9, 0x9d, 0xf4, 0xb2, 0x9c, 0xf8, 0x08, 0x88, - 0x41, 0xcb, 0xd8, 0x7b, 0xd6, 0x5e, 0x90, 0x8d, 0x59, 0x5e, 0x37, 0x6e, - 0x3b, 0x7f, 0x70, 0xf5, 0x81, 0xd2, 0xcb, 0xff, 0xfa, 0x69, 0xc6, 0x00, - 0xeb, 0x81, 0x9c, 0xd3, 0xef, 0x8d, 0x65, 0xd0, 0xc2, 0xca, 0x83, 0xf8, - 0x36, 0x1a, 0xc5, 0x56, 0x4c, 0x0c, 0x9c, 0x2b, 0xa6, 0x23, 0x6b, 0xd7, - 0x9a, 0x7a, 0x41, 0xb9, 0x0a, 0x5b, 0x9a, 0xc9, 0x54, 0x5f, 0x8b, 0xf6, - 0xdf, 0x4a, 0x06, 0xb2, 0xfd, 0x84, 0x7f, 0x49, 0x65, 0xed, 0x66, 0x2c, - 0xa6, 0x41, 0xf6, 0x19, 0x57, 0x09, 0xef, 0xfe, 0x97, 0x43, 0x29, 0x37, - 0xbd, 0x86, 0xac, 0xbf, 0xdd, 0xe4, 0x6d, 0x9c, 0x1a, 0xcb, 0xbd, 0x8b, - 0x2f, 0xff, 0xbd, 0x03, 0xc0, 0x4e, 0xc2, 0xc1, 0xfa, 0x16, 0x5f, 0xf6, - 0xa3, 0xc7, 0xbf, 0x51, 0x25, 0x97, 0xff, 0xfb, 0xf8, 0xfa, 0x5c, 0x1e, - 0x61, 0x60, 0x3c, 0x61, 0xea, 0xcb, 0xff, 0x8f, 0x0b, 0x33, 0x93, 0xa5, - 0xc6, 0xac, 0xbf, 0xf3, 0xc7, 0xd2, 0x9d, 0xcf, 0x87, 0x0b, 0x28, 0x6a, - 0x8c, 0xbe, 0x32, 0x34, 0x6d, 0xd3, 0x49, 0x85, 0xb4, 0x9f, 0xf9, 0xd7, - 0x18, 0x7a, 0x89, 0x79, 0x88, 0xd2, 0xcb, 0xfb, 0xc6, 0xd7, 0x7d, 0xc5, - 0x97, 0xce, 0xdc, 0xde, 0xb2, 0xf6, 0x8f, 0x65, 0x97, 0xf0, 0xe3, 0xfd, - 0x67, 0xcb, 0x2d, 0x3e, 0xb2, 0x99, 0xa3, 0x3c, 0x03, 0xb3, 0x17, 0xe8, - 0x8d, 0xa3, 0xac, 0xb2, 0xfb, 0xfe, 0x36, 0x23, 0x45, 0x86, 0xc2, 0xcb, - 0x81, 0xb2, 0xcb, 0xf6, 0x1e, 0xa6, 0x92, 0xcb, 0xe2, 0x7e, 0xf1, 0x65, - 0xa1, 0xa7, 0x93, 0xbc, 0xa2, 0xe3, 0x99, 0x65, 0xfe, 0xd4, 0x30, 0x32, - 0x8f, 0x96, 0x5f, 0x41, 0x63, 0x0b, 0x2f, 0x72, 0x18, 0x59, 0x7f, 0x9f, - 0x3e, 0xef, 0x5f, 0xcb, 0x2f, 0xfe, 0x08, 0xf3, 0x51, 0x23, 0x1c, 0x12, - 0xcb, 0xfe, 0x27, 0xda, 0x35, 0xa7, 0x92, 0xca, 0x91, 0xfd, 0x79, 0x0a, - 0xff, 0xfb, 0x4f, 0xc2, 0xcd, 0x84, 0x90, 0x60, 0xc9, 0x65, 0x41, 0xf8, - 0x84, 0x8a, 0xbe, 0x4d, 0x73, 0xc3, 0xbd, 0x8c, 0x7a, 0xf7, 0x4f, 0x65, - 0x97, 0xef, 0xdf, 0xe8, 0x99, 0x65, 0xe2, 0x80, 0x2c, 0xbf, 0xf1, 0xcd, - 0xe8, 0xd7, 0xd2, 0x8d, 0x2c, 0xbf, 0xfb, 0x46, 0xdc, 0xd6, 0x44, 0xc6, - 0xd5, 0x94, 0x34, 0x41, 0xf1, 0x02, 0xfb, 0x3b, 0x03, 0x59, 0x7f, 0xf8, - 0xc9, 0xfe, 0xe7, 0x33, 0x43, 0xf6, 0x2c, 0xa9, 0xca, 0xdc, 0xa4, 0x2e, - 0x03, 0x43, 0x8d, 0xf5, 0xa7, 0x0e, 0x3a, 0x45, 0x5c, 0x84, 0xf0, 0xa4, - 0x7b, 0x84, 0x36, 0x85, 0x94, 0xb2, 0xf6, 0x67, 0xeb, 0x2f, 0x78, 0xfa, - 0xb2, 0xdb, 0xf0, 0xf4, 0xcc, 0x40, 0x82, 0xc4, 0x1c, 0xbf, 0xb3, 0x5b, - 0x05, 0xc6, 0xb2, 0xf4, 0x6e, 0x71, 0x65, 0x30, 0x79, 0xa0, 0x2e, 0xbf, - 0x6b, 0x59, 0xbb, 0x32, 0xcb, 0x85, 0xe2, 0xca, 0x86, 0x58, 0x80, 0xe1, - 0x01, 0x92, 0xb1, 0x8e, 0x35, 0x4d, 0xd5, 0xe6, 0x9c, 0x79, 0x85, 0xe5, - 0xcd, 0xff, 0x0e, 0xe0, 0xc2, 0x3f, 0x79, 0x18, 0x85, 0x97, 0x9a, 0xe2, - 0x2c, 0xbf, 0xec, 0x29, 0x16, 0x36, 0x00, 0xb2, 0xfd, 0xe3, 0xdf, 0x83, - 0x59, 0x7f, 0xe1, 0xc1, 0x61, 0x06, 0x59, 0xc5, 0x97, 0x4e, 0xf9, 0x65, - 0xf9, 0xda, 0x7b, 0x98, 0xb2, 0xfe, 0xcf, 0x3f, 0x5e, 0x65, 0x97, 0x47, - 0xcb, 0x2b, 0xe3, 0xc4, 0xe9, 0x6d, 0x62, 0x24, 0x1d, 0xb6, 0xff, 0xb0, - 0x25, 0x9d, 0x27, 0x6a, 0xcb, 0x8e, 0x65, 0x97, 0x63, 0x0b, 0x2a, 0x0d, - 0x77, 0x85, 0xee, 0xd6, 0x2c, 0xbc, 0x4c, 0x8d, 0xc5, 0x97, 0xc7, 0xa8, - 0x92, 0xcb, 0xed, 0x9b, 0x1c, 0x59, 0x5b, 0x1e, 0x26, 0x10, 0xdf, 0xfa, - 0x3a, 0xe1, 0xeb, 0xfd, 0x9d, 0x59, 0x7f, 0xda, 0x9d, 0x03, 0xf6, 0x02, - 0x16, 0x57, 0x8f, 0xe1, 0xcf, 0xaf, 0xc0, 0x78, 0x39, 0xf5, 0x97, 0x8b, - 0x38, 0xb2, 0xff, 0xff, 0xd1, 0xe3, 0x6b, 0x39, 0xa4, 0xfa, 0x13, 0xc7, - 0xf7, 0x00, 0x7b, 0x2c, 0xad, 0x95, 0xfa, 0x8c, 0x75, 0x83, 0x63, 0x29, - 0xdd, 0x3c, 0x9a, 0x15, 0x5a, 0x21, 0xf3, 0x27, 0xe4, 0x04, 0x2d, 0xc6, - 0x7e, 0xc2, 0x68, 0x24, 0x22, 0x14, 0xee, 0x0d, 0xdb, 0x8b, 0x2f, 0xf0, - 0x3f, 0x7f, 0xcc, 0x80, 0xb2, 0xc7, 0xe3, 0xc5, 0x21, 0x1b, 0xfd, 0xb0, - 0xf3, 0xbc, 0x7f, 0x96, 0x5f, 0x4e, 0x79, 0x4f, 0x4b, 0x2f, 0xcf, 0x2e, - 0x0d, 0xab, 0x2f, 0xfe, 0xcd, 0xf8, 0x3c, 0x20, 0xcb, 0x38, 0xb2, 0xfd, - 0xa8, 0xf0, 0x83, 0x59, 0x5a, 0x3e, 0xd7, 0x44, 0xbe, 0x83, 0xda, 0x16, - 0x5f, 0x0a, 0xf9, 0xc5, 0x97, 0xf0, 0xe3, 0xf2, 0xcf, 0x96, 0x5f, 0xf4, - 0x9a, 0xf2, 0xef, 0x21, 0x85, 0x95, 0x08, 0x8a, 0xc2, 0x27, 0x2e, 0xbd, - 0xc3, 0x25, 0x96, 0xfd, 0x65, 0xf0, 0x27, 0x73, 0xe5, 0x95, 0xa3, 0x70, - 0x42, 0x57, 0xf8, 0x49, 0x46, 0xf3, 0x2f, 0xd6, 0x5f, 0x3e, 0xe6, 0x12, - 0xca, 0xc4, 0x66, 0x3a, 0x99, 0x10, 0x70, 0xda, 0xb1, 0x58, 0xc0, 0x09, - 0xb7, 0x4d, 0x5a, 0x52, 0xf0, 0x95, 0xfc, 0x84, 0xa1, 0x56, 0x18, 0x7c, - 0xdd, 0xb4, 0x96, 0x5e, 0x3f, 0x1a, 0xca, 0xf8, 0xd9, 0xf4, 0x62, 0xfb, - 0x3e, 0x94, 0x2c, 0xbc, 0x17, 0xe2, 0xca, 0xf1, 0xbe, 0x10, 0x8a, 0xff, - 0x8d, 0x88, 0x1c, 0x6f, 0xcf, 0x2c, 0xbf, 0xc6, 0x2f, 0xd2, 0xe6, 0x01, - 0x65, 0xfd, 0x21, 0x3f, 0xfe, 0x3e, 0x59, 0x5e, 0x3e, 0x77, 0x35, 0xbf, - 0x83, 0xc8, 0x98, 0x3a, 0x59, 0x78, 0x39, 0xf2, 0xca, 0xf1, 0xe6, 0x74, - 0xbe, 0xfe, 0xc6, 0xeb, 0x50, 0x35, 0x97, 0xef, 0xb9, 0xd3, 0xd9, 0x65, - 0xfc, 0x12, 0xdb, 0x87, 0xf2, 0xcb, 0xff, 0xa3, 0x61, 0x5f, 0xee, 0x60, - 0xcf, 0x8b, 0x2a, 0x11, 0x3f, 0x22, 0xa2, 0x2f, 0xbe, 0xff, 0xfc, 0xf9, - 0x65, 0xfe, 0x0c, 0x6c, 0x58, 0x7b, 0x2c, 0xbf, 0xff, 0x46, 0xbf, 0xce, - 0x10, 0x5e, 0x5e, 0x0b, 0xec, 0xb2, 0xfd, 0xdc, 0x72, 0x02, 0xca, 0xf1, - 0xfe, 0x6e, 0x2b, 0x5f, 0xfe, 0x1f, 0xa3, 0xe9, 0x16, 0x37, 0x3e, 0xea, - 0xcb, 0xf3, 0x73, 0xd8, 0x4b, 0x28, 0xcf, 0xc5, 0xd2, 0xef, 0xf8, 0x2f, - 0x21, 0xe6, 0x7f, 0xc5, 0x97, 0xe6, 0xe6, 0x9c, 0x96, 0x5f, 0xfb, 0xe9, - 0x7a, 0x1a, 0xff, 0x4b, 0x16, 0x5f, 0xc7, 0xf7, 0xd2, 0xce, 0xac, 0xa8, - 0x44, 0xae, 0x13, 0x7e, 0x81, 0x5e, 0x47, 0xef, 0x21, 0x9d, 0x7e, 0xfb, - 0x8d, 0x3d, 0xd5, 0x97, 0xff, 0x79, 0xcf, 0xbf, 0x84, 0x89, 0xe4, 0xb2, - 0xfa, 0x08, 0x2c, 0xb5, 0x97, 0x67, 0x27, 0x1f, 0x47, 0x90, 0xea, 0x11, - 0x86, 0x50, 0x94, 0xbf, 0x9f, 0x6f, 0xdc, 0x86, 0xb2, 0xb6, 0x5d, 0xf0, - 0x1c, 0x28, 0x40, 0xda, 0x64, 0x53, 0x43, 0x33, 0x45, 0xcd, 0x25, 0xf4, - 0x2b, 0xf9, 0x09, 0x6e, 0xc6, 0x3b, 0xbe, 0x1d, 0x73, 0xe4, 0xd7, 0xf4, - 0x7f, 0x93, 0x1b, 0x56, 0x5e, 0xee, 0x12, 0xcb, 0xde, 0x7d, 0xd5, 0x97, - 0xf8, 0x48, 0x04, 0xfe, 0x6a, 0x16, 0x5f, 0xf0, 0xf0, 0x3a, 0xd8, 0x07, - 0xb2, 0xcb, 0xff, 0xec, 0xdf, 0x84, 0x32, 0x71, 0x79, 0xc8, 0xfd, 0x65, - 0xf1, 0xea, 0x1a, 0xb2, 0xb4, 0x7e, 0x5e, 0x51, 0xbf, 0xfe, 0x07, 0x82, - 0x59, 0xf4, 0x8f, 0x85, 0x9b, 0xd6, 0x5f, 0xbd, 0x1e, 0x36, 0x16, 0x5c, - 0xf3, 0x70, 0xfe, 0x77, 0x14, 0x6a, 0x11, 0x99, 0xe8, 0x4d, 0xd4, 0x95, - 0x08, 0x30, 0x37, 0xe1, 0xf7, 0x36, 0xec, 0x6f, 0x35, 0x0c, 0x96, 0xfc, - 0x9e, 0x12, 0x38, 0x66, 0xbc, 0xa3, 0xeb, 0xa6, 0x0a, 0xcb, 0x35, 0x65, - 0x7c, 0x6a, 0x59, 0x63, 0x17, 0xfb, 0xbf, 0x84, 0xb8, 0x63, 0x59, 0x7e, - 0x97, 0xf9, 0x83, 0x59, 0x6d, 0xe6, 0x7b, 0x8e, 0x69, 0x7e, 0xf1, 0xeb, - 0xf0, 0xac, 0xb6, 0xb0, 0xf4, 0x66, 0x28, 0xbf, 0x85, 0xe3, 0xc7, 0xd2, - 0x59, 0x50, 0x7a, 0xf8, 0x51, 0x7f, 0xfa, 0x62, 0x8e, 0xf3, 0xbf, 0x00, - 0xcb, 0x65, 0x97, 0xe3, 0x68, 0x93, 0x71, 0x65, 0xfc, 0xff, 0x48, 0xa0, - 0x6b, 0x2f, 0xfa, 0x3e, 0x91, 0x93, 0x5f, 0xab, 0x28, 0xd1, 0xb7, 0xe4, - 0xc7, 0x2a, 0x22, 0xdb, 0xf3, 0xcb, 0x36, 0x85, 0x97, 0xff, 0x47, 0x39, - 0x8d, 0xe9, 0x43, 0x78, 0xb2, 0xfe, 0x62, 0x76, 0x36, 0x00, 0xb2, 0xff, - 0xe8, 0xfa, 0x5d, 0x0c, 0x6c, 0x7f, 0x75, 0x65, 0xfe, 0x3f, 0x38, 0x20, - 0x86, 0xb2, 0x8d, 0x15, 0x04, 0x61, 0xc4, 0x7b, 0xfa, 0x01, 0xfb, 0x43, - 0xfa, 0xcb, 0xf6, 0x6f, 0x32, 0x1a, 0xcb, 0xfc, 0x3e, 0x1f, 0xbd, 0x83, - 0x59, 0x7f, 0xf1, 0xc7, 0x09, 0xe5, 0x3b, 0x99, 0xa5, 0x97, 0x89, 0xf4, - 0xb2, 0xf9, 0xdd, 0xf7, 0x16, 0x5f, 0xff, 0xd8, 0x39, 0xc7, 0xfc, 0x4e, - 0xef, 0xb3, 0xbe, 0x79, 0x2c, 0xbf, 0xfc, 0x7c, 0xdb, 0x05, 0xc2, 0x0e, - 0xe4, 0x33, 0xc4, 0x4e, 0xb4, 0x6f, 0x79, 0x1d, 0xfe, 0xfa, 0x5c, 0x9a, - 0x51, 0xb2, 0xca, 0x1a, 0xb5, 0x80, 0x13, 0xea, 0x1d, 0x6d, 0x2e, 0xf1, - 0x83, 0x94, 0x11, 0x9f, 0x61, 0xc2, 0x17, 0x5b, 0xff, 0xfb, 0xb9, 0xf7, - 0x75, 0xa8, 0xef, 0xe2, 0x14, 0xbd, 0x8b, 0x2e, 0x3d, 0xeb, 0x2f, 0xa0, - 0xa5, 0xc5, 0x96, 0x3f, 0x91, 0x2f, 0x32, 0xf7, 0xe3, 0x17, 0xfb, 0x5b, - 0x14, 0x00, 0xe4, 0xb2, 0xbc, 0x7d, 0x6e, 0x71, 0x7e, 0xf4, 0x6f, 0x1c, - 0x2c, 0xbc, 0x37, 0x25, 0x96, 0xde, 0xb2, 0xfd, 0xf7, 0x4a, 0x3c, 0xb2, - 0xda, 0x83, 0x76, 0xe2, 0x77, 0xdf, 0x4d, 0x1a, 0x59, 0x6d, 0x2c, 0xac, - 0x36, 0xa1, 0x24, 0xa9, 0x23, 0xe4, 0x65, 0x3a, 0x56, 0xe2, 0xd5, 0xfe, - 0x2e, 0xe8, 0xf7, 0xe0, 0xd6, 0x5f, 0xb5, 0x27, 0xf8, 0x55, 0x95, 0x07, - 0xbc, 0x66, 0x97, 0xf8, 0x3f, 0x4b, 0xbc, 0x0e, 0xea, 0xcb, 0xf9, 0xc5, - 0xfe, 0x3d, 0xc5, 0x95, 0x24, 0x44, 0x78, 0x80, 0x8e, 0x6f, 0xe7, 0x7e, - 0x8f, 0xc3, 0x59, 0x7f, 0xbe, 0xd4, 0x1c, 0x9f, 0x8b, 0x2f, 0xfb, 0xbc, - 0x0c, 0x84, 0x19, 0xf5, 0x65, 0x41, 0xf7, 0x39, 0x9d, 0xfb, 0xd1, 0x92, - 0x75, 0x97, 0xb0, 0xf8, 0xb2, 0xfd, 0xde, 0xe0, 0x76, 0x59, 0x7f, 0xfd, - 0xb3, 0xfb, 0x07, 0x3b, 0x08, 0xb0, 0xff, 0x59, 0x5b, 0x22, 0x50, 0x03, - 0x7a, 0x29, 0xbf, 0xef, 0x00, 0xde, 0x77, 0x1f, 0xcb, 0x28, 0x69, 0x92, - 0xe4, 0x2e, 0x9c, 0xc6, 0xf8, 0xa2, 0x46, 0xb2, 0xfc, 0xe5, 0xf4, 0x8d, - 0x65, 0xe0, 0xc1, 0x2c, 0xbf, 0xff, 0xc7, 0xd8, 0x27, 0x96, 0x0f, 0x8f, - 0xa3, 0xf1, 0xef, 0x59, 0x7d, 0x05, 0x2e, 0x2c, 0xad, 0x23, 0x8b, 0xc4, - 0x04, 0x4f, 0xbc, 0x6c, 0x45, 0xfb, 0xff, 0xf7, 0x0a, 0x77, 0x9c, 0xfb, - 0xf8, 0x48, 0x9e, 0x4b, 0x2f, 0xff, 0xfe, 0x8d, 0x64, 0xd0, 0xdc, 0x01, - 0x8f, 0xd1, 0xde, 0x31, 0xac, 0xdc, 0x59, 0x7f, 0xbc, 0x6c, 0x4f, 0x87, - 0x4c, 0x2c, 0xbf, 0xe6, 0xc1, 0x01, 0xcb, 0xf6, 0x4a, 0xcb, 0xfc, 0x6d, - 0xd6, 0x4f, 0x9f, 0xeb, 0x2f, 0xfa, 0x3f, 0xd6, 0xa0, 0x51, 0xfc, 0xb2, - 0xff, 0x0a, 0xdf, 0x41, 0x96, 0xcb, 0x2f, 0xff, 0x3c, 0x8f, 0x59, 0xf4, - 0xd2, 0x8d, 0x6c, 0xb2, 0xa1, 0x10, 0x1f, 0x9a, 0x5f, 0xff, 0x16, 0x73, - 0x1b, 0x00, 0xce, 0x9e, 0xb1, 0x65, 0x01, 0x3d, 0x66, 0x9c, 0xf8, 0xf3, - 0xf3, 0x6e, 0xc2, 0xf3, 0x79, 0x1d, 0xff, 0xa6, 0xe7, 0x43, 0xf6, 0x0d, - 0xc9, 0x65, 0xff, 0x67, 0x61, 0xb1, 0x9f, 0x75, 0x65, 0x42, 0xb2, 0x3c, - 0x94, 0x96, 0xec, 0x01, 0x40, 0xbf, 0xb6, 0xcd, 0x18, 0x21, 0x65, 0xf1, - 0x0e, 0x1a, 0xb2, 0xff, 0xf8, 0x25, 0xde, 0x78, 0xe6, 0x28, 0x6b, 0xc9, - 0x65, 0xf6, 0x10, 0x5d, 0x65, 0x34, 0xfb, 0xf7, 0xa7, 0xdf, 0xcf, 0xfe, - 0x0d, 0xe4, 0xb2, 0xa1, 0x1c, 0x39, 0x09, 0x03, 0x24, 0xbe, 0xff, 0x8c, - 0xa3, 0x25, 0x65, 0x1a, 0x6d, 0xbe, 0x8c, 0x39, 0xcc, 0xaf, 0xc7, 0xe0, - 0x09, 0x25, 0x95, 0x0d, 0x93, 0xb6, 0xd1, 0x95, 0x0e, 0x1f, 0x79, 0x2e, - 0x48, 0x11, 0xc5, 0x1c, 0x63, 0x53, 0x46, 0x47, 0xa2, 0xf6, 0xc2, 0x6f, - 0xd1, 0xa2, 0xbc, 0x62, 0xdf, 0xa6, 0x14, 0xb7, 0x9e, 0xc7, 0x60, 0x13, - 0x5b, 0xff, 0xb0, 0xbf, 0xcc, 0xd7, 0x3b, 0x18, 0xb2, 0xff, 0xbe, 0xee, - 0x68, 0xf6, 0x76, 0xac, 0xbd, 0x9b, 0xf1, 0x65, 0xb3, 0xf4, 0x4c, 0x92, - 0x17, 0x0e, 0xaf, 0x32, 0xe4, 0x6b, 0x2f, 0xa0, 0x9e, 0x4b, 0x2f, 0xd9, - 0xba, 0xe5, 0xfc, 0xe3, 0xc0, 0xd1, 0x05, 0xfe, 0x91, 0xb6, 0x3c, 0x20, - 0xd6, 0x5f, 0xbc, 0x71, 0xae, 0x2c, 0xaf, 0x1e, 0xde, 0xf3, 0x4b, 0xff, - 0xf4, 0xb8, 0x59, 0xde, 0x1e, 0x37, 0xba, 0xc1, 0x56, 0x5f, 0xfb, 0xc6, - 0xd1, 0xe4, 0xd1, 0x9a, 0x59, 0x7a, 0x51, 0xf2, 0xcb, 0xf0, 0x48, 0x31, - 0xf2, 0xcb, 0xe8, 0xfd, 0xda, 0xb2, 0xd2, 0xc4, 0x52, 0xcc, 0x7c, 0xd1, - 0xd2, 0x28, 0xaf, 0x93, 0x3c, 0x28, 0x7d, 0x5f, 0x70, 0xfb, 0x0b, 0x2a, - 0x0f, 0x29, 0xca, 0x6f, 0xc5, 0x9f, 0x87, 0x8b, 0x2f, 0xf4, 0xe2, 0x7d, - 0x8a, 0x3e, 0x59, 0x70, 0x0f, 0x0f, 0x77, 0x45, 0x17, 0xc0, 0xf1, 0xcc, - 0xb2, 0xff, 0xdf, 0xbe, 0xb3, 0x7e, 0x6f, 0x81, 0xac, 0xbf, 0xfe, 0xc6, - 0x18, 0x31, 0xf8, 0xe6, 0xf1, 0xfd, 0xd5, 0x94, 0xd4, 0x4a, 0x92, 0x15, - 0x42, 0x36, 0xb2, 0x17, 0x17, 0x07, 0x4b, 0x2f, 0x01, 0xf4, 0xb2, 0xff, - 0xdb, 0x61, 0x37, 0x3b, 0xc1, 0x38, 0xb2, 0xfd, 0xc0, 0x46, 0x98, 0x59, - 0x7f, 0x1f, 0xff, 0x4b, 0x3a, 0xb2, 0xb6, 0x46, 0x5f, 0x85, 0xdc, 0x73, - 0xf4, 0x0d, 0xe5, 0x37, 0xd2, 0xee, 0x7e, 0xb2, 0xf7, 0x0e, 0x65, 0x95, - 0xf1, 0xe0, 0x70, 0x8e, 0xfb, 0xbe, 0x08, 0x16, 0x5f, 0xb0, 0xc7, 0xe3, - 0x59, 0x5b, 0x1e, 0x4c, 0x88, 0xef, 0x3e, 0x98, 0x59, 0x50, 0x8a, 0xcc, - 0x6c, 0x72, 0x3b, 0xff, 0xb3, 0xee, 0xf0, 0xca, 0x3f, 0x76, 0xac, 0xbd, - 0x26, 0xf9, 0x65, 0x6c, 0x7c, 0x3d, 0x44, 0xbf, 0xff, 0xf4, 0xfe, 0x77, - 0xce, 0x36, 0x65, 0x9b, 0xcb, 0x39, 0xc3, 0xfb, 0xab, 0x2d, 0xf2, 0xcb, - 0xec, 0x6c, 0x6e, 0xac, 0xb7, 0xcc, 0xb3, 0x6d, 0xc1, 0x2b, 0xcc, 0x18, - 0xab, 0x2f, 0xc2, 0x9e, 0x13, 0x0b, 0x28, 0xcf, 0x18, 0x23, 0xd5, 0x89, - 0xaf, 0x19, 0x1b, 0xc2, 0xa0, 0x9c, 0xaf, 0xe7, 0x07, 0x9f, 0x73, 0x8b, - 0x2d, 0x8b, 0x2f, 0xcf, 0x37, 0x8f, 0x4b, 0x2a, 0x71, 0xb8, 0xf0, 0x85, - 0xf7, 0x0a, 0x1a, 0xb2, 0xa0, 0xf1, 0x3e, 0x23, 0xbd, 0xe9, 0x35, 0x65, - 0xde, 0x35, 0x95, 0x86, 0xcf, 0xa3, 0xb5, 0x0c, 0x9b, 0x69, 0x3a, 0xe4, - 0x27, 0x98, 0x8e, 0xab, 0xe7, 0xdf, 0x46, 0x0c, 0xf0, 0xf1, 0x28, 0xce, - 0x79, 0x1f, 0x67, 0x4f, 0xc3, 0x0a, 0xc9, 0xf5, 0x5b, 0xfd, 0x13, 0x1f, - 0xdc, 0x0b, 0x56, 0x5c, 0xd0, 0x2c, 0xad, 0x8f, 0x30, 0x66, 0xb7, 0xf0, - 0xc4, 0x19, 0x67, 0x96, 0x5f, 0xb3, 0x81, 0xd6, 0xcb, 0x2f, 0xff, 0xff, - 0xfb, 0xef, 0xf4, 0x0e, 0x6e, 0xef, 0x39, 0xe5, 0x81, 0x27, 0xae, 0x49, - 0x95, 0xea, 0x78, 0xce, 0xff, 0x76, 0x74, 0xef, 0x4f, 0xac, 0xac, 0x4c, - 0x74, 0x8b, 0x84, 0x29, 0xbc, 0xd7, 0xea, 0xcb, 0xa5, 0xd5, 0x97, 0xf0, - 0x06, 0x7b, 0xe0, 0x6b, 0x2d, 0xe5, 0x96, 0xfd, 0x65, 0xdc, 0x92, 0xca, - 0x84, 0x4e, 0x0c, 0x71, 0xc5, 0xff, 0x2f, 0xe0, 0x88, 0x44, 0xaf, 0xed, - 0xa6, 0x94, 0xf7, 0xad, 0x96, 0x5e, 0x7c, 0xd2, 0xcb, 0xc5, 0x9d, 0x59, - 0x7b, 0xd8, 0xd5, 0x95, 0xe3, 0xd2, 0x21, 0xbe, 0x8d, 0xdd, 0xd2, 0x59, - 0x7a, 0x3e, 0xe2, 0xcb, 0xe3, 0x29, 0x62, 0xcb, 0xdb, 0x39, 0x2c, 0xa1, - 0x9e, 0xcb, 0x47, 0x7a, 0x41, 0x7d, 0x03, 0x79, 0x2c, 0xbf, 0x67, 0x7c, - 0x7d, 0x59, 0x7e, 0x7f, 0xb3, 0xee, 0xac, 0xaf, 0x1e, 0x87, 0x49, 0xef, - 0x04, 0xb6, 0x59, 0x5b, 0x22, 0xc1, 0x87, 0x1f, 0x11, 0x5b, 0x65, 0x96, - 0xd2, 0xca, 0xd8, 0xd1, 0x98, 0x95, 0xfd, 0xb4, 0xed, 0x9d, 0xfc, 0xb2, - 0xef, 0xba, 0xb2, 0xff, 0xff, 0x78, 0xf5, 0x8d, 0x7f, 0x99, 0x8c, 0x2f, - 0xa9, 0x3f, 0xeb, 0x2f, 0xd8, 0x43, 0xf4, 0x2c, 0xa6, 0x42, 0xb4, 0xe8, - 0x84, 0x4c, 0x8b, 0xb1, 0xbc, 0xe1, 0xbf, 0xe5, 0x57, 0x21, 0x23, 0x10, - 0x8c, 0x0a, 0xc9, 0x7f, 0xd8, 0x31, 0x9f, 0xd9, 0xf7, 0x56, 0x5f, 0x00, - 0xa2, 0x4b, 0x2b, 0xc7, 0xb6, 0xe7, 0x57, 0xfa, 0x33, 0xb1, 0xe7, 0x1a, - 0xcb, 0xd1, 0xf4, 0x96, 0x56, 0xc7, 0xde, 0x32, 0x1d, 0xc3, 0x1b, 0xec, - 0xc2, 0xea, 0xcb, 0xff, 0xdb, 0xcc, 0xbf, 0xf1, 0xbc, 0xba, 0x7b, 0x2c, - 0xbe, 0x0b, 0xea, 0x4b, 0x2a, 0x0f, 0xb8, 0x69, 0x97, 0xff, 0x0e, 0x07, - 0xa8, 0xe9, 0x80, 0xc6, 0xb2, 0xfa, 0x68, 0xdc, 0x92, 0xcb, 0xfb, 0xa0, - 0x18, 0xdb, 0xa5, 0x97, 0xee, 0x99, 0x47, 0xeb, 0x2f, 0xfa, 0x6e, 0x6f, - 0x72, 0xd8, 0x23, 0x59, 0x7f, 0x38, 0xbf, 0xfe, 0xd9, 0xf5, 0x97, 0xd9, - 0xdc, 0x6a, 0xcb, 0x89, 0x85, 0x94, 0xe6, 0xe0, 0x24, 0x35, 0x24, 0x46, - 0x71, 0xb2, 0xff, 0xed, 0x41, 0x07, 0xb2, 0x09, 0x77, 0x8b, 0x2f, 0xfc, - 0x51, 0xd9, 0x66, 0xeb, 0x97, 0xeb, 0x2f, 0x7e, 0x7f, 0xac, 0xbe, 0xda, - 0x6f, 0x1a, 0xcb, 0x7b, 0x0f, 0x08, 0x23, 0xd7, 0xfe, 0x0e, 0xef, 0x8e, - 0x73, 0x1a, 0xce, 0x2c, 0xbf, 0xf1, 0x3b, 0x1e, 0x79, 0x70, 0xc6, 0xb2, - 0xfd, 0xe3, 0x27, 0xd9, 0x65, 0x80, 0xb2, 0xf8, 0x32, 0xce, 0x00, 0xdc, - 0x11, 0x3d, 0x35, 0x15, 0xa4, 0xed, 0x78, 0xb3, 0xab, 0x2e, 0x11, 0xab, - 0x28, 0xcf, 0x54, 0x88, 0xba, 0x37, 0x77, 0xc3, 0x59, 0x50, 0xba, 0x0d, - 0xb1, 0x9c, 0xa1, 0x1c, 0x32, 0x1c, 0x43, 0x60, 0x9b, 0xe2, 0xf3, 0x27, - 0x9a, 0x19, 0x3a, 0x23, 0x6a, 0x27, 0xa1, 0x04, 0x44, 0xfd, 0x8d, 0x1c, - 0x25, 0xb7, 0xf4, 0xe9, 0xa3, 0xa5, 0xbd, 0x65, 0xff, 0xd1, 0xbf, 0x51, - 0xac, 0x3f, 0x40, 0xd6, 0x5d, 0x18, 0xb2, 0x88, 0xf6, 0x78, 0x89, 0x73, - 0xb5, 0x65, 0xd3, 0x4f, 0xac, 0xa2, 0x36, 0x3b, 0xc5, 0xae, 0x0f, 0x56, - 0x54, 0x93, 0x16, 0xc8, 0x45, 0x9a, 0x94, 0xf9, 0x15, 0x99, 0xb2, 0x21, - 0x1c, 0xb4, 0xc9, 0x6e, 0x9e, 0x61, 0x09, 0x3d, 0x94, 0xb2, 0xb4, 0xc9, - 0xe2, 0x38, 0xca, 0xa8, 0x0c, 0xa3, 0x24, 0x4e, 0x81, 0xed, 0x1f, 0x3c, - 0xa5, 0x92, 0x8e, 0x7a, 0xbb, 0x29, 0xd6, 0x8c, 0x4a, 0x95, 0x04, 0xeb, - 0x17, 0xd2, 0xff, 0x4e, 0x55, 0xb4, 0xd3, 0xb6, 0x9a, 0x9d, 0x16, 0x6c, - 0xbb, 0xdf, 0x53, 0x92, 0x1e, 0x73, 0x13, 0xf9, 0xc3, 0xe6, 0x5c, 0x2d, - 0x8a, 0x93, 0x9f, 0xca, 0xcb, 0xc3, 0xb4, 0xb6, 0x00, 0xc6, 0x3b, 0xbe, - 0x34, 0x01, 0x61, 0x99, 0x3f, 0x2e, 0x90, 0x49, 0xe6, 0x7d, 0xc8, 0xfe, - 0xa9, 0x9c, 0x24, 0x91, 0xcd, 0x4b, 0xd8, 0x8f, 0x38, 0xbf, 0xfc, 0xcd, - 0xaf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x36, 0x2f, 0xda, 0x03, 0xb8, - 0x15, 0x15, 0x6a, 0xef, 0xf7, 0xac, 0xbb, 0x93, 0xeb, 0x2c, 0xcf, 0x0f, - 0xa3, 0xc6, 0x9c, 0x1a, 0xbb, 0x7e, 0x96, 0x5c, 0xf0, 0xb2, 0xff, 0x4a, - 0x41, 0xe9, 0x44, 0x96, 0x5f, 0x67, 0x9f, 0xab, 0x2c, 0xc9, 0xc3, 0xd4, - 0x23, 0x3b, 0xff, 0xff, 0x4a, 0x37, 0xc1, 0xe8, 0x06, 0xd7, 0x91, 0x96, - 0x0f, 0x18, 0x59, 0x7f, 0xfb, 0x47, 0x2c, 0x96, 0x3c, 0x8a, 0x1a, 0xb2, - 0xff, 0x6b, 0x01, 0x1f, 0x88, 0xd5, 0x97, 0xfb, 0xd1, 0xb6, 0xa3, 0x06, - 0xb2, 0xff, 0xfd, 0x1b, 0x46, 0xa1, 0xb1, 0x1d, 0xf1, 0xfe, 0xd5, 0x95, - 0x08, 0x88, 0xf1, 0x9d, 0xe8, 0x1c, 0xcb, 0x2a, 0x49, 0xd7, 0x1b, 0x5e, - 0x91, 0xfd, 0x0b, 0xde, 0x91, 0x5f, 0x69, 0xbe, 0x1a, 0xcb, 0xff, 0xb5, - 0x22, 0xce, 0xf2, 0x1b, 0xd0, 0x2c, 0xa8, 0x3e, 0x70, 0x91, 0xde, 0x1e, - 0x12, 0xcb, 0xfb, 0x92, 0x30, 0x3e, 0x96, 0x5e, 0x77, 0x02, 0xa2, 0xb4, - 0x5f, 0x98, 0xfb, 0x81, 0xf9, 0x65, 0x42, 0x20, 0x40, 0x5a, 0x65, 0x17, - 0xf0, 0x4d, 0x8d, 0x40, 0xd6, 0x5f, 0xe8, 0xd7, 0xe2, 0x72, 0x31, 0x65, - 0xff, 0xe3, 0xec, 0xa0, 0x1e, 0x3e, 0xf1, 0xfe, 0x59, 0x5a, 0x46, 0xd3, - 0x4b, 0xbc, 0x5d, 0xbc, 0xd2, 0xfe, 0xfe, 0x76, 0x68, 0xd8, 0x59, 0x7f, - 0xd8, 0x33, 0xe4, 0xc5, 0x03, 0x59, 0x43, 0x3e, 0x97, 0x31, 0xbf, 0xe8, - 0x06, 0x37, 0x0b, 0xb3, 0xeb, 0x2f, 0xf7, 0xa3, 0x5f, 0xf7, 0x36, 0x59, - 0x77, 0x8d, 0xa7, 0xdf, 0xe3, 0xab, 0xd2, 0xfa, 0x4b, 0x2f, 0x07, 0x9d, - 0x59, 0x7f, 0xfe, 0x93, 0x91, 0xf6, 0x3c, 0x0c, 0x19, 0x47, 0x16, 0x5f, - 0xff, 0x8f, 0x72, 0x08, 0x32, 0x3e, 0x72, 0x27, 0x34, 0x0b, 0x28, 0xd1, - 0x56, 0xea, 0x57, 0x1f, 0xcb, 0x2f, 0xff, 0x81, 0x1a, 0xcf, 0xdd, 0xaf, - 0x28, 0x30, 0x2c, 0xbf, 0xfe, 0x97, 0x30, 0xa1, 0xaf, 0x9d, 0xec, 0x35, - 0x65, 0x42, 0x26, 0xdd, 0x3a, 0xb4, 0x8d, 0x3e, 0xc2, 0xca, 0x9a, 0x9f, - 0x27, 0xa1, 0x91, 0xd8, 0x7a, 0x5f, 0xff, 0xfd, 0xbc, 0xfb, 0xcc, 0x60, - 0x1e, 0x3e, 0xe4, 0xc5, 0x0d, 0xdb, 0x05, 0x59, 0x7f, 0xfd, 0xd7, 0xce, - 0x0f, 0x25, 0xe8, 0xde, 0x38, 0x59, 0x7f, 0xff, 0xff, 0x1f, 0x47, 0x81, - 0xe4, 0xef, 0x60, 0x3c, 0x1d, 0x8f, 0x0b, 0xe9, 0x73, 0x81, 0x85, 0x94, - 0xe8, 0xdc, 0x25, 0x0a, 0x84, 0xdc, 0xde, 0x35, 0x2b, 0xfd, 0x1d, 0x7f, - 0x4e, 0x1c, 0x2c, 0xbe, 0x97, 0x4f, 0x65, 0x97, 0xee, 0x71, 0xcb, 0x65, - 0x97, 0xe1, 0x3a, 0x51, 0xfa, 0xcb, 0x79, 0x65, 0x7c, 0x88, 0x56, 0x91, - 0xef, 0x28, 0x10, 0xa6, 0xff, 0xfb, 0xf7, 0xcf, 0x39, 0xee, 0x43, 0x49, - 0xd8, 0x59, 0x7f, 0xe3, 0xe6, 0x0f, 0xee, 0x46, 0xb8, 0xb2, 0xff, 0x3c, - 0xba, 0x7b, 0x78, 0xd6, 0x54, 0x26, 0x09, 0x88, 0x20, 0x51, 0x33, 0xfb, - 0xf6, 0x78, 0xf1, 0xab, 0x2f, 0xc7, 0xfb, 0x4f, 0x4b, 0x2f, 0xff, 0xf9, - 0xfb, 0x04, 0xfb, 0x46, 0xa0, 0xe5, 0x0d, 0x28, 0x61, 0x65, 0xfe, 0x3e, - 0x18, 0x59, 0x63, 0x85, 0x94, 0x48, 0x99, 0xeb, 0x1d, 0xfd, 0xe8, 0x01, - 0x3b, 0x56, 0x5f, 0xf9, 0xcc, 0x1e, 0x70, 0xed, 0xa3, 0x59, 0x46, 0x7d, - 0x44, 0x59, 0x7f, 0xec, 0x7d, 0xa3, 0x08, 0x7e, 0x85, 0x95, 0xb2, 0x79, - 0xe3, 0x26, 0x38, 0x60, 0xfa, 0x11, 0x84, 0x41, 0x7f, 0xa5, 0x1a, 0xda, - 0x35, 0xb2, 0xcb, 0xe9, 0x6b, 0x1a, 0xb2, 0xf6, 0x6b, 0xf5, 0x97, 0xe9, - 0xb0, 0x6d, 0xdd, 0x59, 0x7f, 0x14, 0x0b, 0xf4, 0xb8, 0xb2, 0xbe, 0x44, - 0xd1, 0x91, 0x4c, 0x3b, 0xb8, 0x59, 0x79, 0x80, 0x81, 0x65, 0x42, 0x65, - 0xd9, 0x0c, 0xf6, 0x10, 0x6f, 0xff, 0xff, 0xc6, 0x0c, 0xec, 0x17, 0x79, - 0x3a, 0x0c, 0x78, 0xd9, 0xda, 0x83, 0x93, 0xf1, 0x65, 0xff, 0xf6, 0xbf, - 0xe7, 0xfe, 0x79, 0x1f, 0x4a, 0x3f, 0x59, 0x58, 0x8d, 0x50, 0xc2, 0x0e, - 0xfe, 0xce, 0xb9, 0x7e, 0x15, 0x97, 0xf7, 0xa7, 0x1e, 0xce, 0x4b, 0x2f, - 0xe6, 0xf0, 0x64, 0xe2, 0xac, 0xbf, 0x7f, 0xc6, 0x51, 0x94, 0x65, 0x16, - 0x54, 0x1f, 0x3b, 0x97, 0x5f, 0x3f, 0xee, 0x35, 0x95, 0x24, 0xc1, 0x70, - 0xb4, 0xa1, 0x2d, 0xc2, 0x0b, 0xff, 0x66, 0xa6, 0x2c, 0x1f, 0xa3, 0x7a, - 0xcb, 0x33, 0x64, 0x36, 0x3c, 0x8c, 0x91, 0x99, 0xed, 0xa6, 0x23, 0xd8, - 0xda, 0x16, 0xc3, 0x21, 0xc8, 0xdd, 0x98, 0x85, 0x40, 0x21, 0x21, 0xf1, - 0x69, 0xca, 0x02, 0xd4, 0x75, 0xcd, 0x28, 0xf4, 0x77, 0xaf, 0x28, 0x28, - 0xa3, 0x82, 0xe4, 0x61, 0x5d, 0x8c, 0xb0, 0x44, 0x1b, 0xf6, 0x80, 0xee, - 0x05, 0x45, 0x80, 0xbf, 0xcd, 0x3e, 0x06, 0x35, 0x32, 0xcb, 0xe0, 0x09, - 0xe9, 0x96, 0x54, 0x1e, 0xcb, 0x9a, 0x5e, 0xfc, 0x4f, 0xd6, 0x5f, 0x87, - 0x99, 0xff, 0x16, 0x56, 0x23, 0xd7, 0x90, 0x8d, 0xe9, 0x00, 0x84, 0x17, - 0xf8, 0x70, 0xcf, 0xee, 0x86, 0x16, 0x53, 0x33, 0xf8, 0x0a, 0x15, 0xfb, - 0x40, 0x77, 0x02, 0xa2, 0x75, 0x5f, 0xff, 0xef, 0x46, 0xc3, 0xc6, 0xb3, - 0xe7, 0x33, 0xc7, 0xc0, 0xec, 0xb2, 0xfc, 0xcd, 0xaf, 0x26, 0x78, 0x89, - 0x99, 0x8d, 0x2f, 0xff, 0xe2, 0x0c, 0x77, 0x98, 0x4c, 0xff, 0xfe, 0x3c, - 0xfb, 0x2c, 0xbf, 0x89, 0x9c, 0xcf, 0x33, 0xac, 0xa8, 0x44, 0x76, 0x2f, - 0x5e, 0x62, 0x1a, 0xb2, 0xfd, 0x9b, 0x6d, 0x00, 0x59, 0x7c, 0xe0, 0x11, - 0xab, 0x2f, 0x4b, 0x8c, 0xd8, 0x3e, 0x92, 0x1d, 0xde, 0x53, 0x7e, 0xd0, - 0x1d, 0xc0, 0xa8, 0xb6, 0x57, 0xff, 0x78, 0xfb, 0xe0, 0xfd, 0x8d, 0x7f, - 0x96, 0x5f, 0xdd, 0x7f, 0x4e, 0x1c, 0x2c, 0xbf, 0xff, 0xa4, 0xcf, 0x90, - 0x78, 0x33, 0xce, 0x67, 0x4a, 0x16, 0x54, 0x22, 0x21, 0xcb, 0xef, 0xd2, - 0x83, 0xdf, 0x0b, 0x2f, 0xfa, 0x38, 0xcf, 0xc6, 0x07, 0xd2, 0xcb, 0xfe, - 0x3c, 0x26, 0x23, 0x7b, 0xf9, 0x65, 0x42, 0x26, 0xff, 0x28, 0x9f, 0x3a, - 0xbf, 0xe8, 0x94, 0x6b, 0x68, 0xd6, 0xcb, 0x2c, 0xcf, 0x15, 0x15, 0x80, - 0xd1, 0xb0, 0xce, 0x78, 0x5e, 0x11, 0x9d, 0xff, 0x89, 0x9b, 0x42, 0x7d, - 0x27, 0xdc, 0x59, 0x7f, 0x69, 0xf9, 0xe7, 0x92, 0xcb, 0xf9, 0xf5, 0x3e, - 0xe4, 0xc2, 0xcb, 0xc1, 0xe3, 0x3c, 0x3d, 0xd2, 0x2d, 0xb9, 0xff, 0xc4, - 0x69, 0xff, 0x09, 0xfb, 0xbe, 0x02, 0xcb, 0xe0, 0x3b, 0x81, 0x51, 0x73, - 0x2c, 0xd5, 0x95, 0xa3, 0x7e, 0x29, 0x75, 0xfc, 0x59, 0xf7, 0xe7, 0x25, - 0x96, 0x65, 0xac, 0xad, 0x1e, 0x1e, 0xf2, 0xeb, 0xa6, 0x6a, 0xca, 0x59, - 0x66, 0x70, 0x98, 0x1e, 0x2b, 0x9b, 0x28, 0xa4, 0x93, 0xe3, 0x17, 0xed, - 0x01, 0xdc, 0x0a, 0x8b, 0xbd, 0x7f, 0xa4, 0xcf, 0x9a, 0xd1, 0x8a, 0xb2, - 0xcc, 0xf0, 0xfa, 0xdc, 0xd2, 0xff, 0x8a, 0x1f, 0x6f, 0xb9, 0x03, 0x59, - 0x70, 0xff, 0x59, 0x78, 0xb3, 0x65, 0x96, 0x66, 0x33, 0xed, 0x60, 0xe4, - 0x86, 0x2a, 0x21, 0x61, 0xbb, 0x98, 0x92, 0x75, 0x02, 0x37, 0xd0, 0xc2, - 0x3a, 0xc8, 0x6b, 0x52, 0xb3, 0x5b, 0x0b, 0xdf, 0x43, 0x49, 0xe1, 0x15, - 0xfc, 0xa7, 0x02, 0x8c, 0xbb, 0x91, 0x9b, 0xf6, 0x17, 0xe2, 0x42, 0x56, - 0xff, 0xc2, 0xb9, 0x6d, 0xc3, 0x2f, 0xa4, 0xb2, 0xff, 0xec, 0xdb, 0x05, - 0xf6, 0x73, 0x0c, 0x96, 0x5f, 0xf8, 0xc8, 0xb1, 0x80, 0x05, 0xc6, 0xb2, - 0xfd, 0x9e, 0x1b, 0x92, 0xcb, 0x8d, 0x9f, 0x91, 0xcc, 0x48, 0x1c, 0x43, - 0x10, 0xf6, 0xfd, 0xce, 0x35, 0xe4, 0xb2, 0xff, 0xff, 0xff, 0xde, 0x3f, - 0x1c, 0x17, 0x49, 0xd8, 0xce, 0x87, 0xa7, 0xde, 0x78, 0xf5, 0x1b, 0x3e, - 0x80, 0xb2, 0xee, 0x42, 0xcb, 0xff, 0xbe, 0x00, 0x5f, 0xee, 0xe6, 0x13, - 0x0b, 0x2f, 0x13, 0xb3, 0x84, 0xc7, 0x00, 0x51, 0xc8, 0x4c, 0x74, 0x5a, - 0xfe, 0x64, 0x4f, 0x31, 0xf6, 0xb6, 0x59, 0x78, 0x2e, 0xd5, 0x97, 0xec, - 0xdc, 0xec, 0x30, 0xb2, 0xdb, 0x8b, 0x2b, 0x63, 0x7f, 0x85, 0x75, 0xa3, - 0xfc, 0x25, 0xbb, 0xff, 0x71, 0xd8, 0xf1, 0xc1, 0x06, 0x16, 0x5f, 0xfb, - 0xcf, 0xd7, 0xf7, 0xd2, 0xce, 0xac, 0xac, 0x3f, 0xc3, 0x3d, 0xb9, 0xff, - 0x59, 0x7f, 0xff, 0xf8, 0x9c, 0x52, 0xce, 0xf7, 0x36, 0x82, 0x76, 0x38, - 0xd8, 0xc2, 0x1a, 0xcb, 0xd8, 0x27, 0x16, 0x56, 0x22, 0xa7, 0x42, 0xfb, - 0x8e, 0xb7, 0xf1, 0x47, 0xed, 0x79, 0x2c, 0xbf, 0xfe, 0xcd, 0xf0, 0x5d, - 0xc2, 0x8f, 0xda, 0xf2, 0x59, 0x7e, 0x20, 0xf3, 0xc7, 0x87, 0xf9, 0xa2, - 0xdb, 0xf0, 0xcf, 0x7e, 0xb1, 0x65, 0xbd, 0x07, 0xcd, 0x87, 0xb7, 0xf9, - 0xe5, 0xac, 0x9f, 0x3f, 0xd6, 0x5e, 0x77, 0x02, 0xa2, 0x57, 0x5f, 0xe6, - 0x1c, 0xbf, 0xee, 0x79, 0x65, 0x00, 0xf7, 0x0c, 0xa2, 0xfe, 0x7f, 0xb3, - 0xd8, 0x05, 0x97, 0xfb, 0xe2, 0x76, 0x1f, 0xb2, 0x59, 0x7f, 0xf7, 0xb2, - 0x40, 0xf1, 0x8e, 0x0b, 0xab, 0x28, 0xcf, 0xdf, 0xa6, 0x95, 0x24, 0xe7, - 0x86, 0x4d, 0xa8, 0x49, 0x34, 0x84, 0xa1, 0x49, 0x7f, 0xa3, 0x4f, 0x27, - 0xfa, 0x4b, 0x2f, 0xbb, 0xa3, 0xf9, 0x65, 0xfe, 0x28, 0x68, 0xf4, 0xe0, - 0x59, 0x7f, 0xff, 0xfd, 0xa7, 0x21, 0x23, 0xfc, 0x97, 0xa3, 0x78, 0xe1, - 0x9e, 0x10, 0x65, 0x9c, 0x59, 0x6d, 0x96, 0x5b, 0x65, 0x95, 0x06, 0x92, - 0x42, 0x57, 0xc0, 0x79, 0x62, 0xcb, 0xff, 0x1f, 0x4c, 0xba, 0x1f, 0x32, - 0x61, 0x65, 0x61, 0xf1, 0x39, 0x0d, 0xff, 0xfe, 0x7f, 0xb9, 0x9a, 0xef, - 0x5f, 0x61, 0x1a, 0x3f, 0x1b, 0x0b, 0x2f, 0xb7, 0xbc, 0xa7, 0xa5, 0x97, - 0xfd, 0x87, 0xbc, 0xa3, 0x35, 0x25, 0x97, 0xff, 0xee, 0xcb, 0x37, 0x5c, - 0xbf, 0xfb, 0xba, 0x8c, 0x15, 0x60, 0xa6, 0xe2, 0xfd, 0xf7, 0x7d, 0x1f, - 0xac, 0xac, 0x47, 0xb3, 0xb0, 0x85, 0xae, 0xff, 0xf4, 0xc5, 0x1d, 0xe7, - 0x7e, 0x01, 0x96, 0xcb, 0x2f, 0xf9, 0xc5, 0x1f, 0xa3, 0x6c, 0x15, 0x65, - 0x1a, 0x21, 0xc9, 0x32, 0xff, 0xfd, 0x87, 0xfe, 0x34, 0xfb, 0xc8, 0x6b, - 0xfd, 0xd5, 0x97, 0xff, 0xf8, 0x0f, 0xa7, 0xf7, 0xd2, 0xce, 0xe7, 0x60, - 0x2c, 0xbc, 0x59, 0x7f, 0xf3, 0xfd, 0x23, 0xef, 0xa3, 0x5d, 0x85, 0x97, - 0xfd, 0x0d, 0xee, 0x4d, 0x23, 0xea, 0xca, 0x92, 0x66, 0xc6, 0xaa, 0xd6, - 0x4e, 0xa2, 0x5f, 0xff, 0xef, 0x18, 0xc7, 0x82, 0xfd, 0xd0, 0xbf, 0x3c, - 0x2b, 0x8d, 0x65, 0xf0, 0x5f, 0x52, 0x59, 0x7f, 0x14, 0x6d, 0xfb, 0xf5, - 0x65, 0xfe, 0x71, 0x89, 0xb9, 0x05, 0x25, 0x96, 0x80, 0x1f, 0x23, 0x4b, - 0xaf, 0xff, 0xf1, 0xf5, 0xda, 0xe5, 0xff, 0x85, 0x72, 0xd8, 0x07, 0xb2, - 0xca, 0x1a, 0x61, 0xe7, 0x08, 0x67, 0x27, 0xbf, 0xe0, 0xfe, 0xd7, 0x97, - 0x34, 0x35, 0x97, 0xff, 0xfb, 0x0c, 0xbb, 0x85, 0x38, 0x9c, 0x70, 0x5b, - 0x46, 0x96, 0x5b, 0x3a, 0x89, 0x9d, 0xe7, 0x77, 0xff, 0xff, 0xbd, 0x8d, - 0xfd, 0xf5, 0x9b, 0xf0, 0x79, 0xc0, 0xbf, 0xde, 0x15, 0xfa, 0xb2, 0xff, - 0xd9, 0xf7, 0x7b, 0x0d, 0xf6, 0x6c, 0xb2, 0xff, 0xa6, 0x07, 0x8d, 0xb1, - 0xa6, 0x16, 0x5f, 0xef, 0xf3, 0x59, 0x9d, 0xe2, 0xca, 0xc3, 0xee, 0xf8, - 0xee, 0x86, 0xba, 0x93, 0x91, 0xab, 0x80, 0xf7, 0xd1, 0xb9, 0x94, 0x33, - 0x7a, 0x54, 0x2b, 0xd8, 0x90, 0xae, 0xbf, 0xde, 0x79, 0x7f, 0xac, 0xf9, - 0x65, 0xff, 0xf8, 0xc7, 0xe7, 0x3e, 0xc1, 0x00, 0xda, 0xd3, 0x59, 0x6c, - 0xf2, 0x21, 0xc8, 0xd6, 0xff, 0xb3, 0xee, 0x0e, 0x1c, 0xb6, 0x59, 0x7f, - 0xf0, 0x0f, 0x5e, 0xc9, 0xbc, 0x7a, 0xd9, 0x65, 0xff, 0x3c, 0xb9, 0xe8, - 0xd0, 0x83, 0x59, 0x52, 0x47, 0x06, 0x13, 0xfc, 0x73, 0xd4, 0x6b, 0xff, - 0xfd, 0xec, 0x01, 0x63, 0x70, 0xb3, 0xa1, 0xfd, 0xaf, 0x25, 0x97, 0xfe, - 0x2c, 0xf6, 0x4d, 0x23, 0xd4, 0x96, 0x5f, 0xff, 0xff, 0x7f, 0x04, 0x07, - 0xeb, 0xfd, 0xfe, 0x6f, 0x3e, 0xcb, 0xc7, 0xde, 0x18, 0xd6, 0x5f, 0xf8, - 0xf7, 0x9f, 0x66, 0x94, 0x17, 0x56, 0x54, 0x93, 0x5d, 0x02, 0xff, 0xc7, - 0xdd, 0x84, 0x05, 0xff, 0xe7, 0xc9, 0x7b, 0x0c, 0xb3, 0xf9, 0xfc, 0x59, - 0x79, 0xe4, 0xce, 0x79, 0x6c, 0x98, 0x62, 0x16, 0xb2, 0x84, 0xe8, 0xe1, - 0x93, 0x92, 0xac, 0xbe, 0x54, 0x33, 0x39, 0x88, 0xf4, 0x64, 0xd8, 0x52, - 0x7a, 0x10, 0x5f, 0x90, 0x14, 0x6b, 0x7c, 0x9d, 0xfe, 0xec, 0x7e, 0x22, - 0x47, 0x35, 0xb8, 0x89, 0x73, 0x2f, 0x16, 0x5f, 0xbb, 0x01, 0x65, 0xe2, - 0xcb, 0xf6, 0x01, 0xe5, 0x8b, 0x2f, 0xf6, 0x0c, 0xcb, 0xb9, 0xe5, 0x97, - 0xb3, 0xcc, 0xd9, 0x44, 0x4e, 0x60, 0xd7, 0x8a, 0xc8, 0x9a, 0xf1, 0xc3, - 0xac, 0xbd, 0xd8, 0x1a, 0x4b, 0xff, 0xde, 0x73, 0xec, 0x48, 0xf5, 0xb0, - 0x7f, 0x49, 0x7b, 0x4c, 0xb6, 0x70, 0x7c, 0xfc, 0x1c, 0xbc, 0xe0, 0x67, - 0x24, 0x5d, 0x0e, 0x10, 0x36, 0x66, 0x36, 0xdc, 0xfc, 0x11, 0xb3, 0x36, - 0xb2, 0xb5, 0xec, 0x7b, 0x9b, 0xe3, 0x0d, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, - 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x30, 0xaf, 0xa0, 0xc4, 0xf2, 0xcb, 0xfc, - 0x08, 0xfb, 0xa5, 0x12, 0x59, 0x78, 0xc4, 0xf2, 0xcb, 0xff, 0xfb, 0x37, - 0xb8, 0xfd, 0x0c, 0xfb, 0xec, 0x18, 0x7b, 0xc5, 0x97, 0x64, 0x96, 0x5f, - 0xfe, 0xd3, 0xfe, 0xcd, 0x8e, 0xc8, 0x58, 0xe4, 0x96, 0x5d, 0x8c, 0xc6, - 0x99, 0xbe, 0x11, 0x7e, 0x66, 0x43, 0xa1, 0x5f, 0x10, 0x5a, 0xe6, 0xef, - 0x59, 0x7e, 0x3f, 0x7b, 0x36, 0x59, 0x7a, 0x7b, 0xf0, 0xd6, 0x5f, 0xfc, - 0xc9, 0xcf, 0xa4, 0x17, 0xe9, 0x44, 0x96, 0x5f, 0x32, 0xbc, 0x93, 0x56, - 0x5f, 0xa7, 0x99, 0xe6, 0x7a, 0x9f, 0x64, 0x2c, 0xbf, 0x63, 0x67, 0x7d, - 0xba, 0xb2, 0xfe, 0x86, 0xe7, 0xf1, 0xbd, 0x65, 0x0c, 0xf7, 0x7c, 0x5d, - 0x7f, 0xb5, 0x80, 0x8f, 0xc4, 0x6a, 0xcb, 0xf7, 0x5f, 0x67, 0xe2, 0xcb, - 0xe8, 0x69, 0xe9, 0x65, 0xa2, 0x63, 0xc9, 0xd1, 0x45, 0xf4, 0x11, 0xcc, - 0xb2, 0xff, 0xfd, 0x9b, 0x4e, 0xcc, 0x2e, 0xf9, 0xcf, 0x87, 0xbd, 0x65, - 0xfb, 0xd0, 0x33, 0x61, 0x65, 0x1a, 0x6d, 0x1a, 0x22, 0x6b, 0xf1, 0x14, - 0x74, 0x87, 0x71, 0x5e, 0xe6, 0x47, 0x56, 0x5f, 0x4c, 0x62, 0xcc, 0xb2, - 0xe7, 0xe2, 0xca, 0x69, 0xbb, 0xde, 0x4b, 0x7f, 0xee, 0x0f, 0x44, 0xe2, - 0xe7, 0xdd, 0x59, 0x7f, 0x85, 0x2c, 0xfb, 0xb9, 0xe5, 0x95, 0x87, 0xe8, - 0x68, 0x17, 0xfa, 0x1f, 0x6e, 0xb0, 0xfa, 0x59, 0x7e, 0x7d, 0x49, 0xda, - 0xb2, 0x86, 0x9b, 0x46, 0x2b, 0x7a, 0x12, 0xe4, 0x40, 0x13, 0x4b, 0xfd, - 0xdf, 0x39, 0xf0, 0xf7, 0xac, 0xb3, 0x21, 0x65, 0x11, 0xe4, 0xcf, 0x9a, - 0x5f, 0xee, 0x46, 0x10, 0xfd, 0x0b, 0x2f, 0xe8, 0xc2, 0x1f, 0xa1, 0x65, - 0xe0, 0xea, 0x69, 0xc7, 0xb9, 0xc3, 0x1b, 0xff, 0xda, 0x30, 0xe3, 0x19, - 0xd0, 0xc7, 0xc3, 0x59, 0x7f, 0xfe, 0x3d, 0x79, 0xe7, 0x0f, 0x25, 0xe8, - 0xde, 0x38, 0x59, 0x7f, 0xc2, 0x89, 0xe8, 0x07, 0x8e, 0x65, 0x97, 0xc1, - 0x6e, 0x0d, 0x65, 0xb3, 0xe3, 0xde, 0xdc, 0x3c, 0xbf, 0x6a, 0x25, 0xcc, - 0x59, 0x7c, 0x7d, 0xcd, 0xeb, 0x2f, 0xf6, 0x0b, 0xd2, 0x7f, 0xf8, 0xb2, - 0xa0, 0xff, 0xbc, 0x4f, 0xd2, 0x3a, 0xc5, 0x51, 0xe0, 0x84, 0x06, 0x8d, - 0xfc, 0x96, 0x50, 0xb6, 0xec, 0x2a, 0x6f, 0xff, 0xa0, 0xbb, 0xa8, 0x39, - 0x16, 0x35, 0xe4, 0xb2, 0xff, 0xf4, 0x03, 0x81, 0xe9, 0xf8, 0xd8, 0xf1, - 0xac, 0xbf, 0x9b, 0x18, 0x5d, 0x9f, 0x59, 0x6e, 0x2c, 0xbf, 0x46, 0x17, - 0x67, 0xd6, 0x5e, 0xe3, 0xfd, 0x38, 0xfa, 0x66, 0x2f, 0x68, 0x8d, 0x0d, - 0x34, 0x36, 0xa6, 0x76, 0x16, 0x77, 0xfd, 0xbb, 0x83, 0xf4, 0x6e, 0x94, - 0x2c, 0xa3, 0x3f, 0x37, 0x36, 0xbf, 0xed, 0x6c, 0x0f, 0x1f, 0x83, 0xd5, - 0x95, 0xe3, 0xdb, 0x72, 0x0b, 0xfc, 0x6c, 0x6b, 0x36, 0x8d, 0x96, 0x5f, - 0xa1, 0xbb, 0xff, 0x92, 0xca, 0xe1, 0xf0, 0x74, 0xd6, 0xee, 0x9a, 0xcb, - 0x83, 0x8b, 0x2a, 0x47, 0x9c, 0xc1, 0x17, 0xe2, 0xd7, 0xe0, 0x1f, 0x3c, - 0x6b, 0x2f, 0xec, 0x32, 0xe8, 0x7c, 0xb2, 0xdd, 0xf8, 0xf4, 0xfc, 0x4f, - 0x7f, 0x6b, 0x0f, 0xd0, 0x35, 0x97, 0xb4, 0x1e, 0x2c, 0xbf, 0xfe, 0xf4, - 0x16, 0x77, 0xd9, 0xdf, 0x40, 0x59, 0x6b, 0x2f, 0xe3, 0xd4, 0xe7, 0x2f, - 0xd6, 0x5e, 0xf6, 0x7c, 0xb2, 0xff, 0xff, 0x0b, 0xb9, 0xdc, 0xf4, 0xe2, - 0xcd, 0x8f, 0x0b, 0xe9, 0x71, 0x65, 0xf8, 0x5e, 0xe7, 0x80, 0xb2, 0xb1, - 0x12, 0x0e, 0xcf, 0x43, 0x4e, 0x63, 0x0b, 0x0c, 0x77, 0xca, 0x4e, 0x5e, - 0x50, 0xad, 0xbf, 0xfd, 0xd2, 0x7f, 0xfd, 0x86, 0x30, 0xf7, 0x8b, 0x2f, - 0xb7, 0xe0, 0xe1, 0x65, 0xff, 0x46, 0xc2, 0x4b, 0xc1, 0x7d, 0x96, 0x54, - 0x22, 0xa7, 0x12, 0xb4, 0x47, 0x7f, 0xef, 0xa5, 0x3b, 0xce, 0x08, 0x21, - 0xac, 0xbe, 0x0e, 0xbf, 0x6a, 0xca, 0xc3, 0xe5, 0xe2, 0x0d, 0xf1, 0x61, - 0xb0, 0xb2, 0xf8, 0xe3, 0xee, 0x2c, 0xbf, 0x09, 0xd2, 0x8f, 0xd6, 0x53, - 0x4f, 0xb3, 0xa4, 0x3b, 0xc8, 0xaf, 0xbb, 0xdc, 0x15, 0x65, 0xff, 0xe8, - 0xef, 0xf1, 0x2c, 0xfb, 0xbb, 0x04, 0x55, 0x97, 0xe8, 0x6e, 0x9e, 0x65, - 0x97, 0xb8, 0xff, 0xac, 0xa8, 0x47, 0x3e, 0x18, 0x99, 0x1f, 0x93, 0xba, - 0x51, 0x4b, 0x2f, 0xa1, 0xa7, 0x25, 0x97, 0x7a, 0x24, 0x6b, 0x34, 0x17, - 0x73, 0xc9, 0x65, 0xfa, 0x00, 0x4e, 0xd5, 0x97, 0xfe, 0x89, 0x4e, 0xcf, - 0x1e, 0xbc, 0xeb, 0x2c, 0x7e, 0x3e, 0x5e, 0x13, 0x50, 0xd1, 0x9d, 0xba, - 0x59, 0xe7, 0xbb, 0xf4, 0xdc, 0x18, 0x76, 0x59, 0x7f, 0x3f, 0xfa, 0xd1, - 0xe9, 0x65, 0xee, 0xce, 0xc5, 0x95, 0x07, 0xef, 0xf9, 0x58, 0x85, 0xd7, - 0xde, 0x0f, 0xdd, 0x59, 0x7f, 0xf7, 0xb2, 0x34, 0x58, 0xd6, 0x86, 0x65, - 0x97, 0xf7, 0x44, 0xff, 0xf8, 0xf9, 0x65, 0xff, 0x1f, 0x4f, 0x1a, 0x59, - 0xb2, 0xca, 0x33, 0xe9, 0xf1, 0x95, 0xfd, 0xc3, 0x61, 0xaf, 0xd5, 0x97, - 0xfe, 0xdf, 0x0c, 0x48, 0xca, 0x35, 0x0b, 0x2f, 0xff, 0xfd, 0xac, 0xdf, - 0x05, 0xd9, 0xc2, 0x14, 0x79, 0xcf, 0xb1, 0xde, 0x2c, 0xb8, 0x13, 0xda, - 0xcb, 0xdb, 0x06, 0x4b, 0x2f, 0x16, 0x72, 0x71, 0xba, 0xc1, 0xcb, 0xe7, - 0xfe, 0x43, 0x59, 0x43, 0x54, 0x70, 0x08, 0x56, 0xfc, 0x42, 0x65, 0xda, - 0x3f, 0xdf, 0x0a, 0x81, 0x4c, 0xaf, 0xa7, 0x6f, 0xdc, 0xd9, 0x65, 0x0d, - 0x57, 0xd6, 0x4a, 0x5c, 0x61, 0xce, 0xdb, 0xab, 0x2d, 0xba, 0xb2, 0xf6, - 0x0f, 0xab, 0x2c, 0xd3, 0x36, 0x1a, 0x14, 0xbb, 0xb8, 0xb2, 0xff, 0x41, - 0x47, 0xee, 0xfb, 0x8b, 0x2f, 0x69, 0xe4, 0xb2, 0xff, 0x0f, 0xd8, 0x0f, - 0x46, 0x96, 0x50, 0xd1, 0x07, 0xa3, 0x42, 0x1c, 0xbf, 0x73, 0x3b, 0xa8, - 0x59, 0x7f, 0xf9, 0x96, 0x50, 0xd7, 0x3f, 0x3f, 0x7d, 0x0b, 0x2a, 0x13, - 0x3a, 0x38, 0x4c, 0xf0, 0xbc, 0x24, 0xf7, 0x38, 0x16, 0x5f, 0xc7, 0x33, - 0x83, 0x92, 0x59, 0x40, 0x3c, 0x4f, 0x0b, 0x5f, 0xff, 0xef, 0x19, 0x0f, - 0x58, 0x0f, 0x47, 0xb3, 0x5a, 0x86, 0x16, 0x5f, 0x83, 0xb8, 0x78, 0xd5, - 0x97, 0xee, 0xbb, 0x4f, 0xab, 0x29, 0x83, 0xd1, 0x22, 0xab, 0xf7, 0xa3, - 0x24, 0xeb, 0x2f, 0xfc, 0x7d, 0x0e, 0x9f, 0x93, 0x9b, 0xd5, 0x95, 0x08, - 0x89, 0x19, 0x13, 0x93, 0x5f, 0xe3, 0xc6, 0x96, 0x6c, 0xeb, 0x2f, 0xf7, - 0x0f, 0x78, 0xe3, 0xfd, 0x96, 0x56, 0x1f, 0x43, 0x98, 0xdf, 0xa3, 0xbc, - 0xfc, 0x2b, 0x2f, 0xef, 0x1f, 0x4a, 0x1a, 0xb2, 0xfa, 0x37, 0x94, 0x2c, - 0xa9, 0x8f, 0x39, 0xa5, 0x94, 0xc8, 0x5c, 0xd5, 0x84, 0x4c, 0x8d, 0x80, - 0x10, 0x85, 0x98, 0x8b, 0xd1, 0x9d, 0x14, 0x25, 0xba, 0x40, 0x17, 0x7b, - 0xff, 0xe7, 0x68, 0xfd, 0x1e, 0x86, 0x87, 0xe9, 0x71, 0x65, 0xff, 0xec, - 0xef, 0x8f, 0x3e, 0xee, 0x6f, 0x8e, 0x2c, 0xb7, 0xbc, 0x89, 0xc2, 0x51, - 0xbe, 0x7e, 0x77, 0x65, 0x97, 0xff, 0x39, 0x7a, 0x0c, 0x67, 0xcc, 0x92, - 0xcb, 0xd1, 0xf8, 0x8b, 0x2f, 0xec, 0xdf, 0xe3, 0xfe, 0x65, 0x95, 0x88, - 0xdb, 0x60, 0xa1, 0xc8, 0xc9, 0x07, 0x83, 0xd7, 0x14, 0x2c, 0xbe, 0xf4, - 0x72, 0x16, 0x5e, 0x10, 0x78, 0xb2, 0xf3, 0x2f, 0x93, 0xda, 0xca, 0xd8, - 0xfe, 0x46, 0x2a, 0xe4, 0x3c, 0x1d, 0xbd, 0xc3, 0xe2, 0xcb, 0xe9, 0xcd, - 0x9c, 0x05, 0x97, 0xb0, 0x03, 0x59, 0x7d, 0xdc, 0x2f, 0xd6, 0x5f, 0xce, - 0x2c, 0x77, 0x36, 0x59, 0x58, 0x7d, 0x86, 0x38, 0x44, 0x57, 0xdb, 0x08, - 0x1d, 0x96, 0x5f, 0x4d, 0x28, 0xd9, 0x65, 0x41, 0xe5, 0x61, 0x35, 0xfc, - 0x7d, 0xfc, 0x42, 0x92, 0xcb, 0xe1, 0x66, 0xe4, 0x2c, 0xbe, 0x38, 0x6e, - 0x2c, 0xbf, 0x43, 0x19, 0xde, 0x2c, 0xbf, 0xf3, 0xf7, 0x83, 0xd3, 0xf7, - 0xc1, 0x59, 0x7f, 0xfc, 0x64, 0x19, 0x67, 0x27, 0x74, 0xe7, 0xf3, 0x65, - 0x95, 0xb2, 0x69, 0xcc, 0x10, 0x7c, 0x5f, 0xa2, 0x4f, 0x10, 0x11, 0x47, - 0x4f, 0xec, 0xcd, 0x90, 0xe8, 0x17, 0x27, 0xa1, 0x96, 0x49, 0x44, 0xf6, - 0x44, 0xca, 0xd2, 0x19, 0x54, 0xa2, 0x25, 0x02, 0x0e, 0x3c, 0x1c, 0x96, - 0x4c, 0x09, 0x4e, 0xff, 0x43, 0x3c, 0xe1, 0x09, 0x34, 0x78, 0x3a, 0x8c, - 0x09, 0xb0, 0x93, 0xf4, 0x6e, 0x8f, 0x1a, 0x0f, 0xf0, 0xaa, 0x29, 0x65, - 0x5c, 0x9d, 0x0e, 0xec, 0xa1, 0x00, 0xc3, 0x07, 0x79, 0xe0, 0xa3, 0x93, - 0xf0, 0x93, 0x12, 0x3c, 0x4b, 0xfd, 0x31, 0xf7, 0x35, 0xd8, 0x59, 0x7f, - 0xfd, 0xa3, 0xfa, 0x5c, 0x3e, 0xfa, 0x35, 0xd8, 0x59, 0x7f, 0xa3, 0x4f, - 0x33, 0xf2, 0x4b, 0x2f, 0x3b, 0x81, 0x51, 0x57, 0x2f, 0xe7, 0x13, 0xde, - 0x76, 0xac, 0xa0, 0x1e, 0xb7, 0x8a, 0x2f, 0xe3, 0xd7, 0x9c, 0x46, 0xac, - 0xbe, 0x3e, 0xca, 0x16, 0x50, 0xd1, 0xf5, 0xa8, 0x44, 0xf8, 0x8b, 0x79, - 0x75, 0xf1, 0x6e, 0x71, 0xd6, 0x5b, 0x75, 0x65, 0xff, 0xe8, 0xdb, 0xa6, - 0x3c, 0x29, 0x1f, 0x82, 0xb2, 0x9a, 0x7b, 0xbe, 0x14, 0xba, 0x1a, 0xb2, - 0xee, 0x0d, 0x65, 0x68, 0xd6, 0xb8, 0xb5, 0xfe, 0x8d, 0x76, 0x0a, 0x3f, - 0x59, 0x7f, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0x78, 0xbf, 0x78, 0xf5, - 0xe7, 0x59, 0x78, 0xba, 0xeb, 0x2e, 0xc1, 0xe1, 0xe1, 0x70, 0x9e, 0xa4, - 0x8a, 0xf6, 0xc2, 0x0e, 0xff, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xfa, - 0x7d, 0xfd, 0x05, 0x1f, 0xac, 0xbf, 0xfb, 0x68, 0xd0, 0x33, 0x9c, 0xc1, - 0xe2, 0xca, 0x84, 0x57, 0x61, 0xab, 0x9a, 0xdf, 0xf7, 0x4c, 0x2c, 0xbc, - 0x96, 0xd3, 0x2c, 0xbf, 0x8b, 0x3b, 0xcc, 0x15, 0x65, 0x41, 0xf6, 0x39, - 0xfd, 0xfe, 0x01, 0xf3, 0xc7, 0xd3, 0x59, 0x7e, 0xcd, 0x9c, 0xbe, 0x59, - 0x5f, 0x1e, 0xd1, 0x19, 0x5f, 0xbb, 0xdc, 0x2f, 0xd6, 0x5f, 0xed, 0xc7, - 0x1c, 0x60, 0xcd, 0x65, 0x99, 0xc2, 0xef, 0xc8, 0xcc, 0xf2, 0x34, 0xa3, - 0x44, 0x9a, 0x10, 0x3a, 0x4f, 0xf1, 0x03, 0xc3, 0x84, 0xa1, 0xad, 0xc8, - 0x4c, 0xf5, 0xe8, 0x42, 0x2d, 0xc2, 0x8b, 0xf6, 0x80, 0xee, 0x05, 0x45, - 0x82, 0xbc, 0xc4, 0x6c, 0xb2, 0xff, 0xfe, 0x20, 0xbe, 0xcd, 0xc9, 0xf0, - 0xeb, 0x35, 0x21, 0x24, 0xb2, 0xfd, 0x85, 0x9d, 0xe2, 0xcb, 0xfd, 0xa7, - 0x68, 0x9a, 0x7f, 0x96, 0x59, 0x9e, 0x26, 0x1a, 0xc1, 0xa0, 0x07, 0x9d, - 0x80, 0x42, 0x6b, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x2c, 0xa5, 0xff, - 0xb3, 0xb2, 0xcf, 0xe7, 0xf3, 0xc1, 0x59, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, - 0xb4, 0xd7, 0xf8, 0x7e, 0x79, 0xbc, 0x6d, 0x59, 0x4b, 0x1c, 0xda, 0x5f, - 0xe8, 0x6e, 0x0c, 0xa3, 0xe5, 0x97, 0xe0, 0xe6, 0x9f, 0x8b, 0x2c, 0xcc, - 0x69, 0x8e, 0xe2, 0x13, 0x5a, 0x3c, 0x35, 0xc3, 0x2b, 0xf4, 0xf4, 0xc8, - 0x9e, 0x33, 0xc6, 0x78, 0xac, 0xbe, 0x9e, 0x2c, 0x86, 0x44, 0xf2, 0xb2, - 0xa7, 0xa3, 0xfa, 0x65, 0x68, 0x97, 0xfd, 0x3d, 0xf8, 0xc5, 0x1b, 0xb8, - 0x16, 0x5f, 0x99, 0x5b, 0x27, 0x99, 0x0b, 0x2f, 0xf0, 0x8d, 0xce, 0xf0, - 0xf8, 0xb2, 0xc6, 0xb2, 0xa7, 0xb3, 0xc4, 0x9f, 0x34, 0xbf, 0xd1, 0xb6, - 0x9c, 0x7b, 0x3a, 0xcb, 0xff, 0xf7, 0x9c, 0xbb, 0x2c, 0xd6, 0x41, 0x16, - 0x75, 0x65, 0x49, 0x10, 0xa6, 0x69, 0x7e, 0xde, 0xe3, 0xc6, 0xac, 0xbf, - 0x4e, 0x7f, 0xe7, 0xf1, 0x65, 0xd9, 0xbd, 0x65, 0xb9, 0x07, 0x8a, 0x45, - 0xb7, 0xcd, 0x8f, 0xb8, 0xb2, 0xff, 0x1b, 0x4f, 0x72, 0x08, 0xd6, 0x5f, - 0xa0, 0x81, 0xe8, 0x59, 0x7f, 0xf6, 0x77, 0xc6, 0xdc, 0xef, 0x04, 0xe2, - 0xcb, 0xff, 0x63, 0xff, 0x12, 0xd4, 0x61, 0x2c, 0xa0, 0x22, 0x04, 0xd1, - 0x6f, 0x8f, 0x7f, 0xb7, 0xac, 0xbe, 0xe4, 0x14, 0xcb, 0x2f, 0xa3, 0x72, - 0x6c, 0x59, 0x4e, 0x78, 0xe4, 0x45, 0x7f, 0xb7, 0x0f, 0xf9, 0xcf, 0xe0, - 0xac, 0xa9, 0x2a, 0x9b, 0xc2, 0x23, 0x6e, 0x98, 0x9b, 0xc4, 0x7f, 0x99, - 0x94, 0x29, 0xf8, 0x45, 0xd6, 0xdd, 0xc2, 0x0b, 0xfc, 0xd1, 0x1b, 0xfb, - 0x4f, 0xf5, 0x97, 0xe9, 0xda, 0xd0, 0x7c, 0xb2, 0xfc, 0x6c, 0x41, 0x01, - 0x65, 0x70, 0xf4, 0xba, 0x57, 0x50, 0x8a, 0xbc, 0x84, 0x4d, 0xe3, 0xcd, - 0x96, 0x5f, 0xfe, 0x07, 0x8f, 0xc7, 0xa8, 0x98, 0x5c, 0xf2, 0xca, 0xf1, - 0xf3, 0x90, 0xe5, 0xef, 0xcb, 0x16, 0x5c, 0x58, 0xb2, 0xa7, 0x1b, 0x1f, - 0xc7, 0x2f, 0xfd, 0xc3, 0x9d, 0xe7, 0xd4, 0x6f, 0x85, 0x97, 0xfc, 0xd7, - 0x94, 0xf8, 0x7c, 0x7a, 0x59, 0x5b, 0x22, 0x87, 0x44, 0x8d, 0x41, 0xbf, - 0x3f, 0x3b, 0x03, 0x59, 0x50, 0x7b, 0x01, 0x31, 0xbf, 0xcf, 0xa9, 0x3f, - 0x5c, 0x0b, 0x2f, 0xff, 0x66, 0x16, 0x7e, 0x59, 0xdf, 0x64, 0x96, 0x54, - 0x27, 0xcb, 0xe8, 0xd2, 0xc2, 0x43, 0xb8, 0x65, 0x7e, 0x89, 0x71, 0xb2, - 0x59, 0x7d, 0x02, 0x47, 0x96, 0x5c, 0x7b, 0x2c, 0xbc, 0xee, 0x05, 0x45, - 0xb8, 0xad, 0x8d, 0xf8, 0x05, 0xef, 0xfc, 0x7a, 0xf3, 0xe6, 0xb6, 0x3d, - 0x96, 0x5f, 0x4d, 0x03, 0xc5, 0x97, 0xfe, 0xcd, 0x61, 0x4e, 0xf6, 0x7c, - 0x2a, 0xcb, 0xf1, 0x7e, 0xff, 0x71, 0x65, 0x41, 0xf5, 0x3a, 0x0d, 0x30, - 0x9c, 0xb7, 0xc5, 0x1a, 0x61, 0xf1, 0x13, 0x9f, 0xf2, 0x11, 0x97, 0xfe, - 0x71, 0x93, 0xef, 0xf4, 0x4d, 0xc5, 0x97, 0xdb, 0xe0, 0x04, 0xb2, 0xfe, - 0x2f, 0xe6, 0x28, 0x6a, 0xca, 0x61, 0x12, 0x2d, 0x40, 0x72, 0x3b, 0xcd, - 0x23, 0x59, 0x62, 0x59, 0x7f, 0xde, 0x0b, 0xf3, 0x30, 0x98, 0x59, 0x7e, - 0xe3, 0xfc, 0xe3, 0x59, 0x63, 0x19, 0xf0, 0x74, 0xe2, 0xa1, 0x16, 0x58, - 0x37, 0xe7, 0x0b, 0xfe, 0x87, 0x2f, 0x66, 0x10, 0x16, 0x5f, 0xee, 0xf4, - 0xf6, 0x6c, 0x12, 0xca, 0x91, 0xf4, 0x61, 0xad, 0xfe, 0x20, 0xb6, 0x39, - 0xd3, 0x59, 0x7e, 0x8d, 0x6b, 0x37, 0x16, 0x5e, 0xd1, 0xfc, 0xb2, 0xa0, - 0xfe, 0x48, 0xcb, 0xa5, 0x57, 0xf8, 0x23, 0x2c, 0xde, 0xf2, 0x59, 0x7f, - 0xfa, 0x36, 0xe9, 0x8f, 0x0a, 0x47, 0xe0, 0xac, 0xbf, 0xe9, 0x1e, 0xfc, - 0xf3, 0x96, 0xcb, 0x2f, 0x46, 0x69, 0x65, 0xfe, 0xf4, 0x48, 0xe7, 0xf1, - 0xab, 0x28, 0x67, 0xa1, 0xc1, 0xbb, 0xf4, 0xef, 0xb8, 0x6c, 0x2c, 0xad, - 0x8f, 0x3b, 0xe2, 0x2a, 0xf9, 0x1f, 0x8f, 0x0d, 0x8b, 0xff, 0x67, 0x8f, - 0x43, 0xf4, 0x10, 0x16, 0x5f, 0xf8, 0xb3, 0xbc, 0x89, 0xdd, 0xc0, 0x2c, - 0xa9, 0x1f, 0xe1, 0x9e, 0xdf, 0xef, 0xa5, 0x05, 0xdc, 0xfd, 0x65, 0xf7, - 0x3f, 0x3e, 0xac, 0xa9, 0x2a, 0x95, 0xf1, 0xa3, 0xc6, 0x8b, 0xc8, 0x52, - 0x04, 0x84, 0x43, 0x4b, 0xf3, 0xeb, 0xb9, 0xe5, 0x97, 0xfe, 0x3f, 0xe2, - 0x43, 0xf4, 0x10, 0x16, 0x54, 0x8f, 0x97, 0xa4, 0xf7, 0xf7, 0x65, 0x9a, - 0xce, 0x2c, 0xa5, 0x97, 0x82, 0xfd, 0x59, 0x70, 0x61, 0x65, 0x48, 0xd9, - 0x74, 0x72, 0x96, 0x5f, 0x7c, 0x03, 0xd2, 0xcb, 0x9a, 0xcf, 0x11, 0x19, - 0xf1, 0xeb, 0x48, 0x7a, 0x17, 0x7d, 0x83, 0x21, 0xac, 0xa8, 0x3e, 0xcd, - 0xe9, 0x77, 0xfc, 0x5d, 0xf3, 0xc8, 0x2e, 0x22, 0xca, 0x84, 0xe8, 0xf0, - 0x88, 0xe3, 0x25, 0x72, 0x3b, 0xe6, 0x1c, 0xf6, 0x59, 0x63, 0x59, 0x69, - 0xf5, 0x96, 0x2f, 0xcd, 0x27, 0x44, 0x2f, 0x4e, 0x9e, 0x67, 0x95, 0x97, - 0xfd, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x43, 0xaa, 0x11, 0xbc, 0x68, - 0xf3, 0x13, 0xb9, 0x4d, 0xfb, 0xf8, 0x06, 0x35, 0x65, 0xf4, 0x4d, 0x83, - 0x59, 0x5a, 0x3c, 0xae, 0x14, 0x5f, 0xdc, 0xe3, 0xfb, 0x00, 0xb2, 0xff, - 0xb2, 0x07, 0xe8, 0xdc, 0x89, 0x96, 0x5f, 0xef, 0xcf, 0xde, 0xcf, 0xdd, - 0x65, 0x34, 0xfb, 0xff, 0x3b, 0xbf, 0xf1, 0x6e, 0x39, 0x3b, 0x47, 0x83, - 0x59, 0x50, 0x99, 0x06, 0x11, 0x3c, 0x27, 0x37, 0x08, 0xef, 0xfc, 0xe3, - 0x81, 0xf8, 0xc8, 0xda, 0xb2, 0xff, 0xdb, 0xdf, 0x5c, 0x7f, 0x72, 0x36, - 0x59, 0x7f, 0xb8, 0x10, 0x67, 0x4a, 0x16, 0x53, 0x51, 0x5f, 0xe3, 0xce, - 0xa0, 0xde, 0xee, 0x01, 0x65, 0xd8, 0x05, 0x96, 0xc9, 0xc6, 0xcb, 0xa3, - 0x97, 0xfe, 0x97, 0x9f, 0x5f, 0x76, 0x0f, 0x65, 0x94, 0x47, 0xd0, 0x12, - 0x8b, 0xfd, 0x28, 0xd6, 0xd1, 0xad, 0x96, 0x5f, 0xf7, 0x80, 0x7c, 0xc1, - 0xb8, 0x16, 0x5f, 0x9f, 0x9b, 0xf3, 0x8b, 0x2a, 0x11, 0x2d, 0x86, 0xbf, - 0x9c, 0x5f, 0xa7, 0x7b, 0x3f, 0x75, 0x97, 0xfb, 0x51, 0xe7, 0x1c, 0x9a, - 0xb2, 0xff, 0x9a, 0x7d, 0x9f, 0xc2, 0x76, 0x16, 0x5f, 0xd2, 0x7d, 0x67, - 0xdd, 0x59, 0x7f, 0x0d, 0xdb, 0xe3, 0x15, 0x65, 0x41, 0xee, 0x61, 0x75, - 0xff, 0x67, 0x78, 0x27, 0x34, 0xfc, 0x59, 0x78, 0x7b, 0x6c, 0xb2, 0xfc, - 0x7d, 0xe3, 0x9a, 0xcb, 0xfe, 0xd7, 0xfa, 0x72, 0xee, 0x7e, 0xb2, 0xb6, - 0x4f, 0x34, 0x65, 0x58, 0x67, 0xa8, 0x4b, 0xb4, 0x81, 0xce, 0xbf, 0x1f, - 0x09, 0x35, 0xe1, 0x35, 0x25, 0x97, 0xf0, 0x9d, 0x0c, 0x66, 0xcb, 0x2f, - 0xef, 0xfc, 0xe7, 0xe0, 0xac, 0xa9, 0x1f, 0xdc, 0xc3, 0xda, 0x2f, 0xbf, - 0xf8, 0x05, 0x1d, 0x2c, 0xdf, 0x9a, 0x92, 0xcb, 0xf3, 0xf3, 0x9b, 0x71, - 0x65, 0xee, 0x35, 0xd6, 0x5f, 0xe2, 0x60, 0x4f, 0x78, 0x3c, 0x59, 0x53, - 0x1e, 0x90, 0x47, 0x2f, 0xfe, 0x0f, 0x3c, 0xf2, 0x82, 0x1e, 0x79, 0x65, - 0xff, 0x09, 0x1f, 0xcd, 0x28, 0xd6, 0xcb, 0x2f, 0xe2, 0x7e, 0x89, 0x00, - 0x59, 0x4d, 0x3e, 0xa2, 0x3d, 0xbe, 0x2f, 0xf6, 0xfd, 0x65, 0xff, 0xfe, - 0x9b, 0x86, 0x39, 0xd3, 0x19, 0x6f, 0x79, 0x9f, 0xa1, 0x85, 0x95, 0x88, - 0xac, 0x32, 0x17, 0x25, 0xbf, 0xdc, 0x9d, 0xd9, 0xc3, 0xc2, 0x59, 0x6f, - 0xd6, 0x58, 0xfe, 0x3c, 0x9d, 0x1b, 0xdf, 0x9f, 0xee, 0x74, 0xd6, 0x54, - 0x2b, 0x31, 0xc3, 0x06, 0x11, 0x0d, 0xef, 0x44, 0x7e, 0x8d, 0x64, 0x9d, - 0xb8, 0x51, 0x7e, 0x70, 0xb1, 0x02, 0x2c, 0xbf, 0x4f, 0x79, 0xa8, 0xe2, - 0xca, 0x98, 0xf5, 0x48, 0xa6, 0xfe, 0xce, 0x98, 0xf1, 0xab, 0x2f, 0x8a, - 0x46, 0xd5, 0x96, 0x9d, 0x31, 0xe6, 0xb9, 0x65, 0xfc, 0x65, 0xbd, 0xe6, - 0x65, 0x55, 0x97, 0xf4, 0x4d, 0xf4, 0xb3, 0x7a, 0xca, 0x98, 0xf9, 0xf8, - 0x6d, 0x43, 0x45, 0xa3, 0xc2, 0x46, 0xff, 0xfc, 0x3f, 0x40, 0x8c, 0xfa, - 0x4f, 0xff, 0x39, 0x1f, 0xa4, 0xb8, 0x78, 0xb2, 0xfd, 0xb4, 0x6c, 0xfc, - 0x59, 0x58, 0x89, 0x93, 0x5a, 0x71, 0x6b, 0xfb, 0x71, 0xff, 0x6c, 0x71, - 0x65, 0xd1, 0xfa, 0xcb, 0x05, 0x60, 0x85, 0xbd, 0x78, 0xfa, 0x7f, 0x48, - 0xbf, 0xf7, 0x37, 0xbc, 0xdb, 0x39, 0x3c, 0xcb, 0x2f, 0xfd, 0x83, 0x89, - 0x46, 0x9b, 0xdf, 0x96, 0x5f, 0xcf, 0xfc, 0xc5, 0x03, 0x59, 0x7f, 0xc5, - 0x9b, 0x0f, 0xd8, 0x5d, 0x59, 0x7b, 0xa7, 0xc5, 0x95, 0x09, 0x93, 0x4c, - 0x46, 0xd4, 0x2f, 0x1f, 0x91, 0x77, 0x0e, 0x2a, 0x7a, 0x74, 0x3f, 0x93, - 0xc9, 0x6c, 0xf1, 0x3e, 0x65, 0x1d, 0x62, 0x5a, 0x54, 0xa3, 0x3f, 0x1c, - 0xa7, 0x2c, 0x8f, 0x71, 0x88, 0x77, 0x82, 0x1c, 0x5f, 0x42, 0x58, 0xe1, - 0x35, 0x34, 0xac, 0x2d, 0x4a, 0x6c, 0x6c, 0x63, 0xde, 0x8e, 0x95, 0xe1, - 0xe5, 0xfc, 0x32, 0x8a, 0x16, 0xfc, 0x8f, 0xf3, 0xb3, 0x84, 0x61, 0x86, - 0x5e, 0xf8, 0xc8, 0xe7, 0xe1, 0x80, 0x24, 0x77, 0x97, 0xff, 0x6b, 0x3e, - 0x07, 0x8f, 0xbc, 0x7f, 0x96, 0x5f, 0x7e, 0x21, 0x49, 0x65, 0xc0, 0x67, - 0xf9, 0xf5, 0x75, 0x1a, 0x99, 0xaa, 0x84, 0x0c, 0xa5, 0x3b, 0xe8, 0xd4, - 0x9a, 0xb2, 0xfb, 0xee, 0x3e, 0xea, 0xcb, 0xf6, 0x0c, 0x3d, 0xe2, 0xcb, - 0xcf, 0xa6, 0x16, 0x59, 0x9e, 0xc8, 0x8d, 0x32, 0x22, 0x26, 0x14, 0xa2, - 0xff, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x8b, 0xcd, 0x50, 0xfa, 0x9b, 0x92, - 0x75, 0x1c, 0x72, 0x39, 0x68, 0x30, 0x7e, 0x9f, 0xf3, 0xd4, 0x7c, 0x8d, - 0x53, 0xf4, 0x6b, 0xc5, 0x69, 0x53, 0x39, 0x0b, 0xbd, 0xe8, 0xb7, 0xf9, - 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x52, 0xcb, 0x99, 0x0c, 0xa2, 0xcb, 0xf1, - 0xb3, 0xe6, 0x1a, 0xcb, 0xf6, 0x80, 0xee, 0x05, 0x45, 0x84, 0xbe, 0xec, - 0x0f, 0x16, 0x5f, 0xff, 0x61, 0x0e, 0x3d, 0x1f, 0x77, 0x09, 0xda, 0xb2, - 0xf1, 0x04, 0x0b, 0x2a, 0x0f, 0xa5, 0xd3, 0x6d, 0xc5, 0x97, 0xf0, 0x74, - 0x7b, 0x3b, 0x56, 0x59, 0x9b, 0x28, 0x9b, 0x28, 0xc8, 0x30, 0xa0, 0xcd, - 0x1b, 0x08, 0xae, 0x10, 0x4f, 0x88, 0xdf, 0xe6, 0x79, 0xa0, 0x3b, 0x81, - 0x51, 0x65, 0xad, 0x25, 0x97, 0x69, 0x85, 0x97, 0xcc, 0xd8, 0x65, 0x27, - 0xa5, 0x94, 0x92, 0xf3, 0x31, 0x1a, 0xb2, 0x80, 0x7b, 0x7c, 0x30, 0x08, - 0x5d, 0x30, 0x8b, 0x32, 0x11, 0xe3, 0x9d, 0xd1, 0xe5, 0x96, 0xfd, 0x65, - 0xcc, 0x6c, 0xb2, 0xda, 0x91, 0xab, 0xc1, 0x2a, 0x01, 0xf3, 0xba, 0x0d, - 0xc7, 0xfa, 0xcb, 0xfe, 0x7f, 0x8b, 0x3e, 0xec, 0x30, 0xb2, 0xff, 0x6d, - 0xf7, 0x20, 0x7d, 0x35, 0x97, 0xe8, 0xcd, 0xf1, 0xc5, 0x96, 0x87, 0x3d, - 0xd1, 0x4d, 0x69, 0xd1, 0x7c, 0x50, 0x97, 0xbe, 0x79, 0x48, 0x6b, 0x2f, - 0xe7, 0xd4, 0x75, 0xfc, 0xb2, 0xf0, 0xa2, 0x8a, 0x92, 0xff, 0xa2, 0x5f, - 0x77, 0x51, 0x9f, 0x24, 0x66, 0x68, 0x2f, 0xf8, 0x2f, 0xf6, 0x74, 0xfe, - 0x15, 0x65, 0xd1, 0xc5, 0x94, 0x34, 0xc2, 0xfc, 0x44, 0x49, 0x9c, 0x4c, - 0xde, 0x77, 0x73, 0x29, 0x3d, 0x2c, 0xbf, 0x8d, 0xf9, 0xff, 0x02, 0xb2, - 0xff, 0xe3, 0x93, 0xf1, 0xc8, 0x20, 0xce, 0x24, 0xbf, 0xff, 0xbc, 0x7d, - 0xf6, 0x70, 0xb1, 0xa1, 0xe7, 0x9e, 0x4b, 0x2f, 0xf4, 0x4b, 0xaf, 0xe7, - 0x1a, 0xcb, 0xe7, 0xeb, 0x1c, 0x59, 0x50, 0x8f, 0x1c, 0x42, 0xd2, 0xd3, - 0x99, 0x5a, 0x4b, 0x2d, 0x25, 0x96, 0x92, 0xcb, 0xc2, 0x8a, 0x2a, 0xcb, - 0x01, 0x23, 0x33, 0x41, 0x50, 0x7e, 0xcc, 0x08, 0x98, 0x8f, 0xe6, 0x37, - 0xf0, 0x79, 0xe7, 0x96, 0x2c, 0xbf, 0xfe, 0xe1, 0x83, 0x0b, 0x50, 0x58, - 0x3c, 0x61, 0x65, 0x34, 0xfe, 0xba, 0x5b, 0x6f, 0x96, 0x59, 0x85, 0x96, - 0x0a, 0xca, 0x23, 0x47, 0xc1, 0x2a, 0xc3, 0xf7, 0xe1, 0x17, 0x4d, 0x6e, - 0xe3, 0x0b, 0x2d, 0x8b, 0x2e, 0x0f, 0xf0, 0x6a, 0x06, 0x31, 0x71, 0xc2, - 0xcb, 0xf8, 0xa1, 0xa5, 0x18, 0xb2, 0xff, 0xe8, 0x7d, 0x77, 0xd8, 0x30, - 0xf7, 0x8b, 0x2e, 0x94, 0x2c, 0xbd, 0xc1, 0xb0, 0xb2, 0xb6, 0x47, 0x20, - 0xcb, 0x66, 0x15, 0xf1, 0x50, 0x51, 0x04, 0x16, 0xbf, 0xfd, 0x9f, 0x74, - 0x4e, 0x9f, 0x7d, 0x83, 0x35, 0x97, 0xff, 0xff, 0xa3, 0xbc, 0x3e, 0x72, - 0x3b, 0xe3, 0x8d, 0x7e, 0xd7, 0x94, 0xba, 0xc2, 0xca, 0x61, 0x18, 0x9e, - 0x4b, 0xb8, 0xfe, 0x59, 0x74, 0x35, 0x65, 0xff, 0xfa, 0x08, 0x32, 0x94, - 0x77, 0xd8, 0xd1, 0x23, 0xf5, 0x97, 0xff, 0xc6, 0x41, 0x96, 0x73, 0x50, - 0x72, 0x7e, 0x24, 0xa9, 0x22, 0x8f, 0xaa, 0xd7, 0x01, 0x9c, 0x32, 0x65, - 0xb6, 0x84, 0xbc, 0x88, 0x47, 0x0d, 0x5c, 0x8c, 0xc5, 0x84, 0xc0, 0x10, - 0xea, 0x31, 0xf7, 0x85, 0x81, 0x46, 0x5b, 0xc8, 0xce, 0xbb, 0x18, 0xf6, - 0xf2, 0x49, 0xf1, 0x71, 0x21, 0x73, 0x7f, 0xf9, 0x9b, 0x5e, 0x4c, 0xf3, - 0x40, 0x77, 0x02, 0xa2, 0x8c, 0x5f, 0x1f, 0x5e, 0x7d, 0x65, 0xfc, 0xfa, - 0xfd, 0xb1, 0xfa, 0xcb, 0xe8, 0xd4, 0x7e, 0xb2, 0xfe, 0x81, 0xc3, 0x60, - 0x45, 0x95, 0x32, 0x28, 0xbc, 0x49, 0xbc, 0xbc, 0x42, 0x2b, 0xf8, 0x9f, - 0xbe, 0x39, 0x96, 0x5f, 0xbd, 0x1b, 0x60, 0xd6, 0x5f, 0x89, 0xff, 0x81, - 0x16, 0x5f, 0xf8, 0xfe, 0x97, 0x0b, 0x3b, 0xe0, 0xac, 0xbf, 0xe3, 0xd7, - 0xb3, 0x0a, 0x5c, 0x59, 0x52, 0x3f, 0x60, 0x1f, 0xdf, 0x3e, 0xfc, 0x25, - 0x95, 0xf1, 0xe2, 0x68, 0x8a, 0xed, 0xdd, 0xc5, 0x97, 0xfe, 0x79, 0x03, - 0xc6, 0xd8, 0xd3, 0x0b, 0x2c, 0xce, 0x13, 0xf7, 0xc4, 0x19, 0x8b, 0x7c, - 0x51, 0xd8, 0x71, 0x04, 0x8c, 0x51, 0xda, 0x93, 0x62, 0x43, 0xa8, 0xe9, - 0x9a, 0xf0, 0xf4, 0xa8, 0xae, 0x46, 0x29, 0xd9, 0x5e, 0x77, 0xff, 0x33, - 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x88, 0xe5, 0x7f, 0xf9, 0x9b, 0x5e, - 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x72, 0x5f, 0xe6, 0x79, 0xa0, 0x3b, - 0x81, 0x51, 0x66, 0x2e, 0xef, 0xeb, 0x2f, 0xd9, 0xe2, 0xcd, 0x2c, 0xbd, - 0xb4, 0x69, 0x65, 0xfa, 0x5c, 0x76, 0xb3, 0xf1, 0xed, 0x90, 0xc7, 0x09, - 0xaf, 0xa7, 0x84, 0xf5, 0x3d, 0x4f, 0x05, 0x97, 0xf8, 0x78, 0xd8, 0xfa, - 0x1a, 0xb2, 0xa7, 0xa3, 0xec, 0x9e, 0x07, 0x37, 0xfb, 0x51, 0xdf, 0x3f, - 0xd2, 0x59, 0x7f, 0xff, 0xfd, 0x13, 0x7a, 0x3b, 0x02, 0x1e, 0xa6, 0x8f, - 0x66, 0xfc, 0xf6, 0x0f, 0x7e, 0x2c, 0xaf, 0xd1, 0x6a, 0x46, 0x97, 0xfd, - 0x9c, 0x7e, 0xfe, 0x21, 0x49, 0x65, 0xbf, 0x59, 0x7f, 0x73, 0x5a, 0xcf, - 0xb8, 0xb2, 0xa7, 0xa3, 0xc1, 0xc1, 0x2b, 0xda, 0xc6, 0xac, 0xbe, 0x32, - 0xce, 0x2c, 0xb6, 0x74, 0xde, 0x6e, 0x0e, 0x5f, 0xff, 0xfb, 0xd0, 0x41, - 0xe7, 0x20, 0x4e, 0x99, 0x06, 0x59, 0xce, 0x9a, 0xcb, 0xee, 0xf4, 0xf4, - 0xb2, 0xa4, 0x88, 0xdd, 0x35, 0xde, 0x72, 0x02, 0xcb, 0xdc, 0x8e, 0x2c, - 0xbd, 0xb4, 0xff, 0x16, 0x5d, 0x3d, 0xf9, 0x65, 0x8d, 0x65, 0xfe, 0x8e, - 0x47, 0x76, 0xc1, 0x56, 0x58, 0xda, 0x78, 0x84, 0x21, 0x7f, 0xe2, 0x1f, - 0xa3, 0x9c, 0xcd, 0x42, 0xcb, 0xbf, 0x75, 0x97, 0xec, 0xfb, 0xb9, 0x0b, - 0x2e, 0x9c, 0x22, 0xcb, 0xf0, 0x3c, 0xe6, 0xcb, 0x59, 0x7e, 0x0f, 0x23, - 0x90, 0xb2, 0xb4, 0x7a, 0x4e, 0x57, 0x7f, 0x17, 0xfe, 0xcf, 0xdd, 0x65, - 0xf1, 0x46, 0xf0, 0xac, 0xa3, 0x3d, 0x17, 0x2e, 0xbb, 0xe6, 0xac, 0xbf, - 0xfa, 0x7d, 0xcb, 0xfc, 0xec, 0x11, 0xfe, 0xb2, 0xcc, 0xe7, 0xa5, 0xd7, - 0x08, 0x87, 0x16, 0xc4, 0x72, 0x7b, 0x1b, 0x16, 0x42, 0xd8, 0x04, 0x7f, - 0x0d, 0xcc, 0x39, 0xa2, 0x16, 0xb0, 0x39, 0x33, 0x2c, 0xf4, 0x85, 0xf8, - 0x4e, 0x16, 0xcd, 0xee, 0x53, 0xe4, 0x02, 0x0c, 0x5f, 0xb4, 0x07, 0x70, - 0x2a, 0x2d, 0xd5, 0xb8, 0xb2, 0xb0, 0xf1, 0x7f, 0x34, 0xbf, 0x33, 0x1f, - 0xa3, 0x4b, 0x29, 0x99, 0xe6, 0x78, 0x8a, 0xfe, 0x27, 0x67, 0xad, 0xbc, - 0xb2, 0xf1, 0xfd, 0xfa, 0xcb, 0xf7, 0xd2, 0xf1, 0xfe, 0xb2, 0xff, 0xed, - 0x38, 0x3f, 0x0f, 0x3b, 0x1f, 0x0a, 0xb2, 0xe2, 0x61, 0x65, 0xf0, 0x1d, - 0xc0, 0xa8, 0xa4, 0x15, 0x87, 0x8b, 0xa1, 0x7b, 0xfd, 0x2e, 0x98, 0xbc, - 0xfc, 0xd6, 0x5f, 0xfb, 0x3c, 0x7b, 0xfd, 0x98, 0x40, 0x59, 0x7f, 0x67, - 0xb3, 0xc6, 0xc2, 0xcb, 0xf7, 0x63, 0x79, 0xef, 0x59, 0x79, 0xe4, 0xce, - 0x13, 0xa3, 0x19, 0x56, 0x42, 0x37, 0xe2, 0x1e, 0x1a, 0xf4, 0xfb, 0x79, - 0x6d, 0xfb, 0x33, 0x9e, 0x0a, 0xcb, 0xfc, 0x63, 0x0f, 0x78, 0xd2, 0x59, - 0x7c, 0x2b, 0x63, 0x8b, 0x2f, 0x39, 0x49, 0x65, 0x99, 0x81, 0x58, 0x3e, - 0x8c, 0x1b, 0x1e, 0x0f, 0x9f, 0x9c, 0x9c, 0x26, 0x62, 0x91, 0xdf, 0xfc, - 0xcd, 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x25, 0x25, 0x6c, 0xcd, 0x1a, - 0x99, 0x51, 0xab, 0x4f, 0x09, 0xcf, 0xe7, 0x8a, 0x4a, 0x3b, 0x4e, 0xcb, - 0x2b, 0xdc, 0x74, 0xbc, 0xcd, 0xc0, 0xb2, 0xfe, 0x32, 0xcf, 0x60, 0x16, - 0x5f, 0xc6, 0x5d, 0xc3, 0x1a, 0xcb, 0xa5, 0xd5, 0x97, 0x8a, 0x05, 0x59, - 0x74, 0x33, 0xd1, 0xb3, 0x21, 0x7a, 0x92, 0x22, 0xfa, 0xbd, 0x7b, 0x81, - 0x6a, 0xcb, 0x32, 0x16, 0x59, 0x9c, 0x93, 0x0b, 0xfa, 0x16, 0xc6, 0x47, - 0x3e, 0x3b, 0x78, 0x9e, 0x4b, 0x2f, 0xff, 0x1f, 0xdf, 0xeb, 0x07, 0x1a, - 0x3f, 0xbf, 0x59, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0x9d, 0x97, 0xf6, 0xcf, - 0xa0, 0x6b, 0x16, 0x5f, 0xfd, 0x9e, 0x27, 0x90, 0x7f, 0x6b, 0xc9, 0x65, - 0xe7, 0x93, 0x38, 0x47, 0x9e, 0x26, 0xb9, 0xa1, 0x17, 0x5d, 0xb6, 0xea, - 0xcb, 0xff, 0xf1, 0x8c, 0x2d, 0x8d, 0xc7, 0x19, 0x41, 0x60, 0x16, 0x5f, - 0xe9, 0x46, 0xb6, 0x8d, 0x6c, 0xb2, 0xff, 0xde, 0x27, 0x90, 0x7f, 0x6b, - 0xc9, 0x65, 0x41, 0xfa, 0x61, 0xad, 0xff, 0xfb, 0x3e, 0x97, 0xa3, 0x8f, - 0xa8, 0xdc, 0xf3, 0x81, 0x65, 0x99, 0xe2, 0xab, 0x66, 0xc6, 0x1d, 0xe4, - 0xc7, 0x1b, 0x28, 0x64, 0xee, 0x10, 0x5f, 0x1e, 0xa3, 0x7a, 0xcb, 0xb3, - 0xcb, 0x2f, 0xfe, 0x9f, 0x72, 0xff, 0x3b, 0x04, 0x7f, 0xac, 0xb3, 0x3e, - 0x1f, 0xfc, 0xf9, 0x18, 0x82, 0xd7, 0xff, 0x3b, 0x7d, 0x80, 0x7f, 0x40, - 0x92, 0x59, 0x78, 0xc6, 0xeb, 0x2f, 0xfe, 0x2c, 0xf3, 0xed, 0x9c, 0x27, - 0xf9, 0x65, 0xd3, 0xec, 0xc6, 0x8a, 0x2f, 0x22, 0x70, 0x6e, 0xa1, 0x78, - 0xda, 0x51, 0x94, 0xb6, 0x58, 0x27, 0x21, 0xd7, 0x3f, 0x0d, 0xdb, 0xff, - 0x72, 0x0b, 0xef, 0xf9, 0xc8, 0xfd, 0x65, 0xff, 0xff, 0xff, 0x78, 0xfa, - 0xef, 0xf7, 0x39, 0xc8, 0x6c, 0x7b, 0x33, 0x6c, 0x2c, 0xfb, 0xbc, 0x8f, - 0x96, 0x5f, 0xe8, 0x91, 0xf4, 0xca, 0x4b, 0x2f, 0xff, 0xfc, 0x00, 0xed, - 0x9b, 0xe3, 0xec, 0x1b, 0xc8, 0x46, 0xf3, 0x1c, 0x6b, 0x2f, 0x86, 0xfd, - 0x67, 0x89, 0xbb, 0x01, 0x07, 0x50, 0x94, 0xe1, 0x8d, 0xff, 0xd3, 0x7d, - 0xc3, 0x6c, 0xe1, 0x35, 0x9b, 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x11, 0x62, - 0xfe, 0x3d, 0x39, 0x02, 0x16, 0x56, 0x8f, 0x67, 0xc5, 0xd7, 0xfe, 0x79, - 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0x75, 0x7f, 0xff, 0x60, 0xfd, 0x02, - 0x33, 0xe9, 0x3f, 0xfc, 0xe4, 0x7e, 0x92, 0xcc, 0xe1, 0x37, 0x1c, 0x85, - 0x23, 0x48, 0xa7, 0xd3, 0x2f, 0xfe, 0x6b, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, - 0x54, 0x4c, 0x4b, 0xfb, 0xd0, 0x5f, 0x4c, 0xeb, 0x2f, 0xf3, 0x9c, 0xf9, - 0xff, 0x83, 0x59, 0x7d, 0x80, 0x86, 0x70, 0x7c, 0x7e, 0x2e, 0xa6, 0x68, - 0xee, 0xf4, 0x2d, 0x6f, 0xda, 0x03, 0xb8, 0x15, 0x15, 0x4a, 0xd8, 0xb2, - 0xb0, 0xf1, 0x18, 0x34, 0xbf, 0xf0, 0x5f, 0x52, 0x2c, 0x15, 0xff, 0x59, - 0x7f, 0xf3, 0xf3, 0x46, 0x2f, 0x7c, 0x7a, 0x92, 0xcb, 0xfe, 0xd3, 0xfb, - 0xe9, 0x67, 0x59, 0x8d, 0x10, 0x9e, 0x3f, 0xa6, 0x68, 0xfa, 0x78, 0x53, - 0x5f, 0xf9, 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x27, 0x45, 0xf7, 0x0f, - 0xe1, 0x56, 0x53, 0x4f, 0xc3, 0xf4, 0xcb, 0xe7, 0x2e, 0xf1, 0x65, 0xf6, - 0xc5, 0x1b, 0x2c, 0xbe, 0x6c, 0x30, 0xcd, 0xa7, 0x88, 0x12, 0x1a, 0x66, - 0x8a, 0x33, 0x67, 0xbf, 0xc6, 0xfa, 0x89, 0x3e, 0xf5, 0x97, 0xc6, 0x5f, - 0x9a, 0xcb, 0xf4, 0xd1, 0x34, 0x71, 0x65, 0xfc, 0x2e, 0x1e, 0xfc, 0x25, - 0x94, 0x67, 0xaf, 0xc2, 0x9b, 0xc7, 0xe8, 0x58, 0xcc, 0xd0, 0xdf, 0xfc, - 0x1e, 0x76, 0x3e, 0x66, 0x19, 0x8d, 0xab, 0x2a, 0x49, 0x87, 0xb6, 0x13, - 0x3e, 0x2d, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x4e, 0xeb, - 0xf7, 0x42, 0xed, 0x34, 0x97, 0xfe, 0x28, 0xee, 0x73, 0x33, 0xe9, 0x2c, - 0xa1, 0xaa, 0x28, 0xc8, 0xd0, 0x9a, 0x6c, 0xe9, 0x9d, 0x27, 0xbf, 0xe1, - 0xc4, 0xa1, 0x98, 0xbc, 0xfd, 0x65, 0xfb, 0x85, 0x1f, 0xf1, 0x65, 0xe2, - 0xc1, 0xac, 0xba, 0x19, 0xc1, 0xe1, 0xfe, 0x51, 0x4c, 0xd1, 0xff, 0x8a, - 0x05, 0x08, 0x0b, 0xf7, 0x19, 0x83, 0xb0, 0xb2, 0xff, 0xf3, 0x36, 0xbc, - 0x99, 0xe6, 0x80, 0xee, 0x05, 0x45, 0x0a, 0xbf, 0xfe, 0x7e, 0xcb, 0x08, - 0xc6, 0xcf, 0x9b, 0x46, 0x96, 0x5f, 0x99, 0xec, 0xd7, 0x15, 0x65, 0xff, - 0xff, 0xc1, 0x6b, 0x5e, 0x4c, 0xc1, 0xe0, 0xf6, 0x0b, 0x36, 0x60, 0x31, - 0x32, 0xca, 0x92, 0x28, 0xfc, 0x59, 0x7e, 0x0f, 0xdd, 0x30, 0x2c, 0xbf, - 0x67, 0xf8, 0xe4, 0xb2, 0xfb, 0x86, 0x2f, 0x56, 0x5e, 0x8f, 0xd9, 0xec, - 0x7e, 0x44, 0x53, 0xd2, 0x6a, 0x34, 0x6c, 0x14, 0x25, 0x6f, 0xf9, 0xaf, - 0xcc, 0x16, 0x08, 0x6b, 0x2f, 0xfc, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, - 0x14, 0x92, 0xff, 0x67, 0x8b, 0x07, 0xe0, 0xac, 0xbd, 0x04, 0x35, 0x96, - 0x67, 0x88, 0xd1, 0x69, 0xc7, 0x53, 0x05, 0x32, 0xbf, 0xff, 0xec, 0x20, - 0xf2, 0x30, 0xba, 0x4e, 0xc6, 0x4d, 0x04, 0x35, 0x97, 0x34, 0x96, 0x5f, - 0xfd, 0x37, 0x9d, 0xbd, 0xf4, 0x74, 0x2d, 0x59, 0x7d, 0x85, 0x1b, 0x2c, - 0xac, 0x3e, 0x7d, 0x23, 0x5e, 0xce, 0x33, 0x24, 0xc0, 0x78, 0xc6, 0x23, - 0xed, 0x43, 0x37, 0xef, 0x68, 0xf3, 0x25, 0x19, 0xd0, 0x23, 0x68, 0xd4, - 0x67, 0x8d, 0x96, 0x96, 0xe6, 0xbf, 0x95, 0x12, 0xd7, 0x63, 0xcc, 0x0c, - 0x3d, 0xe7, 0xe3, 0x46, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x44, 0x8b, 0xff, - 0xfd, 0xe8, 0xd9, 0x97, 0xa8, 0x9f, 0x67, 0xa3, 0x86, 0xed, 0x82, 0xac, - 0xb3, 0x3c, 0x45, 0x04, 0xc6, 0x97, 0xb4, 0xfa, 0x59, 0x7f, 0xe7, 0x93, - 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x97, 0x96, 0x66, 0x67, 0xd0, 0xd1, 0xcb, - 0xff, 0xa3, 0x7b, 0xcc, 0x7a, 0xfa, 0x51, 0x32, 0xcb, 0xd3, 0xd3, 0x7f, - 0x59, 0x74, 0xc4, 0xb2, 0xff, 0xf7, 0xa3, 0x82, 0x0e, 0x35, 0x36, 0x17, - 0xeb, 0x2f, 0xb4, 0x1e, 0xf1, 0x65, 0xfb, 0x5f, 0xb4, 0xf8, 0xb2, 0xf4, - 0x17, 0xcb, 0x2f, 0xdd, 0x11, 0xa5, 0x0b, 0x2c, 0x7e, 0x3c, 0x42, 0x1c, - 0xbf, 0xfd, 0xed, 0xf0, 0x5f, 0xee, 0xe0, 0xf3, 0x5f, 0x2c, 0xbf, 0xc7, - 0xa7, 0x19, 0x93, 0x0b, 0x2e, 0x8e, 0xac, 0xbf, 0xe7, 0xdb, 0x51, 0xf4, - 0x8d, 0xab, 0x2f, 0xff, 0x04, 0x67, 0xa1, 0x26, 0xdc, 0x0b, 0x94, 0xcb, - 0x2a, 0x49, 0xa4, 0x19, 0x37, 0x94, 0x3f, 0x32, 0x21, 0x6e, 0x1d, 0x5f, - 0xdf, 0xfa, 0x34, 0x6d, 0x59, 0x7f, 0xe9, 0xb9, 0x1b, 0xdf, 0xd1, 0xf4, - 0xcb, 0x2a, 0x0f, 0xc5, 0xcb, 0xaf, 0x8f, 0x70, 0x46, 0xac, 0xbf, 0x66, - 0xd9, 0xc6, 0xac, 0xbf, 0x9f, 0x67, 0xe3, 0xfe, 0xb2, 0xff, 0xe9, 0xa7, - 0x08, 0x51, 0xbd, 0xf7, 0xc4, 0xcb, 0x29, 0x65, 0xf7, 0x73, 0x53, 0x2c, - 0xbd, 0xd7, 0xde, 0xb2, 0xd2, 0xc3, 0xc1, 0x72, 0x3b, 0xf3, 0xf2, 0x37, - 0xe2, 0xca, 0x98, 0xf3, 0xb7, 0x93, 0x54, 0x26, 0x17, 0x89, 0x8f, 0x09, - 0xab, 0xb5, 0x0b, 0x2a, 0x4b, 0x9b, 0x83, 0x4c, 0x32, 0x39, 0xa3, 0xb5, - 0xd4, 0x32, 0x3c, 0x40, 0x44, 0xdd, 0x28, 0xdf, 0x19, 0xce, 0xe1, 0x9d, - 0xd8, 0x4b, 0x2f, 0xe9, 0xdc, 0xf6, 0x1f, 0x56, 0x50, 0xcf, 0x10, 0xc5, - 0x6e, 0x1f, 0xcb, 0x2f, 0xe2, 0x0f, 0x66, 0x86, 0x16, 0x5e, 0x65, 0x9e, - 0x96, 0x53, 0x9e, 0x78, 0x4b, 0xef, 0xfe, 0xc3, 0xfb, 0x9d, 0x8d, 0x9a, - 0xf2, 0x59, 0x46, 0x7c, 0xda, 0x21, 0xbf, 0xc1, 0xef, 0x8a, 0x33, 0x4b, - 0x2f, 0xc5, 0x9b, 0x09, 0xbd, 0x65, 0xf6, 0x6c, 0x26, 0xf5, 0x97, 0xe1, - 0xc7, 0xc3, 0x79, 0xc7, 0xa2, 0x45, 0x77, 0xff, 0xc7, 0xa9, 0xde, 0x83, - 0xef, 0x02, 0x00, 0xc2, 0xcb, 0xe3, 0xdb, 0xfd, 0xd5, 0x96, 0xf9, 0x65, - 0xe7, 0x70, 0x2a, 0x29, 0x75, 0x2c, 0xac, 0x3c, 0x50, 0x09, 0x4c, 0x51, - 0x7c, 0x5d, 0x8d, 0x2c, 0xbf, 0xec, 0xd6, 0xee, 0x0f, 0x35, 0xf2, 0xca, - 0x33, 0xdd, 0xde, 0x43, 0x7f, 0xe8, 0x97, 0x9c, 0xfe, 0xe4, 0x30, 0xb2, - 0xb6, 0x54, 0xdd, 0x28, 0x41, 0xb0, 0x81, 0x32, 0x8e, 0x9b, 0x3d, 0x08, - 0xc2, 0x23, 0xbd, 0x1a, 0xea, 0xcb, 0xf8, 0x7f, 0x46, 0x8f, 0xe5, 0x97, - 0xdd, 0xdb, 0x05, 0x59, 0x52, 0x3e, 0xf3, 0x1c, 0x22, 0xfb, 0xf1, 0xb1, - 0xac, 0xe2, 0xcb, 0xff, 0x41, 0x47, 0xa7, 0x04, 0x82, 0x05, 0x97, 0x82, - 0xfc, 0x59, 0x7d, 0x30, 0x5e, 0x65, 0x97, 0xe8, 0xfd, 0xfe, 0xe2, 0xcb, - 0xc4, 0x7f, 0xac, 0xbd, 0x9d, 0xe2, 0xca, 0x83, 0x71, 0xc1, 0xca, 0x92, - 0x65, 0x03, 0x28, 0x98, 0xff, 0xc3, 0x9f, 0x92, 0x75, 0x86, 0xfd, 0xba, - 0xe4, 0x3d, 0xc5, 0x94, 0xb2, 0xfd, 0xce, 0xea, 0x38, 0xb2, 0xd1, 0xf1, - 0xb3, 0xe8, 0x5d, 0xff, 0x7f, 0xcd, 0x47, 0xd2, 0x36, 0xac, 0xbd, 0xd7, - 0xde, 0xb2, 0xfd, 0xb0, 0x66, 0x8d, 0xd5, 0x97, 0xc1, 0x9a, 0x37, 0x56, - 0x5c, 0xfb, 0x4e, 0x3d, 0x3d, 0x8b, 0x6a, 0x11, 0xba, 0xe7, 0x61, 0x71, - 0xbf, 0xe8, 0x3f, 0xf9, 0x0d, 0x7e, 0xac, 0xbf, 0xe3, 0xe4, 0xc6, 0x5d, - 0x8f, 0xd6, 0x5f, 0xfc, 0x5d, 0xdf, 0x1a, 0xe3, 0x94, 0x6e, 0xac, 0xa9, - 0x23, 0x9b, 0x45, 0xcd, 0x38, 0xe1, 0xcd, 0xfe, 0x8d, 0xde, 0x43, 0x5f, - 0xab, 0x2e, 0x72, 0x59, 0x7f, 0xd1, 0xfc, 0xef, 0x43, 0x5c, 0x96, 0x57, - 0xc7, 0x9f, 0xbc, 0x56, 0xff, 0xfb, 0x06, 0x24, 0xdc, 0xef, 0xb0, 0x61, - 0xef, 0x16, 0x54, 0x91, 0xf9, 0xa8, 0x42, 0x78, 0x96, 0xfe, 0x81, 0x4f, - 0xc1, 0xdd, 0x59, 0x7f, 0x7d, 0x2e, 0x39, 0x7c, 0xb2, 0xa1, 0x70, 0x62, - 0x4c, 0x19, 0x1f, 0x51, 0xc6, 0x73, 0xa3, 0x51, 0x0c, 0x6f, 0xfc, 0x53, - 0x4e, 0xd4, 0x7d, 0x23, 0x6a, 0xcb, 0xff, 0xdb, 0xe0, 0xbb, 0xdf, 0x60, - 0xc3, 0xde, 0x2c, 0xba, 0x1a, 0xb2, 0xa1, 0x14, 0x98, 0x85, 0xa4, 0xcb, - 0xfa, 0x0a, 0x6e, 0x9b, 0x0b, 0x2f, 0xfa, 0x59, 0xa9, 0xb0, 0xa1, 0xab, - 0x2f, 0xdf, 0xc0, 0x31, 0xab, 0x2f, 0xf6, 0x6d, 0xc8, 0x98, 0x3a, 0x59, - 0x46, 0x89, 0x5d, 0x1c, 0x11, 0x45, 0xd2, 0xc5, 0x97, 0xee, 0x31, 0xa7, - 0x15, 0x65, 0xe2, 0x86, 0xac, 0xa1, 0x9e, 0x2e, 0x8a, 0xaf, 0xbe, 0xdd, - 0xc9, 0x2c, 0xbf, 0xcf, 0xa9, 0xb3, 0xbb, 0x9b, 0xd6, 0x5e, 0x8f, 0xf8, - 0xb2, 0xa1, 0x32, 0x71, 0x97, 0x62, 0xdb, 0x91, 0x04, 0x98, 0x53, 0x9b, - 0xe7, 0xf3, 0xec, 0xb2, 0xfd, 0xe0, 0xb1, 0x84, 0xb2, 0xff, 0x0a, 0x4f, - 0xd9, 0x38, 0xd6, 0x5f, 0xba, 0x26, 0xd1, 0xe5, 0x97, 0xfd, 0x1e, 0xe3, - 0xf6, 0x35, 0xb8, 0xb2, 0xff, 0xcd, 0x71, 0x89, 0x34, 0xa0, 0xbe, 0x59, - 0x43, 0x3f, 0xc3, 0x3b, 0xbf, 0x83, 0xe8, 0xd6, 0x7e, 0xb2, 0xfb, 0x5f, - 0x89, 0xbd, 0x65, 0xe3, 0x17, 0xab, 0x2a, 0x47, 0xe5, 0xe2, 0xee, 0x13, - 0xd6, 0xc9, 0xf2, 0x8c, 0x8b, 0xe2, 0x89, 0x8c, 0xfd, 0x0a, 0x6e, 0xc2, - 0x4e, 0xff, 0x17, 0x73, 0x86, 0xfe, 0x59, 0x7d, 0xc9, 0x71, 0xd6, 0x5f, - 0xf7, 0xe7, 0xec, 0xd3, 0xcd, 0xc5, 0x97, 0xff, 0xd2, 0x28, 0xd8, 0x49, - 0xb9, 0xec, 0xdc, 0xd7, 0xeb, 0x2f, 0x48, 0x7b, 0xd6, 0x54, 0x1f, 0xb3, - 0xab, 0xdf, 0xd3, 0x9b, 0x9d, 0x7e, 0xac, 0xbf, 0xbc, 0x63, 0x3d, 0x01, - 0x65, 0x80, 0xb2, 0xdc, 0xc3, 0xed, 0x01, 0x7b, 0x96, 0xde, 0xfa, 0x6e, - 0x2c, 0xaf, 0x8f, 0x49, 0xcc, 0xef, 0x41, 0x8d, 0x65, 0x42, 0xa1, 0xf1, - 0x98, 0xfc, 0x44, 0xd8, 0x58, 0x3c, 0x37, 0xf8, 0x45, 0x7f, 0xb0, 0x59, - 0x1f, 0x02, 0xd5, 0x97, 0x6f, 0xe2, 0xcb, 0xf8, 0x3c, 0x89, 0x83, 0xa5, - 0x97, 0xec, 0xdb, 0x3d, 0xc5, 0x95, 0x07, 0xe1, 0xe1, 0x92, 0x2f, 0xbd, - 0x9a, 0xe2, 0xca, 0x01, 0xe4, 0xef, 0x2d, 0xbf, 0xef, 0xe3, 0xf1, 0x37, - 0xc1, 0x6e, 0x2c, 0xbf, 0xff, 0x6d, 0x1d, 0x8f, 0x1f, 0x64, 0x7a, 0x07, - 0xa1, 0x65, 0x42, 0x74, 0xd9, 0x0e, 0xd3, 0x24, 0x74, 0x0b, 0xff, 0xfe, - 0xd7, 0xc0, 0x3f, 0xa7, 0x30, 0xf3, 0xb9, 0xe7, 0x04, 0x10, 0xd6, 0x5f, - 0xf3, 0xf0, 0x4e, 0xfc, 0x03, 0x6a, 0xcb, 0x7a, 0x11, 0x50, 0x16, 0xdb, - 0xe3, 0x62, 0x7f, 0x16, 0x5f, 0xc2, 0x76, 0x36, 0x2f, 0x96, 0x5e, 0x23, - 0x6a, 0xca, 0xd1, 0xf8, 0x7e, 0x4b, 0xd3, 0x0b, 0xfc, 0x50, 0xe5, 0xdc, - 0x25, 0x97, 0xfa, 0x3e, 0xe6, 0xec, 0x69, 0x85, 0x97, 0xfb, 0xcf, 0x31, - 0xea, 0x36, 0x59, 0x7f, 0x66, 0xe3, 0x63, 0x3a, 0xb2, 0xec, 0x6a, 0xca, - 0x1a, 0x75, 0x19, 0x09, 0x86, 0x98, 0x78, 0xbd, 0xce, 0x02, 0x69, 0xbc, - 0xbe, 0xfd, 0xb8, 0x6d, 0x8e, 0x2c, 0xbf, 0x3e, 0xfc, 0xd7, 0x16, 0x50, - 0xcf, 0x4d, 0xa5, 0x57, 0xef, 0x39, 0x1b, 0x56, 0x5f, 0x31, 0x37, 0x21, - 0x65, 0xfd, 0xff, 0xdf, 0xe6, 0xb1, 0x65, 0xfc, 0x08, 0x3e, 0x9c, 0x96, - 0x5f, 0xcf, 0xfb, 0x63, 0x3a, 0xb2, 0xa1, 0x11, 0x38, 0x60, 0x65, 0x97, - 0xc3, 0xf3, 0xfc, 0xb2, 0xfe, 0xff, 0x91, 0xe8, 0xe2, 0xca, 0x83, 0xd1, - 0x72, 0x3b, 0xf7, 0xdd, 0xe6, 0x6c, 0xb2, 0xec, 0xd9, 0x65, 0x39, 0xe0, - 0x91, 0x55, 0x42, 0x7e, 0x98, 0x44, 0x64, 0xde, 0x85, 0x69, 0x3f, 0x71, - 0x86, 0xef, 0xc0, 0xb2, 0xdc, 0x59, 0x71, 0xb1, 0xc3, 0x52, 0x11, 0x8b, - 0xdf, 0xb8, 0x16, 0x5f, 0x0b, 0x37, 0x21, 0x65, 0xf3, 0xed, 0x1d, 0x59, - 0x7e, 0x72, 0x3d, 0xdd, 0xeb, 0x2d, 0xc2, 0x3c, 0xdd, 0xe4, 0x57, 0xed, - 0x9f, 0x99, 0x25, 0x97, 0xff, 0xc3, 0xcd, 0xef, 0xa9, 0x84, 0x93, 0xf5, - 0xda, 0xb2, 0xec, 0xdd, 0x59, 0x50, 0x89, 0x43, 0x28, 0xd2, 0x9d, 0xfc, - 0xff, 0x7e, 0xd3, 0xe2, 0xcb, 0x30, 0xb2, 0xa1, 0x3b, 0xaf, 0x87, 0x66, - 0x71, 0xd4, 0x2f, 0x7c, 0x5d, 0xf9, 0x7d, 0xfc, 0x62, 0xbc, 0xd0, 0xd5, - 0x97, 0xb7, 0x23, 0x8b, 0x2b, 0xa7, 0x9a, 0x12, 0xeb, 0x33, 0x64, 0xba, - 0x2c, 0x89, 0xe5, 0x22, 0x78, 0x91, 0xc4, 0xe7, 0x9e, 0xd0, 0xe7, 0x91, - 0x08, 0xe1, 0x9b, 0x92, 0xa3, 0xfe, 0x87, 0x09, 0xc6, 0xab, 0x34, 0xe3, - 0x96, 0xa3, 0x08, 0x69, 0x77, 0xa3, 0xea, 0x79, 0x47, 0x7f, 0xca, 0x84, - 0x29, 0x41, 0x1c, 0x95, 0x1f, 0xd9, 0x56, 0x33, 0xf0, 0x82, 0x12, 0x3e, - 0x7d, 0xc8, 0x56, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x29, 0xc5, 0xfd, 0xe3, - 0x69, 0x3b, 0x0b, 0x2c, 0xcf, 0x0f, 0x84, 0xcd, 0x2f, 0xe8, 0x6e, 0x6e, - 0x47, 0x56, 0x5f, 0x7a, 0x09, 0x85, 0x94, 0xd3, 0xd1, 0xe9, 0x7d, 0xf6, - 0x70, 0x49, 0x2c, 0xbf, 0xf1, 0xe9, 0xf9, 0xec, 0xc2, 0x02, 0xcb, 0xf3, - 0x75, 0xac, 0xe2, 0xcb, 0xff, 0xf7, 0x83, 0xdd, 0x47, 0x79, 0x80, 0xe4, - 0x68, 0x0b, 0x2f, 0xfb, 0x86, 0xc6, 0x4a, 0x3f, 0xe2, 0xcb, 0xfd, 0x1d, - 0x30, 0x18, 0xe1, 0x65, 0xff, 0xfb, 0x26, 0x23, 0xe7, 0x60, 0x43, 0xd4, - 0xd1, 0xe5, 0x95, 0xa4, 0x43, 0xf4, 0xc6, 0xfe, 0xfa, 0x50, 0xd0, 0xcc, - 0xb2, 0xfe, 0x68, 0xe3, 0x81, 0x25, 0x97, 0xbb, 0xe3, 0x59, 0x50, 0x7f, - 0x26, 0x60, 0xe5, 0xb7, 0xf3, 0xfd, 0xc9, 0xdc, 0x11, 0x65, 0xfb, 0xbf, - 0x4a, 0x05, 0x59, 0x7f, 0x38, 0x99, 0xbe, 0x38, 0xb2, 0xb0, 0xf6, 0x42, - 0x55, 0x7f, 0xe3, 0xfb, 0x85, 0x83, 0xf3, 0x8a, 0xb2, 0xff, 0xfb, 0x36, - 0xcf, 0xbb, 0xc3, 0x28, 0xfd, 0xda, 0xb2, 0x98, 0x44, 0x7f, 0x0f, 0xef, - 0xfd, 0x9e, 0x8d, 0x63, 0x31, 0x45, 0x15, 0x25, 0xc6, 0x2a, 0xcb, 0xb6, - 0x67, 0x0b, 0x88, 0x32, 0x22, 0x19, 0x1e, 0x1e, 0x00, 0xa3, 0xe5, 0x63, - 0x86, 0x0f, 0xa1, 0x39, 0xf9, 0x61, 0x42, 0x2f, 0xb0, 0xb0, 0x9f, 0x24, - 0xdc, 0x43, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x57, 0x8b, 0xff, 0xfb, 0x07, - 0xe8, 0x11, 0x9f, 0x49, 0xff, 0xe7, 0x23, 0xf4, 0x96, 0x67, 0x88, 0x93, - 0x9f, 0x34, 0xbf, 0xf9, 0x9b, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x48, - 0xeb, 0xb1, 0xab, 0x2e, 0xee, 0x2c, 0xa0, 0x1a, 0xcf, 0x85, 0xaf, 0xff, - 0xfc, 0x4e, 0xcf, 0x7f, 0x60, 0x70, 0x16, 0x5e, 0xa3, 0xa7, 0xfc, 0x49, - 0x65, 0xe3, 0xfe, 0x16, 0x5e, 0x06, 0x35, 0x23, 0x32, 0xf2, 0xfb, 0x1f, - 0xef, 0xd6, 0x5f, 0x01, 0xdc, 0x0a, 0x89, 0x21, 0x7f, 0x3e, 0xb3, 0x7f, - 0xb1, 0x65, 0x6c, 0x7f, 0xfa, 0x23, 0xfc, 0xba, 0xff, 0xfc, 0x7a, 0x3d, - 0xc8, 0x2d, 0xa3, 0xa7, 0xe7, 0xd9, 0x65, 0xf9, 0xe5, 0xd3, 0xd9, 0x65, - 0x41, 0xff, 0x9a, 0xbd, 0xff, 0xe7, 0xec, 0xdc, 0xc1, 0x8c, 0x2f, 0xa9, - 0x2c, 0xbf, 0xfe, 0x7f, 0xb9, 0x9e, 0x72, 0xcd, 0x9a, 0x1f, 0x2c, 0xbf, - 0xfb, 0xc7, 0xf7, 0x73, 0xee, 0xeb, 0x50, 0xb2, 0xff, 0xe3, 0x86, 0xb8, - 0xc4, 0xdc, 0x82, 0x92, 0xca, 0xc4, 0x6e, 0x01, 0x43, 0xc8, 0xd7, 0xff, - 0x8b, 0x3f, 0x9f, 0xcd, 0x46, 0xcf, 0xa0, 0x2c, 0xbf, 0xd9, 0xe7, 0x69, - 0x47, 0xcb, 0x2e, 0x93, 0x38, 0x56, 0xa3, 0x90, 0xac, 0xf4, 0x2c, 0x3f, - 0x20, 0xe4, 0x64, 0xfd, 0x2f, 0x11, 0x36, 0xfc, 0x1f, 0x80, 0x7c, 0x59, - 0x7e, 0xcf, 0x33, 0xc6, 0xac, 0xb3, 0x38, 0x5c, 0xd8, 0x01, 0x13, 0xcb, - 0xe0, 0xfe, 0x10, 0x9d, 0x29, 0xbf, 0xf9, 0x9b, 0xc9, 0x9e, 0x68, 0x0e, - 0xe0, 0x54, 0x49, 0x4b, 0xf6, 0x80, 0xee, 0x05, 0x45, 0xe2, 0xbf, 0xe9, - 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0x35, 0x66, 0x78, 0x7f, 0x6e, 0x69, - 0x7c, 0x0f, 0x19, 0x2c, 0xbf, 0x73, 0x98, 0x58, 0xb2, 0xff, 0xb4, 0x08, - 0xdb, 0x30, 0xba, 0xb2, 0xfe, 0x8e, 0x1b, 0x62, 0x65, 0x97, 0xce, 0x7f, - 0x71, 0x65, 0xbc, 0xb2, 0xb1, 0x17, 0xc6, 0x4c, 0xd3, 0x8f, 0x16, 0x8a, - 0x45, 0x7f, 0x8f, 0xfc, 0x28, 0xfb, 0x8b, 0x2f, 0x6f, 0x89, 0x2c, 0xbf, - 0x47, 0x79, 0x9d, 0x59, 0x79, 0xc8, 0x78, 0x78, 0xbe, 0x1e, 0xbf, 0xe7, - 0xd4, 0xb9, 0x81, 0xd6, 0xcb, 0x28, 0xcf, 0xac, 0x26, 0x37, 0xfd, 0x9f, - 0x8f, 0xd0, 0x50, 0x2a, 0xcb, 0xef, 0xf9, 0x84, 0xb2, 0xa0, 0xf6, 0xcc, - 0xe6, 0xff, 0xc1, 0x07, 0x38, 0xfa, 0xec, 0x30, 0xb2, 0xfd, 0xee, 0xf3, - 0x3a, 0xb2, 0x8c, 0xfa, 0x1d, 0x02, 0xff, 0xfd, 0xe7, 0x3f, 0xf9, 0x8c, - 0x3b, 0x75, 0x18, 0x4b, 0x2e, 0x31, 0xac, 0xa8, 0x3e, 0xaf, 0x2a, 0x5f, - 0x48, 0x31, 0xf2, 0xcb, 0xfe, 0xd8, 0xf9, 0xc7, 0xff, 0xc1, 0x59, 0x7f, - 0x1e, 0x86, 0x51, 0xf2, 0xcb, 0xff, 0xe0, 0xbf, 0xd9, 0x8c, 0x30, 0xf2, - 0xcf, 0xba, 0xb2, 0xfe, 0xf6, 0x67, 0x7d, 0x8b, 0x2f, 0xfa, 0x25, 0xcd, - 0x69, 0xcb, 0xab, 0x2a, 0x4a, 0x9d, 0x07, 0x08, 0x80, 0x42, 0x2a, 0x62, - 0x1d, 0x11, 0xf8, 0xef, 0x85, 0xbd, 0x52, 0xde, 0x59, 0x7f, 0x67, 0x7b, - 0x05, 0xb2, 0xcb, 0xf6, 0x0d, 0x95, 0x96, 0xea, 0xcb, 0xf9, 0xcb, 0xf6, - 0x56, 0x5b, 0xab, 0x2e, 0x71, 0xef, 0x3e, 0x69, 0xf3, 0x0a, 0xf2, 0x31, - 0x43, 0x09, 0x3b, 0xce, 0x40, 0x59, 0x7b, 0xd0, 0x22, 0xca, 0xe9, 0xb8, - 0x14, 0x6e, 0xfe, 0x27, 0xfc, 0x9d, 0xab, 0x2f, 0xe8, 0x1f, 0xb7, 0x4c, - 0x96, 0x5f, 0xf4, 0x37, 0xd8, 0x31, 0x9f, 0xcb, 0x2b, 0x0f, 0xa0, 0xcb, - 0xef, 0xb7, 0x0e, 0x18, 0x59, 0x7a, 0x5f, 0x30, 0xb2, 0xfe, 0x6f, 0x7c, - 0x1e, 0xf1, 0x65, 0xe0, 0x8f, 0xe5, 0x97, 0xff, 0x3f, 0xe0, 0xf1, 0xe8, - 0x8f, 0xbc, 0x59, 0x7f, 0xb7, 0xe4, 0xbd, 0x04, 0xc2, 0xcb, 0x8b, 0x65, - 0x95, 0x09, 0x90, 0x8c, 0x97, 0x07, 0xcc, 0xbd, 0xc7, 0xbf, 0x44, 0x10, - 0xd6, 0xdd, 0x59, 0x76, 0xb1, 0x65, 0xef, 0xc4, 0xd9, 0x65, 0x68, 0xf1, - 0xff, 0x11, 0x21, 0x6b, 0xb1, 0xab, 0x2f, 0x6b, 0x7f, 0x96, 0x5f, 0xb3, - 0x4f, 0x03, 0x59, 0x50, 0x7b, 0x6e, 0x2c, 0x43, 0xf7, 0xfe, 0xd0, 0x5b, - 0xe3, 0x86, 0xb9, 0x2c, 0xbf, 0xee, 0x43, 0x4b, 0x25, 0x04, 0xb2, 0xb4, - 0x7e, 0x7d, 0x3d, 0xb8, 0xa4, 0xb2, 0xe9, 0xec, 0x55, 0x94, 0x13, 0x67, - 0x3e, 0x2d, 0x58, 0x7f, 0x3b, 0x8a, 0xb7, 0xff, 0x00, 0x2e, 0x3d, 0xf8, - 0x36, 0x56, 0x5b, 0xab, 0x2f, 0x8f, 0xd1, 0xbd, 0x65, 0x68, 0xfc, 0xba, - 0x9f, 0x7f, 0xa3, 0x51, 0xf7, 0xfa, 0x85, 0x97, 0x16, 0xcb, 0x2f, 0x78, - 0x3b, 0xab, 0x2f, 0xe2, 0x8e, 0xf9, 0xe4, 0xb2, 0xa0, 0xf3, 0x26, 0x20, - 0xbd, 0xd8, 0xd2, 0xca, 0x84, 0x7b, 0xec, 0x45, 0x31, 0xa3, 0xb1, 0x84, - 0x8a, 0xe7, 0x02, 0xcb, 0xf8, 0x03, 0x0e, 0xc2, 0x35, 0x65, 0xfd, 0xf7, - 0x31, 0xaf, 0xc5, 0x97, 0xc3, 0xcf, 0x42, 0xcb, 0xfb, 0x36, 0xd4, 0x7d, - 0xa5, 0x97, 0xf8, 0x23, 0xc9, 0x47, 0xfc, 0x59, 0x50, 0x8f, 0x9c, 0x16, - 0x33, 0x17, 0x2e, 0x22, 0x1e, 0x17, 0xdf, 0xc5, 0xd6, 0xcc, 0x43, 0x59, - 0x7e, 0x9b, 0x9c, 0x36, 0xac, 0xbd, 0xc0, 0xfc, 0xb2, 0xff, 0xfb, 0x61, - 0x5e, 0x5c, 0xe6, 0x68, 0x58, 0xd3, 0x0b, 0x2c, 0x4b, 0x2f, 0xe7, 0xef, - 0x36, 0xc1, 0x56, 0x5f, 0xff, 0xc7, 0xc7, 0x97, 0x0f, 0x7f, 0x02, 0xe7, - 0x23, 0xde, 0xb2, 0xe1, 0x04, 0x59, 0x58, 0x9a, 0x84, 0xc5, 0x2e, 0x3d, - 0xfa, 0xa1, 0x08, 0x74, 0xbc, 0x45, 0xdb, 0xf6, 0x6b, 0xff, 0xe1, 0x65, - 0xd3, 0xec, 0xd9, 0x0d, 0x80, 0xf4, 0x43, 0x7e, 0x49, 0x23, 0x87, 0x1e, - 0x4a, 0xf0, 0x04, 0x6a, 0x5f, 0x30, 0x4c, 0x45, 0xa8, 0x4a, 0x7a, 0x34, - 0x17, 0x85, 0x57, 0xf0, 0x8a, 0x28, 0xc6, 0x39, 0x1c, 0x6f, 0x63, 0x43, - 0x9f, 0x52, 0x12, 0x37, 0xed, 0xc6, 0x5b, 0xfc, 0x1d, 0x99, 0xee, 0x6e, - 0x1b, 0x0b, 0x2a, 0x1f, 0x11, 0x4b, 0x68, 0x49, 0xca, 0xd1, 0x78, 0x8e, - 0x50, 0xb1, 0xce, 0x5d, 0x4d, 0x1b, 0x7b, 0x4b, 0x7d, 0x3a, 0xb1, 0xd6, - 0x00, 0xc3, 0x3c, 0x4a, 0xc1, 0x1b, 0x72, 0x35, 0x7a, 0x65, 0x4a, 0x4a, - 0x42, 0x3c, 0x5a, 0x9b, 0xcd, 0xa7, 0x35, 0xe5, 0x4b, 0x3e, 0x1d, 0x23, - 0x67, 0x33, 0x4e, 0xbe, 0x62, 0x95, 0x04, 0x0c, 0x54, 0x1b, 0xfd, 0x6a, - 0xab, 0x8e, 0xb5, 0x1a, 0xdd, 0x94, 0xab, 0x35, 0xf7, 0xa4, 0x6a, 0xfa, - 0xa9, 0x5b, 0xac, 0x84, 0x9b, 0xd5, 0xd9, 0xab, 0xdf, 0xc7, 0xdf, 0xf5, - 0x86, 0x7b, 0x2e, 0x5f, 0x79, 0x5b, 0x33, 0xde, 0x5b, 0x6b, 0x1e, 0xe3, - 0x24, 0x80, 0x37, 0xdc, 0x2b, 0xbe, 0xb1, 0xf5, 0x16, 0x9b, 0x23, 0x3f, - 0x3d, 0x92, 0x25, 0x3f, 0x5f, 0x72, 0xf1, 0x73, 0x68, + 0xfb, 0x5d, 0xbb, 0xf6, 0xa8, 0x89, 0x57, 0xbc, 0xda, 0x59, 0x7f, 0xcf, + 0x2c, 0xd6, 0x7f, 0xa9, 0xd6, 0x5f, 0xf3, 0x0f, 0x0a, 0x4d, 0xe0, 0xac, + 0xb0, 0xbc, 0x46, 0x1c, 0xc6, 0xc7, 0x1c, 0xf9, 0xd5, 0xdb, 0x59, 0xab, + 0x2e, 0x00, 0x56, 0x5e, 0x91, 0x6e, 0x2c, 0xbb, 0xaf, 0xac, 0xbf, 0xfe, + 0x8f, 0x44, 0x89, 0xcd, 0xea, 0x51, 0x9f, 0x59, 0x7f, 0xd8, 0x7e, 0xbe, + 0xde, 0xcd, 0xd5, 0x96, 0xe2, 0xca, 0x19, 0xe6, 0xb9, 0xe5, 0xf0, 0x77, + 0x47, 0x0b, 0x2a, 0x48, 0xfa, 0x18, 0xc3, 0x42, 0x73, 0xc4, 0x37, 0xfb, + 0x0c, 0x28, 0xff, 0x99, 0x65, 0xc0, 0x3a, 0xcb, 0x9d, 0x96, 0x54, 0x1a, + 0xcf, 0x0b, 0xdf, 0xfe, 0x08, 0xaf, 0x9d, 0xf9, 0xbd, 0x19, 0xa9, 0x2c, + 0xbf, 0xec, 0xf0, 0x93, 0x71, 0xba, 0x31, 0x65, 0x42, 0x23, 0x09, 0x3e, + 0xc4, 0xb2, 0xff, 0x48, 0xb3, 0x79, 0x67, 0x16, 0x56, 0x1e, 0x1b, 0x88, + 0x5f, 0xfc, 0x13, 0xf8, 0xb3, 0xaf, 0x93, 0xf9, 0x65, 0xff, 0xfa, 0x44, + 0xff, 0x73, 0xf2, 0x07, 0x1e, 0x89, 0x2c, 0xae, 0x22, 0x5c, 0x44, 0x4b, + 0xb3, 0x8b, 0x2f, 0x3b, 0xf6, 0xa8, 0x8b, 0x55, 0x23, 0xe3, 0xc2, 0x4e, + 0xc5, 0xaf, 0xff, 0xef, 0x3e, 0x13, 0xff, 0x9c, 0xef, 0xcd, 0xbe, 0x38, + 0xb2, 0xfb, 0xe4, 0xe6, 0xac, 0xbf, 0x46, 0xb3, 0xaf, 0xac, 0xb3, 0x69, + 0x14, 0xde, 0x5c, 0x01, 0x15, 0xf9, 0x8d, 0xfe, 0xa1, 0x65, 0xda, 0xe2, + 0xcb, 0xfe, 0x6f, 0xb9, 0xde, 0x4f, 0xa5, 0x97, 0xb8, 0x27, 0xd6, 0x50, + 0xd5, 0x5c, 0x6a, 0x31, 0xaf, 0x43, 0x54, 0x8d, 0x78, 0x51, 0xbc, 0x5c, + 0x43, 0x7b, 0xbf, 0xf5, 0x97, 0xff, 0xc1, 0xff, 0x07, 0xe8, 0xe4, 0x78, + 0x31, 0xc5, 0x97, 0xff, 0xcf, 0xec, 0x2d, 0x6b, 0x3a, 0x97, 0xd8, 0xeb, + 0x2a, 0x48, 0xb6, 0x34, 0x5c, 0x2a, 0x17, 0x77, 0x0b, 0x2f, 0x8e, 0xc6, + 0x71, 0x65, 0xff, 0xe3, 0x5b, 0x5f, 0xeb, 0xb6, 0xc3, 0x25, 0x3a, 0xca, + 0x39, 0xf9, 0x7c, 0x8e, 0xff, 0x9c, 0x42, 0xc9, 0xb5, 0x06, 0x2c, 0xa6, + 0x3d, 0xc0, 0x91, 0x5c, 0x46, 0x2c, 0xac, 0x4c, 0x77, 0xd0, 0xe5, 0x30, + 0x86, 0xfe, 0x3b, 0x75, 0xc8, 0xe9, 0x65, 0xff, 0xd1, 0x85, 0xf0, 0xb8, + 0xf9, 0x06, 0xac, 0xbf, 0xa0, 0x7d, 0x72, 0x26, 0x59, 0x50, 0x8a, 0x19, + 0x17, 0xf1, 0x0e, 0xe7, 0xde, 0xb2, 0xfa, 0x3b, 0x38, 0x56, 0x53, 0x1b, + 0xb2, 0x18, 0xbd, 0xa6, 0xe9, 0x65, 0x0c, 0xde, 0x7c, 0x7e, 0xfd, 0xd0, + 0xf4, 0xf2, 0x59, 0x7f, 0x82, 0x02, 0xc9, 0xc4, 0x92, 0xcb, 0xfd, 0x1f, + 0xe1, 0xc3, 0x13, 0xac, 0xa8, 0x44, 0x97, 0x8a, 0x48, 0xd6, 0xff, 0xc5, + 0xff, 0x64, 0x8c, 0x8e, 0xb8, 0xb2, 0xff, 0xd1, 0xd7, 0x3e, 0xd3, 0xce, + 0xdf, 0x59, 0x70, 0xe1, 0x65, 0x42, 0x25, 0xf4, 0x80, 0x48, 0x37, 0x98, + 0x0e, 0xb2, 0xc3, 0x59, 0x7f, 0xb9, 0x1a, 0x9a, 0x66, 0xf2, 0xca, 0x19, + 0xe3, 0x70, 0x46, 0xfe, 0xd4, 0x1f, 0x08, 0xeb, 0x2f, 0xf1, 0x37, 0x18, + 0xba, 0x92, 0xca, 0xd1, 0xef, 0x18, 0x59, 0x73, 0x4e, 0xb2, 0xf1, 0xc0, + 0xcb, 0x2f, 0xed, 0x3f, 0x1f, 0x3c, 0xb2, 0xdf, 0x73, 0xc8, 0x08, 0xe5, + 0xd1, 0xb8, 0xb2, 0x86, 0x89, 0xf6, 0x5f, 0x39, 0x3d, 0x62, 0x6e, 0x2d, + 0x08, 0x07, 0x86, 0x15, 0xff, 0x1f, 0x35, 0xa6, 0xde, 0xfd, 0xac, 0xbf, + 0xfb, 0xbd, 0x41, 0xb0, 0x5f, 0xda, 0x7b, 0x4f, 0x6a, 0x59, 0x78, 0x52, + 0x43, 0x59, 0x7f, 0x6b, 0x3c, 0xdd, 0x12, 0xcb, 0xe3, 0x41, 0x1f, 0x59, + 0x6f, 0x41, 0xe8, 0x31, 0x6d, 0xfd, 0xe2, 0x0b, 0x9b, 0xda, 0xcb, 0xfa, + 0x35, 0x83, 0x79, 0x2c, 0xa1, 0xa2, 0x05, 0x89, 0x84, 0x2f, 0xb8, 0xb8, + 0xb2, 0xa1, 0x38, 0xe1, 0xab, 0xe4, 0x3c, 0x48, 0xc2, 0xff, 0xbb, 0x13, + 0xed, 0x23, 0x33, 0xcb, 0x2f, 0xff, 0x7f, 0x99, 0x31, 0x41, 0xf5, 0xa8, + 0xe9, 0x65, 0xff, 0x04, 0x56, 0x3c, 0xff, 0x33, 0xcb, 0x2d, 0xf8, 0x44, + 0x43, 0xa5, 0xdf, 0xf7, 0x78, 0x59, 0x3c, 0xe1, 0x25, 0x96, 0xdc, 0x59, + 0x7d, 0xae, 0x61, 0x8b, 0x2f, 0xc4, 0x51, 0xd0, 0x90, 0x6d, 0xf0, 0x52, + 0xfe, 0x6e, 0x6b, 0x51, 0x25, 0x97, 0xff, 0xcd, 0xf0, 0xe9, 0xf9, 0xf6, + 0xdb, 0xc0, 0x42, 0xca, 0xec, 0xff, 0x9c, 0xb6, 0xff, 0xfd, 0x80, 0xe3, + 0x74, 0x66, 0x77, 0x04, 0x17, 0x92, 0xcb, 0xfe, 0x2f, 0xf3, 0xf9, 0x86, + 0x71, 0x65, 0xcf, 0xe5, 0x95, 0x87, 0x9f, 0xd1, 0xcd, 0xff, 0xfa, 0x69, + 0x40, 0x35, 0x9d, 0xc4, 0x9b, 0x4d, 0xc5, 0x95, 0x07, 0xf1, 0x84, 0x57, + 0xec, 0xf6, 0xd6, 0x2a, 0x0a, 0xb5, 0x95, 0x0a, 0xeb, 0x72, 0x18, 0x9d, + 0x93, 0xb3, 0x8f, 0xa1, 0x74, 0x44, 0x5f, 0x8c, 0x74, 0xc2, 0x0b, 0xff, + 0x67, 0xdc, 0x80, 0xe7, 0x3b, 0x2c, 0xbf, 0xff, 0xf0, 0x7d, 0x83, 0xff, + 0xb0, 0xf9, 0xef, 0x3b, 0x7e, 0x3f, 0xc5, 0x97, 0xcd, 0xcc, 0x25, 0x95, + 0x24, 0x63, 0xb1, 0xe7, 0x1a, 0xef, 0x1b, 0x9b, 0xab, 0x2e, 0xdd, 0xdd, + 0x59, 0x76, 0x74, 0x92, 0xd0, 0x92, 0xc0, 0xd1, 0xa7, 0x00, 0xbd, 0xfe, + 0xfe, 0x68, 0x07, 0x6e, 0x24, 0x16, 0x69, 0xef, 0xe9, 0x79, 0xb7, 0xe4, + 0xcb, 0x2a, 0x0f, 0xd5, 0xd1, 0x6f, 0xef, 0x37, 0x70, 0x76, 0x59, 0x7f, + 0xa0, 0x13, 0xbc, 0xa3, 0x71, 0x65, 0x41, 0xf1, 0x91, 0x6d, 0xff, 0xf8, + 0xb0, 0x0e, 0x40, 0x10, 0xff, 0x0b, 0xcf, 0x0b, 0x28, 0x8f, 0xd7, 0xe4, + 0x16, 0x17, 0xb5, 0xb6, 0xd3, 0xdb, 0x50, 0xe8, 0xab, 0x17, 0x88, 0xc6, + 0x67, 0x41, 0x92, 0xf0, 0xe1, 0x59, 0x92, 0xc7, 0x0d, 0x8c, 0xa7, 0xb8, + 0xd3, 0xba, 0x86, 0xbb, 0x42, 0x9a, 0x68, 0x59, 0xea, 0x18, 0xa7, 0x2e, + 0xf4, 0x7a, 0x4e, 0x70, 0x51, 0xe4, 0xf2, 0x5f, 0x6f, 0xe3, 0x48, 0x09, + 0x79, 0x84, 0x1b, 0x70, 0xe0, 0x12, 0x1f, 0x17, 0xff, 0xff, 0x39, 0xc5, + 0xb6, 0xb4, 0x1d, 0x6a, 0x0b, 0x0d, 0x6f, 0x7b, 0x04, 0x59, 0x7d, 0xa0, + 0xff, 0x16, 0x5f, 0xfc, 0x69, 0x9b, 0x93, 0x8c, 0x51, 0xb3, 0x67, 0xb6, + 0xd6, 0x5f, 0xa2, 0x77, 0xd7, 0x6b, 0x2e, 0x6d, 0xeb, 0x2f, 0x47, 0xf8, + 0xb2, 0xf7, 0x02, 0x7d, 0x1e, 0xe8, 0x0a, 0x48, 0x62, 0xb6, 0x9a, 0x3d, + 0x5a, 0x16, 0xb7, 0xfb, 0x01, 0xcc, 0xed, 0xc6, 0xb2, 0xfc, 0x4e, 0x67, + 0x38, 0xb2, 0xb0, 0xf6, 0xf4, 0x67, 0x7d, 0xdb, 0xbf, 0x6a, 0x8a, 0x89, + 0x78, 0xd8, 0xe2, 0xcb, 0xfb, 0xd1, 0xf8, 0xe8, 0xc5, 0x97, 0xc5, 0x26, + 0x3a, 0xcb, 0xf4, 0xb0, 0x98, 0x6b, 0x2b, 0x11, 0x26, 0xc3, 0xae, 0x5f, + 0xf2, 0x1a, 0xd2, 0x3f, 0x4f, 0x0c, 0x3b, 0xef, 0x66, 0xb1, 0x65, 0xe6, + 0x9b, 0x75, 0x65, 0x41, 0xe0, 0xf8, 0x86, 0xfd, 0xdb, 0xfa, 0x3c, 0xb2, + 0xff, 0xfe, 0x09, 0x39, 0xbb, 0x3e, 0x6c, 0x14, 0xb3, 0xcc, 0x75, 0x97, + 0x04, 0x45, 0x97, 0xc3, 0x1c, 0x1d, 0x65, 0xff, 0xf4, 0xa7, 0xda, 0x71, + 0xb4, 0x4f, 0xde, 0xb6, 0x6c, 0xf6, 0xda, 0xca, 0x84, 0x50, 0xb0, 0xc0, + 0x08, 0xaf, 0xda, 0x6e, 0xdb, 0x7a, 0xcb, 0xe1, 0xc6, 0x12, 0xcb, 0xf3, + 0x9b, 0x9e, 0x75, 0x95, 0x87, 0x8e, 0x12, 0x0b, 0xff, 0xf8, 0x24, 0xe6, + 0xec, 0xf9, 0xb0, 0x52, 0xcf, 0x31, 0xd6, 0x5f, 0x6b, 0x59, 0xb6, 0xb2, + 0x8e, 0x88, 0x27, 0x5d, 0xbf, 0xff, 0x3c, 0x8a, 0x39, 0x9d, 0x76, 0x4f, + 0x9d, 0x76, 0xb2, 0xfd, 0x06, 0x67, 0x9d, 0x65, 0xe1, 0xb6, 0xf5, 0x96, + 0x17, 0x0b, 0xcd, 0x92, 0x8c, 0x5c, 0x70, 0x88, 0xc8, 0xc7, 0xbb, 0x69, + 0x62, 0x13, 0x94, 0x7a, 0x1f, 0xce, 0x5c, 0x4e, 0x3c, 0x85, 0x1e, 0xf2, + 0x21, 0x15, 0xb7, 0x49, 0xef, 0xfb, 0x0e, 0x2f, 0x6f, 0x09, 0xbe, 0xb2, + 0xff, 0xbc, 0xda, 0xf3, 0xf3, 0x04, 0x59, 0x70, 0xc9, 0x65, 0xfc, 0xcf, + 0x2f, 0xb4, 0xeb, 0x2f, 0x3f, 0xd9, 0x65, 0xd0, 0x2f, 0x11, 0x2f, 0xd1, + 0xcf, 0x85, 0xb8, 0x5b, 0x43, 0x4c, 0x77, 0x90, 0xd3, 0xbd, 0x86, 0x62, + 0xcb, 0xc1, 0x89, 0xd6, 0x5f, 0xcf, 0x2e, 0xb9, 0x13, 0xac, 0xbf, 0xe7, + 0xe8, 0xb3, 0x7e, 0x9b, 0x8b, 0x2f, 0xcd, 0x12, 0x79, 0x2c, 0xa1, 0xa2, + 0x3c, 0xe5, 0xfe, 0x3a, 0xbf, 0xb2, 0x71, 0xc6, 0x0d, 0x65, 0xf0, 0xfc, + 0xd3, 0x2c, 0xac, 0x3d, 0x07, 0x2d, 0xbf, 0x13, 0xee, 0xe4, 0xeb, 0x2f, + 0x18, 0xfe, 0x59, 0x74, 0x0d, 0x65, 0x41, 0xb3, 0xf0, 0xed, 0xff, 0x39, + 0x7f, 0x9a, 0xc8, 0x3a, 0xcb, 0xf3, 0x11, 0x07, 0x71, 0x65, 0xff, 0x73, + 0x07, 0x9a, 0x94, 0x69, 0x65, 0x41, 0xf0, 0xe8, 0xa6, 0xd3, 0xac, 0xa8, + 0x36, 0x78, 0x43, 0x7d, 0xdc, 0x68, 0xd5, 0x97, 0xe9, 0x3f, 0xe4, 0xeb, + 0x2f, 0xa0, 0x00, 0x85, 0x95, 0x07, 0x90, 0x44, 0xf7, 0xfc, 0x43, 0xcd, + 0x0d, 0xdc, 0x6b, 0x2c, 0x15, 0x95, 0x07, 0x90, 0xe6, 0xf6, 0x25, 0x97, + 0xe9, 0xf4, 0xef, 0xf5, 0x94, 0xc6, 0xe1, 0xc4, 0x2f, 0xbc, 0xde, 0x16, + 0x29, 0x5c, 0x1a, 0x18, 0xe6, 0x42, 0xb0, 0xd8, 0x40, 0x76, 0x41, 0x32, + 0xe9, 0xc8, 0x3d, 0x0c, 0xbe, 0x0f, 0xfd, 0xb0, 0xc6, 0x8d, 0xb5, 0x8b, + 0xdc, 0xc2, 0x59, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x2b, 0xd5, 0xf9, 0xb7, + 0x7b, 0x0c, 0xeb, 0x2d, 0x25, 0x96, 0x3a, 0xca, 0x83, 0x44, 0xe2, 0x37, + 0x40, 0x16, 0x5e, 0xf4, 0x74, 0xb2, 0xfe, 0x9c, 0x4d, 0xb7, 0x20, 0x2c, + 0xbf, 0xf3, 0x90, 0x33, 0xf0, 0x4c, 0x05, 0x95, 0x07, 0xdb, 0xb6, 0x65, + 0x61, 0x72, 0x4e, 0x0f, 0x06, 0xf4, 0x6c, 0xe9, 0xe0, 0x1f, 0x08, 0xb0, + 0x90, 0x8a, 0xbf, 0xf8, 0x5b, 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x12, + 0x32, 0xff, 0xf0, 0xb3, 0xbc, 0x85, 0xe6, 0xbb, 0x77, 0xed, 0x51, 0x3c, + 0x2f, 0xff, 0x0b, 0x3b, 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x13, 0xfa, + 0xff, 0xf0, 0xb3, 0xbc, 0x85, 0xe6, 0xbb, 0x77, 0xed, 0x51, 0x43, 0x2f, + 0xfc, 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x10, 0xbf, 0x9f, 0xb1, + 0x60, 0x69, 0xd6, 0x51, 0xcf, 0xff, 0x7a, 0x75, 0xff, 0xa4, 0x2c, 0x3c, + 0xd9, 0x1c, 0x89, 0x2c, 0xa1, 0x67, 0xcf, 0x04, 0x97, 0xfe, 0x99, 0xbd, + 0xd6, 0x7c, 0x78, 0x75, 0x97, 0xff, 0x9c, 0x58, 0xdc, 0x9f, 0xbd, 0x82, + 0x39, 0xd6, 0x5f, 0xcd, 0xf6, 0xd3, 0x81, 0x65, 0xf6, 0x7f, 0x00, 0xb2, + 0xfc, 0x41, 0x79, 0x71, 0x65, 0x8e, 0xb2, 0xff, 0xb7, 0xe7, 0x52, 0xd3, + 0xbc, 0x96, 0x5e, 0x27, 0x17, 0x24, 0x60, 0x11, 0x67, 0xc8, 0x76, 0xc9, + 0xc4, 0x11, 0xbf, 0xff, 0x7b, 0x0b, 0x0d, 0xf3, 0xcb, 0xc6, 0x38, 0x87, + 0x59, 0x7d, 0xdb, 0xbf, 0x6a, 0x8a, 0x45, 0x52, 0x44, 0x3e, 0x95, 0xef, + 0xc1, 0xf9, 0x47, 0x96, 0x5f, 0xfd, 0xed, 0xef, 0xae, 0x3f, 0xb9, 0x13, + 0xac, 0xbf, 0xf9, 0xfa, 0xe7, 0x8c, 0x80, 0x6c, 0x10, 0xeb, 0x2f, 0xfa, + 0x25, 0x1a, 0x9e, 0x35, 0x3a, 0xcb, 0xff, 0xc5, 0x9e, 0xf9, 0x40, 0x30, + 0x9e, 0x4b, 0x2f, 0xf1, 0x41, 0xf8, 0x0f, 0xba, 0xcb, 0xfc, 0xff, 0x3b, + 0x7f, 0xcc, 0xb2, 0xf3, 0xc8, 0x5e, 0x27, 0x7f, 0x31, 0x1b, 0x93, 0x81, + 0x1c, 0x92, 0xb8, 0x75, 0xf4, 0x61, 0x0c, 0xaf, 0x85, 0xc6, 0x1d, 0x65, + 0xff, 0xf8, 0x58, 0x9d, 0xe7, 0xe0, 0xbf, 0xc7, 0x20, 0xe2, 0xca, 0x63, + 0xfa, 0xde, 0x47, 0x7f, 0xfa, 0x42, 0xf4, 0xe0, 0x7f, 0xb6, 0xb0, 0xeb, + 0x2f, 0xfd, 0xd7, 0x24, 0xdc, 0xe4, 0x6a, 0x4b, 0x2f, 0xf9, 0xbb, 0x83, + 0xf3, 0xf1, 0x25, 0x97, 0x7b, 0x16, 0x5d, 0x06, 0x2c, 0xbf, 0x83, 0xa0, + 0x6c, 0x1c, 0xcb, 0x2c, 0x2e, 0x48, 0x98, 0x19, 0xcf, 0x85, 0xb8, 0x2f, + 0x4e, 0x98, 0xe8, 0x21, 0xb1, 0x7f, 0x4b, 0x3d, 0xe7, 0x92, 0xcb, 0xff, + 0xe6, 0x98, 0x5f, 0xfc, 0xce, 0x08, 0x08, 0xae, 0x16, 0x5f, 0xfb, 0xb1, + 0x63, 0x6d, 0x8e, 0x5d, 0xc2, 0xca, 0xc4, 0x4c, 0x3a, 0xad, 0xff, 0xfd, + 0x83, 0xf4, 0x08, 0x2f, 0xe4, 0xe0, 0xe7, 0x20, 0x09, 0x2c, 0x2e, 0x17, + 0xf9, 0xc6, 0x81, 0xdc, 0x61, 0xc7, 0x95, 0x4b, 0xe8, 0x7f, 0x39, 0x18, + 0x23, 0x68, 0xf9, 0x46, 0xf8, 0x62, 0xed, 0x90, 0xde, 0xe6, 0x71, 0x65, + 0xf0, 0x77, 0x47, 0x0b, 0x2b, 0xa3, 0xc1, 0xf0, 0xe5, 0xff, 0xf7, 0xa3, + 0xcc, 0x6f, 0x39, 0x84, 0x0d, 0xbc, 0x59, 0x7d, 0xdb, 0xbf, 0x6a, 0x89, + 0x41, 0x7f, 0xe8, 0x01, 0xde, 0x5e, 0x87, 0xd2, 0xca, 0x92, 0x2f, 0xf4, + 0xa4, 0x46, 0x17, 0xf9, 0xcc, 0x2c, 0x04, 0x01, 0x65, 0xfe, 0xc1, 0xe0, + 0xe0, 0xbe, 0xb2, 0x88, 0xf8, 0xf8, 0x65, 0x7e, 0x91, 0x34, 0x1a, 0xb2, + 0xff, 0xe7, 0xff, 0x04, 0x20, 0xc8, 0xb0, 0xeb, 0x29, 0xcf, 0xac, 0x89, + 0xef, 0xfa, 0x25, 0xc0, 0x80, 0xef, 0x25, 0x97, 0xff, 0x67, 0xf9, 0x07, + 0xcf, 0xb8, 0x45, 0x6b, 0x2f, 0x0f, 0x50, 0xb2, 0xf3, 0x8f, 0x16, 0x56, + 0x1b, 0x7e, 0x0e, 0x5f, 0xf4, 0xb3, 0xc5, 0x9f, 0xf3, 0x2c, 0xbf, 0xfc, + 0xf3, 0xb6, 0xb4, 0xdd, 0x4b, 0xef, 0xd2, 0xcb, 0xde, 0xf9, 0xd6, 0x5f, + 0x0b, 0x79, 0x0b, 0x85, 0x72, 0xf9, 0x0e, 0x29, 0xa1, 0x24, 0x78, 0x46, + 0x78, 0x80, 0x8e, 0x78, 0xfd, 0xf2, 0x0d, 0xb3, 0x7d, 0xd4, 0xca, 0x9d, + 0xdc, 0x1a, 0x4a, 0xb6, 0xe3, 0x1c, 0x77, 0x1d, 0xcf, 0x70, 0x34, 0xa0, + 0x4d, 0xc9, 0xc4, 0x3d, 0x4a, 0x5d, 0x3b, 0x8f, 0x95, 0x80, 0xb8, 0x2b, + 0x5c, 0xe4, 0x68, 0x41, 0xa4, 0x05, 0x6e, 0xce, 0x47, 0xdf, 0xfe, 0x16, + 0x77, 0x90, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x27, 0x35, 0xff, 0xe1, 0x67, + 0x79, 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, 0x89, 0x5f, 0xf0, 0x5f, 0x52, + 0x15, 0x37, 0x81, 0x96, 0x5e, 0x6e, 0xb8, 0xb2, 0xf1, 0x41, 0xd6, 0x5f, + 0xf1, 0x3f, 0x5f, 0x7f, 0xc9, 0xd6, 0x5f, 0xde, 0xcc, 0xff, 0xb1, 0x65, + 0x4e, 0x89, 0xc6, 0x1d, 0x00, 0xdf, 0xce, 0x2e, 0xdf, 0x0b, 0x2f, 0xe1, + 0xea, 0x37, 0xb6, 0xf5, 0x97, 0xf3, 0x72, 0x69, 0x30, 0x16, 0x5f, 0xd8, + 0x31, 0x06, 0xe7, 0x59, 0x7f, 0xfe, 0xc2, 0x96, 0xcc, 0x1b, 0x73, 0xaf, + 0x85, 0xf8, 0xb2, 0xff, 0x44, 0xe2, 0x6d, 0xb9, 0x01, 0x65, 0xd2, 0x16, + 0x35, 0x49, 0x99, 0x0d, 0xce, 0xcf, 0x58, 0x63, 0xc6, 0x3b, 0xcb, 0x8c, + 0x2e, 0x11, 0x5e, 0xfe, 0xe1, 0x6c, 0xda, 0xc6, 0xcb, 0x2f, 0xfc, 0x58, + 0x08, 0x06, 0xb5, 0x06, 0x2c, 0xb0, 0xb8, 0x3f, 0x2e, 0x1a, 0x56, 0x93, + 0x24, 0x04, 0x3e, 0xeb, 0x4b, 0x8a, 0x3c, 0x5c, 0x0c, 0xbc, 0xcb, 0xf6, + 0xbb, 0x77, 0xed, 0x51, 0x0e, 0x2f, 0xe0, 0xf7, 0xa6, 0x82, 0x59, 0x7e, + 0x62, 0xfc, 0x1d, 0x65, 0x85, 0xe2, 0x22, 0x7c, 0x6d, 0xb6, 0x5b, 0x7f, + 0xe6, 0x1e, 0x1c, 0xb3, 0xaf, 0xba, 0xcb, 0xfd, 0xac, 0xef, 0xd1, 0xd4, + 0x96, 0x58, 0xc5, 0x95, 0x07, 0x8f, 0x86, 0xb4, 0xb2, 0xff, 0xe2, 0x73, + 0x7b, 0xf3, 0x6b, 0x50, 0x62, 0xcb, 0xff, 0xbb, 0xf4, 0x1a, 0xdc, 0x15, + 0x5b, 0x53, 0xf9, 0x65, 0x82, 0xb2, 0xb7, 0x0f, 0x88, 0xea, 0x37, 0x11, + 0x2c, 0xbe, 0xed, 0xdf, 0xb5, 0x44, 0x5e, 0xbf, 0xd9, 0xd0, 0x38, 0xed, + 0x3a, 0xcb, 0xf1, 0x38, 0x1f, 0x8b, 0x2f, 0xd9, 0x34, 0x9f, 0x8b, 0x29, + 0x91, 0xd9, 0x31, 0x2e, 0x85, 0x48, 0xc3, 0xe6, 0x82, 0x13, 0x5f, 0xe9, + 0xfd, 0x9e, 0xc6, 0x9d, 0x65, 0xe8, 0x33, 0xeb, 0x2c, 0xfa, 0x3d, 0x12, + 0x34, 0xbe, 0x3f, 0x9b, 0x4b, 0x2f, 0xb7, 0x58, 0xa6, 0x59, 0x7f, 0x60, + 0xfd, 0x80, 0x75, 0x97, 0xd0, 0x11, 0x5f, 0x16, 0x56, 0x1f, 0xbf, 0x09, + 0x4c, 0x2c, 0xbf, 0xec, 0x60, 0x70, 0x00, 0x6f, 0xac, 0xb8, 0x4e, 0x2c, + 0xb4, 0x96, 0x54, 0x1a, 0x97, 0x18, 0xbf, 0xc0, 0xff, 0x3d, 0x8c, 0x35, + 0x96, 0x9d, 0x65, 0x68, 0xf1, 0x48, 0xce, 0xff, 0xbe, 0x50, 0x71, 0x07, + 0xe8, 0x59, 0x7e, 0x79, 0x1e, 0x24, 0xb2, 0xc7, 0x59, 0x50, 0x89, 0x26, + 0x21, 0xf1, 0xcf, 0xc9, 0xef, 0xa6, 0x93, 0xc9, 0x65, 0xdc, 0xe9, 0x65, + 0xf7, 0xe5, 0x06, 0xa4, 0xbe, 0xc1, 0xff, 0x8b, 0x2b, 0x11, 0x00, 0x72, + 0x37, 0x18, 0x22, 0x3b, 0xfc, 0x59, 0xd4, 0xb8, 0xc6, 0xac, 0xbf, 0x7b, + 0x3b, 0x79, 0x2c, 0xbf, 0x3f, 0x41, 0x7f, 0xac, 0xbb, 0x6c, 0x96, 0x5f, + 0x9e, 0x7f, 0xe7, 0x96, 0x5f, 0xe8, 0x06, 0x10, 0x79, 0x0b, 0x2c, 0x2e, + 0x17, 0xc6, 0xe7, 0x84, 0x24, 0x88, 0x06, 0x17, 0x91, 0xca, 0x77, 0x0a, + 0x86, 0x26, 0x9a, 0x13, 0x3a, 0x2f, 0x3b, 0x0f, 0xa1, 0xec, 0x50, 0xbb, + 0xe1, 0xd7, 0xcd, 0x02, 0x51, 0xbc, 0xa3, 0x6c, 0x64, 0x42, 0x8b, 0xfe, + 0x7e, 0xc5, 0xcb, 0x35, 0x92, 0x59, 0x7f, 0xff, 0xfc, 0x4e, 0x2f, 0x02, + 0x2b, 0x63, 0x5b, 0xfe, 0xc6, 0x97, 0x36, 0x61, 0xb1, 0x25, 0x97, 0xec, + 0xe1, 0xc7, 0x0b, 0x2f, 0xfc, 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x44, + 0xc8, 0xb0, 0xb9, 0xd3, 0x34, 0xec, 0xef, 0x50, 0x84, 0x39, 0x3d, 0xef, + 0xe1, 0xd6, 0x5d, 0xe3, 0xac, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x16, 0xf2, + 0xc2, 0xe0, 0xfa, 0x46, 0x39, 0x82, 0xf7, 0x3e, 0xea, 0xcb, 0xfc, 0x08, + 0x18, 0x5f, 0x52, 0x59, 0x7f, 0xe7, 0x90, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, + 0x29, 0x35, 0x85, 0xe2, 0x26, 0x98, 0x64, 0xe6, 0x77, 0x6d, 0x7b, 0x42, + 0xcb, 0xff, 0x61, 0x67, 0xf4, 0xc6, 0xf8, 0x2b, 0x2c, 0x75, 0x97, 0xfc, + 0x17, 0xeb, 0x5a, 0x0c, 0xdc, 0x59, 0x52, 0x3c, 0xde, 0x08, 0xdc, 0x7e, + 0x96, 0x5f, 0xd9, 0xf2, 0x88, 0x3a, 0xcb, 0xfb, 0xa0, 0x09, 0xa7, 0x02, + 0xcb, 0xbc, 0x2c, 0x52, 0x9a, 0x08, 0xc8, 0x72, 0x11, 0x67, 0x22, 0xf0, + 0xc3, 0x95, 0xd4, 0x33, 0x45, 0x25, 0x3e, 0xab, 0x92, 0x95, 0xb9, 0x0b, + 0x6d, 0xf0, 0xcf, 0x12, 0x37, 0x7b, 0xfc, 0x2f, 0x35, 0xdb, 0xbf, 0x6a, + 0x88, 0x75, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x25, 0x85, 0xf6, 0x00, 0xec, + 0xb2, 0xfc, 0x2c, 0xef, 0x21, 0x78, 0x7a, 0xfb, 0x66, 0xd7, 0xf8, 0x5e, + 0x6b, 0xb7, 0x7e, 0xd5, 0x11, 0x82, 0xf1, 0x90, 0x75, 0x97, 0xa4, 0xc3, + 0x59, 0x7e, 0x96, 0x71, 0xf8, 0xb2, 0xc2, 0xf0, 0xf8, 0x26, 0x1d, 0x08, + 0xe5, 0xff, 0xf9, 0xc1, 0xb7, 0x82, 0xc9, 0xff, 0x2c, 0xfe, 0x0d, 0x65, + 0xff, 0xf9, 0x8e, 0xda, 0x17, 0xfd, 0xbc, 0xf7, 0xe3, 0xa3, 0x16, 0x51, + 0x23, 0xaf, 0x86, 0xff, 0x58, 0xbe, 0x17, 0x2c, 0xe2, 0xcb, 0xdf, 0x69, + 0x96, 0x5f, 0xff, 0xff, 0xff, 0x61, 0x82, 0xfa, 0x82, 0x09, 0xf5, 0x1f, + 0x6e, 0xd8, 0x7e, 0x8e, 0xfd, 0x13, 0x9d, 0xbe, 0xf3, 0x3f, 0xd6, 0x5f, + 0xff, 0xf4, 0xb8, 0x2f, 0xbf, 0x3c, 0xdd, 0xfb, 0x35, 0xb5, 0x7a, 0x63, + 0xf1, 0x65, 0xf4, 0x78, 0x3f, 0x59, 0x7e, 0xcf, 0x82, 0x3b, 0x59, 0x7f, + 0xfa, 0x3e, 0xc0, 0x89, 0x0f, 0xd0, 0x5d, 0xac, 0xbe, 0x62, 0x03, 0x2c, + 0xbe, 0xed, 0xdf, 0xb5, 0x44, 0x7a, 0xa9, 0x1e, 0x86, 0x88, 0x2f, 0xff, + 0x6e, 0x14, 0x38, 0xdb, 0x87, 0x81, 0x81, 0x65, 0xf7, 0x1f, 0xad, 0xeb, + 0x2e, 0x90, 0xbc, 0x44, 0x93, 0x91, 0x7d, 0x2e, 0xff, 0xf0, 0x73, 0xd8, + 0x40, 0xc2, 0xff, 0xb1, 0x65, 0xe8, 0xd4, 0xcb, 0x2e, 0x71, 0x64, 0x7c, + 0x9c, 0x47, 0xb0, 0xb8, 0x57, 0x09, 0x38, 0xef, 0x50, 0xb0, 0x67, 0x49, + 0x88, 0xb4, 0x50, 0xf1, 0x95, 0x94, 0x28, 0x2f, 0xff, 0xe2, 0x73, 0x05, + 0xf3, 0xe5, 0x1b, 0x00, 0x71, 0x34, 0xeb, 0x2f, 0xda, 0xed, 0xdf, 0xb5, + 0x45, 0x86, 0xbf, 0xd2, 0x28, 0xce, 0x61, 0x2c, 0xb9, 0xa4, 0xb2, 0xc2, + 0xf0, 0xff, 0x3a, 0x36, 0x01, 0x85, 0xf0, 0xb0, 0x16, 0x2c, 0xbb, 0xaf, + 0xac, 0xbf, 0x83, 0x3b, 0x10, 0x4e, 0xb2, 0xa0, 0xf1, 0x88, 0x62, 0xf4, + 0x14, 0xeb, 0x2d, 0x0b, 0x2f, 0xa0, 0x12, 0x3a, 0xca, 0xf1, 0xb2, 0x21, + 0x0a, 0x64, 0x47, 0x78, 0x83, 0xe9, 0xd7, 0xff, 0xfd, 0x11, 0xc1, 0x7f, + 0x1b, 0x1f, 0xa9, 0x73, 0xa9, 0x66, 0xa7, 0x59, 0x42, 0xd1, 0x36, 0x45, + 0xf6, 0x89, 0xd3, 0xb6, 0xd4, 0x72, 0x57, 0xf8, 0x5e, 0x6b, 0xb7, 0x7e, + 0xd5, 0x17, 0x3a, 0xf9, 0xb5, 0xa7, 0x59, 0x7d, 0xc8, 0x23, 0x56, 0x56, + 0x1e, 0x18, 0x84, 0x37, 0x8a, 0x3a, 0x59, 0x7c, 0xfa, 0x90, 0xbe, 0x1b, + 0xed, 0xd2, 0x2b, 0xff, 0xff, 0xff, 0xa3, 0x69, 0x4a, 0x7e, 0xfd, 0xb3, + 0x67, 0xb6, 0xc5, 0xce, 0x13, 0x45, 0x5c, 0x0a, 0x7a, 0x9e, 0x7e, 0xcf, + 0xb3, 0x67, 0xb6, 0xd6, 0x54, 0x32, 0xe5, 0x67, 0x84, 0xd4, 0x91, 0x72, + 0x38, 0xee, 0xcb, 0xda, 0x5d, 0x46, 0xa1, 0x14, 0x78, 0x6e, 0x7a, 0x3e, + 0xdf, 0x98, 0x06, 0x18, 0x9b, 0xa7, 0xb7, 0xed, 0x76, 0xef, 0xda, 0xa2, + 0x1e, 0x5f, 0xfe, 0xf3, 0x41, 0xdc, 0x62, 0x6e, 0xc1, 0x49, 0x65, 0x85, + 0xe2, 0x20, 0xb8, 0x6d, 0x7f, 0xf6, 0xfd, 0x37, 0x20, 0x6e, 0x4c, 0x75, + 0x97, 0xbf, 0xd8, 0x16, 0x5f, 0xed, 0x43, 0x7c, 0xa0, 0xeb, 0x2f, 0xf0, + 0x79, 0xb0, 0x64, 0xfe, 0x59, 0x7f, 0xff, 0xfd, 0xec, 0xd6, 0xa3, 0xa9, + 0x09, 0xf6, 0x20, 0xcb, 0x38, 0x59, 0x38, 0x92, 0x59, 0x7d, 0xdb, 0xbf, + 0x6a, 0x88, 0x99, 0x7e, 0xc6, 0xfe, 0x82, 0xb2, 0xfb, 0x73, 0xd0, 0x6a, + 0xcb, 0xff, 0xfd, 0xa2, 0xc9, 0xf0, 0x78, 0x60, 0x75, 0x9d, 0xfa, 0x37, + 0xac, 0xbb, 0x27, 0x59, 0x7c, 0x13, 0xe0, 0xd6, 0x54, 0x22, 0x77, 0xa6, + 0x4d, 0xd1, 0x7b, 0xf7, 0xf9, 0x3e, 0x18, 0xb2, 0xff, 0xbe, 0x13, 0x76, + 0x7b, 0x00, 0xeb, 0x2b, 0x11, 0x32, 0xe6, 0x61, 0x2a, 0xb0, 0x56, 0x5f, + 0xef, 0x85, 0xfa, 0xf4, 0x6f, 0x59, 0x5d, 0xaa, 0xa8, 0xd4, 0x20, 0x0e, + 0x60, 0xe4, 0xe5, 0x1a, 0xe7, 0x0b, 0xbe, 0x23, 0x7f, 0xce, 0xe4, 0x0d, + 0x34, 0x1a, 0xb2, 0xe0, 0xce, 0xb2, 0xd8, 0xb2, 0xe6, 0x15, 0xac, 0xa2, + 0x3c, 0x2d, 0xe3, 0x06, 0x08, 0x5f, 0xe2, 0xc3, 0x35, 0x9e, 0xe2, 0xcb, + 0xf0, 0x39, 0xb3, 0x06, 0xb2, 0xff, 0x31, 0x98, 0x59, 0xd7, 0xd6, 0x53, + 0x1e, 0xee, 0x8a, 0xae, 0xcd, 0xd5, 0x97, 0xbb, 0x61, 0xac, 0xbc, 0xe4, + 0x3c, 0x36, 0xcc, 0x33, 0x7e, 0x6d, 0x87, 0xee, 0x65, 0x94, 0xe7, 0xb6, + 0x45, 0xf7, 0xfd, 0x1e, 0x8d, 0xe7, 0x82, 0x9d, 0x65, 0xff, 0xc1, 0xff, + 0x08, 0x21, 0xfc, 0xa0, 0xd5, 0x97, 0xb8, 0xe4, 0xb2, 0xff, 0xfd, 0x1a, + 0x07, 0xa3, 0x7c, 0xd1, 0x07, 0xe6, 0x0d, 0x65, 0xff, 0x7b, 0xd1, 0xbe, + 0x59, 0xa8, 0x59, 0x5e, 0x44, 0x8b, 0xab, 0xd4, 0xc9, 0xa7, 0x11, 0xd7, + 0x11, 0xbf, 0x0a, 0xcb, 0xfc, 0x4e, 0x02, 0x79, 0x12, 0xcb, 0xf7, 0xf0, + 0x11, 0xa5, 0x97, 0x37, 0xe0, 0xf5, 0xd8, 0xc2, 0xfa, 0x7f, 0x06, 0x75, + 0x95, 0x88, 0xea, 0x78, 0x4d, 0x04, 0xae, 0xfa, 0x73, 0xc6, 0x96, 0x5f, + 0x76, 0x12, 0x35, 0x65, 0xce, 0xeb, 0x29, 0xcf, 0x70, 0x88, 0xc4, 0x24, + 0xbf, 0xf3, 0xf5, 0xc9, 0xb7, 0x18, 0xbf, 0xc5, 0x97, 0x0f, 0xcb, 0x2f, + 0xff, 0x7e, 0x59, 0xad, 0x3c, 0xb0, 0xf1, 0xda, 0xca, 0xc3, 0xe1, 0x71, + 0x7b, 0xfe, 0xf8, 0x7d, 0x03, 0xf3, 0x01, 0x65, 0xff, 0x44, 0xb1, 0x8b, + 0x20, 0xd5, 0x97, 0xff, 0xef, 0x46, 0x81, 0xcc, 0x1f, 0xc2, 0xfd, 0xe6, + 0x96, 0x56, 0xe2, 0x31, 0x66, 0x39, 0xf9, 0xb5, 0xdf, 0x3a, 0xcb, 0xf6, + 0x1c, 0xf0, 0x35, 0x97, 0xfe, 0x12, 0x7e, 0x43, 0x75, 0xf8, 0x3a, 0xcb, + 0xff, 0xb8, 0xef, 0xde, 0x77, 0x05, 0x1d, 0xac, 0xb6, 0x4c, 0x8a, 0xcf, + 0x13, 0xf1, 0x06, 0xf4, 0x6b, 0x8b, 0x2f, 0xff, 0x66, 0xf2, 0xce, 0x77, + 0xe6, 0xdd, 0x6e, 0x2c, 0xbf, 0xe8, 0x90, 0x99, 0xae, 0x61, 0x8b, 0x2f, + 0xf4, 0xa0, 0xd6, 0xf3, 0xce, 0xb2, 0xa7, 0x3e, 0xe6, 0x3a, 0xbc, 0x41, + 0x1a, 0xca, 0xc5, 0x48, 0x7d, 0x1a, 0x7a, 0x18, 0x60, 0x36, 0x21, 0xc0, + 0xc2, 0xf0, 0x42, 0x2b, 0xf1, 0x3b, 0x10, 0x16, 0x5f, 0x8c, 0x0c, 0x6a, + 0x75, 0x95, 0xb0, 0xf3, 0xcc, 0x25, 0xbf, 0xf9, 0x9c, 0x1a, 0x82, 0xff, + 0xb2, 0x4b, 0x29, 0x8f, 0x9f, 0xc4, 0xb7, 0x31, 0xd6, 0x5f, 0x4b, 0xc2, + 0x71, 0x65, 0xce, 0x22, 0xa2, 0x17, 0x57, 0x47, 0x90, 0x12, 0x4a, 0x99, + 0x10, 0x3f, 0x5e, 0xbf, 0x7b, 0x27, 0x09, 0x2c, 0xbe, 0x7d, 0x46, 0xf5, + 0x94, 0x33, 0xcb, 0x01, 0x45, 0xfa, 0x69, 0x63, 0x92, 0xcb, 0xd0, 0x79, + 0x2c, 0xbc, 0x41, 0x35, 0x65, 0x74, 0x6e, 0x48, 0x72, 0xfb, 0xcd, 0x13, + 0x2c, 0xb0, 0xb8, 0x67, 0xd4, 0xce, 0x89, 0x21, 0xe1, 0x98, 0xe4, 0xad, + 0xd3, 0x5c, 0x19, 0xe6, 0x63, 0x1d, 0x42, 0x40, 0xf0, 0xb2, 0xf4, 0xa5, + 0x87, 0x84, 0x78, 0x0b, 0x8a, 0x14, 0x9c, 0x96, 0x51, 0xf8, 0xc9, 0x83, + 0x0a, 0x2d, 0xed, 0xfb, 0x64, 0x42, 0x30, 0x6e, 0x90, 0xdf, 0xb3, 0x5c, + 0x68, 0x59, 0x78, 0x55, 0x0a, 0x82, 0x85, 0x97, 0xfe, 0xd0, 0x67, 0xcf, + 0x4c, 0x50, 0x35, 0x97, 0xc5, 0x18, 0x6a, 0xcb, 0xfd, 0xff, 0x66, 0x7f, + 0xd8, 0xb2, 0xfe, 0xf4, 0x3f, 0x43, 0xe9, 0x65, 0xf6, 0x1c, 0x27, 0x59, + 0x7f, 0xb5, 0x05, 0x83, 0x1c, 0x2c, 0xbf, 0xf3, 0x91, 0xaf, 0xf8, 0xfb, + 0x81, 0x65, 0xf0, 0xc4, 0x82, 0x59, 0x7f, 0xff, 0x37, 0xc3, 0xa7, 0xe6, + 0x17, 0xb3, 0x0a, 0x5c, 0x59, 0x50, 0x7f, 0x4e, 0x45, 0x4b, 0x2f, 0xcf, + 0x9f, 0xc3, 0xac, 0xb8, 0x11, 0x06, 0xc4, 0x82, 0xef, 0xc1, 0xd0, 0x36, + 0x42, 0xcb, 0xbc, 0xeb, 0x2e, 0x63, 0x56, 0x58, 0x2b, 0x2b, 0x0d, 0xf4, + 0xc2, 0xdc, 0x17, 0xbe, 0xfc, 0x16, 0xf5, 0x96, 0xfa, 0xca, 0xf1, 0xb4, + 0xf9, 0x1d, 0xe0, 0x70, 0x5e, 0xd0, 0xae, 0x10, 0x55, 0x93, 0x41, 0x60, + 0xd0, 0x30, 0x87, 0xb3, 0x26, 0x2f, 0xd1, 0x11, 0xcc, 0x7d, 0x0b, 0x70, + 0x28, 0xf0, 0xab, 0xed, 0x02, 0x31, 0x5f, 0x86, 0x2f, 0x1b, 0x71, 0x65, + 0xff, 0xe6, 0x97, 0x05, 0xe7, 0x52, 0x79, 0xc4, 0xed, 0x65, 0x41, 0xfe, + 0x61, 0x65, 0x42, 0x70, 0x1e, 0x8d, 0x82, 0xff, 0xb6, 0xb1, 0x4e, 0xb3, + 0xed, 0xe0, 0xac, 0xbe, 0xe3, 0x4e, 0x29, 0x59, 0x7e, 0x09, 0x13, 0x49, + 0x65, 0x6d, 0x68, 0x8f, 0xda, 0x90, 0xb8, 0x4f, 0x7f, 0xed, 0xac, 0x52, + 0xd3, 0xc6, 0xce, 0xf9, 0x8b, 0x2e, 0xda, 0x64, 0xb2, 0xf7, 0xb3, 0x4b, + 0x2b, 0x6b, 0x44, 0x1e, 0xd4, 0x97, 0xe1, 0xcb, 0xff, 0x64, 0x89, 0xcd, + 0x9b, 0x91, 0xf5, 0x97, 0xdf, 0x6d, 0x62, 0xca, 0xda, 0x47, 0xc1, 0x87, + 0xf7, 0xfd, 0x9f, 0x12, 0x77, 0xd3, 0x4c, 0xb2, 0xfe, 0x96, 0xd3, 0x9c, + 0x52, 0x2a, 0xc5, 0x45, 0x97, 0x8b, 0x3c, 0xb2, 0xfe, 0x63, 0xe4, 0x68, + 0xd5, 0x94, 0x33, 0xc8, 0xec, 0x6e, 0xf0, 0xaa, 0xda, 0x5b, 0x42, 0xcb, + 0xfd, 0x9c, 0xe6, 0x31, 0x76, 0xb2, 0xb6, 0xa4, 0xdc, 0x85, 0x24, 0xfb, + 0x41, 0xd8, 0xa2, 0x11, 0xa2, 0xac, 0x8c, 0x8b, 0xaf, 0x69, 0xf8, 0xb2, + 0xfe, 0xda, 0xc4, 0xf7, 0xb2, 0x75, 0x97, 0x6d, 0xf4, 0xb2, 0xde, 0x59, + 0x5b, 0x0f, 0xf7, 0x6b, 0x1c, 0xda, 0x46, 0xa1, 0x1b, 0xbf, 0xf6, 0xd6, + 0x29, 0xe6, 0x11, 0x63, 0xf6, 0xb2, 0xe3, 0x61, 0x65, 0xf0, 0xf0, 0xa6, + 0x59, 0x73, 0x7d, 0x65, 0xbe, 0xc6, 0xe3, 0xc4, 0x57, 0xfb, 0xaf, 0xf5, + 0x20, 0x91, 0xab, 0x2f, 0xfd, 0x13, 0x16, 0x6f, 0x73, 0x9d, 0x96, 0x53, + 0x9f, 0xb0, 0x4d, 0xef, 0xff, 0xfe, 0xf0, 0x46, 0xd9, 0xa9, 0x8b, 0x37, + 0xfb, 0x07, 0x1c, 0xe4, 0x1a, 0xb2, 0xff, 0xf3, 0x4d, 0x2c, 0xea, 0x5b, + 0x0e, 0xee, 0x4b, 0x2e, 0x7d, 0xd5, 0x97, 0xff, 0xfb, 0x99, 0xfd, 0x9e, + 0xce, 0xe0, 0xc2, 0xc1, 0xf9, 0xa6, 0x59, 0x53, 0xaa, 0x49, 0xc4, 0xf3, + 0x61, 0x39, 0xd9, 0x0f, 0x9d, 0x1d, 0x33, 0xe3, 0x35, 0xb5, 0x2a, 0xfb, + 0x14, 0xca, 0x8f, 0xbf, 0xdd, 0x47, 0xf3, 0x3a, 0x92, 0xcb, 0xfb, 0x1b, + 0xe5, 0x1d, 0x2c, 0xb1, 0xab, 0x2b, 0x69, 0x9f, 0x90, 0xab, 0x34, 0xdb, + 0x2c, 0xba, 0x7f, 0x2c, 0xbd, 0xae, 0x71, 0x65, 0xc5, 0xc5, 0x94, 0x29, + 0x36, 0x7b, 0xc7, 0x6f, 0x1e, 0x3b, 0x59, 0x42, 0x83, 0xc4, 0xc2, 0x7b, + 0xfb, 0x68, 0x83, 0x1f, 0xb8, 0x59, 0x7f, 0x0a, 0xbd, 0xa8, 0xb6, 0xe0, + 0xeb, 0x2b, 0x68, 0x3e, 0xe1, 0x56, 0x67, 0x7f, 0xfe, 0x1e, 0xcc, 0xe1, + 0x4f, 0x3b, 0xee, 0x6c, 0xd9, 0xed, 0xb5, 0x97, 0xf3, 0x94, 0xfe, 0x8d, + 0xc5, 0x97, 0xa5, 0x00, 0x59, 0x43, 0x3c, 0xc7, 0x30, 0xbf, 0x79, 0xfe, + 0xf2, 0x59, 0x7f, 0x36, 0x8b, 0x33, 0x4b, 0x2f, 0x77, 0x3f, 0x96, 0x5f, + 0xa3, 0x82, 0xab, 0x6b, 0xda, 0xd6, 0x5c, 0x73, 0xac, 0xae, 0x1e, 0x78, + 0x4e, 0x2f, 0xd1, 0xc0, 0xf9, 0x96, 0x56, 0xc4, 0x5b, 0xc9, 0xbb, 0x84, + 0x54, 0xb2, 0xfd, 0x27, 0xd3, 0xf6, 0xb2, 0xe6, 0x99, 0x65, 0x41, 0xbf, + 0xc2, 0x8b, 0xfc, 0x59, 0xd4, 0x89, 0xe7, 0x59, 0x5a, 0x3d, 0x2e, 0x0f, + 0xdf, 0xb8, 0x17, 0x20, 0x2c, 0xad, 0x87, 0x93, 0xf2, 0x2b, 0xf8, 0xb3, + 0x79, 0x67, 0x16, 0x51, 0xcf, 0x44, 0x04, 0x97, 0xb8, 0xc0, 0x59, 0x7c, + 0xc5, 0x1c, 0x59, 0x58, 0x7b, 0xcc, 0x45, 0xe1, 0xcb, 0xc6, 0x18, 0x62, + 0x4b, 0xf3, 0x97, 0xfd, 0x89, 0x05, 0x9a, 0x0b, 0xff, 0xff, 0xa2, 0x7d, + 0x9c, 0x0c, 0x75, 0xff, 0x61, 0xf3, 0xe5, 0x00, 0x04, 0x2c, 0xbb, 0x6f, + 0x16, 0x5f, 0x7e, 0x6c, 0xfa, 0xcb, 0x0d, 0x65, 0x0d, 0x18, 0x38, 0xe8, + 0xe3, 0x21, 0x23, 0xa8, 0x56, 0x2a, 0x38, 0xe5, 0x00, 0x9a, 0x50, 0xf9, + 0xbf, 0x78, 0x85, 0x4d, 0xbd, 0xd5, 0x97, 0x3b, 0xac, 0xb7, 0x98, 0xf2, + 0x1c, 0xce, 0xff, 0xfe, 0x06, 0xa3, 0x66, 0xa3, 0xfd, 0x4a, 0x0d, 0xd3, + 0x98, 0xb2, 0xf8, 0x4e, 0x38, 0x16, 0x5d, 0x37, 0x96, 0x5f, 0xf8, 0xfb, + 0x31, 0xb4, 0xc7, 0x83, 0x56, 0x53, 0x1e, 0xc3, 0x8c, 0x5f, 0xf9, 0xa6, + 0xd9, 0xe8, 0x6d, 0x07, 0x71, 0x65, 0x42, 0x67, 0xfa, 0x60, 0xf3, 0xd8, + 0x08, 0x2f, 0xff, 0xdd, 0xf8, 0x83, 0xfd, 0x85, 0x9b, 0xbf, 0x6c, 0xdd, + 0x59, 0x70, 0x7c, 0xb2, 0xfc, 0xdb, 0xba, 0xe7, 0x16, 0x54, 0x22, 0x7c, + 0xd5, 0xdd, 0x0b, 0xdf, 0xc4, 0x1f, 0xb4, 0xf0, 0xb2, 0xff, 0x41, 0x47, + 0x21, 0x8e, 0xb2, 0xf3, 0xff, 0x8b, 0x28, 0xd3, 0xcc, 0xd1, 0x85, 0xed, + 0xd1, 0xc2, 0xca, 0x63, 0xc2, 0x09, 0x1d, 0xef, 0x38, 0xad, 0x65, 0xfb, + 0x78, 0x65, 0x9c, 0x59, 0x7c, 0x06, 0x20, 0xac, 0xac, 0x3c, 0xb0, 0x95, + 0x5f, 0x60, 0xf2, 0x75, 0x97, 0xdb, 0x9b, 0x23, 0x6a, 0x59, 0x7f, 0x8a, + 0x36, 0xf0, 0x98, 0xd5, 0x97, 0xfb, 0xef, 0xd7, 0x1f, 0xa3, 0x16, 0x5a, + 0x16, 0x5e, 0x68, 0x25, 0x95, 0xa3, 0x55, 0xf1, 0x0a, 0xda, 0x99, 0x51, + 0xa3, 0x85, 0x86, 0x10, 0xf6, 0x4f, 0xd4, 0x38, 0x9a, 0x5a, 0x3e, 0xe4, + 0x24, 0x26, 0x8d, 0x97, 0x50, 0xdc, 0x39, 0x87, 0xa1, 0x76, 0x2b, 0x21, + 0x26, 0xbf, 0x90, 0xef, 0x22, 0xdb, 0x2c, 0x10, 0xd3, 0x75, 0x82, 0xfd, + 0xac, 0xdf, 0x1d, 0x2c, 0xbc, 0x59, 0xf5, 0x97, 0xff, 0xba, 0x97, 0x39, + 0x0d, 0xd7, 0xff, 0x07, 0x59, 0x5a, 0x44, 0x89, 0x15, 0x18, 0x37, 0x7f, + 0xe9, 0xf0, 0xa0, 0xcf, 0x9a, 0xfc, 0x59, 0x7f, 0xb3, 0x7b, 0xb7, 0x78, + 0x4b, 0x2e, 0x2f, 0xe1, 0xf9, 0x92, 0x05, 0xf4, 0x60, 0xd9, 0x65, 0x31, + 0xe5, 0x98, 0x57, 0x78, 0x3f, 0xe2, 0xcb, 0xfe, 0xdc, 0x7f, 0xcd, 0x26, + 0xd4, 0xcb, 0x2f, 0xfa, 0x24, 0x63, 0xeb, 0xf1, 0x8b, 0x2f, 0xff, 0xff, + 0xfb, 0x9b, 0x3d, 0x93, 0xc1, 0x9d, 0x4b, 0x9b, 0x03, 0xde, 0xb5, 0x1b, + 0x26, 0x37, 0xad, 0x9b, 0x3d, 0xb6, 0xb2, 0xfe, 0xeb, 0x64, 0xd9, 0x9d, + 0xac, 0xa8, 0x55, 0x03, 0x90, 0xee, 0xec, 0x89, 0xc7, 0x48, 0xfb, 0xe7, + 0x01, 0x85, 0x65, 0xfb, 0xd0, 0x08, 0xdc, 0x59, 0x63, 0x16, 0x5f, 0xd2, + 0x91, 0xe6, 0x8d, 0xd5, 0x96, 0x02, 0xca, 0x63, 0xff, 0x01, 0x51, 0x09, + 0x04, 0xca, 0xed, 0xb8, 0x59, 0x7a, 0x0d, 0x65, 0x97, 0x41, 0xd6, 0x5d, + 0x1d, 0x2c, 0xa1, 0x9a, 0xd9, 0x85, 0xa8, 0x91, 0x09, 0xc1, 0x9f, 0xa4, + 0xdd, 0xb7, 0xb5, 0xac, 0xbf, 0xfc, 0x08, 0x2e, 0xf6, 0x61, 0x06, 0x59, + 0xc5, 0x97, 0xf9, 0xfa, 0x06, 0x9b, 0xa0, 0x2c, 0xbf, 0xf0, 0x4f, 0x19, + 0xc2, 0xcd, 0xee, 0xb2, 0xff, 0x01, 0xcb, 0x27, 0x12, 0x4b, 0x2b, 0xa4, + 0x79, 0x79, 0x2f, 0x86, 0xbf, 0x3e, 0xbd, 0xb2, 0x5d, 0xac, 0xbf, 0xcd, + 0xb3, 0x8f, 0x1d, 0x49, 0x65, 0xff, 0x73, 0x66, 0x14, 0x04, 0x57, 0xc5, + 0x95, 0x0a, 0xb3, 0xf2, 0x17, 0xc6, 0x97, 0xb4, 0x62, 0x27, 0x3e, 0xf1, + 0x01, 0x1a, 0xdf, 0xff, 0xda, 0xd8, 0x59, 0xbf, 0x35, 0x2d, 0x90, 0x37, + 0x9b, 0x8b, 0x2f, 0xff, 0x6b, 0xc6, 0x38, 0xf6, 0x08, 0x00, 0x36, 0xea, + 0xcb, 0xff, 0xb0, 0xcd, 0xd3, 0x85, 0x8f, 0x84, 0x05, 0x97, 0xff, 0xfe, + 0xea, 0x0d, 0x2c, 0x1f, 0x9a, 0x6d, 0x9c, 0xce, 0xa5, 0xac, 0x31, 0x65, + 0x32, 0x2e, 0x49, 0x1e, 0xb1, 0x38, 0xd7, 0x61, 0x28, 0xc2, 0xef, 0xbe, + 0x18, 0x9d, 0x65, 0xfd, 0x27, 0xd7, 0x18, 0x6b, 0x2f, 0xec, 0xf6, 0x1e, + 0x3b, 0x59, 0x50, 0x7b, 0x52, 0x2d, 0xbf, 0x36, 0x9b, 0x7e, 0x2c, 0xa6, + 0x46, 0x37, 0xdf, 0x77, 0x48, 0x6f, 0xb6, 0xf3, 0x50, 0xb2, 0xfe, 0x8e, + 0x7a, 0x0b, 0xeb, 0x2f, 0xff, 0xee, 0xa5, 0xc3, 0xe1, 0x6c, 0xdd, 0x6f, + 0x4e, 0xd9, 0xa5, 0x96, 0xdc, 0x59, 0x7b, 0xf9, 0xc5, 0x95, 0x24, 0x5e, + 0xe1, 0x67, 0x6c, 0x21, 0x14, 0xbf, 0xff, 0xc5, 0x9d, 0xf9, 0x8b, 0x03, + 0xd7, 0xf6, 0x39, 0x98, 0x6a, 0xcb, 0xff, 0x67, 0x6f, 0x3f, 0xb3, 0xbc, + 0x25, 0x96, 0x33, 0x62, 0x28, 0xfc, 0xc9, 0x7f, 0x8d, 0x18, 0x63, 0xc5, + 0x0b, 0x2f, 0xe9, 0x70, 0xd0, 0xc7, 0x4b, 0x2f, 0xb0, 0x6f, 0x25, 0x95, + 0xd1, 0xe8, 0x98, 0x61, 0x7d, 0xa8, 0x89, 0xd6, 0x5f, 0x4d, 0x1f, 0x75, + 0x97, 0xfd, 0x3c, 0x4f, 0xc8, 0x99, 0xb7, 0xac, 0xb9, 0xcc, 0xe2, 0x20, + 0x42, 0x44, 0x21, 0x15, 0xed, 0xff, 0x11, 0x65, 0x42, 0x76, 0x58, 0x58, + 0xd0, 0x84, 0x28, 0x52, 0x98, 0x7b, 0x7f, 0xcd, 0xa9, 0xc2, 0x0c, 0x2c, + 0x59, 0x74, 0xc7, 0x59, 0x7f, 0xa5, 0xcf, 0x87, 0x07, 0xb2, 0x63, 0xd0, + 0x01, 0xc5, 0xff, 0xf6, 0x0f, 0xc1, 0x33, 0x8d, 0xff, 0x33, 0x81, 0x65, + 0x74, 0x89, 0xe2, 0x4e, 0xb8, 0xf2, 0x59, 0x7f, 0xfa, 0x35, 0xd9, 0xa0, + 0xc7, 0x2e, 0xa5, 0xc5, 0x95, 0x23, 0xe3, 0xe0, 0xbd, 0xf6, 0x6a, 0x0e, + 0xb2, 0xf1, 0x66, 0xfd, 0x87, 0x86, 0x44, 0x55, 0xa4, 0x7f, 0x72, 0x19, + 0x37, 0xf8, 0x8d, 0x2c, 0x6e, 0xbe, 0xb2, 0xdb, 0xd6, 0x56, 0x1e, 0x37, + 0x0c, 0xea, 0x11, 0x1e, 0x16, 0xeb, 0xe8, 0xcf, 0x71, 0x65, 0xcd, 0x3a, + 0xcb, 0x02, 0x63, 0x71, 0xf2, 0x1b, 0xfd, 0xd9, 0x60, 0xfc, 0xfc, 0x59, + 0x7f, 0x03, 0x08, 0x7e, 0x85, 0x97, 0xf7, 0x98, 0x80, 0x21, 0xd6, 0x53, + 0x1e, 0xd7, 0xcb, 0x2e, 0x1b, 0x2c, 0xbf, 0xff, 0xbc, 0xd8, 0x58, 0xc3, + 0xc8, 0x03, 0xf6, 0xfa, 0x59, 0x7f, 0xa7, 0x83, 0x94, 0x74, 0x05, 0x95, + 0x09, 0xa7, 0xca, 0x11, 0xbd, 0x90, 0xf4, 0x2c, 0xea, 0xf7, 0xef, 0x6c, + 0x7c, 0xe2, 0xca, 0x83, 0xf9, 0xc5, 0x0b, 0x05, 0x65, 0xfd, 0xf2, 0x89, + 0x67, 0xd6, 0x5f, 0x11, 0x67, 0xd6, 0x5e, 0x31, 0xf8, 0xb2, 0xf3, 0xea, + 0x5b, 0x0f, 0xa6, 0x0b, 0x3c, 0x41, 0x50, 0xca, 0x91, 0xc8, 0x7d, 0x74, + 0x64, 0xd0, 0xe1, 0xd4, 0xa9, 0x2f, 0x4a, 0xcd, 0x75, 0xa2, 0x8f, 0xc3, + 0x84, 0x01, 0x7a, 0xb6, 0xe2, 0xcb, 0x7d, 0x65, 0xd0, 0x05, 0x97, 0xff, + 0x98, 0x22, 0xb8, 0xd9, 0xc0, 0x80, 0xf9, 0xf5, 0x95, 0xd1, 0xf3, 0x68, + 0x5a, 0xff, 0xd1, 0xdf, 0x21, 0xba, 0xfc, 0x1d, 0x65, 0x2c, 0xbd, 0xa0, + 0xee, 0x2c, 0xa9, 0x1a, 0xbf, 0x85, 0xd1, 0x22, 0x2c, 0x2d, 0x57, 0xc0, + 0xe4, 0xff, 0x59, 0x7f, 0x3f, 0xa0, 0xa2, 0x4b, 0x2f, 0xff, 0xfd, 0xfc, + 0x82, 0xce, 0xc9, 0xe7, 0x8d, 0x6a, 0x3f, 0xec, 0x1a, 0xcb, 0xed, 0xe5, + 0x9c, 0xd8, 0x89, 0x5c, 0x2b, 0xbf, 0xfe, 0xc2, 0xc3, 0x7c, 0xf2, 0xf1, + 0x8e, 0x21, 0xd6, 0x5f, 0xf9, 0xcd, 0xd9, 0xf7, 0x72, 0xd9, 0x3a, 0xca, + 0x84, 0xe2, 0x5a, 0x17, 0x3e, 0x3c, 0x25, 0x1b, 0xcf, 0xfe, 0x2c, 0xb8, + 0x33, 0xac, 0xa9, 0x1b, 0x4d, 0x0e, 0x5f, 0xb2, 0x5e, 0x79, 0x2c, 0xb8, + 0xbf, 0x31, 0xe4, 0x78, 0x86, 0xff, 0x39, 0x09, 0xef, 0x40, 0xd6, 0x5f, + 0xff, 0x7f, 0x91, 0x9b, 0x35, 0x1f, 0x6e, 0xd8, 0x6b, 0x2f, 0xdd, 0xec, + 0x1f, 0x46, 0x2c, 0xae, 0x1f, 0xf8, 0x54, 0x6f, 0xf1, 0x9e, 0xc2, 0xea, + 0x0d, 0x59, 0x7c, 0x19, 0x9c, 0x6b, 0x2f, 0xd9, 0xfd, 0x61, 0x8b, 0x2d, + 0xde, 0xc3, 0xcb, 0xf1, 0x1d, 0x42, 0x2a, 0xda, 0x10, 0x17, 0x6a, 0x4b, + 0x2f, 0xf1, 0xaf, 0xcc, 0xf8, 0x93, 0xac, 0xbe, 0xd9, 0xd9, 0x90, 0xb2, + 0xa4, 0x7b, 0x87, 0x36, 0xa8, 0x54, 0xd1, 0xd1, 0x73, 0x42, 0xcb, 0x50, + 0xcd, 0x39, 0x33, 0xb9, 0xdf, 0xc6, 0x8a, 0x34, 0xd0, 0x6a, 0xcb, 0xf0, + 0xc9, 0xdf, 0xcb, 0x28, 0x8f, 0x67, 0x86, 0x77, 0xec, 0xe7, 0xdf, 0x4b, + 0x2f, 0xff, 0x73, 0x1c, 0xb6, 0x73, 0xa8, 0x28, 0xe2, 0xcb, 0x4b, 0xc7, + 0xe3, 0xf2, 0x7b, 0xfa, 0x07, 0x1e, 0x89, 0x2c, 0xbf, 0xd1, 0xfd, 0x8f, + 0xdb, 0x6f, 0x59, 0x5a, 0x3e, 0x32, 0x2c, 0xbf, 0xff, 0xf3, 0x75, 0xf7, + 0xf1, 0x60, 0xfc, 0xd3, 0x73, 0xbc, 0x62, 0x99, 0x65, 0xff, 0xf4, 0x7f, + 0x61, 0x07, 0x77, 0x66, 0x7f, 0x6f, 0x3e, 0xb2, 0xa1, 0x37, 0x26, 0x84, + 0x5e, 0x88, 0x42, 0xdb, 0x73, 0xfd, 0x65, 0xff, 0xde, 0x83, 0x76, 0x7c, + 0x9f, 0xf1, 0xf5, 0x97, 0xfb, 0x67, 0x52, 0x6f, 0x04, 0xeb, 0x2b, 0xc8, + 0x93, 0x00, 0xb1, 0x23, 0x5f, 0x8c, 0x7f, 0x4d, 0xb5, 0xac, 0xbf, 0xec, + 0x1e, 0xcf, 0x9a, 0xc6, 0x71, 0x65, 0xb3, 0x47, 0xd9, 0xbc, 0xbe, 0xfe, + 0x7f, 0x1b, 0x1a, 0x75, 0x97, 0xfe, 0xd4, 0xdb, 0x39, 0x0d, 0x3b, 0xfd, + 0x65, 0x42, 0x66, 0x63, 0x84, 0xd9, 0x14, 0x84, 0xb6, 0xe7, 0x02, 0xcb, + 0xff, 0xed, 0x85, 0x1c, 0x89, 0xcb, 0x07, 0xe6, 0x99, 0x65, 0xff, 0xff, + 0xdc, 0xd1, 0x44, 0xdb, 0x04, 0xfb, 0x4b, 0x3a, 0xfe, 0x6f, 0x2c, 0xe2, + 0xca, 0xd2, 0x32, 0x09, 0x46, 0xbe, 0x98, 0x00, 0x61, 0xbd, 0x4b, 0x29, + 0x65, 0xfd, 0x0c, 0x4f, 0xa3, 0x56, 0x5d, 0xfd, 0x86, 0x9b, 0x7f, 0x05, + 0xdd, 0x34, 0x96, 0x54, 0x22, 0x2b, 0xa4, 0x2d, 0x18, 0x5f, 0xfc, 0x5f, + 0xe6, 0xf6, 0xfc, 0x61, 0x4c, 0xb2, 0xfd, 0xa6, 0xe4, 0x74, 0xb2, 0xb0, + 0xfb, 0x5d, 0x16, 0xff, 0xfd, 0x2e, 0x00, 0x33, 0x6c, 0xc6, 0xd3, 0x1e, + 0x0d, 0x59, 0x7f, 0x0a, 0x66, 0x93, 0x7f, 0x8b, 0x2f, 0x70, 0x4e, 0x2c, + 0xa9, 0xcf, 0x44, 0xe6, 0x77, 0x40, 0x16, 0x5f, 0x8b, 0xfe, 0xcd, 0xd5, + 0x97, 0xe9, 0xb8, 0xfa, 0x35, 0x65, 0xe7, 0x33, 0x50, 0x7a, 0x98, 0x55, + 0x7f, 0xc4, 0x6c, 0x4c, 0xc5, 0x07, 0x59, 0x7f, 0x1a, 0xf2, 0x28, 0x3a, + 0xca, 0x83, 0xe5, 0x63, 0x8a, 0x92, 0xa0, 0xee, 0x88, 0x1a, 0x15, 0x53, + 0x11, 0xe9, 0xab, 0xd0, 0x97, 0xbe, 0x6e, 0xdf, 0x4b, 0x2f, 0x1d, 0xcc, + 0x59, 0x6e, 0x48, 0xdf, 0xb9, 0x15, 0xfe, 0x61, 0xe1, 0x4b, 0xd8, 0xb2, + 0xff, 0xfd, 0xcd, 0x98, 0xc6, 0x6c, 0x2c, 0x01, 0x63, 0xcc, 0xb2, 0xff, + 0xbc, 0xda, 0x9b, 0xcf, 0x9a, 0x59, 0x7f, 0xff, 0xff, 0x03, 0x85, 0x8f, + 0xd6, 0xc1, 0xf8, 0x3b, 0x0b, 0x3a, 0x96, 0x06, 0x72, 0xc7, 0xe9, 0x65, + 0x62, 0x63, 0xfd, 0xac, 0x31, 0xcd, 0xcf, 0xda, 0xa2, 0x98, 0x58, 0xd5, + 0x94, 0xe6, 0xd8, 0x24, 0x97, 0xe9, 0xdc, 0xfc, 0xdb, 0x59, 0x50, 0xa8, + 0xa2, 0x72, 0x6c, 0x8d, 0x43, 0xb6, 0x66, 0x20, 0xbf, 0xff, 0xdf, 0xe0, + 0x9c, 0xd9, 0x92, 0xf4, 0x36, 0x80, 0x77, 0x92, 0xcb, 0xfe, 0x2e, 0xa5, + 0xcf, 0xc6, 0xa6, 0x59, 0x7f, 0xee, 0xbb, 0x0b, 0xfb, 0x3e, 0xfe, 0x59, + 0x58, 0x7f, 0x7f, 0x3b, 0xbf, 0xf3, 0xf5, 0x8d, 0xa6, 0x3c, 0x1a, 0xb2, + 0xf6, 0x30, 0x16, 0x5b, 0x16, 0x5b, 0x00, 0x6a, 0xf7, 0x8d, 0xd2, 0xcb, + 0xb5, 0x8b, 0x2d, 0xd1, 0x1e, 0x4f, 0x0a, 0x02, 0x17, 0x58, 0x9f, 0x3b, + 0x43, 0x7f, 0x44, 0x2f, 0x0b, 0x2b, 0xd8, 0x1d, 0x2c, 0xb4, 0xcb, 0x2f, + 0x83, 0x9d, 0x12, 0xca, 0x9c, 0xda, 0x1c, 0x4a, 0xc6, 0x2c, 0xb9, 0x86, + 0xb2, 0xb7, 0x0d, 0x47, 0x04, 0xae, 0x1c, 0xcb, 0x2f, 0xfb, 0x58, 0x3f, + 0x41, 0x87, 0x0a, 0xcb, 0xfb, 0xd8, 0x36, 0x2f, 0xac, 0xb4, 0xeb, 0x2e, + 0xf7, 0x16, 0x51, 0xa6, 0xa5, 0xc4, 0xaa, 0x13, 0x36, 0xc4, 0xa3, 0x92, + 0x78, 0x63, 0xe7, 0x46, 0x2a, 0xdf, 0xbc, 0x13, 0x72, 0x75, 0x97, 0xec, + 0x39, 0xdc, 0xeb, 0x2e, 0x38, 0x16, 0x5d, 0xe7, 0xd8, 0x8b, 0xf1, 0xab, + 0xe8, 0xa8, 0x04, 0xf7, 0xf6, 0xa3, 0xe4, 0xe0, 0x59, 0x5a, 0x3f, 0x6d, + 0xd4, 0xab, 0xfd, 0xb3, 0xa9, 0x14, 0x67, 0x16, 0x57, 0x4a, 0xc5, 0x5a, + 0x55, 0xdb, 0x92, 0xdf, 0xff, 0x80, 0xdc, 0xd9, 0xe7, 0xe7, 0xe2, 0x6e, + 0x7b, 0x16, 0x52, 0xcb, 0xf8, 0x2c, 0x36, 0x26, 0x59, 0x63, 0x58, 0xdb, + 0x1c, 0x2e, 0xfc, 0xfc, 0xf3, 0xc9, 0x65, 0xf3, 0xc9, 0x8e, 0xb2, 0xfd, + 0xdb, 0xeb, 0x3b, 0x59, 0x7f, 0xc1, 0xea, 0x5c, 0xd9, 0xcf, 0xf6, 0xb2, + 0xfe, 0x2f, 0xcb, 0x01, 0xc5, 0x97, 0x8d, 0x7e, 0x6c, 0x44, 0xae, 0x8a, + 0x5c, 0xfe, 0xbc, 0x8f, 0x9f, 0xc2, 0xda, 0xb4, 0x9b, 0x7f, 0x89, 0xcc, + 0x8c, 0x82, 0xfe, 0x6f, 0x3b, 0x4f, 0x0b, 0x2f, 0x4a, 0x3a, 0x59, 0x7f, + 0x1b, 0xad, 0x67, 0x5c, 0x59, 0x7f, 0xfe, 0x2c, 0xeb, 0xfb, 0x3c, 0xfb, + 0xf6, 0x0f, 0xc1, 0x9d, 0x65, 0xfb, 0xd1, 0x3e, 0x18, 0xb2, 0xc7, 0x84, + 0x43, 0x8d, 0x7a, 0xfe, 0xce, 0x49, 0x81, 0x8b, 0x2f, 0x4b, 0x3e, 0xb2, + 0xa4, 0x79, 0x1f, 0x2c, 0xa8, 0x4f, 0x2b, 0x0e, 0x3a, 0x2c, 0x61, 0xd7, + 0x85, 0xb8, 0x5c, 0x2f, 0xde, 0x6e, 0x47, 0x4b, 0x2f, 0xdd, 0x76, 0x51, + 0xbd, 0x65, 0xfc, 0xfa, 0x9a, 0x4d, 0xe5, 0x97, 0xf8, 0x33, 0xf9, 0xb7, + 0xe4, 0xcb, 0x2f, 0xe1, 0x3d, 0xe8, 0x2e, 0xd6, 0x5f, 0x14, 0x1f, 0x8b, + 0x2e, 0x7e, 0xb8, 0x7a, 0x1f, 0x2f, 0xa8, 0x4c, 0xdb, 0x0a, 0x1c, 0xaf, + 0x85, 0xc1, 0x84, 0x3d, 0xdc, 0xe2, 0xcb, 0x62, 0xcb, 0xfe, 0x63, 0x5b, + 0xe5, 0x9b, 0xbb, 0x34, 0x69, 0xf7, 0x8b, 0xdf, 0xe6, 0x20, 0x61, 0xdf, + 0xa5, 0x95, 0x32, 0x21, 0xf7, 0xaa, 0xdf, 0xff, 0xe2, 0xce, 0xff, 0xf8, + 0xff, 0x26, 0x2c, 0x33, 0x64, 0x6d, 0x4b, 0x2f, 0xfd, 0xdc, 0x1f, 0xd9, + 0xcc, 0x62, 0x59, 0x50, 0x8a, 0x6f, 0x34, 0xdf, 0xb5, 0x1b, 0xe3, 0x4b, + 0x2f, 0xa3, 0xbc, 0x3a, 0xcb, 0xfd, 0xb3, 0x39, 0xc6, 0xc3, 0x16, 0x59, + 0xa6, 0x3d, 0x7d, 0x11, 0x5f, 0xce, 0x5b, 0x07, 0x04, 0xb2, 0xa1, 0x3c, + 0x3c, 0x86, 0x63, 0x11, 0x72, 0x10, 0x01, 0x28, 0xbe, 0xc3, 0xc7, 0x6b, + 0x2f, 0xee, 0xda, 0x7c, 0xeb, 0xeb, 0x2d, 0x12, 0x3d, 0x23, 0x08, 0xaf, + 0x46, 0xa4, 0xb2, 0xff, 0xff, 0x68, 0x3d, 0x4b, 0x9b, 0x20, 0x87, 0xe8, + 0xdb, 0xcd, 0x42, 0xca, 0xda, 0x1d, 0x0b, 0x20, 0xaa, 0x14, 0x87, 0x79, + 0xe1, 0x5d, 0x28, 0xea, 0xc7, 0x2c, 0x93, 0x21, 0x74, 0x6c, 0xa0, 0x4e, + 0xe5, 0x03, 0xf5, 0x1a, 0x0b, 0x42, 0xce, 0x69, 0x55, 0x7a, 0x95, 0x96, + 0x79, 0x47, 0x1e, 0x96, 0xb4, 0x03, 0x82, 0x97, 0x8f, 0xc8, 0xe4, 0x3f, + 0x2a, 0xfb, 0x7c, 0x29, 0x0c, 0x28, 0xdd, 0x1c, 0xbd, 0x3e, 0x4e, 0xb2, + 0xff, 0xb4, 0xe6, 0x6c, 0x71, 0xbc, 0xeb, 0x2f, 0x4b, 0xae, 0xd6, 0x5f, + 0xce, 0x64, 0xc4, 0xc3, 0x59, 0x74, 0x80, 0xb2, 0xe9, 0xce, 0xb2, 0xb6, + 0x1a, 0xf6, 0x17, 0xbf, 0xff, 0x13, 0x4f, 0xb1, 0xb0, 0xb3, 0xbd, 0xdf, + 0xe1, 0xd6, 0x5e, 0x3c, 0x76, 0xb2, 0xf7, 0x5e, 0xc9, 0x8f, 0xd8, 0x0b, + 0x37, 0xff, 0xf6, 0x4e, 0xe5, 0xfe, 0x47, 0x7b, 0x0e, 0x76, 0x2e, 0xd6, + 0x5f, 0xd2, 0xe4, 0xd2, 0x89, 0x96, 0x50, 0xd1, 0x1d, 0xd2, 0xf5, 0xfc, + 0x3e, 0x3c, 0x75, 0x25, 0x95, 0x07, 0xa4, 0xe4, 0x97, 0xfa, 0x6f, 0x34, + 0x1d, 0xc6, 0xb2, 0xff, 0x6c, 0xd6, 0x37, 0xa0, 0x6b, 0x2a, 0x0f, 0x9c, + 0x8c, 0xeb, 0x15, 0x95, 0x1a, 0x3c, 0xc7, 0x9a, 0x1f, 0xf2, 0xeb, 0xc2, + 0x60, 0xa3, 0x15, 0x0c, 0x21, 0xef, 0xb0, 0x8d, 0xdc, 0x59, 0x7f, 0xff, + 0xfe, 0xf3, 0x7f, 0xd9, 0xa8, 0xdf, 0xb0, 0xe1, 0xdd, 0xd9, 0x9d, 0x4b, + 0x02, 0x40, 0xe2, 0xcb, 0x7d, 0x91, 0x65, 0xc2, 0x5b, 0xff, 0xe2, 0x9b, + 0xd0, 0xda, 0x63, 0xb6, 0xdc, 0x1d, 0x65, 0xcc, 0x75, 0x94, 0xc7, 0xcf, + 0x32, 0x8d, 0xff, 0x8e, 0x76, 0x9b, 0xce, 0x51, 0x0b, 0x2f, 0xf3, 0xca, + 0x6f, 0x37, 0x5f, 0x59, 0x7f, 0xd2, 0x09, 0x7e, 0x37, 0xbf, 0x96, 0x5f, + 0xfa, 0x3b, 0xd8, 0x4f, 0xc3, 0xc1, 0x2c, 0xbf, 0x41, 0x7f, 0x60, 0xd6, + 0x5f, 0xbf, 0xb0, 0x1d, 0x01, 0x65, 0x31, 0xea, 0x84, 0xa6, 0xff, 0xf7, + 0x9b, 0xbf, 0x66, 0xce, 0x07, 0xd1, 0xb8, 0xb2, 0xfe, 0x28, 0xea, 0x4c, + 0x4b, 0x29, 0x65, 0xfe, 0xcf, 0x16, 0x7f, 0xcc, 0xb2, 0x86, 0x7d, 0x04, + 0x59, 0xf0, 0xbb, 0xfe, 0xfc, 0x4b, 0x93, 0x4a, 0x27, 0x59, 0x6c, 0xc4, + 0xc8, 0x7a, 0x85, 0xc7, 0xcb, 0xaf, 0xff, 0xbf, 0xec, 0x06, 0xc3, 0xc6, + 0x7c, 0x78, 0x4b, 0x2d, 0xa5, 0x96, 0x31, 0x65, 0xfc, 0xe3, 0xd6, 0x83, + 0x3a, 0xcb, 0xf4, 0x61, 0x7f, 0x6d, 0x65, 0xb6, 0x85, 0x95, 0x88, 0x91, + 0x34, 0x47, 0xb1, 0x23, 0x97, 0xf0, 0xa6, 0xfb, 0xed, 0xac, 0x59, 0x6e, + 0xb6, 0x1f, 0x66, 0x25, 0xdb, 0x98, 0x9b, 0xbb, 0xc6, 0x9b, 0x43, 0x5c, + 0x25, 0x98, 0xd4, 0xe7, 0x5e, 0x84, 0xa1, 0x46, 0x85, 0xf8, 0xec, 0xaf, + 0xff, 0xff, 0x36, 0x1f, 0x3c, 0xd8, 0x7d, 0x85, 0x9f, 0xf6, 0x4b, 0xcd, + 0x87, 0x59, 0x7f, 0xff, 0xf4, 0x9b, 0x85, 0x9b, 0xfd, 0x93, 0x7a, 0x0a, + 0x6d, 0x8f, 0xdb, 0x6f, 0x59, 0x7f, 0xf9, 0xb0, 0xc2, 0xce, 0x67, 0xbc, + 0xdc, 0x59, 0x6c, 0xe9, 0x18, 0x1f, 0x78, 0xbf, 0xff, 0x9b, 0x0c, 0x2c, + 0x9f, 0x03, 0xf2, 0x73, 0x5f, 0x8b, 0x2f, 0xfd, 0x9a, 0xf4, 0x6c, 0x7f, + 0x86, 0x16, 0x5f, 0xff, 0xfe, 0x83, 0x0b, 0x37, 0xfb, 0x35, 0xac, 0xff, + 0x37, 0x7f, 0x1c, 0xf3, 0x62, 0xca, 0x64, 0x5d, 0x68, 0xfe, 0xff, 0xff, + 0xb0, 0x8d, 0xd9, 0xa8, 0xde, 0xdf, 0xe6, 0x1a, 0xda, 0x7e, 0x96, 0x57, + 0x95, 0x7f, 0x94, 0x66, 0xbc, 0x29, 0xfc, 0x62, 0x82, 0x11, 0x53, 0x2b, + 0xc2, 0x0c, 0xb6, 0xab, 0xff, 0xcc, 0x3d, 0x87, 0x6d, 0x90, 0x37, 0x9b, + 0x8b, 0x2f, 0xde, 0x6f, 0xe1, 0xd6, 0x5a, 0x4b, 0x28, 0x52, 0x6e, 0x24, + 0x4f, 0x6d, 0x42, 0x2a, 0xe7, 0x84, 0x35, 0xff, 0xfe, 0x9f, 0xce, 0x53, + 0x6c, 0xf7, 0x6d, 0xcc, 0x1c, 0xf8, 0x62, 0xcb, 0xf4, 0xa3, 0xa9, 0x71, + 0x65, 0xff, 0xff, 0xff, 0xb0, 0x8d, 0xd8, 0xde, 0x08, 0xb9, 0x9b, 0xf0, + 0x72, 0x73, 0x7c, 0xc2, 0xf3, 0xdd, 0x02, 0x06, 0x92, 0xff, 0xff, 0xcc, + 0x60, 0xc3, 0xad, 0x81, 0x89, 0xf9, 0xdf, 0x83, 0xee, 0x9c, 0xc5, 0x97, + 0xff, 0xf6, 0x6f, 0x82, 0xd9, 0xc6, 0xd3, 0x81, 0xca, 0x68, 0x59, 0x5d, + 0xa3, 0x47, 0xce, 0xb6, 0x9f, 0xa4, 0xef, 0xd8, 0xa7, 0x91, 0xb9, 0x56, + 0x2a, 0x64, 0x0c, 0xa2, 0x6b, 0xf8, 0xd2, 0xcf, 0xf9, 0x96, 0x5c, 0x3c, + 0x59, 0x50, 0xcc, 0xab, 0xc8, 0x47, 0xb1, 0x17, 0xa9, 0x04, 0x8f, 0x0d, + 0x62, 0x95, 0x24, 0x12, 0xbd, 0xb2, 0xdb, 0x6e, 0xac, 0xb1, 0xd6, 0x5f, + 0xe7, 0x96, 0x1d, 0xc8, 0x0b, 0x2f, 0xb3, 0xd1, 0x32, 0xca, 0xda, 0x0f, + 0x93, 0xc2, 0x2e, 0x63, 0x77, 0x31, 0x65, 0xc7, 0xef, 0x61, 0xe4, 0xb1, + 0x9d, 0xb7, 0x16, 0x5f, 0xff, 0xfd, 0xd9, 0x66, 0xfd, 0x9c, 0x6c, 0x20, + 0x6c, 0x2c, 0xde, 0x59, 0xcd, 0xeb, 0x2f, 0x9c, 0xed, 0xc5, 0x97, 0xef, + 0x39, 0xdb, 0x8b, 0x2b, 0xc7, 0x91, 0xc2, 0x1a, 0xd2, 0x38, 0xca, 0x18, + 0x37, 0xff, 0xbc, 0x1c, 0x23, 0x76, 0x7f, 0xa9, 0x61, 0x2c, 0xbf, 0xd8, + 0xe7, 0xd9, 0xb7, 0x07, 0x59, 0x7f, 0xfa, 0x51, 0xcf, 0x07, 0x59, 0xff, + 0xb1, 0xd6, 0x50, 0xd1, 0x9d, 0xda, 0x6f, 0x46, 0xf7, 0xfe, 0x2c, 0x09, + 0xba, 0x68, 0x3e, 0x2c, 0xbf, 0xff, 0x06, 0x36, 0x16, 0x0f, 0xcc, 0x68, + 0xe0, 0xd0, 0x2c, 0xac, 0x4e, 0xf3, 0x50, 0xf5, 0x39, 0x91, 0x1e, 0xdf, + 0xfe, 0xff, 0xb3, 0x77, 0xf3, 0x66, 0xe3, 0x90, 0x16, 0x5f, 0xe8, 0x3b, + 0x97, 0x52, 0x85, 0x94, 0x48, 0x82, 0xfa, 0x85, 0xff, 0xd8, 0xc0, 0xd8, + 0x59, 0xbd, 0xb4, 0xeb, 0x29, 0x8f, 0x9f, 0xe4, 0x57, 0xc6, 0x6c, 0xe4, + 0xcb, 0x2d, 0xf5, 0x95, 0x06, 0xe1, 0xc9, 0xef, 0xfc, 0x53, 0x96, 0x6f, + 0xe0, 0x63, 0xa5, 0x97, 0xfd, 0xe8, 0xeb, 0x60, 0xa9, 0xbc, 0x0c, 0xb2, + 0xfd, 0xfe, 0xa4, 0xdb, 0x6b, 0x28, 0x67, 0xdf, 0xc4, 0x3a, 0x84, 0x69, + 0x4f, 0x0b, 0x0a, 0x92, 0xea, 0x7b, 0x4a, 0xb3, 0xe4, 0x65, 0x5f, 0x59, + 0x0c, 0x3c, 0x6f, 0xdb, 0xf7, 0x7f, 0x9e, 0x59, 0x7f, 0xec, 0xe0, 0x60, + 0xde, 0x46, 0xa6, 0x59, 0x4c, 0x7d, 0xa6, 0x16, 0xdf, 0x6a, 0x4e, 0x35, + 0x97, 0x3f, 0x6b, 0x2f, 0xda, 0xcd, 0xb6, 0x02, 0xcb, 0xfd, 0xdf, 0x9b, + 0xc4, 0x19, 0xd6, 0x5f, 0xa3, 0xa0, 0x6a, 0x16, 0x54, 0x8f, 0x77, 0xe6, + 0xb5, 0x3a, 0x2a, 0x4a, 0x10, 0xf7, 0xbf, 0x82, 0xb5, 0x94, 0x29, 0x4c, + 0x22, 0x21, 0x81, 0x85, 0x17, 0xfa, 0x33, 0xe0, 0x10, 0xa4, 0xb2, 0xec, + 0xf2, 0xca, 0x23, 0xc9, 0xdb, 0x33, 0xb8, 0xd8, 0x59, 0x76, 0x0d, 0x65, + 0x6d, 0x4c, 0x92, 0x99, 0xe1, 0x83, 0x29, 0xd7, 0xfc, 0x86, 0x5b, 0x91, + 0x72, 0x32, 0xaf, 0xc2, 0x04, 0x24, 0x9b, 0xc5, 0xef, 0xcd, 0xfe, 0x60, + 0x16, 0x5f, 0xbd, 0x9b, 0xdb, 0x7a, 0xcb, 0xff, 0xff, 0x13, 0xff, 0xd1, + 0x36, 0xc2, 0xcf, 0x37, 0xf8, 0x1e, 0xc3, 0x0b, 0x2e, 0xc0, 0x2c, 0xbf, + 0xf8, 0x80, 0x58, 0xd3, 0x7a, 0x08, 0xd5, 0x94, 0xc7, 0xb2, 0xe2, 0xd7, + 0xf4, 0xb9, 0xf6, 0x8e, 0x96, 0x5f, 0xff, 0xf3, 0xcd, 0xb3, 0x9c, 0xcf, + 0x6b, 0x58, 0x61, 0x61, 0x8e, 0x05, 0x97, 0xe8, 0x2f, 0x3c, 0x96, 0x5f, + 0xf7, 0xf2, 0x78, 0xe3, 0x6b, 0x16, 0x5e, 0x81, 0xc2, 0xca, 0x19, 0xfc, + 0xf4, 0x4c, 0x73, 0x8a, 0x59, 0x4b, 0x2f, 0xfb, 0xf9, 0x3c, 0x71, 0xb5, + 0x8b, 0x2f, 0x40, 0xe1, 0x65, 0xee, 0x3c, 0xdb, 0x11, 0x33, 0x06, 0x18, + 0x17, 0xd0, 0x59, 0xce, 0x2d, 0x84, 0x9e, 0xcf, 0xe3, 0x7c, 0xbe, 0xda, + 0x05, 0x50, 0xa3, 0x68, 0x59, 0x7c, 0xce, 0x43, 0x59, 0x63, 0x36, 0x1e, + 0xb8, 0xcd, 0xef, 0xd8, 0xfd, 0x4b, 0x8b, 0x2f, 0xe7, 0x9b, 0xf8, 0x5f, + 0x59, 0x40, 0x3d, 0x53, 0x0a, 0x2a, 0x49, 0x94, 0x34, 0x21, 0x79, 0x08, + 0x0b, 0xee, 0xfc, 0xdd, 0xac, 0xbe, 0x0f, 0xa0, 0xeb, 0x2f, 0xff, 0x83, + 0xad, 0x41, 0x61, 0xad, 0xef, 0x60, 0x8b, 0x2a, 0x11, 0x2d, 0x84, 0x9a, + 0x22, 0xbe, 0xf4, 0x04, 0x96, 0x5f, 0x05, 0xfa, 0xfa, 0xcb, 0x8b, 0xeb, + 0x2f, 0xff, 0xfe, 0x37, 0x35, 0xa6, 0x3e, 0xc9, 0xa4, 0x13, 0xf5, 0x2e, + 0x72, 0x35, 0xda, 0xcb, 0xbc, 0xeb, 0x2c, 0xec, 0x89, 0x0d, 0xef, 0x57, + 0xe8, 0x63, 0x60, 0xeb, 0x2f, 0x69, 0xba, 0x59, 0x78, 0x23, 0x85, 0x97, + 0xff, 0xcc, 0x36, 0x7f, 0xb3, 0xff, 0x67, 0x1a, 0x65, 0x95, 0x25, 0xf2, + 0x91, 0x93, 0xe1, 0x59, 0xb0, 0xc7, 0xe8, 0x82, 0x69, 0x65, 0xfa, 0x86, + 0x81, 0xcb, 0xbc, 0x42, 0xe4, 0x65, 0x0a, 0x6e, 0x14, 0xfc, 0x9f, 0x78, + 0xee, 0xd8, 0xe5, 0xb7, 0x56, 0x5e, 0x9e, 0x27, 0x59, 0x4b, 0x2f, 0xec, + 0x38, 0xfd, 0x9c, 0x59, 0x7e, 0x9f, 0x67, 0x6d, 0x3a, 0xcb, 0xfb, 0x9d, + 0xf6, 0xe4, 0x6a, 0xca, 0xda, 0x68, 0x95, 0x9c, 0x2f, 0x45, 0xbf, 0x2d, + 0xbf, 0xc5, 0xb3, 0x7f, 0x52, 0xe4, 0xcb, 0x2f, 0xff, 0xf0, 0xfd, 0x9f, + 0xfb, 0x97, 0x78, 0xda, 0x63, 0xc1, 0xab, 0x2e, 0x9f, 0xa5, 0x97, 0xef, + 0x3e, 0xe4, 0x01, 0x65, 0x0d, 0x1b, 0xac, 0x74, 0xec, 0x1b, 0xa3, 0x37, + 0xed, 0x82, 0x4f, 0x13, 0xac, 0xbf, 0x16, 0x79, 0xfe, 0xb2, 0xa4, 0x7a, + 0x73, 0x16, 0xdf, 0xc6, 0xb7, 0x5c, 0x0f, 0x16, 0x56, 0x8f, 0x4c, 0x88, + 0xea, 0x15, 0x13, 0x64, 0x64, 0x2d, 0x0e, 0x4b, 0xfd, 0x1b, 0x0b, 0x37, + 0xe7, 0x96, 0x59, 0x96, 0x5f, 0xf0, 0x4b, 0x64, 0xcd, 0x38, 0x66, 0x59, + 0x7f, 0x60, 0xe6, 0x94, 0x6e, 0x2c, 0xbf, 0xe3, 0x93, 0x9b, 0xe6, 0x9c, + 0xeb, 0x2f, 0xf8, 0xfc, 0x79, 0xb7, 0x7d, 0x93, 0xac, 0xa8, 0x3f, 0x8c, + 0x3a, 0xa9, 0xd3, 0x07, 0xd1, 0xf7, 0xe1, 0x53, 0x76, 0x12, 0xcb, 0xd2, + 0x80, 0x2c, 0xb6, 0x86, 0x6c, 0x70, 0x56, 0xf8, 0x1c, 0xdc, 0xed, 0x65, + 0x31, 0xe6, 0x84, 0x9a, 0xfc, 0x0c, 0xf8, 0x93, 0xac, 0xbf, 0xc5, 0x86, + 0x6e, 0xff, 0x3c, 0xb2, 0xfe, 0xe6, 0x7b, 0xec, 0x6a, 0xcb, 0xfe, 0xe7, + 0x83, 0x36, 0xc3, 0x37, 0x3a, 0x59, 0x63, 0x26, 0x45, 0x3f, 0x0d, 0xbe, + 0x5d, 0x6f, 0xac, 0xb7, 0x16, 0x5f, 0x8c, 0xfe, 0x7b, 0x61, 0xa6, 0x8b, + 0xa1, 0x1b, 0xd3, 0xc8, 0xd5, 0x95, 0x09, 0xc6, 0xe4, 0x34, 0x5d, 0x68, + 0x28, 0x74, 0x28, 0x5f, 0x16, 0x81, 0x49, 0x4a, 0xd9, 0x34, 0xeb, 0xb3, + 0x56, 0x8c, 0x5f, 0xd0, 0xb5, 0x28, 0xeb, 0xaf, 0xfe, 0x93, 0xf3, 0x27, + 0x7f, 0xcf, 0x86, 0x2c, 0xbf, 0xec, 0xf6, 0xc1, 0x1f, 0x73, 0xd8, 0xb2, + 0xfe, 0xf6, 0x77, 0x28, 0x3a, 0xcb, 0xfd, 0xec, 0x93, 0x96, 0x74, 0xb2, + 0xb0, 0xf8, 0x3e, 0x5d, 0x7f, 0xff, 0xe9, 0x44, 0xfd, 0x4b, 0x8c, 0x6e, + 0xce, 0x67, 0x6c, 0x70, 0xea, 0x75, 0x97, 0xfb, 0x0c, 0xd9, 0xe6, 0xc3, + 0xac, 0xbf, 0xfe, 0x9f, 0x18, 0xbe, 0x59, 0xbf, 0x67, 0x0c, 0x25, 0x97, + 0x38, 0x27, 0x44, 0x47, 0x0d, 0x6b, 0xa4, 0xca, 0xca, 0x1f, 0x97, 0xf7, + 0xb0, 0xba, 0x83, 0x56, 0x5f, 0xce, 0x5f, 0x0e, 0xa7, 0x59, 0x4c, 0xaa, + 0xd4, 0x08, 0xc5, 0x09, 0xef, 0xc6, 0x98, 0x61, 0x48, 0x85, 0xd7, 0x0f, + 0x75, 0x65, 0xec, 0x69, 0x96, 0x5f, 0xf9, 0xb2, 0x6d, 0x9c, 0x8f, 0x3e, + 0xe2, 0xcb, 0xfe, 0xc7, 0xeb, 0xd9, 0xf0, 0x3a, 0xcb, 0xff, 0x47, 0xb6, + 0x6b, 0x27, 0xc7, 0x3a, 0xcb, 0xff, 0xdc, 0x0e, 0x16, 0xc2, 0xcf, 0x79, + 0xc6, 0xb2, 0xff, 0x64, 0xfb, 0x26, 0x9c, 0x1a, 0x59, 0x52, 0x44, 0x1f, + 0xd2, 0xaf, 0x8a, 0x35, 0x0b, 0x2f, 0xff, 0xe1, 0xec, 0xe3, 0x6d, 0xc1, + 0x03, 0xd8, 0x58, 0xde, 0x59, 0x7f, 0xf9, 0xb6, 0xe0, 0x81, 0xec, 0x2c, + 0x6f, 0x2c, 0xbe, 0x2c, 0x3e, 0xc2, 0x45, 0x37, 0x17, 0x6f, 0xfb, 0xac, + 0x8e, 0xa6, 0x28, 0x3a, 0xcb, 0xfb, 0xae, 0x7b, 0x1f, 0x4b, 0x2f, 0xff, + 0xfc, 0xc7, 0xd3, 0x67, 0x44, 0x1f, 0xc7, 0xb6, 0x6f, 0x6f, 0xcd, 0x0b, + 0x29, 0xd1, 0x3d, 0xf2, 0xeb, 0xff, 0x41, 0x7e, 0x24, 0xc4, 0x6c, 0x2c, + 0xa9, 0xd5, 0xd9, 0x8c, 0x70, 0xd4, 0x3e, 0xce, 0x3a, 0x86, 0x1b, 0x11, + 0xcd, 0x0c, 0x6f, 0x1d, 0x7e, 0x1b, 0x1b, 0xc8, 0xaf, 0xff, 0xb1, 0xe7, + 0xf4, 0x37, 0xf9, 0x13, 0xe7, 0x16, 0x5f, 0xed, 0x4f, 0x0d, 0xac, 0x25, + 0x97, 0x8d, 0xe4, 0xcb, 0x2b, 0x0f, 0x47, 0xa3, 0x2b, 0x1d, 0x66, 0xc3, + 0x45, 0x7d, 0x33, 0x64, 0xeb, 0x2f, 0x16, 0x0d, 0x65, 0xfd, 0x80, 0xc0, + 0xea, 0x75, 0x97, 0xdb, 0x3c, 0xf3, 0x2c, 0xa8, 0x45, 0xa6, 0x11, 0xf4, + 0x46, 0x43, 0x7c, 0x2e, 0xbf, 0x14, 0x61, 0x93, 0xac, 0xbd, 0xb6, 0x1f, + 0xac, 0xbf, 0x7f, 0x84, 0xc6, 0xac, 0xa1, 0x41, 0xf8, 0x48, 0xa0, 0xe4, + 0x17, 0xf7, 0x5c, 0xcc, 0x23, 0x56, 0x5f, 0x1c, 0x48, 0x02, 0xcb, 0xff, + 0xd3, 0x8f, 0x4f, 0xd9, 0x66, 0xfd, 0x37, 0x16, 0x54, 0x23, 0x47, 0x0c, + 0xd8, 0xb8, 0x24, 0x77, 0x7f, 0x8b, 0x2f, 0xef, 0xf9, 0xe6, 0x10, 0xeb, + 0x29, 0x65, 0xbc, 0xb2, 0xbc, 0x5e, 0x38, 0x5d, 0xd9, 0xc5, 0x97, 0x3e, + 0x96, 0x58, 0x12, 0x35, 0x9a, 0x16, 0xbe, 0x79, 0x08, 0x35, 0x96, 0xfc, + 0x1e, 0x57, 0x89, 0xe9, 0xd3, 0x08, 0x02, 0x61, 0x42, 0x56, 0xe8, 0x1a, + 0xcb, 0xb8, 0xcb, 0x2e, 0xe8, 0x0b, 0x2b, 0xc7, 0x88, 0x2b, 0x16, 0x08, + 0xb5, 0xfd, 0xc8, 0xe8, 0x1a, 0x85, 0x97, 0x0d, 0x96, 0x54, 0x32, 0x86, + 0xa7, 0x64, 0xc9, 0x79, 0xbd, 0xc2, 0x89, 0xa3, 0x76, 0xd4, 0x71, 0x3e, + 0x3a, 0x78, 0xc7, 0xc9, 0xe3, 0x86, 0x7b, 0xcb, 0xaf, 0x6f, 0xf6, 0x2c, + 0xbe, 0x63, 0xc7, 0x96, 0x5f, 0x9f, 0xdb, 0x07, 0x0b, 0x29, 0x8f, 0xa3, + 0xc3, 0xdf, 0x21, 0xbf, 0xbe, 0x51, 0x2c, 0xfa, 0xcb, 0xec, 0x27, 0x92, + 0xcb, 0xef, 0xf0, 0x4e, 0x6c, 0x3c, 0xc1, 0x41, 0x65, 0xfe, 0xfb, 0x4f, + 0x9e, 0x0f, 0xd6, 0x5b, 0x16, 0x5e, 0xe4, 0x1a, 0xb2, 0xbc, 0x6b, 0x7e, + 0x21, 0x69, 0x96, 0x5f, 0xd8, 0x1c, 0xf7, 0x73, 0xac, 0xa8, 0x3c, 0x1e, + 0x09, 0x5f, 0xb6, 0x60, 0xf0, 0x96, 0x57, 0x47, 0x92, 0x44, 0x37, 0xbd, + 0x03, 0x59, 0x50, 0x8e, 0x9c, 0x85, 0x5c, 0xc4, 0x57, 0xff, 0xf0, 0x76, + 0x77, 0xe6, 0x19, 0x43, 0xcf, 0xdf, 0x9f, 0x4b, 0x2f, 0xec, 0xd0, 0x18, + 0xbe, 0xb2, 0xee, 0xba, 0x59, 0x63, 0xec, 0x3c, 0x53, 0x96, 0x5f, 0xbe, + 0xd3, 0x93, 0xac, 0xbf, 0xfb, 0xfc, 0xd9, 0xbb, 0xfc, 0xf7, 0xd8, 0xeb, + 0x2a, 0x47, 0xe2, 0x44, 0xf7, 0xf7, 0x9e, 0x47, 0xd3, 0x2c, 0xbf, 0xf8, + 0xd3, 0x5f, 0xfc, 0xf9, 0x47, 0x52, 0x59, 0x7f, 0x66, 0x39, 0x7f, 0x8b, + 0x2f, 0xc5, 0x12, 0xcf, 0xac, 0xa2, 0x3d, 0x1f, 0x95, 0xd4, 0x22, 0xe6, + 0x50, 0x98, 0xb9, 0xb8, 0xb2, 0xc7, 0x59, 0x7b, 0x59, 0xd2, 0xcb, 0xd8, + 0xd3, 0xac, 0xbe, 0x83, 0x9d, 0x96, 0x5b, 0x27, 0x37, 0xbf, 0x1c, 0xa1, + 0xa2, 0xa3, 0xc2, 0xc0, 0x11, 0x25, 0xab, 0xe9, 0xc3, 0xae, 0xd6, 0x5f, + 0xf1, 0xb0, 0x52, 0xcf, 0x31, 0xd6, 0x5c, 0xe6, 0xce, 0x7b, 0xbf, 0x25, + 0xbf, 0x37, 0x39, 0x07, 0x59, 0x4c, 0x8e, 0xf2, 0x84, 0xce, 0xf2, 0xfa, + 0x85, 0xe7, 0x2c, 0x7a, 0x35, 0x05, 0xa3, 0x4a, 0xd1, 0xa1, 0xe1, 0x48, + 0xf0, 0x9b, 0x01, 0x09, 0x43, 0x98, 0x31, 0xdf, 0x5f, 0x86, 0xc4, 0xe3, + 0x59, 0x7b, 0x83, 0xe9, 0x65, 0xc0, 0xed, 0x65, 0xff, 0xec, 0x9b, 0xd0, + 0x46, 0x96, 0x7f, 0xc1, 0x59, 0x46, 0x9f, 0x17, 0x86, 0x2f, 0xbb, 0x0b, + 0xc9, 0x65, 0x6c, 0x46, 0x34, 0xa1, 0x01, 0xd1, 0x1d, 0x32, 0x64, 0x9a, + 0x87, 0x65, 0xfd, 0xaf, 0x66, 0x83, 0x8b, 0x2f, 0xff, 0xec, 0xea, 0x5c, + 0xff, 0xa0, 0xf0, 0xc3, 0xd9, 0x1b, 0x52, 0xca, 0xc4, 0x47, 0xb1, 0x6d, + 0xff, 0x68, 0xb2, 0x79, 0xc3, 0xa9, 0xd6, 0x5f, 0xc5, 0xb3, 0xbe, 0x00, + 0x6b, 0x2a, 0x0f, 0xb5, 0xcf, 0x2f, 0xfc, 0x1e, 0x6c, 0x38, 0x9e, 0x7f, + 0x42, 0xcb, 0xf6, 0x7c, 0x39, 0xd2, 0xcb, 0xc6, 0xe7, 0x4b, 0x2e, 0x89, + 0xb6, 0x1e, 0x37, 0xca, 0x28, 0x91, 0x70, 0x18, 0x44, 0x5f, 0xff, 0xc6, + 0x7f, 0x18, 0xfb, 0x0b, 0x3b, 0x6d, 0x69, 0xa7, 0x59, 0x7f, 0xff, 0xfe, + 0x09, 0x6c, 0x31, 0xfa, 0x96, 0x9c, 0x1b, 0x38, 0x18, 0xeb, 0xd8, 0xc5, + 0x86, 0xac, 0xbf, 0xff, 0xff, 0xdd, 0xe7, 0x65, 0x9f, 0xf0, 0x7c, 0xfd, + 0x4b, 0x9f, 0xd6, 0x19, 0x8c, 0x3f, 0xf1, 0x96, 0x5f, 0xff, 0xef, 0x87, + 0x0b, 0x63, 0x67, 0xca, 0x01, 0xb3, 0x18, 0x6b, 0x2f, 0xf8, 0xf8, 0x7d, + 0x87, 0xdc, 0xdf, 0x25, 0x97, 0xff, 0xff, 0xb3, 0x66, 0x84, 0xe4, 0x6c, + 0xe3, 0x61, 0x4d, 0xcf, 0xb6, 0x4e, 0x50, 0xb2, 0xb4, 0x98, 0xe9, 0xd8, + 0x7c, 0x83, 0x7f, 0xfd, 0xad, 0x67, 0xf9, 0xe6, 0xcd, 0x9e, 0x04, 0x2c, + 0xa8, 0x54, 0x60, 0xd1, 0xd7, 0x04, 0xc6, 0xff, 0xfe, 0x8f, 0x60, 0xcd, + 0x0c, 0x7b, 0x3f, 0x07, 0x7f, 0xac, 0xa8, 0x57, 0x4f, 0x8b, 0xde, 0x95, + 0x72, 0x13, 0x6b, 0xff, 0xff, 0xe6, 0x9b, 0xd9, 0xcd, 0x67, 0x7b, 0x3c, + 0xd8, 0x59, 0xbc, 0xb0, 0x61, 0x25, 0x97, 0xec, 0x2e, 0xc4, 0x3a, 0xcb, + 0xff, 0xbd, 0x90, 0x53, 0x16, 0x7f, 0x8e, 0xb2, 0xd2, 0x24, 0x75, 0x7d, + 0xff, 0x74, 0xa6, 0xff, 0xdb, 0xbf, 0x8e, 0x4d, 0x27, 0xd4, 0xeb, 0x2f, + 0x7d, 0x8d, 0x59, 0x76, 0x1f, 0x61, 0xf0, 0x8a, 0x11, 0x2f, 0xfe, 0x69, + 0xdc, 0xe7, 0x6d, 0x83, 0x6d, 0xeb, 0x28, 0x67, 0xf7, 0xa3, 0x3b, 0xd3, + 0x36, 0xe2, 0xcb, 0xff, 0xfb, 0xed, 0x3e, 0x0f, 0x61, 0xde, 0x5a, 0x69, + 0xdc, 0xeb, 0x2f, 0xf4, 0xee, 0x72, 0x8d, 0x4c, 0xb2, 0xff, 0xba, 0xc3, + 0x40, 0x7c, 0xd9, 0xac, 0x44, 0x93, 0x2f, 0x5f, 0x01, 0xde, 0x65, 0x96, + 0x85, 0x97, 0xb0, 0xa7, 0xd8, 0x6c, 0xbb, 0x22, 0xbf, 0xfe, 0xc0, 0xeb, + 0x64, 0xde, 0x09, 0xad, 0x84, 0x6a, 0xcb, 0xf8, 0xe1, 0x06, 0xc3, 0xe9, + 0x65, 0xff, 0xf3, 0xfe, 0x34, 0x13, 0xb7, 0x36, 0x72, 0x5c, 0x59, 0x7f, + 0xda, 0x9e, 0x27, 0x9c, 0x3a, 0x9d, 0x65, 0xff, 0xb6, 0x4d, 0xe0, 0x9a, + 0xd8, 0x46, 0xac, 0xbf, 0xc5, 0xb3, 0x81, 0xdb, 0x0e, 0x96, 0x56, 0x1f, + 0xe0, 0x50, 0xef, 0xff, 0xfd, 0x1d, 0x6e, 0xfe, 0x0b, 0x27, 0xd9, 0x38, + 0x75, 0x2f, 0xc4, 0xdc, 0x59, 0x50, 0x9a, 0x87, 0x21, 0x74, 0x12, 0x1b, + 0xf0, 0xf3, 0xa7, 0x25, 0x97, 0xff, 0x6c, 0xe7, 0x83, 0xb3, 0xfc, 0xe4, + 0x69, 0x65, 0xff, 0xfd, 0x1a, 0x06, 0xc8, 0xde, 0xfe, 0x8d, 0x6b, 0x3f, + 0xc5, 0x95, 0x3a, 0x2a, 0x3c, 0x95, 0x7f, 0xe9, 0x47, 0xc3, 0xde, 0xce, + 0x7d, 0x96, 0x5f, 0xff, 0x7a, 0x27, 0xd8, 0x59, 0xbd, 0xfd, 0xe8, 0xe9, + 0x65, 0xff, 0xff, 0x75, 0xc6, 0xc3, 0x36, 0x7b, 0x3f, 0xcc, 0x9f, 0x66, + 0x30, 0xd6, 0x50, 0xd1, 0x81, 0x8a, 0x97, 0xff, 0x67, 0xdb, 0xa9, 0x14, + 0x6c, 0xdd, 0xed, 0x65, 0xff, 0xf4, 0x75, 0x2e, 0x79, 0xb3, 0xfd, 0x49, + 0xbc, 0xb2, 0xff, 0x8b, 0x35, 0x9d, 0xe3, 0x0d, 0x65, 0xfd, 0x3f, 0xe6, + 0x28, 0x3a, 0xcb, 0xf3, 0xc4, 0xd1, 0x32, 0xcb, 0xf6, 0x0f, 0xc1, 0x31, + 0x65, 0xd1, 0x36, 0xc3, 0xd1, 0x22, 0x8b, 0xff, 0xfb, 0x27, 0xc6, 0x19, + 0x07, 0xdb, 0x20, 0x6f, 0x37, 0x16, 0x5f, 0xd9, 0xe6, 0xd7, 0x9d, 0x65, + 0xfb, 0xcd, 0xaf, 0x3a, 0xcb, 0xb0, 0xcd, 0x87, 0xa7, 0x85, 0x95, 0x0b, + 0x8e, 0xf9, 0x0c, 0xfe, 0x89, 0x1a, 0x30, 0x29, 0x88, 0xb4, 0x95, 0xe5, + 0x17, 0x37, 0x28, 0x40, 0x70, 0xbf, 0xf0, 0xb0, 0xbe, 0xfe, 0x60, 0xd6, + 0x54, 0xed, 0x85, 0x28, 0xe1, 0x1c, 0x6c, 0x36, 0x3b, 0x97, 0x9d, 0xd4, + 0x65, 0xcd, 0x18, 0xa4, 0xc4, 0x5a, 0x85, 0x91, 0xe1, 0x0b, 0xe3, 0x50, + 0x2a, 0x11, 0x8f, 0x23, 0xa2, 0xfc, 0xe5, 0x66, 0xec, 0x2b, 0x6f, 0xff, + 0x9b, 0x98, 0x39, 0xf0, 0xcd, 0x84, 0x59, 0xd2, 0xcb, 0xfd, 0xf2, 0xcf, + 0xfb, 0x27, 0x59, 0x7f, 0x7f, 0x99, 0x13, 0x9d, 0x65, 0xfe, 0xd9, 0xac, + 0xea, 0x4c, 0x75, 0x95, 0xa3, 0xe4, 0x30, 0xba, 0xff, 0xcf, 0xaf, 0x67, + 0xe0, 0x98, 0x0b, 0x2d, 0xba, 0xb2, 0xff, 0xf8, 0xb2, 0x7d, 0x80, 0x0f, + 0xf3, 0x0e, 0x03, 0x16, 0x5f, 0x4b, 0xed, 0x3a, 0xcb, 0xfd, 0xdb, 0x73, + 0x07, 0xb0, 0x6b, 0x2f, 0xee, 0xa5, 0xcd, 0x9f, 0x65, 0x96, 0xcf, 0x1f, + 0x39, 0x86, 0xd7, 0xfe, 0x94, 0x60, 0x3d, 0x98, 0x5d, 0xac, 0xbf, 0xfd, + 0xe6, 0x21, 0xec, 0x13, 0xb2, 0xcf, 0x62, 0xcb, 0xfe, 0x7f, 0xf2, 0x69, + 0x04, 0xbe, 0xb2, 0xb1, 0x18, 0x73, 0x1e, 0x81, 0x32, 0xff, 0xbc, 0xc7, + 0x8c, 0x2f, 0xf1, 0x65, 0xff, 0xfe, 0x0f, 0xf4, 0x19, 0xb6, 0x7e, 0x6f, + 0x04, 0x1f, 0x6c, 0xdd, 0x59, 0x7d, 0x1d, 0xc1, 0xf6, 0x23, 0x47, 0xb3, + 0x02, 0x37, 0xa8, 0x57, 0xd9, 0x90, 0x97, 0xec, 0x8d, 0x8f, 0x34, 0x28, + 0xea, 0x65, 0x08, 0xad, 0xd8, 0xef, 0x2f, 0xff, 0xed, 0x63, 0x9f, 0x61, + 0xaf, 0xd7, 0xb3, 0xde, 0x8f, 0xac, 0xbe, 0xcc, 0x07, 0x16, 0x5f, 0x66, + 0xa6, 0x92, 0xcb, 0xff, 0x9b, 0xa9, 0x73, 0x60, 0xdb, 0x7c, 0x0d, 0x65, + 0xee, 0xa3, 0x71, 0x65, 0x1a, 0x7d, 0x2e, 0x93, 0x7d, 0x9e, 0x7d, 0xeb, + 0x2f, 0xe9, 0x67, 0xb3, 0x7f, 0x16, 0x5b, 0x06, 0x7a, 0x53, 0x11, 0xdf, + 0xff, 0x78, 0x3c, 0xd9, 0xe6, 0xff, 0xb3, 0x51, 0xbd, 0x65, 0xfb, 0x8d, + 0x9d, 0x1d, 0x65, 0x0c, 0xff, 0x3e, 0xa9, 0x7f, 0x67, 0x45, 0x98, 0x05, + 0x95, 0x87, 0x9c, 0x44, 0x57, 0xf1, 0x47, 0x5e, 0xc9, 0xd6, 0x5d, 0x07, + 0x1a, 0xa6, 0x1c, 0x21, 0x36, 0x11, 0x9a, 0x74, 0x28, 0x79, 0x7c, 0x82, + 0xff, 0xed, 0x41, 0x9b, 0xa5, 0x06, 0x75, 0x2e, 0x2c, 0xb4, 0x2c, 0xbe, + 0x6d, 0x3f, 0x4b, 0x2d, 0xf6, 0x36, 0x5c, 0x10, 0xa1, 0xa2, 0x89, 0x9f, + 0x2f, 0xf9, 0xcb, 0xbf, 0x31, 0xca, 0x16, 0x5f, 0xfc, 0x32, 0x79, 0xa6, + 0x8f, 0x83, 0x38, 0xb2, 0xff, 0xf8, 0xa2, 0x7f, 0x43, 0x7f, 0x8c, 0x5d, + 0x49, 0x65, 0xc7, 0x11, 0x65, 0xd1, 0x32, 0xca, 0x83, 0x5e, 0xc3, 0x17, + 0xff, 0x36, 0xf6, 0x1e, 0xc8, 0x98, 0x6e, 0x62, 0xcb, 0xff, 0xff, 0xc4, + 0xc6, 0xf9, 0xe6, 0xd8, 0x41, 0xdd, 0xd9, 0x9d, 0x4b, 0x02, 0x40, 0xe2, + 0xcb, 0xff, 0xe6, 0x97, 0xf9, 0x9b, 0xf5, 0x80, 0xe3, 0xf6, 0xb2, 0xff, + 0xd8, 0x3c, 0x73, 0x76, 0x18, 0xe6, 0x2c, 0xbf, 0x79, 0xa0, 0xa7, 0x59, + 0x47, 0x4c, 0xef, 0xd0, 0x80, 0x25, 0x2d, 0xe8, 0x57, 0xff, 0xf0, 0x46, + 0xe4, 0x0d, 0x9f, 0xcf, 0x47, 0xf5, 0x83, 0x59, 0x7c, 0x76, 0x63, 0x16, + 0x54, 0x23, 0x0a, 0x48, 0x8e, 0xb9, 0x44, 0xaa, 0x4f, 0x83, 0xff, 0x94, + 0x8d, 0x7f, 0xb5, 0x13, 0xf9, 0xb0, 0x6b, 0x2f, 0xa2, 0x6e, 0x32, 0xca, + 0x92, 0xe1, 0xe0, 0xc8, 0xb0, 0xdf, 0xb4, 0x56, 0x96, 0x23, 0xa3, 0x82, + 0x33, 0xbf, 0xff, 0xa5, 0x1a, 0x34, 0xe4, 0xdd, 0x4b, 0x83, 0xd3, 0x4e, + 0xb2, 0xff, 0xff, 0x71, 0x82, 0x3d, 0x86, 0x93, 0x8c, 0x39, 0xed, 0x93, + 0x4c, 0xb2, 0xd9, 0x32, 0x31, 0xb8, 0xbd, 0x7a, 0x26, 0xe2, 0xcb, 0x82, + 0x35, 0x97, 0xf7, 0x08, 0xb0, 0x1c, 0x59, 0x53, 0x1e, 0x1f, 0xc5, 0xef, + 0xff, 0xfc, 0xe3, 0xc2, 0x7f, 0xf3, 0x34, 0x00, 0x46, 0x75, 0xfe, 0x32, + 0xca, 0x87, 0x42, 0xff, 0x95, 0x8a, 0xe7, 0x71, 0x88, 0xb4, 0xe1, 0xf6, + 0xa1, 0x05, 0xe9, 0x57, 0xef, 0x3a, 0x96, 0x51, 0x99, 0x7c, 0xa4, 0x2c, + 0x06, 0x11, 0xdf, 0xd1, 0x26, 0x1e, 0x12, 0xcb, 0xe2, 0xfb, 0x6f, 0x59, + 0x7d, 0x20, 0xbf, 0xd6, 0x5d, 0x1b, 0x8b, 0x2e, 0x0e, 0xe2, 0xcb, 0xd0, + 0x50, 0xb2, 0xbb, 0x3c, 0xdd, 0x0c, 0x9c, 0x6a, 0xa1, 0x18, 0x58, 0x46, + 0xcd, 0xf7, 0xdf, 0xe3, 0x81, 0x65, 0xff, 0xde, 0x6d, 0x8d, 0xa0, 0xce, + 0xfa, 0xed, 0x65, 0xf3, 0x79, 0xe7, 0x59, 0x7e, 0x82, 0x39, 0xa6, 0xac, + 0xbf, 0xcd, 0xc6, 0x08, 0xac, 0x70, 0xb2, 0xf4, 0x7e, 0x16, 0x50, 0xcf, + 0xeb, 0xe5, 0x3b, 0xcd, 0xaf, 0xde, 0x3b, 0x17, 0x6b, 0x2f, 0xb3, 0xed, + 0xc5, 0x95, 0x87, 0x93, 0xc2, 0x8b, 0xd2, 0x83, 0xac, 0xb9, 0xc4, 0x59, + 0x5e, 0x36, 0x7c, 0x1c, 0xbf, 0xf7, 0xfc, 0xd9, 0x83, 0x2c, 0x31, 0x65, + 0x61, 0xef, 0x31, 0x0d, 0xff, 0xb9, 0x13, 0x67, 0x9b, 0x5e, 0x75, 0x97, + 0x67, 0x96, 0x53, 0x1e, 0xa1, 0xcf, 0xaf, 0x69, 0x8d, 0x59, 0x7f, 0xfc, + 0x1c, 0x6f, 0x67, 0x7e, 0x6d, 0x86, 0x1f, 0xb5, 0x97, 0xbf, 0x86, 0x2c, + 0xb8, 0x33, 0x91, 0xf8, 0xfd, 0x52, 0xf4, 0xe1, 0xfa, 0xcb, 0xef, 0x33, + 0x81, 0x65, 0x61, 0xbf, 0xf8, 0xf5, 0x62, 0x23, 0x40, 0xdb, 0x7e, 0x08, + 0xac, 0x9f, 0xeb, 0x2f, 0xd3, 0xb9, 0x7f, 0x8b, 0x2f, 0xef, 0x3c, 0xfb, + 0x25, 0xf5, 0x97, 0xe2, 0x04, 0x36, 0xf5, 0x97, 0xe9, 0x84, 0xe4, 0x62, + 0xca, 0x63, 0xd1, 0x72, 0x8b, 0xf3, 0xe8, 0xba, 0x65, 0x97, 0xa6, 0x8f, + 0xac, 0xa8, 0x4c, 0xe7, 0x0a, 0xd8, 0xa3, 0xd0, 0x82, 0xf9, 0x00, 0x49, + 0xef, 0x79, 0xc9, 0x65, 0x4e, 0xbd, 0x98, 0x38, 0x76, 0xe1, 0x69, 0xa4, + 0x5d, 0xa4, 0x34, 0x27, 0x26, 0x7a, 0x3c, 0x2c, 0xbc, 0xe8, 0xe4, 0x25, + 0x18, 0xdf, 0xe3, 0x5b, 0x31, 0x6a, 0xe6, 0xe9, 0x65, 0x85, 0x2b, 0x2f, + 0x7e, 0x0e, 0xb2, 0x85, 0x06, 0xc4, 0x85, 0x6e, 0x94, 0xeb, 0x2e, 0xe8, + 0xd5, 0x97, 0xf1, 0xde, 0x5a, 0xc3, 0x16, 0x5d, 0x9d, 0x0c, 0xf1, 0xf0, + 0x66, 0xf8, 0x53, 0xcf, 0xe2, 0xcb, 0xee, 0xf0, 0x80, 0xb2, 0xff, 0xde, + 0x82, 0x8e, 0xf5, 0x18, 0x4b, 0x29, 0xcf, 0x7b, 0xe4, 0x57, 0xf6, 0x4f, + 0x06, 0xbf, 0x16, 0x5f, 0xde, 0x61, 0xb6, 0xbb, 0x59, 0x7f, 0xfe, 0x7e, + 0x87, 0xa2, 0x73, 0x0b, 0x00, 0x0c, 0x02, 0xcb, 0xba, 0xe6, 0xc4, 0x69, + 0x0c, 0x87, 0xb2, 0xef, 0x97, 0x5f, 0xef, 0x43, 0x13, 0xe8, 0xd5, 0x97, + 0xf4, 0x31, 0x3e, 0x8d, 0x59, 0x7d, 0xad, 0x36, 0xb6, 0x1e, 0xf7, 0x8c, + 0xaf, 0xf7, 0x65, 0x93, 0x69, 0xf7, 0xac, 0xb3, 0x80, 0xfc, 0x48, 0xee, + 0xf1, 0x61, 0xd6, 0x5b, 0xa5, 0x97, 0x3c, 0xa4, 0x6b, 0x78, 0x37, 0x7f, + 0xff, 0xfb, 0x61, 0xe3, 0x3f, 0xb3, 0x24, 0xdb, 0xcb, 0x39, 0xb2, 0x06, + 0xf3, 0x71, 0x65, 0xe3, 0x38, 0x05, 0x97, 0xf6, 0x1c, 0x6e, 0xfd, 0xac, + 0xb8, 0xbb, 0xd8, 0x79, 0x7e, 0x1e, 0xa9, 0x23, 0xe5, 0xe1, 0x93, 0x5d, + 0xae, 0x84, 0xb2, 0x44, 0xc4, 0x9a, 0x5f, 0x39, 0x6b, 0xc6, 0xac, 0x08, + 0xc7, 0x09, 0x4c, 0x31, 0x92, 0xde, 0xe7, 0xd9, 0x65, 0xe9, 0x81, 0xd2, + 0xcb, 0xd0, 0x6e, 0xce, 0xcd, 0xd8, 0x07, 0x2f, 0x80, 0x00, 0xee, 0x2c, + 0xb0, 0x16, 0x5f, 0xb5, 0x3c, 0x6a, 0x75, 0x97, 0xe6, 0x2f, 0x88, 0x75, + 0x95, 0x07, 0xa4, 0x02, 0xab, 0xd2, 0xe6, 0x2c, 0xbf, 0x0a, 0x4a, 0x30, + 0x0b, 0x2b, 0x47, 0x8c, 0x01, 0xcb, 0xff, 0x36, 0x19, 0xc0, 0xcc, 0x50, + 0x75, 0x97, 0x82, 0xfc, 0x59, 0x52, 0x47, 0x26, 0x33, 0x9c, 0x88, 0x43, + 0xfb, 0xfc, 0x61, 0xe1, 0xb4, 0x1d, 0xc5, 0x97, 0x10, 0x56, 0x52, 0xcb, + 0xa3, 0x5b, 0x0d, 0x0f, 0x05, 0xab, 0x11, 0x0c, 0x15, 0x8b, 0xff, 0xf9, + 0xb5, 0xb3, 0x1b, 0x08, 0xdf, 0x36, 0x1f, 0x3b, 0x59, 0x7f, 0xd9, 0xd4, + 0xb9, 0xd4, 0x83, 0xa5, 0x97, 0xff, 0xfe, 0x3f, 0x3b, 0xf4, 0x77, 0xd4, + 0x88, 0x23, 0xd8, 0xc6, 0xb9, 0x01, 0x65, 0xff, 0xfe, 0x9f, 0x50, 0x7e, + 0x06, 0x36, 0x46, 0xa0, 0x7e, 0x83, 0xac, 0xac, 0x46, 0xab, 0x39, 0x5f, + 0xf4, 0xb6, 0x46, 0xcf, 0xfb, 0x09, 0x65, 0x62, 0x79, 0x2c, 0xb7, 0xa8, + 0xc4, 0x5c, 0x86, 0xfc, 0x0e, 0x37, 0x46, 0x2c, 0xbf, 0x75, 0x07, 0x9e, + 0x16, 0x5f, 0x75, 0x26, 0xf2, 0xcb, 0xda, 0xce, 0xbc, 0x79, 0x9f, 0x29, + 0xbf, 0xba, 0x79, 0x14, 0x1d, 0x65, 0xff, 0xff, 0x14, 0xde, 0xce, 0xa5, + 0x04, 0x3d, 0x85, 0x9b, 0xf4, 0xdc, 0x59, 0x7f, 0xc5, 0x37, 0xcb, 0x27, + 0x72, 0x59, 0x4c, 0x8a, 0x20, 0xb5, 0x5f, 0xff, 0xfe, 0xd6, 0x9a, 0x7d, + 0x9e, 0xcf, 0x94, 0x4d, 0xec, 0x9e, 0x3a, 0xf8, 0x7b, 0x59, 0x7f, 0xff, + 0xf4, 0x1b, 0xe8, 0xd8, 0x58, 0x13, 0x76, 0x75, 0x2e, 0x31, 0x09, 0x13, + 0xac, 0xbf, 0x10, 0x38, 0x41, 0x59, 0x7e, 0xeb, 0x8d, 0x84, 0xb2, 0xb1, + 0x18, 0xec, 0xf2, 0x12, 0x7b, 0xff, 0xec, 0xdd, 0x2c, 0x3b, 0x97, 0xf9, + 0xb2, 0x0c, 0x59, 0x50, 0xaa, 0xdf, 0x21, 0x9e, 0xc4, 0x5e, 0x8d, 0x14, + 0x25, 0xd7, 0xfe, 0xf9, 0xce, 0xf3, 0x6c, 0x2c, 0x31, 0x65, 0xff, 0xda, + 0x2e, 0xb3, 0x81, 0x98, 0xa0, 0xeb, 0x2f, 0xf9, 0x8d, 0xf4, 0x34, 0xf0, + 0x6a, 0xca, 0x63, 0xff, 0xe2, 0x2d, 0x6c, 0x47, 0x14, 0xa1, 0x83, 0x7f, + 0xee, 0x67, 0x52, 0x6d, 0x17, 0x58, 0xb2, 0xff, 0x06, 0x62, 0xcf, 0x3f, + 0xd6, 0x54, 0xe7, 0xe4, 0x47, 0xf7, 0xff, 0x48, 0x20, 0xe1, 0x67, 0x39, + 0x06, 0x2c, 0xbe, 0x33, 0x64, 0xec, 0xb2, 0xfe, 0x83, 0x07, 0xe7, 0x3a, + 0xca, 0xc3, 0xd4, 0xf1, 0x35, 0xff, 0xb2, 0x6f, 0x43, 0x13, 0xe8, 0xd5, + 0x97, 0xfc, 0x7c, 0xe6, 0xc9, 0x8a, 0x0e, 0xb2, 0xff, 0xfd, 0xc9, 0xdf, + 0x60, 0xfd, 0x1a, 0xd6, 0x6f, 0x8e, 0x96, 0x50, 0xd1, 0xeb, 0xa2, 0x13, + 0x9f, 0x7c, 0xee, 0xff, 0xfd, 0x19, 0x3e, 0xc1, 0xe9, 0xa7, 0xfb, 0x61, + 0x4e, 0xb2, 0xfb, 0x7e, 0x07, 0xb5, 0x97, 0xff, 0xfc, 0xfa, 0xf6, 0x7d, + 0xb0, 0xa7, 0xe4, 0x61, 0x0f, 0xd0, 0xb2, 0xda, 0x59, 0x7f, 0x66, 0xef, + 0xd8, 0xa7, 0x59, 0x77, 0xf6, 0x4e, 0x78, 0x24, 0x23, 0x58, 0x8f, 0x9e, + 0x89, 0x5e, 0x14, 0x97, 0xff, 0xfe, 0xeb, 0x27, 0x0e, 0xee, 0xce, 0xa5, + 0xf8, 0x33, 0x66, 0x68, 0x00, 0x85, 0x97, 0xfd, 0x93, 0x6d, 0x87, 0xf9, + 0xd7, 0xd6, 0x5e, 0xcd, 0x0d, 0x65, 0xd1, 0x25, 0x97, 0xff, 0xdc, 0xd9, + 0xa8, 0xef, 0x0a, 0x69, 0x67, 0xf8, 0xb2, 0xb1, 0x18, 0x67, 0x3e, 0x00, + 0xe0, 0x45, 0xaf, 0xfe, 0x9d, 0xcb, 0x3d, 0x9f, 0xd6, 0x18, 0xb2, 0xff, + 0xff, 0xfd, 0x81, 0x34, 0x83, 0xf9, 0xb3, 0xed, 0xd4, 0x8a, 0x0b, 0x3c, + 0xd9, 0xa9, 0x96, 0x56, 0x23, 0x1f, 0xa4, 0x4b, 0xfe, 0xc3, 0x3d, 0x06, + 0xe7, 0xf8, 0xb2, 0xff, 0xe7, 0x29, 0xce, 0x16, 0x1b, 0x13, 0x2c, 0xa6, + 0x3f, 0xc3, 0x0e, 0xaf, 0xe9, 0xba, 0x90, 0x63, 0xeb, 0x2f, 0xf8, 0x3d, + 0x7b, 0x3f, 0xac, 0x31, 0x65, 0xff, 0xfd, 0x28, 0xd7, 0x52, 0xe6, 0xcf, + 0x43, 0x13, 0xe8, 0xd5, 0x97, 0xe9, 0x7c, 0xb2, 0x4b, 0x2f, 0xfd, 0xd0, + 0xfc, 0x17, 0xe1, 0x60, 0xd6, 0x56, 0x1f, 0x30, 0x49, 0xef, 0xf9, 0xff, + 0xfc, 0x9a, 0x4d, 0xf5, 0x97, 0xf6, 0x1a, 0x6b, 0xff, 0x8b, 0x2f, 0xb3, + 0xcf, 0xf5, 0x97, 0x39, 0xf6, 0x1e, 0x81, 0x17, 0xd4, 0x22, 0xdf, 0xd0, + 0x89, 0xb8, 0x06, 0x2c, 0xbe, 0xdb, 0xcd, 0x42, 0xcb, 0x66, 0x8d, 0xe6, + 0xf1, 0x8a, 0x85, 0x52, 0x58, 0x61, 0xd1, 0xdf, 0xa1, 0x89, 0xc8, 0x6c, + 0x7d, 0x8e, 0xff, 0xec, 0xff, 0x36, 0x6b, 0x1b, 0xd0, 0x35, 0x97, 0xfd, + 0xef, 0x47, 0x5b, 0x0c, 0x3f, 0x6b, 0x2f, 0xec, 0xfe, 0xb5, 0x92, 0x59, + 0x4b, 0x2f, 0xd9, 0xe2, 0xce, 0xd6, 0x50, 0x0d, 0x91, 0x05, 0xd4, 0xc7, + 0xff, 0xf5, 0xfb, 0xd9, 0xd7, 0xd6, 0x5f, 0xec, 0x1b, 0x6f, 0xfb, 0x69, + 0x65, 0xd9, 0xcd, 0x87, 0xe9, 0xb8, 0x46, 0xe3, 0xb4, 0xe9, 0xb8, 0x14, + 0x66, 0x57, 0xfd, 0x87, 0xf4, 0x36, 0x83, 0xb8, 0xb2, 0xfe, 0xfb, 0x4e, + 0x4e, 0x75, 0x95, 0x3b, 0x66, 0x12, 0x38, 0xfa, 0xf1, 0x04, 0xd7, 0x6e, + 0xe5, 0x75, 0xf5, 0x19, 0xb3, 0x42, 0x72, 0x62, 0x2d, 0x47, 0x1c, 0x73, + 0xdf, 0x46, 0xa2, 0xe6, 0x80, 0x8c, 0xec, 0xa3, 0x03, 0xe4, 0x27, 0xff, + 0x2a, 0xd0, 0x2c, 0x5b, 0xe3, 0xb5, 0x10, 0xa3, 0x74, 0xee, 0xff, 0xa0, + 0xe5, 0x83, 0xd3, 0x4e, 0xb2, 0xff, 0xff, 0x19, 0xe0, 0xc7, 0x5b, 0x35, + 0xa8, 0x9c, 0x9d, 0xf4, 0x6a, 0xcb, 0xfc, 0x58, 0x1c, 0x36, 0x40, 0x59, + 0x4e, 0x89, 0x93, 0x19, 0xaa, 0x48, 0xf4, 0xc8, 0x68, 0xde, 0x36, 0x34, + 0xb2, 0xff, 0xfa, 0x36, 0x79, 0xf7, 0xec, 0xc3, 0x9e, 0x34, 0x6a, 0xcb, + 0xf0, 0x0f, 0x99, 0xf5, 0x97, 0xfd, 0x9b, 0x35, 0x9e, 0x2c, 0x99, 0x65, + 0x61, 0xf0, 0x91, 0x3d, 0xff, 0xfe, 0xf3, 0x83, 0x9b, 0x0b, 0x37, 0x96, + 0x73, 0x0f, 0x1d, 0xac, 0xbf, 0xff, 0xfe, 0xd0, 0x4e, 0xdc, 0xd9, 0x34, + 0x82, 0x5f, 0xd9, 0xe8, 0x93, 0x16, 0x1e, 0x16, 0x5b, 0x8b, 0x2f, 0xdf, + 0xd9, 0xdf, 0xce, 0xb2, 0xa1, 0x17, 0xcf, 0x08, 0x10, 0x88, 0xd4, 0xca, + 0x92, 0x3c, 0x3a, 0x50, 0xb7, 0xe1, 0x07, 0xe3, 0x21, 0xbf, 0x82, 0x73, + 0x60, 0xbb, 0x59, 0x5b, 0x5b, 0x74, 0xfb, 0xb4, 0xc9, 0xa2, 0x34, 0x7c, + 0xac, 0xf3, 0x3a, 0x94, 0x9e, 0xf2, 0x9b, 0xc9, 0x5e, 0xfd, 0xe1, 0x0b, + 0xa0, 0x2c, 0xbf, 0xed, 0x9b, 0xbf, 0xcf, 0x7d, 0x8e, 0xb2, 0xff, 0xe9, + 0xdf, 0xfa, 0xc9, 0xdc, 0xbf, 0xc5, 0x95, 0x88, 0xad, 0xec, 0xa9, 0x8f, + 0xaf, 0xff, 0xe9, 0x7b, 0x1a, 0x5c, 0xc2, 0x0f, 0xcb, 0x01, 0x0b, 0x2c, + 0xcb, 0x2d, 0xac, 0x3e, 0x80, 0x2c, 0x5f, 0xff, 0x67, 0xfd, 0x83, 0x0f, + 0xf9, 0x1c, 0x0f, 0x16, 0x5f, 0xd1, 0x85, 0xd8, 0x87, 0x59, 0x7f, 0xbe, + 0x18, 0xc9, 0xc4, 0x3a, 0xcb, 0xff, 0x7a, 0x08, 0x33, 0x67, 0x39, 0x0b, + 0x2d, 0xb9, 0xe4, 0x78, 0xfd, 0x40, 0x42, 0xed, 0xd3, 0x5a, 0x84, 0xd8, + 0x9e, 0x31, 0x8b, 0xfb, 0xd8, 0x5f, 0x00, 0x56, 0x5f, 0xff, 0xf9, 0xb7, + 0x96, 0x73, 0x67, 0xdb, 0x66, 0x7e, 0x3b, 0x6d, 0xf1, 0xe5, 0x97, 0xf8, + 0x70, 0x0d, 0x99, 0xd7, 0xd6, 0x5f, 0xff, 0x3e, 0x9f, 0xdd, 0x4b, 0x3f, + 0xb3, 0xbe, 0x6e, 0x2c, 0xbf, 0x9a, 0x4f, 0xff, 0x32, 0xcb, 0xff, 0xe7, + 0x38, 0xfd, 0x1a, 0x2c, 0x1f, 0x9c, 0xc5, 0x94, 0x34, 0xc2, 0x3b, 0x36, + 0xfa, 0xbe, 0xf2, 0xcb, 0xf9, 0xf7, 0x06, 0x59, 0xe5, 0x97, 0x1f, 0x8b, + 0x2f, 0x3f, 0x19, 0x65, 0x41, 0xb2, 0x00, 0xbd, 0xff, 0x09, 0x3e, 0x13, + 0x9d, 0xfc, 0xb2, 0xf9, 0xb4, 0x4e, 0xb2, 0xa4, 0xaa, 0x55, 0xa3, 0x7a, + 0x99, 0x04, 0x98, 0x7e, 0x41, 0xbc, 0xe6, 0xff, 0x73, 0x90, 0xd3, 0xbf, + 0xd6, 0x5f, 0xf7, 0x1c, 0xcd, 0xd6, 0xc2, 0x1a, 0xcb, 0xfb, 0x3f, 0x8e, + 0x53, 0x2c, 0xbe, 0xce, 0x46, 0x96, 0x58, 0xdf, 0x1e, 0x69, 0x16, 0x5a, + 0x50, 0x8e, 0x3c, 0x33, 0x0c, 0x22, 0x2d, 0x25, 0x97, 0x86, 0x10, 0x2c, + 0xbf, 0xff, 0xa3, 0x73, 0x63, 0x61, 0x67, 0x9b, 0x0b, 0xa9, 0x71, 0x65, + 0xfe, 0xdd, 0x6c, 0xeb, 0xcd, 0x8b, 0x2c, 0x5d, 0x22, 0x48, 0x0b, 0xb7, + 0xd0, 0x77, 0x1a, 0xca, 0x84, 0xc2, 0x86, 0x23, 0x90, 0xaf, 0x22, 0x9b, + 0xfd, 0x93, 0x7b, 0x3f, 0x03, 0x59, 0x7d, 0x07, 0xe1, 0xd6, 0x5f, 0xfb, + 0x0d, 0xf6, 0x7f, 0x85, 0x12, 0x59, 0x4c, 0x7c, 0x01, 0x22, 0xbe, 0x9f, + 0xed, 0x3a, 0xcb, 0xf7, 0xdc, 0xed, 0xf5, 0x95, 0x87, 0x96, 0x44, 0x97, + 0x86, 0xc3, 0x59, 0x7f, 0xff, 0xe0, 0xc6, 0xb6, 0x47, 0xa0, 0x7b, 0x3e, + 0xd9, 0xbb, 0xd4, 0x9f, 0xa5, 0x97, 0x80, 0xfb, 0x8b, 0x2f, 0xdc, 0x28, + 0x9b, 0xeb, 0x28, 0x68, 0xd7, 0x21, 0xce, 0x3a, 0x7c, 0x7e, 0xee, 0x0a, + 0xa5, 0x96, 0x92, 0xca, 0x84, 0xd8, 0x72, 0x1e, 0xee, 0x79, 0xf1, 0xdb, + 0xc5, 0xdc, 0x2c, 0xbf, 0xff, 0xfe, 0xf6, 0x7f, 0x8f, 0x36, 0xc2, 0xce, + 0xa5, 0x81, 0x9c, 0xb0, 0x7e, 0x69, 0x96, 0x5f, 0xff, 0x37, 0x22, 0x5f, + 0xcf, 0x16, 0x7f, 0xcc, 0xb2, 0xe0, 0x9a, 0xb2, 0x99, 0x30, 0x2d, 0x0e, + 0x7a, 0x10, 0x3f, 0x4d, 0xbc, 0x7f, 0x3a, 0xcb, 0xff, 0x02, 0x6f, 0x30, + 0x09, 0xfa, 0x92, 0xca, 0x59, 0x6c, 0x73, 0xcb, 0xe2, 0x05, 0xef, 0x1b, + 0xf5, 0x97, 0xef, 0xff, 0xf8, 0x62, 0xca, 0x83, 0xc7, 0x61, 0xea, 0x84, + 0x7a, 0x1d, 0x9c, 0x0d, 0xb7, 0x8f, 0x1d, 0xac, 0xbb, 0x58, 0xb2, 0xf6, + 0x30, 0xd6, 0x5b, 0x8b, 0x2e, 0x2c, 0xec, 0xd6, 0x74, 0x37, 0x79, 0xb0, + 0x96, 0x5e, 0x68, 0x99, 0x65, 0xff, 0xd8, 0x0d, 0x9e, 0x6f, 0xf0, 0x9a, + 0x65, 0x97, 0xfe, 0x2c, 0xe6, 0xce, 0x00, 0xf9, 0xc5, 0x95, 0x3a, 0x3a, + 0x4e, 0x5b, 0xc1, 0xaf, 0x8e, 0x6f, 0x46, 0xad, 0xa1, 0x39, 0x58, 0x1d, + 0xc8, 0xca, 0xef, 0xfe, 0x20, 0x6d, 0xe7, 0x9a, 0x0e, 0xe3, 0x59, 0x7f, + 0x6b, 0x24, 0x50, 0x75, 0x97, 0xec, 0x91, 0x41, 0xd6, 0x5c, 0x40, 0xd8, + 0x7a, 0x5a, 0x2c, 0xbf, 0xff, 0xff, 0x4b, 0x9c, 0x0c, 0x7d, 0x87, 0x85, + 0x36, 0xc2, 0xcd, 0x41, 0x7f, 0xd9, 0xba, 0xb2, 0xff, 0xd1, 0x8d, 0xff, + 0x41, 0x47, 0x6b, 0x2f, 0xe3, 0xf5, 0x1e, 0xf4, 0x2c, 0xbd, 0xd4, 0xb9, + 0x39, 0xf5, 0x61, 0xe5, 0x62, 0x6a, 0x9d, 0x17, 0xea, 0x1e, 0x16, 0xe2, + 0xca, 0xc5, 0x46, 0x41, 0x8f, 0xac, 0x43, 0x6b, 0x4e, 0xb2, 0xfd, 0x3c, + 0x7f, 0x00, 0xb2, 0xfe, 0x1b, 0x94, 0x98, 0xeb, 0x2f, 0xda, 0xce, 0xa5, + 0xc5, 0x97, 0xbb, 0xf6, 0x2c, 0xb6, 0x4e, 0x78, 0xda, 0x29, 0xbf, 0xee, + 0xa3, 0x53, 0xec, 0xc6, 0x1a, 0xcb, 0xa6, 0x65, 0x95, 0x89, 0x93, 0xb0, + 0x93, 0x94, 0x13, 0x90, 0x4a, 0x37, 0x9e, 0x5f, 0x7b, 0x68, 0xef, 0x6d, + 0x65, 0xfd, 0x9d, 0x4a, 0x01, 0x0b, 0x2f, 0xc5, 0x9e, 0x7f, 0xac, 0xae, + 0x8f, 0x4c, 0xe5, 0xb7, 0xda, 0xc9, 0xa1, 0x65, 0xf3, 0x6f, 0xcd, 0x2c, + 0xad, 0xa9, 0x1c, 0xf0, 0xfe, 0xc4, 0x7e, 0x22, 0xbe, 0xd9, 0xdc, 0xe6, + 0x2c, 0xbf, 0x8b, 0x00, 0x78, 0x92, 0xcb, 0xf1, 0x67, 0xfc, 0xcb, 0x28, + 0x67, 0xa4, 0x61, 0x65, 0xfa, 0x7d, 0x81, 0x89, 0x96, 0x5f, 0xff, 0xf1, + 0x40, 0x3a, 0x97, 0x03, 0x1f, 0x2c, 0x1b, 0x66, 0xa6, 0x59, 0x50, 0x8b, + 0x57, 0x23, 0xf9, 0x65, 0x43, 0x69, 0xd5, 0x3c, 0x7f, 0x23, 0x28, 0xc9, + 0x58, 0x5d, 0x46, 0x86, 0xd1, 0xa1, 0xcc, 0x81, 0xa8, 0x49, 0xfa, 0x3c, + 0xd7, 0x8d, 0x08, 0x11, 0x9b, 0x14, 0x78, 0x9c, 0x94, 0xd9, 0xf8, 0xd7, + 0xc3, 0x19, 0xee, 0xf4, 0x01, 0x23, 0x2f, 0xbf, 0x49, 0xb5, 0x9d, 0x2c, + 0xbd, 0xcf, 0x62, 0xcb, 0xf6, 0x72, 0x7c, 0x31, 0x65, 0xff, 0xde, 0x08, + 0xfc, 0x1f, 0xf3, 0xc1, 0x99, 0x65, 0x74, 0x8b, 0x59, 0x8a, 0x3c, 0x38, + 0x45, 0x37, 0xff, 0x9b, 0x4d, 0x9d, 0x6c, 0xfc, 0xc5, 0x07, 0x59, 0x7f, + 0xf6, 0x3f, 0x5b, 0x07, 0x13, 0xec, 0x34, 0xd5, 0x95, 0xda, 0x26, 0x3a, + 0x4c, 0xbf, 0xa0, 0xe5, 0x93, 0xe2, 0xcb, 0xdf, 0xe7, 0xb0, 0xf4, 0x7c, + 0x4b, 0x7f, 0xfe, 0x3f, 0x52, 0xe6, 0xba, 0x8f, 0xf2, 0x3c, 0xdf, 0x59, + 0x7f, 0xd8, 0x69, 0x67, 0xfc, 0xc6, 0x2c, 0xbf, 0x61, 0x98, 0x33, 0xac, + 0xbf, 0xfd, 0x1d, 0x79, 0xb0, 0x86, 0xdb, 0xe0, 0x6b, 0x2a, 0x13, 0x36, + 0x63, 0x3d, 0x2c, 0x78, 0xe4, 0x8a, 0x2e, 0xdc, 0x1a, 0xcb, 0xff, 0xe9, + 0xf3, 0xb1, 0xf9, 0xb0, 0xdd, 0x86, 0x86, 0x16, 0x5f, 0xd9, 0xad, 0x67, + 0xf8, 0xb2, 0xfe, 0x27, 0x34, 0xef, 0x25, 0x97, 0xa4, 0xdf, 0xf1, 0xed, + 0x7c, 0xb6, 0xfd, 0x87, 0x2c, 0xe9, 0x65, 0xfd, 0xf6, 0xdf, 0x05, 0xda, + 0xca, 0xe1, 0xeb, 0x08, 0x4f, 0x77, 0xb1, 0x65, 0xfa, 0x0e, 0xde, 0x85, + 0x97, 0x88, 0x4f, 0x2c, 0xbf, 0xd9, 0xff, 0x37, 0xf3, 0xb5, 0x97, 0xd1, + 0x85, 0xda, 0xca, 0xd8, 0x8d, 0x09, 0x11, 0xe8, 0x59, 0xc9, 0x88, 0x77, + 0xe6, 0x74, 0x28, 0x54, 0xf2, 0xc3, 0x53, 0x42, 0xbf, 0xd1, 0xac, 0xdf, + 0xfa, 0x5c, 0xfb, 0xcf, 0xba, 0x59, 0xd2, 0xcb, 0xfb, 0xd1, 0x20, 0xb8, + 0x8b, 0x2f, 0xc3, 0xf6, 0x17, 0xd6, 0x54, 0x8f, 0x56, 0x62, 0xea, 0xe9, + 0x17, 0x65, 0x09, 0x8b, 0xfe, 0xd3, 0x61, 0x9f, 0xfb, 0x92, 0xcb, 0xba, + 0x35, 0x65, 0xcd, 0xd6, 0xc3, 0xd1, 0x19, 0xc5, 0xe6, 0x06, 0x2c, 0xb0, + 0x16, 0x5b, 0x92, 0x35, 0x9f, 0x1b, 0xbf, 0xfd, 0x86, 0x6e, 0xfb, 0x3f, + 0x80, 0x3b, 0xcc, 0xb2, 0xa1, 0x34, 0xad, 0x3c, 0xba, 0xe1, 0x13, 0xdf, + 0xf9, 0xf7, 0x96, 0x7f, 0x00, 0x43, 0x59, 0x60, 0x2c, 0xa6, 0x3c, 0xf9, + 0x8f, 0xaf, 0xfb, 0xd3, 0xb6, 0x17, 0x52, 0xe2, 0xcb, 0xfe, 0xeb, 0xd9, + 0xd9, 0x60, 0x77, 0x16, 0x5f, 0xff, 0x19, 0x9d, 0xf3, 0x3f, 0x36, 0x1a, + 0x58, 0x05, 0x96, 0x94, 0x23, 0x27, 0x0e, 0x98, 0xf6, 0xff, 0xc5, 0x01, + 0xef, 0xaf, 0xb6, 0x12, 0xcb, 0xf9, 0xba, 0x06, 0x9c, 0x6b, 0x2f, 0x66, + 0x80, 0xb2, 0xfd, 0xc6, 0xc2, 0x02, 0xcb, 0x63, 0x1e, 0x17, 0x07, 0x2f, + 0xcc, 0x00, 0x66, 0x96, 0x50, 0xd1, 0xf7, 0xe3, 0xe2, 0x70, 0xe1, 0x35, + 0xb6, 0xa5, 0x97, 0xe7, 0xc2, 0x63, 0x56, 0x5e, 0xfe, 0x79, 0x65, 0x11, + 0xe1, 0x6e, 0x93, 0x5c, 0xc7, 0x59, 0x7f, 0xff, 0xee, 0xa4, 0xfd, 0x6c, + 0x20, 0xee, 0xec, 0xce, 0xa5, 0x81, 0x20, 0x71, 0x65, 0x1d, 0x11, 0x9b, + 0xa2, 0xd7, 0xfc, 0x28, 0xff, 0xd8, 0xba, 0x97, 0x16, 0x5f, 0x6e, 0x7b, + 0x37, 0x16, 0x5e, 0xdb, 0x61, 0x5a, 0xca, 0xd8, 0x9f, 0x98, 0xa0, 0xf2, + 0x75, 0x8c, 0x85, 0x81, 0xa4, 0xce, 0x7d, 0xb6, 0x51, 0x7f, 0xff, 0xfd, + 0xd7, 0x03, 0x1d, 0x6c, 0xf6, 0x0f, 0x61, 0x60, 0x4d, 0xd9, 0xc0, 0x01, + 0xbe, 0xb2, 0xff, 0xff, 0xd8, 0x33, 0x9e, 0x3f, 0xcc, 0xff, 0x34, 0xd9, + 0xd9, 0x60, 0xd6, 0x5f, 0xfe, 0xf8, 0x63, 0x27, 0xd9, 0xc6, 0x26, 0xd2, + 0xcb, 0x18, 0x48, 0xb6, 0x11, 0xae, 0xa1, 0x36, 0x7c, 0x8c, 0xf6, 0xfd, + 0x05, 0xd3, 0xce, 0xb2, 0xfe, 0x99, 0x87, 0x87, 0x65, 0x97, 0xff, 0xff, + 0xfd, 0xdc, 0x7a, 0x0f, 0xfc, 0xe7, 0x23, 0x5a, 0x82, 0xc9, 0xf0, 0x3c, + 0x0c, 0xc5, 0x07, 0x59, 0x50, 0x8c, 0x1c, 0x2d, 0xbc, 0x1d, 0x1a, 0xb2, + 0x8e, 0x6f, 0xf6, 0xc8, 0x6f, 0xce, 0x01, 0x1e, 0x75, 0x97, 0xff, 0xff, + 0x4f, 0xb3, 0xf3, 0xb6, 0x6a, 0x7d, 0x93, 0x49, 0xbd, 0x83, 0xeb, 0x37, + 0x56, 0x56, 0x23, 0x2d, 0x89, 0x02, 0x53, 0x79, 0x81, 0x0b, 0x2f, 0xf6, + 0xc2, 0xcd, 0x34, 0x1d, 0x65, 0xff, 0xb4, 0xff, 0xd6, 0x37, 0xa0, 0x6b, + 0x2f, 0xe1, 0x96, 0x79, 0xfe, 0xb2, 0xfd, 0xfe, 0xa4, 0xda, 0x59, 0x58, + 0x7a, 0xbc, 0x2c, 0xa9, 0xd3, 0x01, 0x18, 0xde, 0x8c, 0xc1, 0x09, 0x2b, + 0xda, 0x71, 0x16, 0x5f, 0xa3, 0xe7, 0x6f, 0xac, 0xa7, 0x3c, 0x40, 0x8e, + 0xdf, 0x17, 0x58, 0x75, 0x95, 0x39, 0xe1, 0x98, 0x43, 0x7f, 0xe8, 0x37, + 0x74, 0x38, 0x53, 0x08, 0x75, 0x97, 0xfc, 0x66, 0x68, 0x6d, 0x9f, 0xe2, + 0xcb, 0xfc, 0x0e, 0x66, 0xce, 0xfe, 0x75, 0x97, 0xff, 0xff, 0xf8, 0xd2, + 0xcd, 0x8d, 0x84, 0xff, 0xf4, 0x4d, 0xb0, 0xb3, 0xcd, 0xfe, 0x07, 0xb0, + 0xc2, 0xca, 0xc4, 0xda, 0x7a, 0x24, 0x64, 0x47, 0x39, 0x09, 0xbd, 0xff, + 0xe7, 0x37, 0x08, 0x3f, 0xf6, 0x6f, 0x1c, 0x2c, 0xbf, 0xfb, 0x3f, 0x8d, + 0x3e, 0x76, 0xd3, 0x71, 0x65, 0xff, 0xb3, 0x01, 0xcd, 0x9a, 0xe0, 0xf8, + 0xb2, 0xff, 0x6b, 0x3b, 0xf3, 0x6a, 0x65, 0x95, 0xb1, 0x17, 0x63, 0x45, + 0xc4, 0x1b, 0xff, 0xef, 0x36, 0xcc, 0x9b, 0xa9, 0x73, 0xfe, 0xce, 0x96, + 0x51, 0x27, 0x19, 0xf8, 0xc1, 0xb7, 0x98, 0xdf, 0x7f, 0x41, 0x3a, 0xcb, + 0xff, 0xfd, 0x87, 0x3b, 0x75, 0xb0, 0xd3, 0x70, 0xbe, 0x68, 0x63, 0x4b, + 0x2e, 0xce, 0xd9, 0x11, 0x3a, 0x23, 0xbe, 0xe8, 0xb3, 0x6d, 0x65, 0x62, + 0x62, 0x8d, 0x0c, 0x17, 0x2e, 0xbf, 0x61, 0xe4, 0x4c, 0xb2, 0xf3, 0x17, + 0xd6, 0x5f, 0xd2, 0xe3, 0x9c, 0x3c, 0x59, 0x53, 0x9e, 0x4b, 0x8d, 0xdf, + 0x7b, 0xcf, 0x25, 0x96, 0xe2, 0xca, 0xc3, 0x66, 0xc4, 0x57, 0xf7, 0xdb, + 0x53, 0xe7, 0x6b, 0x2a, 0x1b, 0x78, 0xd1, 0xca, 0x5d, 0xc9, 0x58, 0x26, + 0xca, 0x53, 0xee, 0x11, 0x5d, 0x43, 0xad, 0xa5, 0x90, 0xea, 0x3d, 0xa3, + 0x94, 0x7a, 0x3f, 0x37, 0x8c, 0xbc, 0xa5, 0x1a, 0x72, 0x57, 0x4f, 0xcc, + 0xc2, 0xdf, 0xb6, 0xab, 0xba, 0x3f, 0x7f, 0x89, 0xcd, 0xcc, 0x23, 0x56, + 0x5d, 0xde, 0x2c, 0xa3, 0x9e, 0x4b, 0x99, 0x52, 0xcb, 0xff, 0xb6, 0x64, + 0xdd, 0x4b, 0x9f, 0xf6, 0x74, 0xb2, 0xfb, 0x77, 0xcd, 0xa5, 0x97, 0xfa, + 0x50, 0x3d, 0x83, 0x69, 0x96, 0x5f, 0xf6, 0xcf, 0x96, 0x19, 0x8d, 0xc5, + 0x97, 0xff, 0xfe, 0xfb, 0xcc, 0x59, 0x3b, 0xec, 0x2e, 0xb0, 0xc2, 0xc0, + 0xe1, 0xab, 0x2b, 0x6b, 0x4d, 0x66, 0x70, 0xbe, 0xd2, 0xba, 0x25, 0x98, + 0xdb, 0x74, 0xea, 0xf7, 0xa0, 0x0b, 0x2f, 0xf7, 0x98, 0x11, 0xf6, 0xde, + 0xb2, 0xfe, 0x66, 0x83, 0x22, 0x65, 0x97, 0xdf, 0x72, 0x02, 0xcb, 0xff, + 0xf3, 0x9a, 0x68, 0x1e, 0x6d, 0xd2, 0x83, 0x3a, 0x97, 0x16, 0x58, 0x47, + 0x3f, 0xe2, 0x21, 0xbe, 0x7d, 0xc8, 0x02, 0xca, 0x14, 0x2b, 0x24, 0x88, + 0xde, 0xb1, 0x93, 0xb1, 0xc9, 0x8d, 0x1e, 0x15, 0x66, 0x13, 0xde, 0xe7, + 0xd9, 0x65, 0x2c, 0xbf, 0xb0, 0xf1, 0xe7, 0xf2, 0xcb, 0x69, 0x65, 0x2c, + 0xb6, 0xcc, 0x2f, 0x26, 0x11, 0xbd, 0xe6, 0x35, 0x65, 0x6c, 0x44, 0x68, + 0xd2, 0x0d, 0x28, 0xbf, 0xfe, 0xea, 0x45, 0x1b, 0x0e, 0x50, 0x6f, 0xda, + 0x75, 0x97, 0xff, 0x6c, 0xfe, 0xb0, 0xcc, 0x9c, 0xb0, 0xc5, 0x95, 0xb1, + 0x38, 0x28, 0x1c, 0xc8, 0x4c, 0x31, 0x9f, 0xd4, 0xef, 0xda, 0xd8, 0x5b, + 0xcc, 0x59, 0x6e, 0x2c, 0xbc, 0xe0, 0x85, 0x94, 0x73, 0x59, 0xe1, 0x1b, + 0xcf, 0x34, 0x2c, 0xbd, 0xec, 0xd2, 0xca, 0x84, 0x59, 0x3a, 0xc9, 0x84, + 0x3b, 0xa3, 0x97, 0xf4, 0xf3, 0x48, 0x51, 0xa9, 0xd6, 0x5f, 0x08, 0x59, + 0xbd, 0x65, 0xf3, 0x0f, 0x06, 0xb2, 0xba, 0x3c, 0x53, 0x92, 0x5a, 0x65, + 0x97, 0x41, 0xd6, 0x5b, 0xeb, 0x2b, 0x46, 0x9d, 0xc5, 0xa8, 0x67, 0xb3, + 0xe3, 0x9b, 0xe8, 0x1b, 0xc9, 0x65, 0xef, 0xe7, 0x16, 0x5f, 0xfb, 0x1f, + 0xa0, 0x4d, 0x28, 0xd4, 0xeb, 0x2f, 0x6a, 0x26, 0x59, 0x70, 0x4c, 0x59, + 0x73, 0xf4, 0xb2, 0xb0, 0xd7, 0xf0, 0x62, 0xa7, 0x47, 0x51, 0xa4, 0x3e, + 0x1c, 0x74, 0x1f, 0xa6, 0x5f, 0x49, 0xcb, 0x6d, 0x65, 0xd3, 0x3a, 0xcb, + 0xa5, 0x3a, 0xcb, 0xed, 0x9f, 0x89, 0x2c, 0xbf, 0xfe, 0xc8, 0x20, 0x43, + 0x7f, 0xd8, 0x7c, 0x1a, 0xcb, 0xc2, 0x06, 0x75, 0x97, 0x41, 0xab, 0x2a, + 0x74, 0x53, 0x48, 0x90, 0xd4, 0xcf, 0x8f, 0xdf, 0xce, 0x64, 0x7f, 0x27, + 0x59, 0x7f, 0x36, 0xba, 0x91, 0x42, 0xcb, 0xf4, 0x7e, 0x4d, 0xf5, 0x97, + 0xf7, 0xa3, 0xa9, 0x67, 0xd6, 0x54, 0x8f, 0x54, 0x64, 0xf5, 0xe4, 0x52, + 0x7e, 0x10, 0x57, 0xfd, 0x3e, 0xb2, 0x69, 0x31, 0x1a, 0xb2, 0xff, 0xa0, + 0xbf, 0xa6, 0xdf, 0x83, 0x59, 0x4e, 0x7e, 0x9b, 0x67, 0x77, 0x67, 0xd6, + 0x5a, 0x65, 0x95, 0xe3, 0x50, 0x42, 0xd5, 0xb5, 0xae, 0xb0, 0x43, 0xde, + 0x3e, 0x34, 0x61, 0x93, 0x25, 0x9c, 0x93, 0xc2, 0xef, 0x0b, 0xe2, 0x3f, + 0x0c, 0x34, 0xb6, 0xe1, 0x38, 0x22, 0x65, 0xfe, 0x33, 0x24, 0x41, 0x7e, + 0x2c, 0xbf, 0x74, 0x63, 0x90, 0x16, 0x5c, 0x46, 0xac, 0xb7, 0x18, 0xf0, + 0x02, 0x53, 0x73, 0xf9, 0x65, 0xff, 0x8f, 0x06, 0xff, 0xd9, 0xf8, 0x02, + 0xcb, 0xf3, 0x8e, 0x30, 0x96, 0x58, 0xd5, 0x95, 0x3a, 0x23, 0x18, 0x5b, + 0xc7, 0xe4, 0x4b, 0x7f, 0xfe, 0x39, 0x67, 0x7d, 0x7c, 0x9f, 0xc7, 0x8c, + 0xfa, 0xcb, 0xff, 0xec, 0x9d, 0xcb, 0xbd, 0x9c, 0x83, 0xbf, 0x5f, 0x59, + 0x50, 0x8a, 0x8d, 0x2a, 0xdf, 0xed, 0xcf, 0x64, 0xfa, 0xd4, 0x2c, 0xa5, + 0x97, 0xff, 0x3c, 0xb0, 0x86, 0x51, 0x21, 0xf1, 0x65, 0xb3, 0x0f, 0x37, + 0x78, 0x5d, 0xdc, 0xda, 0x96, 0x5f, 0xfe, 0x2c, 0x3c, 0x77, 0xb0, 0x49, + 0xe7, 0x7e, 0x96, 0x5f, 0xc1, 0x39, 0xde, 0x5b, 0x3e, 0x7d, 0x9b, 0xa3, + 0x97, 0xe0, 0xc8, 0x4d, 0x71, 0x65, 0x9b, 0xc7, 0xe8, 0x49, 0x57, 0xff, + 0xe8, 0xd4, 0x77, 0x87, 0x8e, 0xe4, 0xdc, 0x09, 0xd6, 0x54, 0x2e, 0x1a, + 0x4c, 0xe7, 0xa8, 0x59, 0xfa, 0x1c, 0x8e, 0x44, 0x50, 0x84, 0xfc, 0x61, + 0x1b, 0x64, 0xd7, 0xf6, 0xb2, 0x0d, 0x82, 0x59, 0x73, 0xf9, 0x65, 0xe2, + 0x73, 0xac, 0xbf, 0xff, 0xfb, 0x37, 0x66, 0x8f, 0x67, 0xca, 0x26, 0xd9, + 0x85, 0x9d, 0x49, 0xb8, 0xb2, 0xff, 0xfe, 0xf3, 0xcc, 0x70, 0x93, 0x9b, + 0xcc, 0xef, 0xc1, 0xdc, 0x59, 0x74, 0x7c, 0x08, 0xd7, 0xe3, 0xb5, 0xc0, + 0x85, 0x97, 0x67, 0x16, 0x5f, 0xf8, 0xf9, 0xd4, 0xb8, 0xf1, 0xd4, 0x96, + 0x57, 0x67, 0xad, 0xe1, 0x6b, 0x84, 0x9d, 0x65, 0x31, 0xbc, 0x22, 0x3a, + 0x92, 0xa2, 0x9c, 0x2c, 0x61, 0x6f, 0x43, 0xc8, 0x8b, 0xbf, 0x0a, 0x8a, + 0xda, 0xe3, 0x1c, 0x97, 0xda, 0xa1, 0x7a, 0x29, 0x94, 0x19, 0xb4, 0x43, + 0xc4, 0x51, 0x2d, 0x13, 0x69, 0x42, 0x9c, 0x54, 0x3e, 0x15, 0x50, 0x8f, + 0xda, 0x70, 0x93, 0x8a, 0x55, 0xd4, 0xf3, 0x88, 0x92, 0x97, 0x76, 0x3a, + 0x64, 0x66, 0x5a, 0x20, 0xd3, 0x67, 0x33, 0xbb, 0xa6, 0xee, 0xf5, 0x49, + 0xb6, 0x69, 0xfc, 0xe9, 0xa9, 0x00, 0x1a, 0xa6, 0xaf, 0x1e, 0x7e, 0x4f, + 0xd6, 0x8d, 0x21, 0xe7, 0xe6, 0x41, 0x3b, 0xb4, 0x2b, 0x86, 0x69, 0x57, + 0x56, 0x7c, 0xad, 0x89, 0xbf, 0x5c, 0xbe, 0x86, 0x72, 0x8b, 0x7c, 0x7e, + 0xe6, 0x46, 0x03, 0xb7, 0x3b, 0x3e, 0x24, 0xe7, 0xb6, 0xec, 0xab, 0x3b, + 0xff, 0xf8, 0x3d, 0x8b, 0xeb, 0xfa, 0x8c, 0xe8, 0x50, 0x37, 0x73, 0x56, + 0x50, 0xb5, 0x6c, 0xad, 0x2c, 0x02, 0xfe, 0x76, 0xff, 0x18, 0x96, 0x5e, + 0x6d, 0x62, 0xca, 0xdc, 0x3c, 0x6e, 0x15, 0xdf, 0xb5, 0xdb, 0xbf, 0x6a, + 0x8a, 0x75, 0x76, 0x74, 0xb2, 0xfb, 0xfa, 0x6e, 0x96, 0x5f, 0xfe, 0x08, + 0x49, 0x8a, 0x3c, 0xc7, 0xce, 0x2c, 0xbb, 0x47, 0x59, 0x61, 0x70, 0x8f, + 0x3c, 0x25, 0xe8, 0xd9, 0x85, 0xce, 0x46, 0x04, 0x7b, 0xff, 0xf4, 0x85, + 0xe4, 0xbd, 0x8d, 0x2e, 0x47, 0xe0, 0x6b, 0x2f, 0x66, 0x71, 0x65, 0xfc, + 0xf3, 0xff, 0x8e, 0x05, 0x97, 0x68, 0x5f, 0x8f, 0x27, 0x6c, 0x6e, 0xa1, + 0x1a, 0x4d, 0x09, 0xfb, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x51, 0xaf, 0xfc, + 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x44, 0xd0, 0xbf, 0xfc, 0x59, 0x34, + 0x9f, 0x52, 0x2c, 0xde, 0xeb, 0x2f, 0x8a, 0x33, 0xa5, 0x95, 0x88, 0xef, + 0x39, 0xb7, 0x13, 0xbe, 0x95, 0x7f, 0x84, 0x7d, 0xe2, 0xfe, 0xd3, 0xac, + 0xa1, 0x67, 0xeb, 0x07, 0x97, 0xe9, 0xc4, 0x9e, 0x27, 0x59, 0x7d, 0xdb, + 0xbf, 0x6a, 0x8a, 0xbd, 0x58, 0x7b, 0x9a, 0x2c, 0xbf, 0xfd, 0xe6, 0xff, + 0x22, 0x5e, 0x83, 0x1c, 0x96, 0x5f, 0xfd, 0xf0, 0x60, 0xfd, 0x83, 0x1b, + 0x74, 0xb2, 0xfb, 0xfa, 0x6e, 0x96, 0x5f, 0xb7, 0xc1, 0x78, 0x2b, 0x2f, + 0xfc, 0xfd, 0x4b, 0x99, 0xd8, 0xf3, 0xa5, 0x95, 0x87, 0xd4, 0xe5, 0x37, + 0xf3, 0x0c, 0x71, 0xa8, 0x59, 0x7e, 0xe1, 0x3c, 0x71, 0x65, 0xff, 0xff, + 0xb0, 0x98, 0x67, 0x77, 0x2e, 0xc7, 0xe8, 0xc1, 0xb1, 0x4e, 0xb2, 0xa1, + 0x11, 0xf2, 0x26, 0xbf, 0xf9, 0xfd, 0x33, 0xff, 0xfd, 0x76, 0xc4, 0xb2, + 0xff, 0xfc, 0x02, 0x09, 0xc4, 0x18, 0xe0, 0x07, 0x8c, 0xfa, 0xcb, 0xf9, + 0xff, 0xcc, 0xeb, 0xeb, 0x2b, 0xa4, 0x42, 0x12, 0xb5, 0x85, 0xe2, 0xb2, + 0x6e, 0xc8, 0x7a, 0x49, 0x64, 0x5d, 0x42, 0x37, 0xc4, 0x1f, 0x85, 0xd9, + 0x84, 0x42, 0x43, 0x2a, 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x56, 0xcb, 0xfe, + 0x90, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x24, 0x15, 0xf6, 0x1e, 0x37, 0x16, + 0x58, 0x5e, 0x22, 0x8d, 0xcd, 0xb8, 0x93, 0x7c, 0x76, 0x28, 0x59, 0x7e, + 0xd7, 0x6e, 0xfd, 0xaa, 0x24, 0x35, 0xfd, 0xa0, 0xef, 0x83, 0x0e, 0xb2, + 0xfe, 0x2c, 0xe7, 0xe5, 0x0b, 0x2f, 0x85, 0xbc, 0x85, 0xc2, 0x2c, 0xf0, + 0x81, 0x8d, 0xb7, 0x98, 0xdf, 0xec, 0xfb, 0x0f, 0x0a, 0x65, 0x97, 0xf9, + 0xcd, 0x16, 0x69, 0xb9, 0xb8, 0xb2, 0xdc, 0x16, 0x7d, 0xa4, 0x65, 0x79, + 0xdf, 0xb5, 0xc6, 0x06, 0xa8, 0x3d, 0x2e, 0xca, 0x6d, 0xda, 0xcb, 0x6e, + 0x2c, 0xac, 0x34, 0xde, 0x12, 0xb8, 0xcf, 0xac, 0xbd, 0xc6, 0x35, 0x65, + 0x0c, 0xda, 0xf4, 0x31, 0x76, 0xd1, 0x3a, 0xcb, 0xfe, 0xf4, 0x7f, 0x9b, + 0x57, 0x36, 0x82, 0x59, 0x5b, 0x59, 0xf0, 0x48, 0x76, 0xfb, 0xff, 0xcd, + 0xd5, 0x96, 0x25, 0x96, 0x65, 0x95, 0xb5, 0x1a, 0x01, 0x56, 0x21, 0x7f, + 0xf8, 0x55, 0x8a, 0xbd, 0xab, 0xd0, 0x72, 0x7f, 0x36, 0x96, 0x5b, 0xa5, + 0x97, 0xbf, 0x80, 0x59, 0x73, 0x12, 0xcb, 0xc1, 0xfe, 0x2c, 0xba, 0x26, + 0x59, 0x7f, 0x1f, 0x3b, 0x27, 0xdc, 0x59, 0x7b, 0x1a, 0x75, 0x96, 0x11, + 0x65, 0x61, 0xef, 0x68, 0xc0, 0x23, 0x97, 0xe1, 0xc7, 0xdc, 0x6b, 0x2e, + 0x6d, 0xeb, 0x2a, 0x0d, 0xff, 0xc9, 0xef, 0x7b, 0x38, 0xb2, 0xce, 0xb2, + 0x86, 0x6b, 0x3e, 0x39, 0x43, 0x4e, 0xbb, 0x70, 0x4a, 0x61, 0xcd, 0x0a, + 0xf8, 0x73, 0x8e, 0xbf, 0x6d, 0x11, 0x32, 0xfb, 0xfc, 0x6d, 0xeb, 0x2c, + 0x4b, 0x2f, 0xc3, 0x82, 0x9f, 0x71, 0x65, 0xfe, 0x83, 0x44, 0x00, 0x23, + 0xa5, 0x95, 0x07, 0xc3, 0x39, 0x5d, 0xf9, 0xfc, 0xc7, 0xc5, 0x95, 0x88, + 0xb9, 0x27, 0x1d, 0xe4, 0x57, 0xf6, 0x77, 0xe8, 0x89, 0x96, 0x5b, 0x6d, + 0x65, 0x31, 0xf9, 0x78, 0xc0, 0x25, 0xd7, 0x88, 0x1c, 0x59, 0x7e, 0x79, + 0xc4, 0xc9, 0x96, 0x56, 0x1e, 0x31, 0x0e, 0x5e, 0xec, 0xb7, 0x16, 0x5f, + 0xf9, 0xcc, 0xf3, 0x3c, 0xbe, 0xd3, 0xac, 0xa7, 0x3d, 0xf2, 0x20, 0xbf, + 0xf0, 0x33, 0xae, 0x09, 0xa6, 0x3e, 0x2c, 0xb9, 0xa6, 0x59, 0x6c, 0xe8, + 0xf5, 0xf4, 0x81, 0x7d, 0x3f, 0x3a, 0x65, 0x97, 0xff, 0xa3, 0xa9, 0x31, + 0xcc, 0xc2, 0x1f, 0xa1, 0x65, 0x62, 0x71, 0x9a, 0x7f, 0x27, 0x7e, 0x14, + 0x04, 0x92, 0xfc, 0xe3, 0x12, 0x09, 0x65, 0xfe, 0x60, 0xee, 0x7a, 0x32, + 0x75, 0x97, 0xfe, 0xd7, 0xc4, 0x27, 0xef, 0x0b, 0xb5, 0x97, 0xd0, 0x76, + 0xdb, 0x59, 0x74, 0x6e, 0xac, 0xbf, 0xf1, 0x8f, 0x2d, 0x63, 0x7a, 0x06, + 0xb2, 0xfb, 0xb7, 0x7e, 0xd5, 0x16, 0x22, 0xfd, 0xad, 0x39, 0x7d, 0x65, + 0xfd, 0xaf, 0x3f, 0x30, 0x45, 0x97, 0x87, 0xe0, 0xac, 0xa6, 0x3c, 0xb7, + 0x2e, 0xb1, 0x8b, 0x2e, 0xe3, 0x2c, 0xa6, 0x35, 0x00, 0x12, 0xbf, 0xf4, + 0xb3, 0x9f, 0xf6, 0x36, 0xa4, 0xb2, 0x98, 0xf7, 0x82, 0x41, 0x7f, 0x44, + 0x74, 0x77, 0x1a, 0xcb, 0xc1, 0x29, 0x2c, 0xbf, 0xdd, 0xc6, 0x68, 0x00, + 0xfa, 0xca, 0x9d, 0x57, 0xf4, 0x89, 0xf0, 0xdb, 0xb4, 0x0e, 0x89, 0x18, + 0x67, 0x47, 0xc7, 0x30, 0xf3, 0x91, 0x42, 0x9b, 0x84, 0x3f, 0x2d, 0x08, + 0xe5, 0xf6, 0xa0, 0x8d, 0x59, 0x7a, 0x51, 0xb8, 0xb2, 0xb0, 0xf0, 0x66, + 0x22, 0xb3, 0x2c, 0xb3, 0x2c, 0xb4, 0x8d, 0x34, 0x00, 0x10, 0xbf, 0x09, + 0xb7, 0x9a, 0x85, 0x97, 0x07, 0x4b, 0x2f, 0xbf, 0x05, 0x3a, 0xca, 0x98, + 0xdc, 0xfc, 0x5e, 0xc4, 0xb2, 0xe8, 0x25, 0x97, 0xf4, 0x70, 0x49, 0xe2, + 0x75, 0x94, 0x47, 0xab, 0xc1, 0x01, 0x05, 0x6f, 0xb7, 0x3c, 0x1d, 0xc5, + 0x95, 0x09, 0x99, 0xe3, 0x23, 0x3b, 0x84, 0xbe, 0xff, 0x83, 0x39, 0x60, + 0xfc, 0x13, 0x56, 0x51, 0xa9, 0xe8, 0xfa, 0x35, 0xb2, 0x3b, 0xbe, 0xf7, + 0x03, 0x0b, 0x2f, 0xff, 0x67, 0x5d, 0x01, 0xff, 0xc6, 0x2e, 0xa4, 0xb2, + 0xff, 0xe8, 0xce, 0x61, 0x0d, 0x81, 0x04, 0xb2, 0xf1, 0x44, 0xeb, 0x29, + 0x91, 0x50, 0x49, 0x81, 0x40, 0xbe, 0x8d, 0x41, 0xd6, 0x54, 0x26, 0x33, + 0x28, 0x65, 0x70, 0xba, 0xf8, 0x62, 0x6d, 0x52, 0x59, 0x7e, 0x07, 0x7e, + 0x61, 0x5a, 0xcb, 0xde, 0xc0, 0x2c, 0xbf, 0xba, 0xe7, 0xa1, 0xbe, 0xb2, + 0xe7, 0xfa, 0xca, 0x63, 0xc4, 0x39, 0x75, 0xef, 0x40, 0x16, 0x5c, 0x1d, + 0xb5, 0x97, 0xcc, 0x51, 0x3a, 0xcb, 0xff, 0xef, 0xe7, 0x52, 0x20, 0xfd, + 0xd8, 0xa0, 0x6b, 0x2f, 0xe3, 0x96, 0x46, 0xe4, 0xcb, 0x2c, 0x05, 0x95, + 0x07, 0x82, 0xc6, 0x17, 0x9e, 0x3a, 0x59, 0x5b, 0x42, 0x7f, 0x38, 0x53, + 0xd9, 0x6e, 0x98, 0x3c, 0x42, 0x43, 0x9c, 0x1a, 0xf9, 0x0e, 0xdc, 0x23, + 0xf7, 0x48, 0x2f, 0x3f, 0xf8, 0xb2, 0xff, 0xfb, 0x52, 0x39, 0x46, 0xa0, + 0x79, 0x34, 0x79, 0x65, 0x31, 0xf5, 0xb8, 0xe5, 0xf6, 0x76, 0xfc, 0x59, + 0x7d, 0xbc, 0x2f, 0xc5, 0x96, 0x65, 0x97, 0xfd, 0x1f, 0xe7, 0x3f, 0x1d, + 0x18, 0xb2, 0xfc, 0xda, 0x63, 0x05, 0x6b, 0x2d, 0xd2, 0xca, 0x92, 0x3b, + 0xf0, 0x81, 0x88, 0xa6, 0x24, 0xd0, 0x87, 0x8e, 0xc4, 0x2c, 0xbf, 0xf3, + 0x7b, 0xa9, 0x67, 0xf3, 0xaf, 0xac, 0xbf, 0xde, 0xc3, 0xe3, 0xea, 0x75, + 0x95, 0x23, 0xf3, 0x1a, 0x05, 0xfb, 0xff, 0x79, 0x71, 0x65, 0xec, 0xd4, + 0x2c, 0xbc, 0x58, 0x75, 0x9b, 0x65, 0xdd, 0xff, 0x83, 0x9d, 0x0f, 0x7f, + 0xb1, 0xe6, 0x59, 0x5d, 0x22, 0xca, 0x64, 0x3d, 0xe5, 0xb6, 0x92, 0xcb, + 0xdd, 0x71, 0xd6, 0x5f, 0x66, 0x19, 0xc5, 0x95, 0x07, 0xa1, 0x82, 0x3f, + 0x1d, 0xb6, 0xf5, 0x97, 0x04, 0x96, 0x58, 0x56, 0xb2, 0xdb, 0xd6, 0x54, + 0x27, 0xad, 0x90, 0xd4, 0xd4, 0x21, 0x00, 0x5b, 0xc1, 0x3f, 0x8b, 0x6f, + 0x15, 0xbf, 0xbb, 0x8f, 0xfb, 0x00, 0xb2, 0xfe, 0x13, 0x35, 0x99, 0x32, + 0xca, 0x23, 0xdc, 0xe1, 0x75, 0xfb, 0xae, 0x46, 0xb8, 0xb2, 0xff, 0x9f, + 0xfc, 0x18, 0x5f, 0x52, 0x59, 0x7f, 0xa7, 0xea, 0x5c, 0x26, 0x99, 0x65, + 0xf7, 0xc8, 0x33, 0xac, 0xa8, 0x3d, 0x92, 0x36, 0xa8, 0x47, 0xe6, 0x10, + 0x91, 0x48, 0x61, 0x25, 0x7f, 0x6a, 0x40, 0xcc, 0x99, 0x65, 0xc1, 0x11, + 0x65, 0xf3, 0xc3, 0x6d, 0xac, 0xbf, 0x87, 0xe6, 0xdf, 0x04, 0xb2, 0xee, + 0x4c, 0xb2, 0xf6, 0x84, 0xe2, 0xca, 0xc4, 0x66, 0x9a, 0x5d, 0xa1, 0x82, + 0x23, 0xf9, 0x76, 0xf1, 0x8b, 0xfe, 0xe1, 0xba, 0x81, 0xfa, 0x37, 0xac, + 0xbe, 0x90, 0x9e, 0x85, 0x97, 0xb5, 0x12, 0x59, 0x4e, 0x6f, 0xf7, 0x91, + 0xdf, 0x8f, 0x8d, 0xa9, 0x96, 0x5b, 0x71, 0x65, 0x41, 0xbc, 0x72, 0x8b, + 0xe1, 0x23, 0x77, 0x8b, 0x2f, 0xfc, 0x44, 0xe7, 0xe6, 0x1e, 0x37, 0x16, + 0x5f, 0xf9, 0xa7, 0x72, 0xf3, 0xf2, 0x37, 0x16, 0x5e, 0xf4, 0x79, 0x65, + 0x2c, 0xb6, 0x0c, 0xd3, 0x9c, 0x72, 0xfb, 0x4c, 0x66, 0xe2, 0xca, 0x64, + 0x79, 0x78, 0xfc, 0x99, 0xf8, 0x4d, 0x7f, 0xfb, 0x4c, 0x78, 0xeb, 0xd0, + 0x32, 0x7d, 0xc5, 0x94, 0x34, 0xe7, 0xf9, 0x18, 0xc7, 0xce, 0xef, 0xbb, + 0xf4, 0x69, 0x65, 0xe6, 0xcd, 0x2c, 0xae, 0x8d, 0xf0, 0x84, 0x77, 0xf8, + 0x01, 0x71, 0x3d, 0x12, 0x59, 0x50, 0xae, 0xef, 0x16, 0x19, 0xef, 0xcb, + 0xcf, 0x1d, 0xf0, 0x5d, 0x4c, 0x23, 0xba, 0x24, 0xb2, 0xfd, 0xdf, 0xa3, + 0xad, 0xd5, 0x94, 0x33, 0xc3, 0xe8, 0x5a, 0xc3, 0x59, 0x7e, 0x27, 0x3c, + 0x79, 0x65, 0x61, 0xb7, 0x61, 0x1b, 0xff, 0xd0, 0x78, 0x90, 0xca, 0x3c, + 0xf9, 0xa5, 0x97, 0x37, 0x96, 0x52, 0xca, 0x91, 0xf4, 0x7d, 0x1f, 0x6c, + 0x5a, 0xfc, 0x51, 0xe8, 0xdc, 0x59, 0x7b, 0xf8, 0x05, 0x97, 0xf1, 0xdb, + 0x9c, 0x61, 0xac, 0xbc, 0xfa, 0x35, 0x65, 0x04, 0xf2, 0x8c, 0x2d, 0xbf, + 0x8b, 0x37, 0x96, 0x71, 0x65, 0xcd, 0xa5, 0x95, 0xd9, 0xe1, 0xf8, 0xb6, + 0xff, 0x6e, 0x6c, 0x12, 0x09, 0xcd, 0x59, 0x7f, 0xa4, 0xf8, 0x59, 0xfe, + 0x2c, 0xbf, 0x87, 0x98, 0x5d, 0x7d, 0x65, 0x62, 0x25, 0xfa, 0x39, 0x01, + 0x8d, 0xf0, 0xe1, 0xf4, 0xb2, 0xff, 0xd9, 0xd4, 0xbd, 0x1c, 0x37, 0xd0, + 0xb2, 0xa1, 0x5a, 0x9c, 0x96, 0xba, 0x84, 0x3b, 0x19, 0x4c, 0x53, 0xa6, + 0x6f, 0x33, 0x14, 0x2e, 0xb8, 0x61, 0xba, 0x43, 0x7d, 0xf7, 0x79, 0xd6, + 0x5b, 0x6d, 0x65, 0xd2, 0xe2, 0xcb, 0x3c, 0x8d, 0x5f, 0x42, 0x97, 0xdf, + 0x62, 0x31, 0x25, 0x82, 0xb2, 0xd1, 0x86, 0xcf, 0xc4, 0x57, 0x66, 0x96, + 0x5f, 0xe2, 0xff, 0x3a, 0xe3, 0xee, 0x2c, 0xbf, 0xb0, 0x7b, 0x99, 0xd6, + 0xe2, 0xca, 0x73, 0xeb, 0x23, 0x7a, 0xdc, 0x4d, 0xb5, 0xd3, 0x40, 0xb4, + 0x44, 0xa1, 0x84, 0x0d, 0xe1, 0x3c, 0x15, 0x97, 0xfe, 0x38, 0x66, 0xeb, + 0x91, 0x33, 0x6f, 0x59, 0x7f, 0x9b, 0x9e, 0x72, 0x88, 0x59, 0x70, 0x7c, + 0xb2, 0xb4, 0x78, 0xe7, 0x30, 0xbf, 0xfe, 0xcf, 0x75, 0x2e, 0x4d, 0x26, + 0x2f, 0xc0, 0x16, 0x5f, 0xd0, 0x72, 0x8e, 0xa4, 0xb2, 0x98, 0xff, 0xbc, + 0xa3, 0x7b, 0x5a, 0xc5, 0x97, 0xba, 0x97, 0x16, 0x5d, 0xe6, 0xe1, 0xba, + 0x30, 0x72, 0xfb, 0x58, 0xfb, 0xab, 0x2f, 0x41, 0x92, 0x59, 0x7f, 0xd9, + 0xfe, 0x6b, 0x39, 0x1d, 0x2c, 0xbd, 0x8f, 0xda, 0xca, 0xec, 0xfc, 0x98, + 0x74, 0x8e, 0x6f, 0xfd, 0x06, 0x09, 0x3f, 0x30, 0xf1, 0xb8, 0xb2, 0xe7, + 0x31, 0x65, 0x4e, 0xa9, 0x1c, 0x70, 0xa0, 0xed, 0x6f, 0x45, 0xbe, 0x84, + 0xb7, 0xcb, 0xb7, 0xa2, 0x5d, 0xce, 0x96, 0x5d, 0x9c, 0x59, 0x76, 0xee, + 0x96, 0x54, 0x2b, 0x8e, 0xc9, 0x5a, 0x4c, 0xe8, 0x20, 0xc6, 0xe8, 0xb5, + 0xff, 0xda, 0xec, 0x2e, 0x3c, 0x21, 0xf9, 0x96, 0x5f, 0xb3, 0xdd, 0x4b, + 0x8b, 0x2f, 0xc7, 0x17, 0xde, 0xf3, 0x16, 0x53, 0x1e, 0xc0, 0x85, 0x37, + 0x1e, 0x16, 0x5e, 0x6d, 0xf8, 0xb2, 0xff, 0xbb, 0x27, 0xe7, 0x03, 0x1d, + 0xac, 0xac, 0x3e, 0xdf, 0x8b, 0x04, 0x76, 0xff, 0xce, 0xdf, 0x96, 0x1a, + 0x58, 0x05, 0x97, 0xee, 0xa4, 0x58, 0x35, 0x95, 0xe3, 0xe5, 0x23, 0xdb, + 0xde, 0xc3, 0x16, 0x5f, 0xcd, 0xcf, 0x34, 0x32, 0xcb, 0xff, 0xf1, 0x66, + 0x77, 0xe8, 0xdc, 0x2c, 0xfe, 0x30, 0x16, 0x51, 0xd1, 0x00, 0xe5, 0x77, + 0xfb, 0x0b, 0xa8, 0xe3, 0xee, 0x2c, 0xbf, 0x14, 0xd1, 0xe8, 0x59, 0x4b, + 0x2e, 0xc1, 0xac, 0xb8, 0x0f, 0xd1, 0xa1, 0xde, 0x17, 0x7e, 0xcf, 0x74, + 0xfb, 0x8b, 0x2f, 0x81, 0xc8, 0x25, 0x97, 0xfb, 0x5e, 0x76, 0xe3, 0x6f, + 0x59, 0x71, 0xac, 0xb2, 0xa0, 0xfb, 0x30, 0x85, 0xcd, 0x2f, 0xfd, 0x84, + 0x4f, 0xfd, 0x92, 0x83, 0xac, 0xb7, 0x6b, 0x2b, 0xc7, 0xa0, 0x13, 0xeb, + 0xf3, 0xfc, 0x2e, 0x22, 0xca, 0x85, 0xca, 0x71, 0xc2, 0x73, 0x21, 0x1e, + 0xd0, 0x93, 0xdc, 0x21, 0x3c, 0x27, 0x7c, 0x44, 0xe6, 0xa0, 0x48, 0x22, + 0xfe, 0x42, 0x5f, 0xef, 0x81, 0x22, 0xbf, 0x8c, 0x8d, 0x69, 0xe6, 0x59, + 0x7f, 0xc3, 0x8e, 0xc4, 0x00, 0x23, 0xa5, 0x97, 0xb8, 0xfd, 0x2c, 0xbf, + 0xe7, 0xd6, 0x1d, 0xb6, 0xe0, 0xeb, 0x2b, 0xb4, 0x49, 0xb1, 0xe0, 0x47, + 0x6f, 0x9f, 0x9b, 0x82, 0x2c, 0xbf, 0x74, 0x31, 0xb7, 0x16, 0x5e, 0xd6, + 0x71, 0x65, 0x41, 0xe2, 0xe1, 0x4d, 0xf7, 0xe3, 0xa9, 0x2c, 0xbf, 0x98, + 0x1b, 0x64, 0xc0, 0x59, 0x76, 0x01, 0x65, 0x4e, 0x7d, 0x1a, 0x23, 0x22, + 0xfb, 0xff, 0xbc, 0xed, 0xfc, 0xd0, 0x0e, 0xf2, 0x59, 0x78, 0x7e, 0x65, + 0x94, 0xc7, 0xbe, 0x14, 0x3b, 0xfd, 0x31, 0x39, 0x98, 0x40, 0x59, 0x78, + 0xa2, 0x75, 0x94, 0xe7, 0x9e, 0x46, 0x77, 0xbf, 0x82, 0x2c, 0xa8, 0x56, + 0x41, 0x90, 0xc2, 0x34, 0xc3, 0xcd, 0x6f, 0x08, 0x8e, 0x42, 0x38, 0x2e, + 0x1b, 0xa4, 0x17, 0xf1, 0x44, 0xa3, 0x7c, 0x2c, 0xb0, 0x16, 0x5f, 0x8d, + 0x72, 0x0c, 0xcb, 0x2a, 0x0d, 0xd0, 0x44, 0x6f, 0x82, 0xdb, 0xa7, 0x59, + 0x7f, 0x6f, 0xd3, 0xc3, 0x6d, 0xac, 0xb9, 0xa7, 0x59, 0x6c, 0x59, 0x4c, + 0x98, 0x24, 0xcc, 0xfa, 0x20, 0x39, 0x2b, 0x98, 0x90, 0xbd, 0xfb, 0x3d, + 0xbd, 0xb4, 0xb2, 0xff, 0x14, 0xbc, 0xdb, 0xf0, 0x6b, 0x2d, 0x0b, 0x29, + 0xcf, 0x10, 0x8d, 0x2f, 0x66, 0xa1, 0x65, 0xf4, 0xc6, 0x41, 0xab, 0x2f, + 0x8b, 0xfb, 0xb0, 0xb2, 0xfa, 0x7f, 0xe7, 0x6b, 0x2f, 0xf3, 0x9a, 0x27, + 0xbd, 0x12, 0x59, 0x50, 0x8b, 0xdc, 0x1b, 0x62, 0x57, 0x24, 0xdb, 0x24, + 0xbf, 0xf7, 0xb0, 0x63, 0x6e, 0xb3, 0xaf, 0xac, 0xbf, 0xb6, 0x0c, 0x47, + 0xd6, 0x96, 0x54, 0xe7, 0xe2, 0x34, 0x0b, 0xfc, 0x3c, 0xff, 0xa0, 0xbb, + 0x59, 0x7a, 0x1b, 0x6d, 0x65, 0xf7, 0xf8, 0x21, 0xd6, 0x53, 0x9e, 0x10, + 0x47, 0xaf, 0xf8, 0x7b, 0x33, 0x91, 0x9a, 0x02, 0xcb, 0xde, 0x13, 0x8b, + 0x2b, 0x0f, 0x61, 0xce, 0xaf, 0x73, 0xcc, 0xb2, 0xff, 0x30, 0xfe, 0x4f, + 0xd7, 0x16, 0x52, 0xcb, 0xfb, 0x8d, 0xd6, 0x75, 0xf5, 0x95, 0xd1, 0xba, + 0xf8, 0x5d, 0xd3, 0xc2, 0xca, 0x84, 0x53, 0x3b, 0x68, 0x48, 0xaf, 0xb3, + 0x8c, 0x05, 0x95, 0x0a, 0x90, 0xa7, 0x23, 0x1b, 0xaf, 0x9e, 0x40, 0x40, + 0x50, 0xc2, 0xdb, 0x2e, 0xad, 0xa9, 0xda, 0xdc, 0x0a, 0x55, 0x76, 0x88, + 0x41, 0x0a, 0x09, 0xf6, 0x92, 0x28, 0xaa, 0x2c, 0x89, 0x41, 0x13, 0xbb, + 0xca, 0x34, 0xf1, 0xca, 0x00, 0xc9, 0x68, 0xe6, 0xc3, 0xeb, 0xb9, 0x42, + 0x7d, 0x46, 0xa0, 0xd2, 0x8b, 0xa6, 0x8f, 0xd7, 0x52, 0xab, 0x4f, 0x1e, + 0x3f, 0xa7, 0x31, 0xde, 0x5f, 0xf8, 0x25, 0x03, 0x0a, 0xd4, 0x4a, 0x5d, + 0x67, 0x27, 0x3e, 0xff, 0x2f, 0xb0, 0x31, 0xc3, 0xef, 0x56, 0x31, 0xb7, + 0x6e, 0x1b, 0xa2, 0x4a, 0xfc, 0xbb, 0xb8, 0x59, 0x7c, 0xfd, 0xc6, 0x96, + 0x51, 0x86, 0xe7, 0x74, 0x5e, 0xe3, 0x31, 0x65, 0xff, 0x9a, 0x3f, 0xe7, + 0x37, 0x08, 0x0b, 0x2f, 0xff, 0x3e, 0xb6, 0x3f, 0xf6, 0x7f, 0xae, 0xd8, + 0x96, 0x53, 0x22, 0x8f, 0xc2, 0xfb, 0xcf, 0x6f, 0x6b, 0x24, 0xb2, 0xe6, + 0x3a, 0xca, 0xf9, 0xb2, 0xdd, 0x1c, 0xbf, 0xb3, 0xf0, 0xc7, 0xe2, 0xcb, + 0xd0, 0x06, 0x59, 0x7f, 0x44, 0xb3, 0x59, 0xc5, 0x97, 0xef, 0x67, 0xe3, + 0xcb, 0x28, 0x67, 0xa6, 0xe5, 0x97, 0xff, 0xb5, 0xa0, 0xcb, 0x59, 0x1d, + 0x49, 0x8e, 0xb2, 0xe9, 0x99, 0x65, 0x61, 0xf1, 0x3a, 0x5d, 0xee, 0x09, + 0xc5, 0x97, 0xff, 0x4b, 0xe1, 0x9c, 0x5f, 0x9c, 0xed, 0xc5, 0x97, 0xfe, + 0xf0, 0x7a, 0xe4, 0x1d, 0xfa, 0xfa, 0xcb, 0x67, 0x48, 0x89, 0xfa, 0x45, + 0xff, 0xbf, 0x07, 0xe4, 0x34, 0xef, 0xf5, 0x97, 0xf3, 0xee, 0x3e, 0x75, + 0xf5, 0x95, 0xd1, 0xf7, 0x78, 0xfa, 0xff, 0x3e, 0x0d, 0xba, 0x27, 0x59, + 0x58, 0x7a, 0x81, 0x23, 0xb8, 0x66, 0xac, 0xbe, 0x8f, 0xc9, 0xd6, 0x5f, + 0x6b, 0x76, 0x09, 0x65, 0x89, 0x65, 0x41, 0xb4, 0x30, 0x92, 0xf7, 0xca, + 0x16, 0x5d, 0xe1, 0x70, 0xb9, 0xd1, 0x90, 0xc8, 0x66, 0x39, 0x89, 0x34, + 0x58, 0x76, 0xef, 0x42, 0x0d, 0xc8, 0x0a, 0x14, 0xfc, 0x87, 0x5f, 0xc8, + 0x77, 0x8c, 0x18, 0xaa, 0x21, 0x0d, 0x0b, 0x64, 0x26, 0xc4, 0xfb, 0x4d, + 0xfd, 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x9a, 0xbf, 0xc0, 0x8e, 0x33, 0xf4, + 0x62, 0xcb, 0xf0, 0x66, 0xf3, 0x0d, 0x65, 0xff, 0xb0, 0x79, 0x86, 0x8c, + 0x9a, 0x75, 0x97, 0x9f, 0x3e, 0xb2, 0xfb, 0x5e, 0x71, 0x6c, 0x8b, 0x63, + 0x9a, 0x11, 0x4f, 0x0f, 0xaf, 0xf7, 0xfd, 0x8d, 0x39, 0xe1, 0x65, 0xff, + 0xa3, 0x40, 0xff, 0x3d, 0x8c, 0x35, 0x97, 0x6d, 0x6e, 0xb2, 0xd3, 0xac, + 0xbd, 0x28, 0xe9, 0x65, 0xb2, 0x0d, 0x7c, 0xc2, 0x57, 0xcc, 0x4f, 0x3a, + 0xca, 0xc4, 0xc0, 0xbc, 0x66, 0xe7, 0xc4, 0x95, 0xc2, 0x6b, 0x79, 0x65, + 0xfb, 0xd1, 0xcf, 0x32, 0xcb, 0xff, 0x37, 0xe0, 0xe4, 0xe6, 0xf9, 0x96, + 0x5d, 0x1e, 0x59, 0x7f, 0x16, 0x6f, 0xf3, 0xc9, 0x65, 0x85, 0xce, 0x8b, + 0x9c, 0x11, 0x98, 0x9f, 0xc7, 0xbf, 0x16, 0xa1, 0x69, 0xaa, 0x6e, 0xc6, + 0x03, 0x7f, 0xfc, 0x17, 0x9f, 0x58, 0x71, 0x7e, 0x89, 0xc8, 0x2b, 0x28, + 0x5a, 0xe0, 0xeb, 0x43, 0xc5, 0xe5, 0x55, 0x11, 0x7d, 0xf3, 0x1c, 0x4d, + 0x2c, 0xbd, 0xe6, 0x31, 0x65, 0xf7, 0x0a, 0x0c, 0x59, 0x7b, 0xbc, 0xf2, + 0xcb, 0xb9, 0x0b, 0x2f, 0xc1, 0xe7, 0xe3, 0x8b, 0x2a, 0x46, 0xfa, 0x61, + 0x6a, 0x83, 0xfd, 0x65, 0xbb, 0xf8, 0xa0, 0xfc, 0x69, 0xd6, 0x5e, 0x2d, + 0x05, 0x65, 0x48, 0xf2, 0x58, 0xb6, 0xe3, 0x34, 0xb2, 0xfc, 0x16, 0x15, + 0x05, 0x3b, 0x52, 0xcb, 0xc1, 0xeb, 0x8b, 0x2f, 0xc2, 0x7c, 0xa0, 0x0b, + 0x2b, 0x47, 0x8d, 0xbc, 0x7a, 0xfd, 0x38, 0x64, 0x18, 0x59, 0x50, 0x79, + 0xac, 0x49, 0x7c, 0xc7, 0x6d, 0xd5, 0x97, 0x04, 0x45, 0x97, 0x8b, 0x38, + 0xb2, 0xa0, 0xf5, 0xe6, 0x24, 0x10, 0x62, 0xfb, 0xcd, 0xd7, 0x16, 0x5d, + 0x1d, 0x2c, 0xb9, 0xb6, 0xd6, 0x56, 0xe1, 0xe9, 0xcc, 0x46, 0x20, 0xbd, + 0xda, 0x35, 0x65, 0xc7, 0x17, 0x0a, 0xe4, 0x06, 0x47, 0xd0, 0xeb, 0x42, + 0x7e, 0x66, 0x9d, 0x10, 0x9c, 0x63, 0xd0, 0xc9, 0x77, 0x70, 0xc2, 0x0c, + 0x43, 0x4b, 0xb1, 0x96, 0x5d, 0x83, 0x59, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, + 0x28, 0x05, 0xfc, 0xfa, 0x6f, 0xf3, 0x16, 0x5e, 0x79, 0x0b, 0xc3, 0xe2, + 0xe1, 0xb5, 0xfe, 0x63, 0xc6, 0xe7, 0xb2, 0x75, 0x96, 0x17, 0x24, 0x7b, + 0xe0, 0xa9, 0xde, 0x3c, 0x69, 0x7f, 0x17, 0xf9, 0x03, 0x85, 0x97, 0x48, + 0xeb, 0x2f, 0xe6, 0xe4, 0xc5, 0x03, 0x59, 0x7b, 0x5d, 0x49, 0x65, 0x0c, + 0xf2, 0xdc, 0xb6, 0xfd, 0x1d, 0x7d, 0xf4, 0xb2, 0xfd, 0xfe, 0x49, 0x80, + 0xb2, 0xdb, 0xd6, 0x5b, 0xeb, 0x2a, 0x46, 0x93, 0xb1, 0x3b, 0xf9, 0xbd, + 0x05, 0x1f, 0x59, 0x78, 0x6e, 0xcb, 0x2a, 0x13, 0x8b, 0x91, 0x66, 0x31, + 0x31, 0x0b, 0x94, 0x12, 0x67, 0x08, 0x82, 0x57, 0x7a, 0x68, 0x92, 0xcb, + 0xb5, 0xf5, 0x96, 0x17, 0x86, 0xd3, 0x83, 0xb7, 0xfd, 0x1f, 0xf6, 0x1f, + 0x35, 0x8b, 0x2f, 0xa6, 0xcc, 0xed, 0x65, 0xfb, 0xe6, 0xbf, 0x05, 0xe8, + 0xf6, 0x84, 0x37, 0xa9, 0x23, 0x14, 0xc8, 0x41, 0x50, 0xb4, 0xe3, 0xe2, + 0x36, 0x6b, 0xb9, 0xf5, 0x96, 0x85, 0x96, 0xf2, 0xca, 0x39, 0xa1, 0x08, + 0x85, 0xf0, 0xa7, 0x7f, 0x5c, 0x59, 0x78, 0x78, 0x75, 0x97, 0xff, 0x7d, + 0x83, 0xc1, 0x0f, 0xad, 0x31, 0xab, 0x2f, 0xff, 0xdb, 0xe3, 0xcc, 0x3f, + 0x44, 0xb8, 0xfe, 0x6e, 0x2c, 0xbf, 0xb9, 0x07, 0x28, 0x99, 0x65, 0xbc, + 0xb2, 0xf0, 0x85, 0x32, 0xcb, 0x7f, 0x0d, 0x78, 0x04, 0x6e, 0xc9, 0xd6, + 0x56, 0x1b, 0xd2, 0x26, 0xbe, 0x63, 0xc4, 0xcb, 0x2a, 0x74, 0xe4, 0xe4, + 0x38, 0xc8, 0xe0, 0x56, 0x28, 0x4c, 0xed, 0x8f, 0xdf, 0xfe, 0x0e, 0xa5, + 0x9c, 0x60, 0x8a, 0xca, 0x0e, 0xb2, 0xdc, 0x59, 0x7c, 0x36, 0x20, 0x2c, + 0xad, 0x86, 0xc9, 0xc4, 0x6f, 0xff, 0xb5, 0x38, 0xfc, 0xda, 0xe4, 0x6a, + 0x66, 0xf2, 0xcb, 0xff, 0xb0, 0x1c, 0x27, 0x37, 0x37, 0xb6, 0x96, 0x5e, + 0x08, 0xf1, 0x65, 0xfd, 0xaf, 0x94, 0x1f, 0x8b, 0x2f, 0xff, 0xda, 0x1b, + 0x91, 0xbe, 0xcd, 0xcd, 0x31, 0xe0, 0xd5, 0x95, 0x88, 0x86, 0x09, 0x6d, + 0xb6, 0xd6, 0x54, 0x26, 0xdf, 0x8a, 0x4c, 0x8b, 0xe8, 0x51, 0x00, 0x8a, + 0xf3, 0xeb, 0x16, 0x5e, 0xe4, 0x01, 0x65, 0xf4, 0x98, 0xb1, 0x65, 0x7c, + 0xde, 0x18, 0x39, 0x7d, 0xdb, 0xbf, 0x6a, 0x8b, 0x7d, 0x7b, 0x6d, 0xfe, + 0xb2, 0xff, 0x31, 0x41, 0xc0, 0xff, 0x59, 0x7a, 0x6c, 0x02, 0xcb, 0xf0, + 0x93, 0xfa, 0x34, 0xb2, 0xbb, 0x4d, 0x01, 0x95, 0xf4, 0x44, 0x73, 0x0f, + 0x0f, 0xb9, 0x8f, 0xc7, 0x6f, 0xf9, 0xbd, 0x1d, 0x46, 0xe6, 0x74, 0xb2, + 0xff, 0xff, 0x9e, 0x61, 0xb6, 0xbd, 0x83, 0x28, 0xed, 0xe7, 0x28, 0x3a, + 0xcb, 0xfe, 0xd0, 0x79, 0xe7, 0x90, 0x19, 0x65, 0x98, 0x08, 0x9f, 0xfb, + 0x35, 0xf7, 0xf8, 0xff, 0x59, 0x7f, 0xed, 0x66, 0xe4, 0xde, 0x73, 0xb7, + 0x16, 0x5d, 0x93, 0xe1, 0xf2, 0x68, 0x8a, 0xbc, 0x8b, 0x92, 0x84, 0x65, + 0x8c, 0x59, 0x7f, 0xce, 0x5d, 0xf2, 0x3c, 0xfb, 0x8b, 0x28, 0xd3, 0xcd, + 0xf8, 0x95, 0xf6, 0x13, 0x4c, 0xb2, 0xf9, 0xb3, 0x5b, 0xd6, 0x5f, 0x75, + 0x29, 0xe1, 0x65, 0xe8, 0x33, 0x6d, 0x65, 0x61, 0xe2, 0x68, 0x92, 0xf7, + 0xa3, 0x4b, 0x2f, 0xde, 0x6d, 0x79, 0xd6, 0x5f, 0xfe, 0xf4, 0x4f, 0xfc, + 0xf1, 0x67, 0xfc, 0xcb, 0x2f, 0x1f, 0x06, 0xb2, 0xc7, 0x59, 0x7f, 0xa2, + 0x71, 0xe1, 0x9c, 0x17, 0x08, 0xb9, 0xc1, 0xc9, 0x89, 0xdd, 0x24, 0x41, + 0xca, 0x92, 0x69, 0xfe, 0x86, 0xd5, 0xf0, 0xcf, 0x9d, 0x2c, 0xbe, 0x97, + 0x04, 0xe2, 0xca, 0x83, 0xc7, 0xf9, 0x1d, 0xf6, 0x7f, 0x98, 0xb2, 0xfe, + 0x7e, 0x86, 0xc5, 0x3a, 0xca, 0x83, 0xcf, 0xd1, 0x0d, 0xee, 0x78, 0x6b, + 0x2f, 0xc2, 0x7c, 0xa0, 0x0b, 0x28, 0xe7, 0x8b, 0xbc, 0x76, 0xe2, 0x85, + 0x97, 0xff, 0x7f, 0x8d, 0xc8, 0x2c, 0xff, 0x99, 0x65, 0xff, 0x9f, 0x77, + 0x4c, 0x6e, 0x79, 0xa4, 0xb2, 0xff, 0x80, 0xdf, 0x27, 0xfc, 0x0d, 0x65, + 0xe2, 0xcf, 0x2c, 0xad, 0x23, 0xa8, 0xe2, 0xbe, 0x42, 0xe2, 0x0e, 0xf3, + 0x7b, 0xfe, 0x6e, 0x60, 0xe2, 0x66, 0x3a, 0xcb, 0xf0, 0xe3, 0x70, 0x27, + 0x59, 0x7f, 0xcf, 0xc8, 0xc2, 0x1f, 0xa1, 0x65, 0xfe, 0xf4, 0x0d, 0xb7, + 0xc0, 0xd6, 0x5f, 0xf6, 0xb3, 0xaf, 0x13, 0xee, 0x4e, 0xb2, 0xd8, 0x33, + 0xf1, 0x39, 0xa5, 0xdc, 0xe6, 0x91, 0x9c, 0x50, 0xa7, 0xa8, 0x55, 0x7d, + 0x91, 0x87, 0x76, 0x98, 0xc7, 0x0f, 0x0f, 0x9b, 0xf0, 0x99, 0xe7, 0x3a, + 0xcb, 0x82, 0x6a, 0xcb, 0xe3, 0xcd, 0x02, 0x2c, 0xba, 0x3c, 0xb2, 0xff, + 0xdb, 0xae, 0x71, 0x34, 0x03, 0xb7, 0x16, 0x57, 0x68, 0xbd, 0x39, 0x43, + 0x8c, 0x11, 0x26, 0xe8, 0xb5, 0xe6, 0x2f, 0xac, 0xb8, 0x3d, 0x2c, 0xbf, + 0xe7, 0x97, 0xf9, 0x86, 0x79, 0x96, 0x5e, 0xe9, 0xfc, 0xb2, 0x9d, 0x11, + 0x20, 0x1b, 0x21, 0x80, 0x9c, 0xdf, 0xe8, 0xe6, 0x75, 0xf6, 0xd2, 0xcb, + 0xee, 0x7e, 0x0e, 0xb2, 0xb4, 0x7a, 0xa0, 0x33, 0xbf, 0xde, 0x09, 0x0f, + 0xcc, 0x62, 0xcb, 0xff, 0xa6, 0x08, 0xdc, 0x81, 0xb1, 0x8f, 0xf5, 0x95, + 0xe3, 0xfb, 0xf9, 0xa5, 0xed, 0x47, 0xd6, 0x5f, 0xfa, 0x3e, 0x17, 0x9e, + 0x3d, 0x07, 0x59, 0x7f, 0x4c, 0xe3, 0xf3, 0x1d, 0x65, 0xfd, 0xf6, 0xc1, + 0xc1, 0xd6, 0x57, 0x48, 0x98, 0xf9, 0xf1, 0x85, 0xd7, 0xcf, 0x38, 0x49, + 0x65, 0xdc, 0x25, 0x97, 0xf7, 0x5c, 0x8e, 0xf0, 0xeb, 0x2f, 0x8f, 0xde, + 0x12, 0xca, 0x85, 0x45, 0xd9, 0x09, 0xdd, 0x11, 0x3c, 0x2d, 0x08, 0xcb, + 0x84, 0x41, 0x16, 0x10, 0xbe, 0x96, 0x5f, 0xa6, 0x82, 0x28, 0x59, 0x77, + 0x7a, 0x59, 0x73, 0x92, 0xca, 0x83, 0xde, 0x60, 0xbf, 0x93, 0x04, 0x62, + 0xfc, 0xf3, 0xc7, 0x9d, 0x65, 0xe2, 0x83, 0x56, 0x5f, 0x66, 0xe3, 0xf9, + 0x65, 0xe2, 0x7f, 0xf6, 0x78, 0x1c, 0x1c, 0xbf, 0xe2, 0xcf, 0xff, 0x26, + 0x79, 0x96, 0x5e, 0x98, 0x3e, 0x59, 0x70, 0xce, 0xb2, 0xfd, 0x93, 0x4a, + 0x3a, 0x59, 0x58, 0x7b, 0xc6, 0x8f, 0x10, 0xbd, 0xd0, 0x4b, 0x2b, 0xb4, + 0xc3, 0x58, 0xcf, 0xd0, 0x97, 0x30, 0xba, 0xf7, 0x8c, 0x75, 0x97, 0xff, + 0x07, 0x9e, 0x79, 0x8b, 0x00, 0x1e, 0x2c, 0xbf, 0x61, 0x7e, 0x38, 0xb2, + 0xf3, 0x91, 0xab, 0x2d, 0x25, 0x97, 0xf8, 0x00, 0x0f, 0x37, 0x33, 0xa5, + 0x95, 0x87, 0x92, 0xe2, 0x37, 0xfe, 0x7e, 0xba, 0xe3, 0x0f, 0x0c, 0xe2, + 0xca, 0x85, 0x60, 0xd9, 0x1b, 0xa3, 0x22, 0x68, 0x77, 0xc8, 0xae, 0x4c, + 0x4c, 0xbc, 0x20, 0xbf, 0xfe, 0x7e, 0xb5, 0x99, 0xd1, 0x9e, 0x0c, 0x75, + 0xc5, 0x97, 0xe7, 0x9f, 0xb7, 0x1a, 0xcb, 0xfd, 0xf6, 0xe3, 0xf6, 0xf3, + 0xac, 0xbf, 0x39, 0x0f, 0xd0, 0xb2, 0xf8, 0x0c, 0x46, 0xac, 0xa7, 0x3c, + 0x80, 0x13, 0x50, 0xa5, 0xb8, 0xc5, 0xda, 0x0e, 0x36, 0x91, 0x0c, 0x47, + 0x7b, 0x3a, 0xfc, 0x9f, 0xc7, 0x1c, 0x8e, 0x47, 0x1a, 0x6b, 0x27, 0x71, + 0xca, 0x74, 0xe8, 0xc4, 0x7b, 0x84, 0x33, 0x47, 0x6d, 0xa7, 0x03, 0xb8, + 0x7a, 0x59, 0x23, 0xc6, 0x22, 0x08, 0x6a, 0x94, 0xab, 0xee, 0x43, 0x63, + 0xf2, 0xd0, 0x02, 0xe9, 0xb6, 0xa6, 0x21, 0x4e, 0xeb, 0xe5, 0xd1, 0x3a, + 0xcb, 0x9f, 0xeb, 0x2f, 0x3f, 0x42, 0xc6, 0x6b, 0x4e, 0x2f, 0x42, 0xd5, + 0x0f, 0x14, 0x7d, 0x37, 0xf0, 0xc5, 0xf3, 0xfc, 0xe9, 0x65, 0xee, 0xdf, + 0xb5, 0x97, 0xff, 0x09, 0xde, 0xc8, 0xd6, 0x98, 0x9f, 0xb5, 0x97, 0xfb, + 0x6d, 0xc8, 0x1f, 0x89, 0x96, 0x56, 0x22, 0x70, 0xe3, 0xc2, 0x24, 0x5d, + 0xb5, 0xed, 0x0b, 0x2f, 0x1d, 0xfa, 0x59, 0x78, 0x0f, 0xe5, 0x97, 0xfd, + 0xf6, 0x3f, 0x3d, 0x86, 0x3a, 0xcb, 0xb7, 0xb2, 0xcb, 0xed, 0x6b, 0x04, + 0x59, 0x7f, 0xd1, 0x23, 0x1f, 0x5a, 0xc1, 0x16, 0x5e, 0xc3, 0x05, 0xed, + 0x49, 0x84, 0x41, 0x0e, 0x0e, 0xf4, 0x39, 0x31, 0xcb, 0x8c, 0x11, 0x1d, + 0xb8, 0x2d, 0x3b, 0x49, 0xe3, 0x38, 0xbf, 0xff, 0xef, 0xb7, 0xf9, 0xe6, + 0x17, 0xff, 0x33, 0x83, 0x03, 0xa9, 0xd6, 0x54, 0x2b, 0x1e, 0x69, 0x50, + 0x41, 0x33, 0xbf, 0x4e, 0x2c, 0x01, 0xe9, 0x65, 0xff, 0xfe, 0x6f, 0x85, + 0xe7, 0x17, 0x92, 0xf4, 0x6b, 0x30, 0x8d, 0x59, 0x5a, 0x44, 0x78, 0xac, + 0xb6, 0xff, 0xff, 0xee, 0xdf, 0x4f, 0xe9, 0x67, 0xf0, 0x7c, 0x73, 0xe6, + 0xa7, 0x8e, 0x96, 0x5f, 0xd8, 0x37, 0x3e, 0x12, 0xcb, 0xff, 0xec, 0x08, + 0xaf, 0x09, 0xdb, 0xcf, 0xff, 0x42, 0xca, 0x64, 0x77, 0x69, 0xcf, 0xc5, + 0x77, 0xed, 0x76, 0xef, 0xda, 0xa2, 0x94, 0x5f, 0xff, 0x3f, 0xcb, 0x27, + 0xd4, 0x79, 0xbd, 0x9a, 0x59, 0x77, 0x0c, 0x59, 0x7f, 0xef, 0x40, 0x0e, + 0xf2, 0xe7, 0x0c, 0x59, 0x79, 0xe4, 0x2e, 0x13, 0x0b, 0xc2, 0xf0, 0x1b, + 0x71, 0x38, 0x41, 0x8b, 0xff, 0x37, 0x6f, 0xa7, 0x93, 0x70, 0x0b, 0x2f, + 0xda, 0xed, 0xdf, 0xb5, 0x44, 0x9c, 0xba, 0x42, 0xe0, 0xfd, 0x30, 0xfa, + 0x8e, 0x8f, 0xf7, 0x86, 0x8d, 0xf7, 0xa2, 0x67, 0x59, 0x7d, 0xd9, 0x04, + 0xd5, 0x97, 0x68, 0x5e, 0x1e, 0x33, 0x91, 0x50, 0xb4, 0x4d, 0xbb, 0x6d, + 0x44, 0x76, 0x0d, 0x13, 0xd3, 0xf4, 0xe5, 0x3c, 0xca, 0x3c, 0xc8, 0x2d, + 0x32, 0x36, 0x63, 0x63, 0x2f, 0xee, 0x38, 0xa6, 0x97, 0x4b, 0xb9, 0x19, + 0xe4, 0xd0, 0xe9, 0xd4, 0x62, 0xc7, 0xb7, 0xc9, 0xbe, 0x9c, 0x4d, 0x79, + 0x7b, 0x60, 0x8e, 0xb8, 0xa5, 0xaf, 0x72, 0xbb, 0x0e, 0xfc, 0xb4, 0xa0, + 0xc3, 0x1b, 0x7c, 0xbb, 0xab, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x0f, 0xaf, + 0xfc, 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x44, 0xa6, 0xb0, 0xbc, 0x44, + 0x21, 0xcd, 0xaf, 0xf0, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x22, 0x75, 0xf9, + 0xbf, 0xc0, 0x9d, 0x65, 0xf8, 0x27, 0x27, 0x35, 0x65, 0xef, 0x44, 0xcb, + 0x2e, 0xea, 0x4b, 0x2a, 0x64, 0x42, 0xe8, 0xa3, 0xc5, 0x01, 0x1d, 0xbf, + 0xc1, 0xe8, 0x41, 0x87, 0xfc, 0x59, 0x7f, 0xfb, 0x69, 0x9a, 0x66, 0xe4, + 0xe3, 0x14, 0x6c, 0xd9, 0xed, 0xb5, 0x97, 0xed, 0x76, 0xef, 0xda, 0xa2, + 0x31, 0x5f, 0xb8, 0xdb, 0xe0, 0xeb, 0x2f, 0x75, 0x29, 0xd6, 0x5b, 0xd0, + 0x79, 0x18, 0x53, 0x7f, 0x4a, 0x01, 0xe6, 0x31, 0x65, 0xff, 0xfc, 0x12, + 0x73, 0x76, 0x7c, 0xd8, 0x29, 0x67, 0x98, 0xeb, 0x2f, 0xd3, 0x47, 0x52, + 0x75, 0x97, 0xd0, 0x7e, 0xc0, 0xb2, 0xff, 0xfa, 0x53, 0xed, 0x38, 0xda, + 0x27, 0xef, 0x5b, 0x36, 0x7b, 0x6d, 0x65, 0x62, 0x2c, 0xfc, 0x52, 0x02, + 0x3b, 0xf6, 0x9b, 0xb6, 0xde, 0xb2, 0xfc, 0x1f, 0xc7, 0x52, 0x59, 0x7b, + 0x3a, 0xfa, 0xcb, 0xfd, 0x85, 0xec, 0xfc, 0x0d, 0x65, 0xd9, 0xf8, 0x3c, + 0xe6, 0x1d, 0xbf, 0xf7, 0xcd, 0x82, 0x96, 0x79, 0x8e, 0xb2, 0xff, 0x8d, + 0x82, 0x96, 0x79, 0x8e, 0xb2, 0xf8, 0x24, 0xe6, 0xec, 0x3f, 0x6f, 0x9f, + 0x5f, 0xb4, 0x06, 0xf4, 0x2c, 0xa3, 0x9f, 0x10, 0x4e, 0xef, 0x75, 0x2d, + 0xa1, 0x65, 0xfd, 0xef, 0xf3, 0x3a, 0x92, 0xca, 0x63, 0xd2, 0x09, 0x1d, + 0xfb, 0x64, 0xc5, 0x03, 0x59, 0x78, 0x49, 0x6e, 0x2c, 0xb0, 0xb8, 0x5d, + 0x6e, 0x9c, 0xfa, 0x46, 0xf8, 0xc9, 0xdb, 0xf4, 0xc4, 0xc7, 0x2e, 0xf4, + 0x62, 0x0e, 0x5e, 0x02, 0xa2, 0x77, 0xe4, 0x60, 0x7f, 0x74, 0xdb, 0x21, + 0xdd, 0x2a, 0xbf, 0xfc, 0x2c, 0xef, 0x21, 0x79, 0xae, 0xdd, 0xfb, 0x54, + 0x4f, 0x2b, 0xdb, 0xe3, 0xcb, 0x2d, 0x0b, 0x2a, 0x0d, 0x76, 0x87, 0xaf, + 0xa0, 0xa5, 0xc5, 0x97, 0x67, 0x16, 0x5e, 0xfc, 0x1d, 0x65, 0xfb, 0xcc, + 0x59, 0xbd, 0x65, 0x69, 0x13, 0x60, 0x20, 0x15, 0x90, 0xfc, 0x58, 0x41, + 0xcb, 0xf7, 0x02, 0x3c, 0x3a, 0xcb, 0xa4, 0x22, 0xcb, 0xe0, 0xbe, 0xa4, + 0xb2, 0xf7, 0xc4, 0x9d, 0x65, 0xe3, 0x87, 0x71, 0x65, 0xf9, 0xc7, 0xe8, + 0xe2, 0xcb, 0xfd, 0x9e, 0xf4, 0x74, 0xfb, 0x8b, 0x2c, 0x2e, 0x11, 0xfd, + 0x22, 0x81, 0x8c, 0x61, 0x10, 0x07, 0xc8, 0x83, 0x84, 0xf4, 0x2d, 0x3b, + 0x63, 0x23, 0x4d, 0xa8, 0x65, 0x28, 0x4e, 0x55, 0x29, 0xe3, 0x6f, 0x43, + 0xa3, 0xf2, 0xb6, 0xef, 0xda, 0xed, 0xdf, 0xb5, 0x44, 0x40, 0xbf, 0xf3, + 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x12, 0xa2, 0xfe, 0xd0, 0x7d, 0x05, + 0xda, 0xcb, 0xfb, 0xb6, 0xcd, 0xdf, 0x42, 0xca, 0x83, 0xde, 0xc2, 0xeb, + 0x0b, 0xc4, 0xc0, 0x8e, 0x6c, 0x50, 0xac, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, + 0x11, 0x42, 0xfd, 0xa8, 0x3c, 0x74, 0xb2, 0xfd, 0xe6, 0x38, 0x46, 0xb2, + 0xf1, 0xc3, 0xb8, 0xb2, 0xff, 0x9e, 0x58, 0x32, 0x77, 0x1a, 0xcb, 0xff, + 0x05, 0xf4, 0xf2, 0xfb, 0x70, 0x2b, 0x2f, 0xfa, 0x3a, 0x2c, 0xff, 0x20, + 0xeb, 0x28, 0x8f, 0xd8, 0x27, 0xd7, 0xa0, 0x18, 0xb2, 0xc2, 0xf1, 0x38, + 0xe6, 0x36, 0x72, 0x80, 0x14, 0x11, 0x07, 0x21, 0x58, 0x21, 0x0d, 0xfe, + 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x44, 0x64, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, + 0x13, 0x2a, 0xfd, 0x2c, 0xfb, 0xf6, 0xb2, 0xfc, 0x2c, 0xef, 0x21, 0x78, + 0x7b, 0xdd, 0x1b, 0x5d, 0xd0, 0x56, 0x5f, 0xb5, 0xdb, 0xbf, 0x6a, 0x8a, + 0x91, 0x62, 0x59, 0x74, 0x8e, 0xb2, 0xf8, 0xf9, 0x9f, 0x59, 0x61, 0x16, + 0x58, 0x5c, 0x91, 0x51, 0x83, 0x1b, 0x86, 0xda, 0x10, 0x71, 0x70, 0x90, + 0xdf, 0xe1, 0x79, 0xae, 0xdd, 0xfb, 0x54, 0x57, 0x4b, 0xfc, 0x2f, 0x35, + 0xdb, 0xbf, 0x6a, 0x8b, 0x15, 0x7f, 0xd1, 0xce, 0x41, 0xff, 0x9d, 0xac, + 0xbe, 0xed, 0xdf, 0xb5, 0x44, 0xf4, 0xbf, 0x1d, 0xe4, 0x2f, 0x3b, 0x3e, + 0x9d, 0x1c, 0xde, 0x31, 0xfb, 0x59, 0x7f, 0x7a, 0x1b, 0x4c, 0x2b, 0x59, + 0x7e, 0x86, 0xdb, 0x6d, 0xd5, 0x97, 0xd1, 0xd3, 0xee, 0xac, 0xb8, 0xc1, + 0x78, 0x89, 0xfe, 0xc7, 0x9c, 0xc0, 0x8b, 0x2f, 0xff, 0x41, 0x0b, 0xcf, + 0x3e, 0xc3, 0xc6, 0x7d, 0x65, 0xff, 0xff, 0xe1, 0xe1, 0x82, 0xcb, 0x0d, + 0x35, 0xff, 0xc6, 0x29, 0xa3, 0xbd, 0x67, 0x4b, 0x2f, 0xff, 0xff, 0xdf, + 0x7d, 0x48, 0x5e, 0x70, 0x2f, 0xd6, 0x14, 0x18, 0x27, 0xda, 0x59, 0xd7, + 0xd6, 0x5f, 0xb3, 0xfe, 0x63, 0x16, 0x5f, 0xfb, 0x98, 0x4e, 0x6f, 0x9a, + 0x09, 0x65, 0xff, 0x66, 0x79, 0xbb, 0xf6, 0x0b, 0x23, 0xe4, 0xf9, 0x45, + 0xff, 0xfa, 0x62, 0x83, 0x8b, 0xce, 0x31, 0x83, 0x77, 0x35, 0x65, 0xdc, + 0xfa, 0xcb, 0xb3, 0x8b, 0x2f, 0xfd, 0x9a, 0xea, 0x0f, 0xe7, 0xcd, 0x2c, + 0xbb, 0x80, 0x59, 0x7e, 0x27, 0x39, 0x42, 0xcb, 0xf8, 0x3c, 0xf3, 0xc8, + 0x5e, 0xd0, 0x8a, 0x77, 0x17, 0x21, 0x63, 0x0f, 0x84, 0x17, 0xbd, 0x3c, + 0x6e, 0x2c, 0xbb, 0x5f, 0x59, 0x7e, 0xcf, 0xf1, 0x8e, 0xb2, 0xff, 0xf4, + 0x75, 0xfc, 0x99, 0xb5, 0xfe, 0x07, 0x71, 0x65, 0xe7, 0xe8, 0x5c, 0x22, + 0xb5, 0xc8, 0x08, 0x5f, 0xe4, 0xf5, 0x8a, 0x9b, 0xb5, 0x0f, 0xfe, 0x46, + 0x43, 0x52, 0x5c, 0xad, 0x1a, 0x5f, 0x4f, 0xa5, 0x0e, 0xbf, 0xca, 0xbe, + 0xa1, 0x6b, 0xc6, 0x11, 0x0e, 0x06, 0x9c, 0xf7, 0xbf, 0xfc, 0x31, 0x7f, + 0xf8, 0x67, 0x12, 0x6e, 0x07, 0xa5, 0x97, 0xa0, 0x22, 0xb5, 0x97, 0xed, + 0x77, 0xe6, 0xe2, 0xca, 0x63, 0xc9, 0x09, 0x05, 0xdf, 0x85, 0x95, 0xb5, + 0x1b, 0x7e, 0x88, 0x6f, 0xf8, 0xb3, 0x79, 0x67, 0x00, 0x75, 0x97, 0xe6, + 0xf1, 0x3c, 0xcb, 0x2f, 0xd2, 0xc1, 0xec, 0xc5, 0x97, 0xe7, 0x69, 0xf5, + 0x0b, 0x2f, 0xdf, 0x20, 0xb8, 0xa1, 0x65, 0x6d, 0x48, 0xdb, 0x14, 0x9c, + 0xc1, 0x3f, 0x8a, 0x44, 0x27, 0xb8, 0xe0, 0x59, 0x7e, 0xcf, 0xb0, 0x78, + 0xb2, 0xed, 0xa8, 0x55, 0x2c, 0xad, 0xa8, 0xf8, 0x05, 0x50, 0xbe, 0xd3, + 0x27, 0xbf, 0x0a, 0xbd, 0xab, 0x9a, 0xfa, 0xcb, 0xfc, 0x21, 0x66, 0xb5, + 0x1d, 0xac, 0xad, 0xa8, 0xfa, 0x05, 0x06, 0x97, 0xda, 0x3f, 0xfa, 0x59, + 0x7e, 0xda, 0xc5, 0x27, 0xe1, 0xab, 0x2e, 0x6e, 0x2c, 0xad, 0xa8, 0xf2, + 0x7b, 0x33, 0xbf, 0x6d, 0x62, 0x98, 0x91, 0xd6, 0x5e, 0xf4, 0x6e, 0x2c, + 0xbf, 0xf6, 0xd3, 0xda, 0x05, 0x02, 0x91, 0x40, 0xa0, 0x54, 0x14, 0x6d, + 0x4b, 0x2f, 0xfc, 0x2a, 0xc5, 0x02, 0xa0, 0xab, 0x15, 0x62, 0x91, 0x4e, + 0xd7, 0xb5, 0x2c, 0xbf, 0xf0, 0xa9, 0xb4, 0xc5, 0x58, 0xa8, 0x2a, 0xc5, + 0x22, 0xa8, 0x55, 0xed, 0x4b, 0x2f, 0xfb, 0xc3, 0x90, 0xb9, 0x70, 0x85, + 0x8a, 0x53, 0x4a, 0xda, 0x1a, 0x85, 0x53, 0x75, 0x6d, 0x4a, 0x83, 0x45, + 0x26, 0x22, 0xaa, 0x36, 0x9b, 0xf0, 0xa4, 0xee, 0xe4, 0xb2, 0xfe, 0x86, + 0xff, 0xe0, 0xeb, 0x2e, 0x1e, 0xe2, 0xca, 0xda, 0xcf, 0xc0, 0x55, 0x95, + 0x74, 0x59, 0x7b, 0xbc, 0xf2, 0x4b, 0xb9, 0xa5, 0x97, 0x8f, 0x1c, 0x59, + 0x7f, 0xff, 0xbe, 0x26, 0xa3, 0xd1, 0x9d, 0x8d, 0x8a, 0x73, 0xc4, 0x96, + 0x5d, 0xa8, 0x59, 0x4c, 0x7f, 0x00, 0x62, 0xbf, 0x46, 0xb4, 0xf2, 0x59, + 0x7f, 0xf7, 0xa3, 0x8e, 0x27, 0xbc, 0xdd, 0x71, 0x65, 0xff, 0x34, 0x16, + 0x6f, 0xd4, 0x71, 0x65, 0x76, 0x7f, 0xde, 0x46, 0xbd, 0x33, 0x18, 0xb2, + 0xec, 0x92, 0xcb, 0x01, 0x8d, 0xa3, 0x8f, 0x5f, 0xf9, 0xb6, 0x79, 0x9e, + 0x5f, 0x69, 0xd6, 0x56, 0x1f, 0x2f, 0x89, 0x6f, 0xdf, 0x00, 0x85, 0x32, + 0xcb, 0xff, 0x3f, 0x36, 0x73, 0x99, 0x29, 0x42, 0xcb, 0x71, 0x65, 0xfd, + 0x1d, 0xb4, 0xee, 0x4b, 0x2f, 0xff, 0xc4, 0xe6, 0xb6, 0xa2, 0x52, 0xce, + 0x00, 0x10, 0xb2, 0xff, 0x3f, 0xc3, 0x98, 0x46, 0xac, 0xa1, 0xa6, 0x9f, + 0x84, 0x26, 0x95, 0x4c, 0x81, 0xa1, 0x1f, 0x16, 0x81, 0x52, 0xfe, 0xcf, + 0xc1, 0x44, 0xcb, 0x2f, 0xfc, 0x58, 0x1e, 0xcb, 0x27, 0x12, 0x4b, 0x2f, + 0xff, 0x39, 0xc5, 0xc6, 0xb4, 0xdb, 0xbd, 0x86, 0x75, 0x97, 0x69, 0x89, + 0x12, 0x3b, 0xa8, 0x17, 0xcd, 0xe1, 0x0e, 0xb2, 0xff, 0xf3, 0x1b, 0xb3, + 0x09, 0xfa, 0xe1, 0xa6, 0xba, 0xca, 0xec, 0xfc, 0x48, 0x8e, 0xff, 0xf3, + 0xf0, 0xb0, 0x02, 0xfc, 0xdd, 0xbe, 0x96, 0x5c, 0x46, 0x2c, 0xbf, 0x70, + 0x82, 0xf2, 0x59, 0x7f, 0x7e, 0x69, 0x3e, 0x8d, 0x59, 0x76, 0x76, 0xb2, + 0xf0, 0xf0, 0xd7, 0x3c, 0x7f, 0x98, 0x5f, 0x7a, 0x0f, 0xda, 0xca, 0x84, + 0x6d, 0xe0, 0xbb, 0xb7, 0x7c, 0xce, 0xe0, 0x81, 0x65, 0xfb, 0xfe, 0x60, + 0x8a, 0xd6, 0x54, 0x8f, 0x0f, 0x05, 0xef, 0xb3, 0x08, 0xd5, 0x95, 0xc3, + 0xc2, 0xf9, 0x0d, 0xe1, 0xe7, 0x96, 0x5e, 0x99, 0x8c, 0x59, 0x61, 0xc8, + 0xdd, 0x30, 0xe5, 0xff, 0xec, 0xec, 0x6c, 0x42, 0x66, 0xb5, 0x1b, 0xd6, + 0x5f, 0xfd, 0xb2, 0x20, 0xa0, 0xfb, 0x36, 0x7b, 0x6d, 0x65, 0x42, 0x2f, + 0x80, 0x4c, 0x49, 0x97, 0xfc, 0x2b, 0x94, 0x61, 0x0e, 0x0e, 0xb2, 0xff, + 0xde, 0xc9, 0xbc, 0xde, 0x8d, 0x42, 0xcb, 0x9f, 0xa5, 0x97, 0x8a, 0x37, + 0x16, 0x5f, 0xe7, 0xe3, 0xf8, 0x25, 0x3a, 0xca, 0x23, 0xe8, 0xf8, 0xb8, + 0x47, 0xab, 0x63, 0x26, 0x7a, 0x71, 0x79, 0x42, 0x50, 0x64, 0x3d, 0x42, + 0x95, 0xa5, 0x05, 0xcc, 0xcd, 0xa8, 0x5e, 0x9e, 0x14, 0x3e, 0x22, 0x28, + 0xc9, 0xb9, 0x0b, 0xff, 0xc6, 0x34, 0x12, 0xe1, 0x0e, 0xf7, 0x61, 0x4d, + 0x77, 0x02, 0xb2, 0xda, 0x59, 0x74, 0x69, 0x65, 0xd9, 0xe5, 0x97, 0xed, + 0x75, 0x2f, 0xc2, 0xcb, 0xd9, 0xbf, 0x16, 0x56, 0x1e, 0x31, 0x14, 0xd6, + 0xc4, 0x51, 0xf6, 0x23, 0xb6, 0x2c, 0x22, 0xe5, 0xf6, 0x1d, 0xbe, 0xb2, + 0xa1, 0x31, 0xfd, 0x42, 0xeb, 0xe8, 0x97, 0xbb, 0x0e, 0x96, 0x5d, 0xa0, + 0x2c, 0xb9, 0xf1, 0x65, 0x74, 0x6b, 0x34, 0x2f, 0x78, 0x9f, 0xeb, 0x2f, + 0x13, 0x71, 0x65, 0x8c, 0x14, 0x9b, 0x68, 0x1b, 0xba, 0x3c, 0xb2, 0xfb, + 0x5b, 0xdc, 0xeb, 0x2f, 0xee, 0xce, 0x51, 0xd0, 0x16, 0x5f, 0xc0, 0xe6, + 0x66, 0x32, 0xcb, 0xff, 0xcd, 0xb2, 0x26, 0x6f, 0xea, 0x3b, 0x0f, 0x6b, + 0x2f, 0x01, 0xfa, 0x59, 0x7d, 0x9f, 0x83, 0x16, 0x56, 0x1b, 0xf2, 0x1d, + 0xbf, 0xfc, 0xdb, 0x3d, 0x93, 0x37, 0x5c, 0xf6, 0x76, 0xb2, 0xe2, 0xe2, + 0xcb, 0xe2, 0x7f, 0xf1, 0x65, 0x48, 0xdb, 0x9c, 0x5a, 0xf4, 0x66, 0x96, + 0x5f, 0xfe, 0xed, 0xf4, 0xff, 0x6e, 0x41, 0x40, 0x16, 0x5a, 0x5e, 0x3e, + 0x31, 0x06, 0xeb, 0xa4, 0x56, 0xea, 0x10, 0x95, 0x0a, 0xe7, 0x67, 0x35, + 0x1a, 0x56, 0x2c, 0x76, 0x56, 0xc2, 0xd3, 0x12, 0x1c, 0xbc, 0x05, 0x7c, + 0x84, 0x6f, 0xc7, 0xc3, 0x19, 0x95, 0xf0, 0xce, 0x67, 0x16, 0x5f, 0xf0, + 0x3b, 0xf3, 0x69, 0xb2, 0x4b, 0x2f, 0x30, 0x87, 0x59, 0x73, 0x0d, 0x65, + 0x39, 0xb3, 0x10, 0x76, 0xf7, 0xa0, 0x96, 0x5e, 0xe6, 0xee, 0xea, 0xcb, + 0xed, 0x92, 0x01, 0xd6, 0x5e, 0xd6, 0x0d, 0x65, 0xfe, 0x7f, 0xc4, 0xdc, + 0x63, 0xac, 0xa3, 0x4f, 0x3f, 0xc3, 0x97, 0xfa, 0x24, 0x59, 0xd7, 0xf1, + 0x65, 0xfb, 0xb6, 0xea, 0x72, 0x59, 0x7f, 0xf3, 0xf7, 0x04, 0x39, 0xa5, + 0x1a, 0x9d, 0x65, 0x74, 0x7e, 0x1e, 0x2a, 0xb7, 0x16, 0x53, 0x1b, 0x4e, + 0x11, 0xdf, 0xc5, 0xa7, 0x77, 0xfa, 0xcb, 0xff, 0xef, 0xf0, 0x7a, 0xc6, + 0x37, 0xc6, 0x39, 0x4e, 0xb2, 0xf8, 0x87, 0x86, 0xac, 0xbd, 0xe0, 0x9d, + 0x65, 0xdb, 0xc6, 0xb2, 0xb6, 0x92, 0xb5, 0x18, 0x24, 0x93, 0x60, 0xc8, + 0x70, 0x6f, 0xa2, 0x36, 0x74, 0xd1, 0x1f, 0xa1, 0xac, 0xe4, 0x1c, 0x2b, + 0xfa, 0x90, 0x48, 0x8c, 0x1d, 0xbf, 0x61, 0x14, 0x4e, 0xb2, 0xdd, 0x2c, + 0xd1, 0xa6, 0xbc, 0x12, 0x92, 0xcb, 0xf7, 0x26, 0x82, 0x9d, 0x65, 0x61, + 0xf3, 0x9a, 0x45, 0xf1, 0xcb, 0xdb, 0x25, 0x3a, 0xcb, 0xf1, 0x1a, 0xd9, + 0xc5, 0x97, 0xef, 0x37, 0x18, 0x6b, 0x2f, 0x34, 0x1d, 0x65, 0xb5, 0x23, + 0xc2, 0xf1, 0x3d, 0xf3, 0xfd, 0xfb, 0x59, 0x4c, 0x79, 0x46, 0x14, 0x5f, + 0x04, 0x57, 0xc9, 0xd6, 0x5f, 0xf8, 0xc7, 0x06, 0x77, 0xe7, 0x07, 0x16, + 0x54, 0x1f, 0x46, 0x14, 0x5f, 0xfb, 0x8f, 0xd4, 0x13, 0x8f, 0x0d, 0x59, + 0x4c, 0x9c, 0xdf, 0xa1, 0x66, 0x50, 0x8a, 0xf9, 0x05, 0xff, 0xef, 0xfb, + 0x0e, 0x07, 0xd6, 0x6f, 0xc1, 0xac, 0xba, 0x3c, 0xb2, 0xc3, 0x59, 0x47, + 0x34, 0xe4, 0x2d, 0x63, 0x56, 0x5e, 0x20, 0x42, 0xcb, 0x88, 0x7b, 0x0d, + 0x6f, 0x04, 0xae, 0xcf, 0xac, 0xbf, 0xb3, 0x86, 0x39, 0x4e, 0xb2, 0xa1, + 0x33, 0x1c, 0x72, 0x74, 0xd0, 0x17, 0x10, 0xb5, 0xfe, 0x27, 0x33, 0x63, + 0xf7, 0x8b, 0x2f, 0x83, 0xc7, 0xed, 0x65, 0xff, 0x82, 0x3f, 0x34, 0x6f, + 0xd0, 0x9c, 0x59, 0x5a, 0x3e, 0x52, 0x23, 0xbd, 0xc1, 0xc2, 0xcb, 0xfe, + 0xe7, 0xf3, 0xb0, 0x81, 0xf1, 0x65, 0x1a, 0x7a, 0xae, 0x39, 0x50, 0x89, + 0x80, 0xbb, 0x5b, 0x8b, 0x2d, 0x8b, 0x29, 0x8d, 0x0e, 0xe8, 0x8d, 0xf7, + 0x45, 0x06, 0xac, 0xa3, 0x9e, 0x33, 0x91, 0xdf, 0xf6, 0x13, 0xcb, 0x92, + 0x32, 0x75, 0x97, 0xd2, 0xe3, 0x12, 0xcb, 0xef, 0x77, 0x1d, 0xac, 0xbf, + 0xf7, 0x64, 0xfe, 0x7e, 0xb3, 0xaf, 0xac, 0xa9, 0x22, 0xff, 0xa3, 0xa6, + 0x21, 0x09, 0x25, 0xf6, 0xb1, 0xce, 0xb2, 0xa0, 0xf7, 0x9c, 0xf6, 0xfe, + 0x8e, 0x47, 0xa3, 0x8b, 0x2f, 0xed, 0x4a, 0x3b, 0x6e, 0xd6, 0x56, 0x8f, + 0x6d, 0xcb, 0x2e, 0xfe, 0x2c, 0xa8, 0x5f, 0x53, 0x9c, 0xbf, 0x23, 0xbb, + 0x68, 0xdd, 0xf4, 0x8f, 0xe8, 0xcc, 0x9e, 0x11, 0x25, 0x19, 0xf0, 0x5e, + 0xc4, 0x21, 0xbf, 0xfc, 0x6b, 0xe7, 0x5f, 0xfc, 0x66, 0xf6, 0xed, 0x65, + 0xfe, 0x2c, 0xe7, 0xdd, 0xc9, 0x65, 0x1a, 0x7f, 0xbb, 0xd3, 0x6f, 0xb7, + 0x77, 0x63, 0x71, 0x65, 0xff, 0xf7, 0xd8, 0x83, 0x2c, 0xe0, 0xc2, 0xfa, + 0x92, 0xcb, 0x46, 0xc3, 0xfa, 0x10, 0xae, 0xff, 0xc7, 0x79, 0x67, 0x9b, + 0x5e, 0x75, 0x97, 0x36, 0xb4, 0x7c, 0xe0, 0x2a, 0xbf, 0xff, 0x8b, 0x0d, + 0xc2, 0xd9, 0xcf, 0xfb, 0x0e, 0x24, 0x01, 0x65, 0x42, 0x22, 0xb0, 0xb6, + 0xff, 0x05, 0xf8, 0xd3, 0x31, 0x8b, 0x29, 0x93, 0xe5, 0xf4, 0x72, 0x04, + 0x43, 0x7b, 0xd0, 0x4b, 0x2e, 0xf9, 0xd6, 0x5b, 0x6d, 0x65, 0x74, 0x6a, + 0xfc, 0x2f, 0x5d, 0x9f, 0x43, 0xa3, 0x5f, 0x0f, 0x4c, 0x62, 0xcb, 0xfb, + 0x32, 0x7c, 0xcf, 0xac, 0xb8, 0xdd, 0xeb, 0x2f, 0x60, 0x46, 0xb2, 0xa7, + 0x44, 0x28, 0xc8, 0xc8, 0xb3, 0x83, 0x57, 0x98, 0xbe, 0xb2, 0xfa, 0x3b, + 0xcd, 0x2c, 0xbe, 0xf4, 0x6f, 0xc5, 0x97, 0xf3, 0xef, 0x69, 0x98, 0xc5, + 0x94, 0x74, 0x48, 0x10, 0xdf, 0xc8, 0x84, 0x23, 0xbf, 0xc1, 0xd4, 0xe7, + 0x8c, 0xfa, 0xcb, 0xfe, 0xe4, 0x1c, 0x7e, 0x82, 0xed, 0x65, 0xcc, 0x58, + 0x7d, 0xa6, 0x9a, 0x54, 0x23, 0x58, 0x70, 0xaa, 0xbd, 0x20, 0xf1, 0x65, + 0xfc, 0x37, 0xd0, 0x36, 0xf1, 0x65, 0xef, 0x09, 0xbd, 0x65, 0xff, 0x41, + 0xcb, 0x3b, 0xd3, 0x01, 0x65, 0x86, 0xb2, 0xf7, 0x39, 0x8b, 0x2c, 0x38, + 0x35, 0xae, 0x23, 0x52, 0x45, 0x57, 0x08, 0x02, 0xcb, 0x7f, 0x79, 0xdb, + 0xbc, 0x25, 0x97, 0xfa, 0x58, 0xdc, 0xe0, 0x61, 0x65, 0xfc, 0x3c, 0x29, + 0x7b, 0x16, 0x5f, 0xff, 0xfe, 0xce, 0x7b, 0x35, 0x04, 0xfd, 0x4b, 0xd1, + 0xff, 0xc7, 0x5e, 0x83, 0xac, 0xa8, 0x46, 0xab, 0x19, 0x1c, 0xb2, 0xff, + 0xdf, 0x83, 0xf5, 0xdb, 0x75, 0x9a, 0x59, 0x7e, 0xf6, 0x69, 0xb8, 0xb2, + 0xf1, 0x34, 0xba, 0x3e, 0x8f, 0xa0, 0xdf, 0xf6, 0x02, 0x09, 0xc7, 0x86, + 0xac, 0xbf, 0xa3, 0xf8, 0xc1, 0x15, 0xac, 0xa7, 0x3e, 0x70, 0x1b, 0xdf, + 0xf6, 0x4f, 0x83, 0xc2, 0x8d, 0xc5, 0x95, 0x0a, 0xa3, 0x27, 0x8c, 0x06, + 0x50, 0x96, 0x04, 0x26, 0x88, 0x86, 0xff, 0xf1, 0x7f, 0x6f, 0x26, 0x93, + 0xea, 0x71, 0xc2, 0xcb, 0xff, 0xf8, 0xa5, 0x1f, 0x7f, 0x71, 0x9f, 0xe0, + 0x10, 0xa4, 0xb2, 0xfb, 0xff, 0xcd, 0xc5, 0x97, 0xfd, 0x19, 0x2f, 0x63, + 0x4b, 0x8b, 0x2b, 0x87, 0xb9, 0xf2, 0x5b, 0xf0, 0xe6, 0xf0, 0x77, 0x16, + 0x57, 0x47, 0x9e, 0x44, 0x55, 0x89, 0xba, 0xb2, 0x73, 0xc6, 0x0b, 0x7e, + 0xd1, 0x36, 0x1a, 0xb2, 0xfd, 0x1e, 0x6e, 0xa4, 0xb2, 0xe3, 0xc9, 0x65, + 0xff, 0x3e, 0x76, 0x3c, 0xd0, 0x19, 0x65, 0x6c, 0x3f, 0x71, 0x94, 0x78, + 0x5e, 0xff, 0x75, 0xc1, 0x09, 0xa0, 0x6b, 0x2b, 0x47, 0xca, 0x46, 0x35, + 0x09, 0x92, 0x34, 0x60, 0x77, 0xfa, 0x5c, 0x28, 0x03, 0x9d, 0x65, 0xf9, + 0xfa, 0xfc, 0xf0, 0xb2, 0xa0, 0xf6, 0xc8, 0xca, 0xfe, 0xd1, 0xb8, 0x1d, + 0x4e, 0xb2, 0xfe, 0x6d, 0x4e, 0x10, 0x62, 0xcb, 0xf7, 0xe3, 0x0b, 0xb5, + 0x97, 0xdd, 0x7e, 0x0e, 0xb2, 0x8d, 0x3c, 0xae, 0x89, 0xef, 0xfa, 0x42, + 0x7d, 0xbc, 0xc5, 0xf5, 0x97, 0xfe, 0xcd, 0xc1, 0xfa, 0x3d, 0x1f, 0xe2, + 0xcb, 0xff, 0xd1, 0x9d, 0x7f, 0xd1, 0xf2, 0x80, 0x71, 0x65, 0xd0, 0x05, + 0x97, 0x78, 0xeb, 0x2f, 0xff, 0xf6, 0x83, 0x26, 0x2c, 0x08, 0x36, 0x67, + 0x08, 0x2f, 0x3a, 0xca, 0xed, 0x11, 0xfc, 0x16, 0xf8, 0xbd, 0x42, 0xa4, + 0xf9, 0xcc, 0x19, 0xe1, 0xc9, 0x08, 0xe7, 0xe8, 0x21, 0x86, 0xc5, 0xf8, + 0x6e, 0x41, 0x3a, 0xcb, 0xff, 0x04, 0x19, 0xde, 0x6b, 0x4f, 0x25, 0x97, + 0xff, 0x05, 0xe4, 0x70, 0xff, 0xd0, 0x11, 0x5a, 0xcb, 0xa0, 0xeb, 0x2b, + 0x11, 0x8b, 0xa2, 0x72, 0x3f, 0xe2, 0x4d, 0xe9, 0xdb, 0x4b, 0x2f, 0xfb, + 0x8d, 0xd7, 0xe6, 0x94, 0x74, 0xb2, 0xfd, 0xcf, 0xf3, 0x3e, 0xb2, 0xb8, + 0x7c, 0x81, 0x3c, 0xbf, 0x0a, 0xda, 0x66, 0x31, 0x65, 0xfc, 0x51, 0x30, + 0x5c, 0x45, 0x94, 0x13, 0xdb, 0x10, 0xb6, 0xec, 0xf2, 0xcb, 0xc6, 0x18, + 0x62, 0x4b, 0xff, 0xdf, 0x6f, 0xf3, 0xcd, 0xb6, 0x26, 0xa2, 0x49, 0x05, + 0x9a, 0x0a, 0x35, 0x3b, 0x76, 0x84, 0x0b, 0xbe, 0xfc, 0x8c, 0x26, 0xd7, + 0xfc, 0x2b, 0x6d, 0x4e, 0x10, 0x61, 0x2c, 0xba, 0x66, 0x59, 0x7f, 0xff, + 0x4a, 0x0b, 0x3f, 0xe6, 0xcf, 0xc1, 0xdb, 0x52, 0x59, 0x5a, 0x3e, 0xff, + 0x8b, 0xdf, 0xc7, 0x10, 0xb3, 0x7e, 0x2c, 0xbf, 0x67, 0x02, 0x5f, 0x59, + 0x4c, 0x7f, 0x0e, 0x44, 0x45, 0xf7, 0xff, 0xe8, 0xd4, 0xf1, 0xe7, 0x6d, + 0x69, 0x8f, 0xb5, 0xed, 0x25, 0x95, 0x26, 0xc7, 0xe4, 0x70, 0x9d, 0xc8, + 0x53, 0xf7, 0x1d, 0x1f, 0x44, 0xec, 0x3b, 0x34, 0x36, 0xb5, 0x2a, 0xf0, + 0xf1, 0xe8, 0x7a, 0x35, 0x80, 0x42, 0x0c, 0xa5, 0x37, 0xf2, 0x32, 0xdf, + 0xc7, 0xe4, 0x14, 0xfd, 0xf1, 0x92, 0x6e, 0x96, 0x5f, 0xf7, 0x52, 0xe7, + 0x30, 0x6f, 0xf5, 0x97, 0xf6, 0xbf, 0x01, 0x15, 0xf1, 0x65, 0xcd, 0xb6, + 0xb2, 0xfd, 0x9a, 0xf8, 0x7c, 0xb2, 0xb4, 0x78, 0x22, 0x0c, 0xdb, 0x16, + 0x5b, 0x16, 0x6e, 0x16, 0x17, 0xda, 0x27, 0xde, 0xb2, 0xf6, 0x39, 0x2c, + 0xb9, 0xcc, 0x59, 0x50, 0x9a, 0xb0, 0xce, 0xb1, 0xcc, 0xd3, 0x36, 0x22, + 0xd1, 0x19, 0xc6, 0xaf, 0xff, 0xe2, 0xcf, 0xfb, 0x25, 0xa8, 0xf3, 0xb7, + 0xe3, 0xcb, 0x2f, 0x03, 0x98, 0xb2, 0xff, 0x3c, 0xa6, 0xf3, 0x75, 0xf5, + 0x97, 0xd2, 0x82, 0x92, 0xcb, 0x3a, 0xcb, 0xd1, 0xee, 0x2c, 0xae, 0x8d, + 0x63, 0x08, 0x5f, 0xfa, 0x3b, 0xd9, 0x85, 0x01, 0x15, 0xf1, 0x65, 0xff, + 0xfc, 0xff, 0x6f, 0x39, 0xf6, 0x67, 0x23, 0x35, 0x84, 0xb2, 0xff, 0xee, + 0x3f, 0x5c, 0xe6, 0x10, 0x36, 0xf1, 0x65, 0xff, 0xe6, 0xef, 0x91, 0xb7, + 0x9f, 0x94, 0xb3, 0x8b, 0x28, 0x69, 0xea, 0x4c, 0x6b, 0xa4, 0xd3, 0x90, + 0x92, 0x27, 0xd6, 0x77, 0xa3, 0xdf, 0x6b, 0xd8, 0x4b, 0x2f, 0xff, 0xc5, + 0x8d, 0xc6, 0xd4, 0x07, 0xf3, 0x46, 0x0d, 0x65, 0x32, 0x36, 0xdd, 0x9c, + 0x24, 0x37, 0xe1, 0x24, 0xc0, 0xe2, 0xcb, 0xd9, 0x10, 0xb2, 0xfc, 0x27, + 0x0c, 0xcf, 0x2c, 0xa9, 0xcf, 0x13, 0x83, 0x54, 0x34, 0x48, 0x69, 0xb6, + 0xfe, 0x2d, 0x82, 0x72, 0x31, 0x65, 0xf6, 0x9c, 0xec, 0xb2, 0xfb, 0xf1, + 0xd1, 0x8b, 0x2b, 0x17, 0x1e, 0x3b, 0x58, 0xf4, 0xac, 0xb7, 0x85, 0xf0, + 0x08, 0xc2, 0x5e, 0x61, 0x0d, 0xff, 0xfb, 0xe1, 0x13, 0xe5, 0x00, 0x7f, + 0x80, 0x42, 0x92, 0xcb, 0xf7, 0xff, 0x84, 0x75, 0x97, 0xff, 0xfa, 0x33, + 0x98, 0x5a, 0x89, 0x31, 0xf3, 0xa9, 0x4c, 0x15, 0x94, 0xc8, 0x87, 0x22, + 0x7b, 0x8c, 0xf2, 0xcb, 0xff, 0xd0, 0x5d, 0x89, 0xa7, 0x03, 0x7f, 0xd0, + 0xb2, 0xf9, 0xe7, 0x72, 0x59, 0x7e, 0xff, 0xb0, 0x0e, 0xb2, 0xba, 0x3c, + 0x82, 0x21, 0xbf, 0x8f, 0xb3, 0xd8, 0x07, 0x59, 0x7f, 0x19, 0xcc, 0xc2, + 0x9d, 0x65, 0x41, 0xff, 0xe1, 0x13, 0x17, 0xdf, 0xda, 0xc2, 0x0c, 0x69, + 0x65, 0xf4, 0x72, 0x37, 0xac, 0xbf, 0xfa, 0x09, 0xff, 0x28, 0x35, 0xcc, + 0xfa, 0xca, 0x14, 0x22, 0x4f, 0xc5, 0x81, 0x23, 0xbd, 0xb1, 0xfb, 0x59, + 0x50, 0xac, 0xea, 0x50, 0xde, 0xec, 0x84, 0x03, 0x1c, 0x8c, 0x47, 0xf0, + 0xbf, 0xdd, 0x34, 0xbf, 0xa4, 0x21, 0xce, 0xdb, 0x8b, 0x2f, 0xb3, 0x91, + 0x25, 0x97, 0xda, 0xf3, 0x08, 0xb2, 0xfe, 0x97, 0x3e, 0xd1, 0xd2, 0xcb, + 0xe3, 0x89, 0x04, 0xb2, 0xf9, 0x87, 0x87, 0x59, 0x7c, 0xee, 0x40, 0x59, + 0x63, 0x20, 0xf0, 0x4d, 0x21, 0xb8, 0x27, 0x59, 0x7f, 0x8c, 0x79, 0xb2, + 0x51, 0xb8, 0xb2, 0xfd, 0xba, 0x19, 0x9a, 0x65, 0x94, 0xc8, 0xa4, 0xf1, + 0x4f, 0x05, 0xc2, 0x6f, 0x7f, 0xcc, 0x7f, 0x74, 0xfb, 0x9f, 0xe2, 0xcb, + 0xfb, 0xb7, 0xf7, 0xb0, 0x6b, 0x2a, 0x0f, 0xac, 0x27, 0xb7, 0xd0, 0x63, + 0x98, 0xb2, 0xff, 0x43, 0xeb, 0xc6, 0x38, 0xd2, 0x5c, 0x61, 0x89, 0x28, + 0x67, 0x98, 0x61, 0x9d, 0xef, 0xb6, 0xe2, 0x41, 0x66, 0x8e, 0xfe, 0xeb, + 0xb6, 0xe7, 0x99, 0x65, 0xe3, 0xc1, 0xd6, 0x5e, 0x90, 0x7e, 0xb2, 0xa0, + 0xdc, 0x84, 0x72, 0xa1, 0x5d, 0xf0, 0xcc, 0xb0, 0x87, 0xa2, 0x36, 0x2e, + 0x9a, 0x30, 0x73, 0xc2, 0x9c, 0x04, 0x3c, 0x84, 0x97, 0xcc, 0x76, 0xda, + 0x2f, 0x88, 0x7e, 0x75, 0x97, 0xb1, 0xf7, 0x16, 0x5e, 0xd6, 0x0d, 0x65, + 0x61, 0xed, 0xe8, 0x87, 0x78, 0xf5, 0xef, 0x46, 0x96, 0x5f, 0xd8, 0x02, + 0x8f, 0xf1, 0x65, 0xc6, 0x71, 0x65, 0xb1, 0x65, 0xba, 0xc3, 0x51, 0xf1, + 0x8b, 0xee, 0xa4, 0x29, 0xe9, 0x65, 0xbc, 0xb2, 0xff, 0xdc, 0x19, 0x40, + 0xfd, 0x1f, 0xe2, 0xca, 0x83, 0xcf, 0xe0, 0x8d, 0x42, 0x30, 0x30, 0x9c, + 0x2f, 0x17, 0xff, 0xfd, 0x86, 0x64, 0xbd, 0x8d, 0x2e, 0x75, 0xc6, 0xfb, + 0x14, 0xeb, 0x2e, 0xf4, 0xcb, 0x2f, 0xf7, 0x99, 0xe5, 0xf6, 0x9d, 0x65, + 0xff, 0xbe, 0xda, 0x70, 0x6e, 0xff, 0x3c, 0xb2, 0xff, 0x98, 0xc2, 0xcf, + 0xb0, 0x40, 0xb2, 0xfe, 0xfc, 0x31, 0x09, 0xc5, 0x97, 0xe3, 0xb4, 0xcc, + 0x62, 0xca, 0x83, 0xd6, 0x62, 0xdb, 0xf3, 0x68, 0x71, 0x3a, 0xcb, 0xfc, + 0xfa, 0xff, 0x09, 0x8d, 0x59, 0x7f, 0x75, 0xcc, 0xf8, 0x93, 0xac, 0xbf, + 0xc6, 0x7f, 0x3c, 0x38, 0x3a, 0xca, 0x83, 0xe5, 0x73, 0x1b, 0xff, 0xdc, + 0xc3, 0x70, 0x3a, 0x71, 0xc7, 0xa1, 0x65, 0xf0, 0x83, 0xf4, 0x2c, 0xa1, + 0x4a, 0xe2, 0x5c, 0x0e, 0x4a, 0x31, 0x4c, 0x2e, 0xed, 0x9f, 0xa1, 0x86, + 0x33, 0xdc, 0x41, 0xd4, 0x23, 0xbc, 0x40, 0xe5, 0x05, 0x09, 0x8e, 0x10, + 0x05, 0x26, 0xf4, 0xcf, 0xa5, 0x97, 0xfd, 0xff, 0x60, 0x03, 0x1d, 0x08, + 0xb2, 0xff, 0xff, 0xce, 0xdf, 0x8f, 0x16, 0x7f, 0xcc, 0x24, 0xa3, 0x7b, + 0x10, 0x16, 0x5f, 0xbb, 0xc3, 0xc7, 0x16, 0x5e, 0x09, 0x0d, 0x65, 0xff, + 0xef, 0x63, 0x4e, 0x78, 0x76, 0x93, 0xf1, 0x65, 0xff, 0xec, 0xf6, 0x17, + 0xf9, 0x9b, 0xca, 0x3a, 0x59, 0x50, 0x9c, 0xcf, 0x43, 0xbe, 0x3b, 0x76, + 0xb0, 0x14, 0x7c, 0x70, 0xc4, 0x8b, 0x9b, 0xa5, 0x97, 0xa0, 0xbe, 0xb2, + 0xe6, 0xd2, 0xca, 0x9c, 0xd8, 0xe0, 0xdd, 0xfe, 0x93, 0x1f, 0xdd, 0x3e, + 0xe2, 0xcb, 0xe7, 0xd4, 0x49, 0x65, 0xf7, 0x58, 0x19, 0x96, 0x5f, 0xf8, + 0x31, 0xa3, 0x5c, 0x4f, 0xb4, 0x96, 0x5f, 0xf3, 0xf5, 0xb3, 0xae, 0x61, + 0x1a, 0xb2, 0xa7, 0x4c, 0x6b, 0xa2, 0x13, 0x9b, 0xf8, 0x84, 0x89, 0x3e, + 0x81, 0x7d, 0xed, 0xc6, 0x3a, 0xcb, 0xc5, 0x00, 0x59, 0x5b, 0x0f, 0x03, + 0x84, 0xb7, 0xf7, 0xdc, 0xe7, 0x83, 0xac, 0xb1, 0xf0, 0xf4, 0x7a, 0x24, + 0xbf, 0xdd, 0x7b, 0x26, 0xf3, 0x69, 0x65, 0x41, 0xee, 0xe1, 0x45, 0xff, + 0xa3, 0xaf, 0x41, 0xfb, 0xf3, 0x4c, 0xb2, 0xf9, 0xf9, 0xd3, 0xac, 0xbf, + 0xe9, 0x73, 0xcf, 0xdc, 0x10, 0xd6, 0x5e, 0x07, 0xfc, 0xb2, 0xa4, 0x7f, + 0x1d, 0x11, 0x00, 0xe6, 0xff, 0xff, 0xda, 0xc1, 0xf1, 0xf7, 0x1b, 0xaf, + 0x3b, 0x4a, 0x07, 0xe0, 0x9a, 0xb2, 0xc0, 0x59, 0x4e, 0x8b, 0x1e, 0x18, + 0x08, 0xe1, 0x7e, 0x6e, 0xf1, 0xce, 0xb2, 0xa1, 0x73, 0xbe, 0x4c, 0xb9, + 0x1b, 0x13, 0x46, 0x8f, 0xa2, 0x07, 0x8d, 0xa8, 0x8c, 0x2f, 0xe2, 0x1f, + 0x38, 0xc7, 0x59, 0x7e, 0xed, 0xe7, 0xc3, 0x16, 0x5f, 0xa3, 0x43, 0xc2, + 0x59, 0x58, 0x7f, 0xa4, 0x5b, 0xf2, 0xab, 0xf4, 0x6d, 0xb7, 0x82, 0xb2, + 0xfc, 0x12, 0x2c, 0x35, 0x65, 0xed, 0x37, 0x96, 0x57, 0x67, 0x86, 0x44, + 0xf7, 0xdb, 0xbf, 0x63, 0x56, 0x5d, 0x02, 0x2c, 0xae, 0x1b, 0xdd, 0xb2, + 0x6b, 0xff, 0xa0, 0x11, 0xe3, 0x93, 0x9b, 0xe6, 0x59, 0x61, 0x42, 0xcb, + 0xfb, 0xd0, 0x46, 0x3f, 0x4b, 0x2f, 0xfc, 0x53, 0x46, 0x14, 0xf9, 0xd7, + 0xd6, 0x50, 0xcf, 0xb5, 0xcb, 0xaf, 0xfe, 0x61, 0xfa, 0x3b, 0x80, 0x39, + 0x01, 0x65, 0xf1, 0x8f, 0x07, 0x59, 0x7e, 0x7e, 0x4e, 0xda, 0x59, 0x7d, + 0xa6, 0x0c, 0xeb, 0x8b, 0xd5, 0x7b, 0xb0, 0xce, 0xb8, 0xbd, 0x57, 0xfe, + 0xc6, 0xdf, 0x85, 0x83, 0x79, 0x2e, 0x2f, 0x55, 0xf9, 0xcb, 0xa9, 0x0b, + 0x1a, 0x29, 0xb8, 0x60, 0x61, 0x65, 0xcf, 0xba, 0xb2, 0x86, 0x99, 0xb9, + 0xe1, 0x9c, 0x4a, 0x17, 0xe3, 0x7e, 0xee, 0x4b, 0x2f, 0x10, 0x67, 0x59, + 0x4e, 0x78, 0x9f, 0x27, 0xa6, 0x44, 0xd1, 0x3c, 0xd4, 0x2e, 0x2d, 0x0c, + 0xb7, 0x1b, 0x59, 0x7f, 0x44, 0x87, 0x43, 0x78, 0x41, 0x70, 0x87, 0xe8, + 0x61, 0x8f, 0xce, 0xff, 0x13, 0x9f, 0xd1, 0x83, 0x59, 0x76, 0xd5, 0xb4, + 0x2c, 0xbc, 0xd1, 0xa5, 0x94, 0x28, 0x37, 0x9e, 0x21, 0xbf, 0xfb, 0x4c, + 0x78, 0xdc, 0x2c, 0x3f, 0x50, 0xb2, 0xa4, 0x7d, 0x73, 0x12, 0xde, 0x27, + 0x1a, 0xcb, 0xdc, 0x9d, 0xd6, 0x53, 0x1b, 0x81, 0x06, 0xef, 0xf7, 0xdb, + 0x51, 0xde, 0x6f, 0x59, 0x71, 0xd9, 0x65, 0x41, 0xe5, 0xce, 0x6b, 0x7e, + 0xc3, 0xe9, 0xfa, 0x59, 0x43, 0x45, 0xb1, 0x36, 0x70, 0x8a, 0xfd, 0x2c, + 0xdf, 0x12, 0x59, 0x7b, 0x35, 0x0b, 0x2f, 0x6f, 0xc1, 0xac, 0xae, 0xd5, + 0x3d, 0x75, 0x0d, 0x86, 0x8c, 0x47, 0x45, 0xfe, 0x29, 0x08, 0xdd, 0x8c, + 0x59, 0x7f, 0x98, 0xc8, 0x61, 0xe1, 0xd6, 0x59, 0xb0, 0xf1, 0x26, 0x12, + 0xbc, 0xfa, 0x9d, 0x65, 0x2c, 0xb1, 0x76, 0x6a, 0x26, 0x1d, 0xbf, 0xbc, + 0xf3, 0x6a, 0x27, 0x59, 0x7f, 0x37, 0x5c, 0xf6, 0x76, 0xb2, 0xfb, 0xd8, + 0xd3, 0x2c, 0xbf, 0xa3, 0x7e, 0x7b, 0xd0, 0xb2, 0xfd, 0x9f, 0xe6, 0x4c, + 0xb3, 0xc6, 0xba, 0xff, 0xff, 0xfb, 0x3a, 0xe3, 0x61, 0x9b, 0x33, 0xa9, + 0x71, 0xbf, 0xc6, 0xe8, 0x63, 0x0c, 0xeb, 0x2f, 0xfd, 0x1d, 0x96, 0x4d, + 0xe0, 0xea, 0x65, 0x94, 0xc8, 0xc5, 0x28, 0x42, 0x5f, 0xff, 0x98, 0x87, + 0xb0, 0x4f, 0xb7, 0x1d, 0x88, 0x32, 0x59, 0x7c, 0xf3, 0xf9, 0x96, 0x56, + 0x2a, 0x71, 0x62, 0x89, 0x8b, 0xf4, 0x5e, 0x4a, 0x1f, 0x87, 0xee, 0xf2, + 0x6d, 0xb5, 0x6b, 0xc1, 0xd4, 0x96, 0x5f, 0xf8, 0xee, 0x3d, 0x47, 0xfd, + 0x83, 0x59, 0x7f, 0x3f, 0xc0, 0x21, 0x49, 0x65, 0xfa, 0x7e, 0xfd, 0x1a, + 0x59, 0x7f, 0x9d, 0xcc, 0x03, 0xff, 0x8b, 0x2e, 0x13, 0x8b, 0x28, 0x67, + 0x97, 0xe3, 0x3b, 0xff, 0x0e, 0x3e, 0xf2, 0xcd, 0xee, 0x35, 0x97, 0xe6, + 0x9e, 0x76, 0xd2, 0xcb, 0xf4, 0x11, 0x04, 0xeb, 0x2d, 0x2f, 0x9e, 0x78, + 0x85, 0x35, 0xb1, 0x3d, 0x78, 0x1d, 0x9c, 0xfb, 0x0b, 0x8d, 0x75, 0x39, + 0x13, 0xc2, 0x3a, 0xfc, 0xc2, 0xcc, 0x30, 0xc4, 0x97, 0xfe, 0x35, 0xfa, + 0xd9, 0xe7, 0x3b, 0x71, 0x65, 0xa2, 0x47, 0xde, 0x72, 0xdb, 0xb3, 0xcb, + 0x2e, 0xc1, 0xac, 0xbf, 0x7c, 0x02, 0x14, 0x96, 0x51, 0xa6, 0xfd, 0xc5, + 0xaf, 0xcf, 0xae, 0xe3, 0xeb, 0x2e, 0x6d, 0x2c, 0xaf, 0x1b, 0xe0, 0x94, + 0x5b, 0xb5, 0x97, 0x38, 0xd6, 0x5f, 0xda, 0x7e, 0x79, 0xe4, 0xb2, 0xdd, + 0x2c, 0xb9, 0x8c, 0x59, 0x70, 0x80, 0x59, 0x53, 0x1a, 0xf0, 0x0b, 0xde, + 0x93, 0x8d, 0x65, 0xc6, 0x18, 0xb2, 0xa4, 0x8d, 0xbc, 0x16, 0xec, 0xb5, + 0x90, 0x78, 0x44, 0x60, 0xe5, 0xc2, 0x01, 0x20, 0xb3, 0xd7, 0xa7, 0x4d, + 0xbf, 0xf1, 0xa2, 0x5f, 0xec, 0x3b, 0x0e, 0x70, 0xf1, 0x65, 0xff, 0xfc, + 0x0d, 0xbc, 0xd4, 0x7d, 0xbb, 0x61, 0xcf, 0x05, 0x0b, 0x2f, 0x67, 0x5f, + 0x59, 0x6c, 0x23, 0xfa, 0xe2, 0xed, 0x79, 0x1a, 0x9c, 0x85, 0x75, 0xff, + 0x30, 0xf0, 0xed, 0x33, 0x18, 0xb2, 0xff, 0xff, 0xa5, 0xe8, 0x1c, 0x37, + 0x40, 0xd6, 0x0e, 0x34, 0xdd, 0x01, 0x65, 0xff, 0xff, 0x47, 0x9d, 0xbf, + 0x12, 0x08, 0xf0, 0x4c, 0xd7, 0xc3, 0xe5, 0x97, 0xff, 0x9c, 0x79, 0x84, + 0x6f, 0x39, 0x84, 0x05, 0x97, 0xde, 0x0b, 0x9b, 0x09, 0xa7, 0x61, 0xce, + 0x99, 0xce, 0xcd, 0x78, 0xa3, 0xcb, 0x2f, 0xff, 0xe9, 0x3f, 0x39, 0x19, + 0x38, 0x64, 0x3d, 0x13, 0x98, 0xb2, 0xd0, 0x34, 0x65, 0x9a, 0xa8, 0xc3, + 0x75, 0xc5, 0x4e, 0xdf, 0x94, 0x83, 0x7d, 0x2f, 0x37, 0x16, 0x5f, 0xcf, + 0x3e, 0x61, 0x1a, 0xb2, 0xfe, 0x63, 0xf7, 0x85, 0xda, 0xcb, 0xe7, 0x9f, + 0x9e, 0x59, 0x5a, 0x3d, 0x1e, 0x17, 0x56, 0xc5, 0xea, 0x59, 0x2a, 0x8d, + 0x7f, 0xa8, 0xe4, 0x1a, 0x5b, 0x99, 0x16, 0x70, 0x8b, 0xef, 0xd6, 0xda, + 0x96, 0x5e, 0x77, 0x3a, 0xcb, 0xde, 0x6f, 0xac, 0xb6, 0xf1, 0x49, 0xe6, + 0xf8, 0x58, 0x41, 0xbb, 0xfe, 0xcf, 0xfa, 0x35, 0xfc, 0xed, 0x65, 0xc6, + 0xba, 0xcb, 0xec, 0x20, 0xcc, 0xb2, 0xff, 0xfd, 0xc7, 0xff, 0x0b, 0x39, + 0x1d, 0x03, 0xf9, 0xc5, 0x95, 0xd1, 0xfb, 0xfc, 0x8a, 0xed, 0x4c, 0xb2, + 0xed, 0x42, 0xca, 0x83, 0x5d, 0x83, 0x15, 0x0c, 0xfa, 0x39, 0x42, 0xa7, + 0x25, 0x60, 0x34, 0xa5, 0x2f, 0x43, 0x69, 0xe7, 0xb3, 0x01, 0x0c, 0xf2, + 0x3c, 0xf9, 0xc8, 0x61, 0x1d, 0xb6, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xb6, + 0xf0, 0xef, 0x26, 0xe0, 0x30, 0x1e, 0x76, 0x94, 0x0f, 0xc1, 0x36, 0x18, + 0x9f, 0xf1, 0x27, 0xdf, 0xe7, 0x92, 0xcb, 0xf7, 0x9b, 0x7e, 0x4e, 0xb2, + 0x99, 0x1c, 0xfc, 0x85, 0xed, 0xff, 0x78, 0x3f, 0xf6, 0x69, 0xb8, 0xb2, + 0xf7, 0x1e, 0x65, 0x97, 0xfe, 0x1c, 0x14, 0xc1, 0xf3, 0xfa, 0x16, 0x5f, + 0x1e, 0x3a, 0x92, 0xcb, 0xff, 0x66, 0xf8, 0x19, 0x67, 0xf0, 0x0b, 0x2e, + 0xc2, 0x59, 0x6c, 0xe8, 0xf4, 0xf7, 0x9f, 0x5f, 0xbd, 0xf8, 0x91, 0xd6, + 0x5c, 0x20, 0x16, 0x53, 0x23, 0x83, 0x4e, 0xde, 0x2a, 0x01, 0x45, 0xe6, + 0x21, 0xac, 0xbf, 0xf9, 0x86, 0xff, 0x6e, 0x64, 0xb3, 0xcb, 0x2e, 0x7d, + 0xd5, 0x97, 0xb3, 0xaf, 0xac, 0xaf, 0x1f, 0xc7, 0xd0, 0xb7, 0x46, 0x6f, + 0xec, 0xd4, 0x7f, 0x98, 0xb2, 0xff, 0xf9, 0xfa, 0x94, 0x4b, 0x07, 0xc8, + 0x94, 0x12, 0xca, 0xc4, 0x56, 0x31, 0x91, 0x16, 0x5f, 0xdc, 0x7f, 0x34, + 0x01, 0x65, 0xf8, 0xbf, 0xcc, 0x25, 0x97, 0xfe, 0x10, 0xa4, 0x59, 0xff, + 0xe4, 0xeb, 0x29, 0x8f, 0x94, 0x04, 0xd7, 0xed, 0x3e, 0xfd, 0xd7, 0x59, + 0x52, 0x5c, 0x21, 0x19, 0x3f, 0x47, 0x2c, 0x3b, 0xa8, 0xc7, 0xbc, 0x78, + 0x51, 0x9f, 0xf0, 0xb7, 0xf0, 0x91, 0xde, 0x43, 0x7e, 0xda, 0x85, 0x1b, + 0x5e, 0xdf, 0xd6, 0x5f, 0xe9, 0xfe, 0x7f, 0x60, 0x1d, 0x65, 0xf6, 0x13, + 0x1a, 0xb2, 0xa4, 0x88, 0xf3, 0x9d, 0x6f, 0x34, 0xbb, 0xbd, 0xd5, 0x97, + 0xb9, 0x2f, 0x2c, 0xa2, 0x37, 0x1f, 0x1b, 0xbf, 0xff, 0xba, 0xe1, 0x3f, + 0x3d, 0x92, 0xcf, 0x36, 0xbc, 0xeb, 0x2f, 0xb3, 0xa9, 0xf7, 0xac, 0xbe, + 0xcf, 0xcc, 0x75, 0x97, 0xfb, 0x83, 0x73, 0xc7, 0xfb, 0x59, 0x7f, 0x87, + 0x84, 0x19, 0x67, 0x16, 0x57, 0x47, 0xcc, 0x46, 0x97, 0xdd, 0x70, 0x20, + 0x59, 0x71, 0x76, 0xb2, 0xa0, 0xdd, 0xb9, 0x25, 0xfe, 0x13, 0xe5, 0x93, + 0xb6, 0x96, 0x5f, 0x8b, 0xb3, 0x47, 0xd2, 0xcb, 0xe7, 0xdd, 0xc2, 0x59, + 0x79, 0xb8, 0xcb, 0x29, 0xcf, 0xa7, 0x85, 0x7f, 0x23, 0xbf, 0xb3, 0xb8, + 0xf4, 0x1d, 0x65, 0x42, 0xb0, 0x7c, 0x6a, 0x62, 0x0d, 0x2d, 0x1c, 0x99, + 0xe1, 0x12, 0x05, 0xd2, 0x1f, 0x0c, 0x27, 0x4c, 0x2e, 0xbf, 0xf4, 0x08, + 0x00, 0xca, 0x4f, 0xe0, 0xac, 0xbd, 0x98, 0x6a, 0xcb, 0xe9, 0x40, 0x38, + 0xb2, 0x86, 0x6f, 0xb0, 0x72, 0xa7, 0x44, 0xf7, 0x4f, 0xd7, 0xdf, 0x0b, + 0x92, 0xcb, 0xfe, 0xf3, 0x0d, 0x85, 0x70, 0x4c, 0xb2, 0xff, 0xf9, 0x8d, + 0xc6, 0x3e, 0xa0, 0x22, 0xb7, 0xf7, 0x16, 0x5f, 0xe7, 0x96, 0x0f, 0x5c, + 0xe2, 0xcb, 0xe8, 0xc1, 0x06, 0xb2, 0xff, 0xfe, 0x91, 0x46, 0x73, 0x0b, + 0xfe, 0xc1, 0x87, 0xfc, 0x59, 0x7e, 0xe7, 0xbd, 0x04, 0xb2, 0xfe, 0x6f, + 0xbf, 0x8c, 0xdc, 0x59, 0x58, 0x7b, 0x06, 0x93, 0xdf, 0xd1, 0x3e, 0xde, + 0x6a, 0x16, 0x5f, 0xec, 0x9b, 0xd9, 0xc7, 0x25, 0x97, 0xfe, 0x1e, 0x75, + 0x2e, 0x7f, 0x8e, 0x05, 0x95, 0xa3, 0xf2, 0x09, 0x95, 0xf7, 0x39, 0x86, + 0x2c, 0xbf, 0xc6, 0x0f, 0xd9, 0xbf, 0x34, 0xb2, 0xff, 0xe6, 0x3e, 0xce, + 0xfc, 0xde, 0xed, 0xb8, 0xb2, 0xff, 0x64, 0xb0, 0x22, 0xb7, 0x25, 0x97, + 0xff, 0x44, 0xbd, 0x1d, 0x7e, 0x3c, 0xfb, 0x8b, 0x2a, 0x11, 0xf5, 0xa3, + 0x6f, 0x24, 0x11, 0xad, 0xff, 0xfe, 0x62, 0xce, 0xbe, 0x6b, 0xff, 0xd1, + 0xec, 0xde, 0xf2, 0x59, 0x7b, 0x30, 0x96, 0x54, 0xeb, 0x82, 0x63, 0x53, + 0xec, 0xcf, 0xa2, 0x26, 0x85, 0x8c, 0xc4, 0x5a, 0x85, 0x17, 0x88, 0xbf, + 0x18, 0xee, 0xf3, 0xbd, 0xd6, 0x2b, 0x8a, 0x16, 0x5f, 0xc3, 0xe7, 0xa0, + 0xce, 0x2c, 0xbf, 0xe1, 0xb6, 0xa3, 0x78, 0x39, 0x25, 0x97, 0x41, 0xd6, + 0x54, 0x1e, 0x8f, 0x8e, 0xeb, 0xc8, 0xb6, 0x71, 0x5f, 0xc2, 0x02, 0xff, + 0xb8, 0xfe, 0x61, 0xf6, 0xd3, 0xac, 0xbf, 0xcf, 0x2c, 0x1f, 0x39, 0x0b, + 0x2f, 0xef, 0xfa, 0x0f, 0x31, 0x2c, 0xa8, 0x44, 0xd6, 0x1d, 0x00, 0xca, + 0xb6, 0xb5, 0xed, 0x38, 0x21, 0xc9, 0xc4, 0xd7, 0x8d, 0xa4, 0x30, 0xce, + 0xb8, 0xbe, 0xb2, 0xf0, 0x75, 0x3a, 0xcb, 0xdd, 0x86, 0x16, 0x54, 0x1e, + 0x8c, 0x85, 0x98, 0x7a, 0xfb, 0x03, 0xa9, 0xd6, 0x5f, 0xfb, 0x7b, 0x7c, + 0x01, 0x2e, 0x30, 0xd6, 0x5f, 0xb3, 0x9e, 0x0c, 0xeb, 0x2d, 0xad, 0x88, + 0x8c, 0xc2, 0x3f, 0x20, 0x5f, 0xff, 0xe7, 0x90, 0x92, 0xf6, 0x04, 0x57, + 0x84, 0x69, 0x16, 0x4c, 0xb2, 0xa1, 0x13, 0x87, 0x37, 0xbf, 0xed, 0x83, + 0x27, 0x34, 0xd7, 0x31, 0x65, 0xf9, 0xb5, 0x29, 0xa1, 0x65, 0xff, 0xde, + 0xc2, 0x73, 0x7c, 0xdf, 0x93, 0x2c, 0xaf, 0x1f, 0x5f, 0x0a, 0x2b, 0x11, + 0x94, 0xd0, 0xa8, 0xbf, 0xfe, 0x0f, 0x62, 0x74, 0x07, 0xe3, 0xe9, 0xba, + 0x02, 0xcb, 0xf4, 0x78, 0xb0, 0xd5, 0x94, 0xc7, 0xf7, 0xe5, 0x4b, 0xf4, + 0x4d, 0xe6, 0xd2, 0xcb, 0xf8, 0x3f, 0xe4, 0x02, 0x75, 0x97, 0xcf, 0xa8, + 0x92, 0xcb, 0xff, 0xf9, 0x89, 0xd8, 0x81, 0xa8, 0xf3, 0xb7, 0xe3, 0xcb, + 0x28, 0x68, 0xa6, 0x22, 0xff, 0x90, 0xdf, 0x7f, 0x81, 0x9d, 0x65, 0xff, + 0xff, 0x75, 0xa8, 0x0f, 0xc2, 0x7d, 0x3b, 0x80, 0xb3, 0x7b, 0x69, 0x65, + 0x32, 0x23, 0x1c, 0x92, 0xff, 0xd2, 0x10, 0x6f, 0x3e, 0x1d, 0xf8, 0xb2, + 0xff, 0xa5, 0x1e, 0x8f, 0xf9, 0xce, 0xb2, 0xa0, 0xfe, 0x02, 0x81, 0x7f, + 0xf8, 0x98, 0x1f, 0xeb, 0xb6, 0xd0, 0x90, 0x35, 0x97, 0xfd, 0xe1, 0x06, + 0x1f, 0xf0, 0x10, 0xb2, 0xa1, 0x10, 0xee, 0x99, 0x43, 0x56, 0x19, 0xd9, + 0x0b, 0x43, 0x38, 0xf0, 0xbb, 0x28, 0x4c, 0xfe, 0x15, 0x17, 0xff, 0xc0, + 0x3e, 0x1f, 0x09, 0xcf, 0x12, 0x13, 0x8b, 0x2f, 0xe7, 0x03, 0xb0, 0xd9, + 0x65, 0xf3, 0x9f, 0x8e, 0xb2, 0xf4, 0x1e, 0x16, 0x57, 0x48, 0xb6, 0xd2, + 0x7f, 0x0a, 0xf7, 0x90, 0xdf, 0xb4, 0x1e, 0xfd, 0x0b, 0x2f, 0xed, 0x4d, + 0x26, 0xff, 0x16, 0x58, 0xa0, 0xf6, 0x30, 0xa6, 0xfb, 0x35, 0x1c, 0x59, + 0x7f, 0xa6, 0x79, 0x9f, 0xa9, 0x71, 0x65, 0xfc, 0xf3, 0xb4, 0xcc, 0x62, + 0xcb, 0xff, 0xfc, 0xe6, 0x7f, 0x3d, 0xb0, 0x79, 0x34, 0x9f, 0x53, 0xf8, + 0x2b, 0x2a, 0x11, 0xd9, 0x84, 0x2e, 0x6c, 0x45, 0xf7, 0xec, 0x29, 0xf0, + 0xc5, 0x97, 0xe7, 0x3f, 0x98, 0xc5, 0x95, 0x39, 0xe8, 0x0c, 0xa2, 0xff, + 0xa2, 0x71, 0x25, 0xe0, 0xbc, 0xeb, 0x2f, 0xf3, 0xff, 0x9d, 0xf6, 0xdd, + 0x2c, 0xbf, 0xe6, 0xef, 0x26, 0x72, 0x9c, 0x52, 0xb2, 0xb1, 0x1a, 0x7a, + 0x23, 0x73, 0xc2, 0x36, 0xb0, 0xa1, 0x65, 0xfa, 0x35, 0xac, 0xf2, 0xcb, + 0xcf, 0x2f, 0xac, 0xbf, 0xfe, 0x83, 0x4c, 0xc6, 0xde, 0x63, 0x8e, 0x30, + 0xeb, 0x2f, 0xe2, 0x73, 0x60, 0xf0, 0xb2, 0x85, 0x28, 0xd6, 0x90, 0xa9, + 0xc9, 0xc8, 0x70, 0x2a, 0x57, 0xa7, 0x34, 0xd5, 0x97, 0xb6, 0x9e, 0xe0, + 0x16, 0x5b, 0x71, 0x65, 0xf4, 0x82, 0x31, 0x7b, 0x41, 0xba, 0x34, 0x9a, + 0xfe, 0x3b, 0xf5, 0xb5, 0x67, 0x96, 0x5e, 0x31, 0xf8, 0xb2, 0xfe, 0x3c, + 0x61, 0x7f, 0x8b, 0x2f, 0xd1, 0x3e, 0x49, 0x96, 0x5e, 0x10, 0x62, 0xf1, + 0x14, 0x7e, 0x33, 0xe0, 0xef, 0xcb, 0x2a, 0x64, 0xcd, 0x7d, 0x0e, 0x4b, + 0xef, 0x7b, 0x3a, 0x59, 0x7f, 0x38, 0xe0, 0xa0, 0x0b, 0x2f, 0x9b, 0x98, + 0x38, 0x3c, 0xed, 0xb2, 0x3b, 0xde, 0x71, 0xac, 0xbf, 0xe6, 0x83, 0xec, + 0xc1, 0xb6, 0xf5, 0x95, 0xe3, 0xd7, 0xe0, 0xe5, 0x42, 0xab, 0xa1, 0xc7, + 0x1f, 0xdb, 0xc3, 0xc2, 0x46, 0xff, 0xfc, 0xdd, 0xc1, 0xf8, 0xfa, 0xc3, + 0x87, 0xb7, 0x92, 0xcb, 0xfe, 0x7d, 0x3f, 0xdb, 0x4e, 0x05, 0x97, 0x36, + 0xf5, 0x97, 0xfa, 0x09, 0xfc, 0x12, 0x9d, 0x65, 0xff, 0x98, 0xd8, 0x1b, + 0x13, 0xe8, 0xd5, 0x97, 0xff, 0xb3, 0xaf, 0xf5, 0xf6, 0x33, 0x06, 0xf2, + 0x59, 0x58, 0x88, 0xa0, 0x1f, 0x5b, 0xcb, 0x2f, 0xe6, 0xd0, 0x0e, 0xdc, + 0x59, 0x52, 0x4f, 0x07, 0xb5, 0x6d, 0xc3, 0x73, 0x8c, 0x14, 0x2f, 0x02, + 0x45, 0xb6, 0x23, 0x78, 0x70, 0x75, 0x97, 0xf0, 0x32, 0x68, 0xeb, 0x8b, + 0x2f, 0xfd, 0xec, 0x2e, 0xf6, 0x60, 0xdb, 0x7a, 0xcb, 0xff, 0xfc, 0x4e, + 0x67, 0xb0, 0xee, 0x67, 0xf9, 0x86, 0x0d, 0x8e, 0xb2, 0xf7, 0xb2, 0x65, + 0x97, 0xfb, 0xf9, 0xac, 0x9a, 0x0d, 0x59, 0x7f, 0xff, 0xf7, 0x3d, 0x1e, + 0x86, 0xe8, 0x1a, 0xc1, 0xc7, 0xf8, 0xc5, 0xd4, 0x96, 0x56, 0x27, 0x2c, + 0xc5, 0xf3, 0x21, 0x79, 0x8b, 0xe3, 0xa6, 0x1a, 0x5e, 0x1b, 0x1d, 0x65, + 0xfe, 0x34, 0xb2, 0x79, 0xc2, 0x4b, 0x2a, 0x15, 0x2d, 0xe4, 0x76, 0x4c, + 0xb0, 0x11, 0xcb, 0xfb, 0xcf, 0x28, 0xe4, 0x96, 0x5f, 0xf6, 0x79, 0xba, + 0xe7, 0x83, 0xc5, 0x97, 0x61, 0x76, 0x7c, 0xe0, 0x2d, 0xbf, 0xff, 0x82, + 0xfb, 0x9b, 0x36, 0xc3, 0x1b, 0x33, 0x84, 0x17, 0x9d, 0x65, 0xff, 0xba, + 0x94, 0x7f, 0xf0, 0xe7, 0x9d, 0x65, 0xff, 0xec, 0xf3, 0xb9, 0xc9, 0xf4, + 0xd1, 0xc5, 0x96, 0xc3, 0xa2, 0x1b, 0x7a, 0x05, 0xfa, 0x7d, 0xd8, 0xeb, + 0x8b, 0x2f, 0xce, 0x01, 0xe1, 0x2c, 0xac, 0x4d, 0xa3, 0xd0, 0xeb, 0x72, + 0xa2, 0x2d, 0xbf, 0xdd, 0xc4, 0xbf, 0xe7, 0x1a, 0xcb, 0xf3, 0x6d, 0xe6, + 0x8d, 0x59, 0x7d, 0xbc, 0xb3, 0x8b, 0x2f, 0xe2, 0x73, 0x4b, 0x00, 0xb2, + 0x98, 0xf3, 0xce, 0x47, 0x73, 0xc2, 0xcb, 0xfa, 0x3f, 0xcd, 0x9f, 0x92, + 0xcb, 0x8d, 0x92, 0xcb, 0xf7, 0x9b, 0x7b, 0x76, 0xb2, 0xec, 0xf4, 0x8f, + 0x0b, 0xb1, 0x8a, 0xc4, 0xe1, 0x0e, 0x68, 0xef, 0x5c, 0x21, 0xf8, 0xae, + 0xdb, 0x95, 0xe3, 0x0c, 0x31, 0x25, 0xff, 0xb4, 0x41, 0x71, 0x32, 0x68, + 0x3a, 0xc1, 0x66, 0x82, 0xf4, 0xcc, 0x62, 0xcb, 0xde, 0x08, 0x16, 0x5b, + 0xcc, 0x6e, 0xe6, 0x1e, 0xb7, 0x6b, 0x2a, 0x11, 0x8b, 0x90, 0x8c, 0xd1, + 0x3d, 0xfe, 0x81, 0xe4, 0xa0, 0xbb, 0x59, 0x50, 0xdc, 0x53, 0x4f, 0x1a, + 0xac, 0xa1, 0xd9, 0x92, 0xeb, 0x5a, 0x32, 0x2d, 0xc8, 0x4c, 0x4d, 0x18, + 0x8e, 0xa3, 0x5c, 0x3c, 0x62, 0x1e, 0x96, 0x0e, 0xf2, 0x82, 0x8a, 0x56, + 0x5f, 0x21, 0x53, 0xf8, 0xe5, 0x43, 0x1e, 0x21, 0x91, 0x9f, 0x08, 0x67, + 0x7c, 0xda, 0x70, 0x2c, 0xbf, 0xc3, 0xf4, 0x4e, 0x59, 0xd2, 0xcb, 0xc3, + 0xf4, 0x2c, 0xa3, 0x9f, 0x88, 0x08, 0x78, 0x69, 0x7d, 0xad, 0x67, 0x96, + 0x5f, 0xde, 0x6d, 0xdd, 0xd0, 0x9a, 0xb2, 0xa0, 0xf5, 0xfb, 0x22, 0xb0, + 0xad, 0x65, 0xc5, 0xc5, 0x96, 0x65, 0x97, 0xf6, 0xb9, 0xe8, 0x2f, 0xac, + 0xba, 0x00, 0xb2, 0xdf, 0x83, 0xc3, 0xe1, 0x6d, 0xff, 0xed, 0x4e, 0x27, + 0xdb, 0xc1, 0x39, 0xde, 0x4b, 0x2c, 0x2b, 0x59, 0x7f, 0xdf, 0x8d, 0x73, + 0xd0, 0x5f, 0x59, 0x77, 0x21, 0x65, 0xe3, 0x8e, 0x16, 0x5f, 0xe2, 0xfb, + 0xcd, 0xc8, 0xfa, 0xca, 0x63, 0xcf, 0x71, 0xcb, 0xe6, 0x7c, 0xed, 0x65, + 0xff, 0xb3, 0x79, 0x67, 0x26, 0x28, 0x1a, 0xcb, 0xee, 0xc7, 0x13, 0xac, + 0xb8, 0x10, 0xb2, 0xf7, 0x1b, 0x4b, 0x2b, 0x0f, 0x58, 0x04, 0x9f, 0x16, + 0xbf, 0xd2, 0xc2, 0x61, 0xe1, 0x2c, 0xbb, 0x82, 0xe1, 0x3e, 0x6c, 0x15, + 0x98, 0xe3, 0xcc, 0xa0, 0x20, 0x22, 0x1e, 0x42, 0x57, 0xe5, 0xd4, 0xea, + 0xad, 0xbf, 0x28, 0xce, 0xfb, 0xa1, 0xbc, 0xeb, 0x2e, 0xe4, 0x2c, 0xbc, + 0x71, 0xc2, 0xcb, 0xfc, 0x5f, 0x79, 0xb9, 0x1f, 0x59, 0x4c, 0x79, 0xee, + 0x39, 0x7c, 0xcf, 0x9d, 0xac, 0xbf, 0xf6, 0x6f, 0x2c, 0xe4, 0xc5, 0x03, + 0x59, 0x7d, 0xd8, 0xe2, 0x75, 0x97, 0xf4, 0xc0, 0x6d, 0xc7, 0x99, 0x65, + 0xe6, 0x07, 0x16, 0x5c, 0x08, 0x59, 0x7b, 0x8d, 0xa5, 0x97, 0x64, 0xcb, + 0x2b, 0x11, 0x77, 0xd9, 0x27, 0x8c, 0x80, 0x39, 0xf1, 0x61, 0x07, 0x2f, + 0xec, 0x26, 0x1e, 0x12, 0xcb, 0xf6, 0x11, 0x3f, 0xd6, 0x5f, 0xa7, 0xfe, + 0x61, 0xd6, 0x54, 0x8f, 0xdf, 0xc5, 0x4e, 0x4b, 0x7f, 0x13, 0x8f, 0x0d, + 0x17, 0x0b, 0xc8, 0xf2, 0x15, 0x18, 0xb6, 0x29, 0xf7, 0x2b, 0x75, 0x8a, + 0xe6, 0x24, 0xf3, 0x28, 0x08, 0x08, 0x87, 0x90, 0xfa, 0xfc, 0x33, 0xef, + 0xfe, 0xd4, 0x75, 0xc2, 0x83, 0xe7, 0x5f, 0x59, 0x7f, 0xfe, 0x71, 0xe6, + 0x11, 0xa2, 0x14, 0x14, 0xed, 0xa5, 0x97, 0x9f, 0x53, 0xae, 0x41, 0x25, + 0xf4, 0xb3, 0xa9, 0x2e, 0x41, 0x25, 0xee, 0x30, 0xd7, 0x20, 0x92, 0xe3, + 0x0c, 0x5c, 0x82, 0x4a, 0xed, 0x15, 0x33, 0x15, 0x7c, 0xc0, 0xc2, 0x9b, + 0x9f, 0xe9, 0x90, 0x48, 0x16, 0x78, 0x17, 0xff, 0xff, 0x0c, 0xa0, 0x7e, + 0x8f, 0xf2, 0x3f, 0x03, 0x8f, 0xe1, 0xc0, 0x62, 0xcb, 0xfb, 0x3d, 0x98, + 0x46, 0xac, 0xbc, 0xe4, 0x0d, 0x8c, 0x99, 0xa8, 0x9e, 0x69, 0xd4, 0x36, + 0xce, 0x8a, 0x51, 0x9e, 0xf0, 0xdf, 0xee, 0x37, 0xdb, 0x78, 0xfe, 0x59, + 0x6c, 0xdc, 0x45, 0x78, 0x21, 0x17, 0x69, 0x2c, 0xbf, 0xa4, 0x19, 0xfe, + 0xd3, 0xa4, 0xbe, 0xd0, 0x1b, 0xeb, 0x2f, 0x6f, 0x8e, 0x2c, 0xbe, 0x71, + 0xfb, 0x16, 0x5e, 0x1b, 0x1d, 0x65, 0xff, 0xbd, 0x1f, 0x62, 0x83, 0xc7, + 0x16, 0x5b, 0x71, 0x65, 0x42, 0x33, 0x70, 0x88, 0xd1, 0xe7, 0x21, 0xe0, + 0xe6, 0xe9, 0xe5, 0x4c, 0x9a, 0xaf, 0xa1, 0xfb, 0x7f, 0xd0, 0x52, 0x28, + 0x03, 0x9d, 0x65, 0xfd, 0xdb, 0x73, 0xf9, 0xe5, 0x97, 0xe6, 0xfe, 0x82, + 0x75, 0x97, 0xd1, 0xe0, 0xe9, 0x65, 0xef, 0x3f, 0xd6, 0x54, 0xe7, 0xcd, + 0x31, 0x47, 0x08, 0xae, 0x8f, 0x2c, 0xb4, 0x2c, 0xf9, 0x6d, 0x7f, 0x9a, + 0x41, 0x7e, 0x79, 0x96, 0x5f, 0xd9, 0xbd, 0xcf, 0x9e, 0x59, 0x69, 0x24, + 0xbc, 0xfa, 0x9d, 0x25, 0x24, 0xa8, 0x37, 0x3d, 0x88, 0x9c, 0x76, 0xf4, + 0x03, 0xb4, 0x82, 0xcd, 0x75, 0x1d, 0x18, 0x85, 0x09, 0x5b, 0xc5, 0x2f, + 0x2c, 0xbd, 0xd4, 0xb8, 0xb2, 0xa1, 0x35, 0x7c, 0x87, 0xb1, 0xc9, 0xdc, + 0x72, 0xff, 0x3c, 0xf8, 0x53, 0xb6, 0x96, 0x5f, 0xb4, 0x03, 0xb7, 0x16, + 0x5f, 0xc2, 0x14, 0xb9, 0xe1, 0xac, 0xc3, 0x51, 0x7f, 0x7f, 0x80, 0x77, + 0xd2, 0xcb, 0xe8, 0xed, 0xb8, 0xb2, 0xf8, 0x2f, 0xa9, 0x2c, 0xb1, 0xd6, + 0x5a, 0x43, 0x36, 0x73, 0x11, 0x5f, 0xff, 0xff, 0xe0, 0x00, 0x3c, 0x7f, + 0xfe, 0x59, 0xef, 0x3c, 0xb6, 0xf3, 0x9c, 0x0f, 0x3f, 0xcc, 0x31, 0x65, + 0x42, 0x67, 0xd3, 0x96, 0xe2, 0xab, 0x94, 0x5f, 0xfd, 0x9d, 0x7f, 0x8c, + 0x50, 0x07, 0x3a, 0xcb, 0xd2, 0x8e, 0x96, 0x5d, 0x83, 0x59, 0x7d, 0x93, + 0x31, 0xd6, 0x54, 0xe8, 0x98, 0x99, 0x0f, 0xe3, 0xa6, 0x0b, 0x5f, 0xa2, + 0x69, 0x40, 0x12, 0x5c, 0x40, 0x59, 0x7f, 0x7d, 0xb4, 0xd3, 0xc2, 0xca, + 0xc3, 0xc3, 0x10, 0x5a, 0xff, 0xfd, 0xec, 0x69, 0x73, 0x67, 0xfd, 0x83, + 0x0f, 0xf8, 0xb2, 0xbb, 0x47, 0x2e, 0x9a, 0xfe, 0x45, 0x7f, 0xc0, 0x72, + 0xfc, 0xd9, 0xac, 0x59, 0x7f, 0xef, 0xfb, 0x06, 0x1f, 0xf2, 0x68, 0x59, + 0x66, 0x59, 0x7f, 0xd3, 0x86, 0x43, 0xf0, 0x5c, 0x96, 0x5f, 0xcd, 0x07, + 0x9f, 0x0c, 0x59, 0x7e, 0xc9, 0xcf, 0x87, 0x59, 0x7b, 0x8d, 0xa5, 0x94, + 0x47, 0x89, 0xf2, 0x8b, 0xf8, 0x9c, 0x00, 0x0f, 0x16, 0x5e, 0x83, 0x8b, + 0x1a, 0x61, 0x58, 0x21, 0xa3, 0xae, 0x39, 0x7c, 0x86, 0xe6, 0x37, 0x89, + 0xd3, 0x89, 0x1a, 0x55, 0x62, 0xb6, 0xc6, 0x8c, 0x95, 0xcc, 0x4a, 0x3d, + 0xfb, 0xfb, 0xde, 0xc9, 0xff, 0xc5, 0x97, 0xb2, 0x70, 0xac, 0xac, 0x3c, + 0xc2, 0x2f, 0xbf, 0xec, 0xfe, 0xc2, 0xc0, 0x09, 0xd2, 0xca, 0x86, 0xd9, + 0x72, 0x54, 0xac, 0xf1, 0x98, 0x64, 0x6c, 0xc6, 0x95, 0x74, 0x6c, 0xd0, + 0x94, 0xd2, 0x3f, 0xa3, 0x76, 0x74, 0x00, 0x2d, 0x94, 0x6f, 0x9c, 0x9c, + 0x40, 0xfc, 0x24, 0xf6, 0xc8, 0x2f, 0xff, 0xd3, 0xeb, 0x58, 0x37, 0x3f, + 0x9f, 0xe5, 0x13, 0x2c, 0xbf, 0xff, 0xfc, 0x1d, 0x06, 0x62, 0x70, 0x73, + 0x98, 0x6e, 0x07, 0x4e, 0x38, 0xf4, 0x2c, 0xbf, 0xfe, 0xcf, 0xc7, 0xf9, + 0xa8, 0x2f, 0xfb, 0x24, 0xb2, 0xfe, 0x61, 0x23, 0xa8, 0xe9, 0x65, 0xfc, + 0x18, 0xd6, 0x9a, 0x75, 0x97, 0xf9, 0x85, 0xb7, 0xf5, 0x92, 0x59, 0x7f, + 0x79, 0xb7, 0x84, 0x12, 0x59, 0x7f, 0xb9, 0x0d, 0xad, 0x64, 0xeb, 0x2f, + 0xe9, 0x40, 0x3c, 0xc6, 0x2c, 0xbf, 0x9c, 0x7e, 0x82, 0x0a, 0xcb, 0xfe, + 0x83, 0x96, 0x0d, 0xbd, 0xc5, 0x97, 0xb1, 0x80, 0xb2, 0xfb, 0xb3, 0x74, + 0x05, 0x97, 0x9d, 0xc9, 0x65, 0xfd, 0x28, 0x9b, 0x18, 0x0b, 0x2c, 0x2c, + 0x69, 0xee, 0xe1, 0x71, 0xa6, 0x9d, 0x18, 0x4c, 0x66, 0x72, 0xef, 0x16, + 0x0a, 0xcd, 0xc8, 0x6f, 0xe4, 0xbb, 0xa3, 0x57, 0x04, 0xc5, 0x97, 0xd1, + 0xb8, 0x38, 0x59, 0x7d, 0xbb, 0xe0, 0x88, 0xb2, 0xfe, 0x08, 0x9c, 0x6c, + 0x25, 0x97, 0x64, 0xcb, 0x2e, 0x12, 0x65, 0x94, 0xc6, 0xc1, 0xc5, 0xed, + 0x13, 0x1f, 0xe7, 0x17, 0x6f, 0x18, 0x61, 0x89, 0x2d, 0x09, 0x05, 0x9a, + 0x0b, 0xa5, 0x3a, 0xca, 0x91, 0xba, 0x39, 0x15, 0xef, 0x40, 0x16, 0x5f, + 0xc2, 0x8f, 0x40, 0x23, 0x71, 0x65, 0x7c, 0xf4, 0x04, 0x1c, 0xbb, 0xda, + 0x59, 0x7b, 0xc2, 0x83, 0x16, 0x5f, 0x4d, 0x99, 0xda, 0xca, 0x85, 0xe2, + 0x29, 0xd5, 0xa4, 0xf0, 0x34, 0xec, 0x94, 0x18, 0x6c, 0x2a, 0x7b, 0x18, + 0xe8, 0x92, 0x68, 0x51, 0xea, 0x10, 0x4e, 0xe3, 0xf2, 0x3d, 0xe2, 0xe6, + 0x11, 0x5f, 0x0f, 0x33, 0x4b, 0x2f, 0xff, 0x7e, 0x6c, 0xd6, 0x9e, 0x6c, + 0xd6, 0x7d, 0x65, 0x61, 0xf6, 0x31, 0x0d, 0xff, 0xe2, 0x96, 0xc9, 0x37, + 0xe5, 0x1a, 0x8e, 0xd6, 0x5f, 0xa3, 0x5a, 0xcf, 0x2c, 0xac, 0x3f, 0x33, + 0x53, 0x2f, 0xe9, 0xe6, 0x90, 0xa3, 0x53, 0xac, 0xbf, 0xfc, 0x03, 0xbc, + 0xb6, 0x40, 0xe7, 0x3c, 0x69, 0x65, 0xf3, 0x41, 0x7d, 0x65, 0xe9, 0xdc, + 0x96, 0x56, 0x91, 0x13, 0xe4, 0xdf, 0x90, 0x5f, 0xf8, 0xd0, 0xf2, 0x4d, + 0xa9, 0xc2, 0x05, 0x97, 0x16, 0x2c, 0xbc, 0x27, 0x44, 0xb2, 0xfc, 0x59, + 0xd0, 0x38, 0xb2, 0xee, 0x8c, 0x59, 0x7d, 0x9b, 0x90, 0x75, 0x95, 0x87, + 0xca, 0xe5, 0x1c, 0x19, 0xa3, 0x53, 0x07, 0x64, 0x23, 0x8a, 0xfa, 0x10, + 0x77, 0x98, 0xf0, 0xb2, 0xf3, 0x41, 0xd6, 0x5c, 0xe3, 0x59, 0x5a, 0x36, + 0x3f, 0x1b, 0xbf, 0x4f, 0xec, 0x03, 0xac, 0xa9, 0xcf, 0x27, 0x44, 0x37, + 0xde, 0x1e, 0x12, 0xcb, 0xff, 0xe8, 0x13, 0xe5, 0x00, 0x7f, 0x80, 0x42, + 0x92, 0xca, 0xda, 0xd5, 0xb1, 0x64, 0x2f, 0xda, 0x33, 0x7d, 0x21, 0xbc, + 0x25, 0x78, 0x47, 0xf2, 0x1b, 0xe1, 0x07, 0xe6, 0x59, 0x7f, 0xe7, 0xff, + 0x0c, 0xcf, 0x01, 0xfe, 0xb2, 0xfc, 0x0c, 0x1b, 0xc9, 0x65, 0xf6, 0xf0, + 0xb9, 0x2c, 0xbf, 0xff, 0xf6, 0x7e, 0x3b, 0x2c, 0xc2, 0x89, 0x7f, 0xce, + 0x72, 0xcd, 0xeb, 0x2a, 0x74, 0xc5, 0x86, 0x47, 0xa3, 0xf2, 0x27, 0x30, + 0x8e, 0xf0, 0x83, 0x99, 0x65, 0xe9, 0x31, 0x2c, 0xbf, 0xf9, 0x8e, 0x4e, + 0x6f, 0x3d, 0x05, 0xf5, 0x97, 0xee, 0x3f, 0x9b, 0x8b, 0x2e, 0x12, 0x4b, + 0x2f, 0xf4, 0x18, 0x58, 0x00, 0xf1, 0x65, 0x1a, 0x79, 0x7a, 0x18, 0xbf, + 0xff, 0xfd, 0x2e, 0x79, 0xdb, 0xe1, 0xd3, 0xf3, 0x0a, 0x24, 0x3d, 0x37, + 0x52, 0x59, 0x78, 0x4d, 0xd3, 0x16, 0x5f, 0xff, 0x03, 0x07, 0xfe, 0x37, + 0xfd, 0x9b, 0xc7, 0x0b, 0x2e, 0x6e, 0x96, 0x54, 0xe8, 0x8a, 0xd1, 0x17, + 0xd4, 0x6f, 0xe7, 0x6f, 0xcc, 0xc6, 0x2c, 0xbf, 0xfa, 0x76, 0xd4, 0x0f, + 0xd0, 0x63, 0xfd, 0x65, 0xa3, 0xc7, 0xe6, 0x45, 0xd7, 0xfe, 0x06, 0x69, + 0x81, 0x80, 0xd1, 0xd6, 0x5f, 0xfe, 0x36, 0x39, 0xa8, 0xf1, 0x67, 0xe0, + 0xeb, 0x2e, 0x08, 0x8b, 0x2f, 0xf8, 0x32, 0xce, 0x09, 0x38, 0x49, 0x65, + 0xfe, 0x2c, 0xde, 0xd3, 0x31, 0x8b, 0x2b, 0xc8, 0x88, 0x21, 0x8e, 0x1d, + 0xdf, 0xff, 0xc1, 0x79, 0xfb, 0x0c, 0xff, 0xcf, 0x16, 0x7f, 0xcc, 0xb2, + 0xfd, 0x13, 0x10, 0x78, 0xb2, 0xb1, 0x38, 0x56, 0x86, 0x8f, 0x8b, 0xfe, + 0xbb, 0x73, 0x12, 0xcb, 0xf9, 0xc8, 0x19, 0xf3, 0x56, 0x54, 0x2e, 0xb7, + 0xce, 0x99, 0x21, 0xf3, 0x46, 0xe6, 0x43, 0xd3, 0x97, 0x88, 0xde, 0x30, + 0x12, 0x85, 0x27, 0x09, 0xbf, 0x1e, 0x1e, 0xf4, 0x1d, 0xb1, 0x5b, 0xe2, + 0xfc, 0x6d, 0xac, 0xbd, 0x05, 0xf5, 0x97, 0xd1, 0xa7, 0xf2, 0xca, 0x19, + 0xbc, 0xde, 0x37, 0x76, 0x4c, 0xb2, 0xfb, 0xc1, 0x3c, 0x2c, 0xa5, 0x94, + 0xb2, 0xce, 0x72, 0xdb, 0x81, 0x77, 0x04, 0x56, 0xb2, 0xfb, 0xd8, 0x07, + 0x59, 0x7d, 0xf6, 0xf0, 0x56, 0x5f, 0xd9, 0xae, 0xa5, 0xf8, 0x59, 0x74, + 0x6e, 0x0a, 0xa3, 0xd0, 0x10, 0x8a, 0xb6, 0xb4, 0xee, 0x99, 0x82, 0x62, + 0x37, 0x17, 0x23, 0x80, 0x92, 0xef, 0x1b, 0xdd, 0x71, 0xb0, 0xbd, 0xae, + 0x18, 0xb2, 0xa2, 0x98, 0xc0, 0xb6, 0x88, 0x59, 0x8a, 0x21, 0x51, 0xb4, + 0x8a, 0xc5, 0x46, 0xd1, 0x55, 0x28, 0xd7, 0x69, 0xc2, 0xdc, 0x55, 0x9d, + 0xc5, 0x26, 0xee, 0x79, 0xdd, 0x19, 0x4e, 0x01, 0x8e, 0x91, 0x55, 0x95, + 0xa8, 0x19, 0xb2, 0xa3, 0x3b, 0x9c, 0xdb, 0xea, 0x5d, 0x6b, 0x4e, 0x1b, + 0xee, 0x46, 0x0f, 0x34, 0xe3, 0xde, 0xa7, 0xd7, 0x8f, 0x3a, 0x97, 0xea, + 0xca, 0xc9, 0xe7, 0x73, 0x01, 0x38, 0x6c, 0x2b, 0x8c, 0xc4, 0xa7, 0xbe, + 0x39, 0x5c, 0xac, 0xfe, 0xb8, 0x15, 0x0c, 0xf9, 0x06, 0xf8, 0xd2, 0x4c, + 0x84, 0x9e, 0xdc, 0xb8, 0x41, 0x27, 0xbf, 0x77, 0x65, 0x42, 0xdf, 0xfe, + 0x9c, 0xf1, 0xd0, 0xbd, 0xaf, 0x69, 0xfc, 0x9c, 0x0b, 0x29, 0xd5, 0xb1, + 0x06, 0x58, 0x4d, 0xf3, 0x10, 0x19, 0x65, 0xe7, 0x3f, 0x16, 0x54, 0x8d, + 0xe6, 0xf2, 0x0b, 0xf1, 0xf1, 0x9c, 0x0b, 0x2f, 0xbb, 0x77, 0xed, 0x51, + 0x45, 0x2f, 0xff, 0xce, 0x08, 0xef, 0xcd, 0xcf, 0x37, 0xfd, 0x84, 0xb2, + 0xb4, 0x88, 0x42, 0x30, 0xbe, 0xfe, 0x9b, 0xa5, 0x97, 0xfe, 0x8f, 0xb0, + 0x22, 0x5f, 0xe6, 0xd4, 0xb2, 0xfd, 0xdc, 0x14, 0x01, 0x65, 0xf7, 0xcd, + 0x6e, 0xd6, 0x53, 0x9e, 0x5f, 0x09, 0xef, 0xec, 0x00, 0x9a, 0x70, 0x2c, + 0xbc, 0xf2, 0x17, 0x09, 0xe6, 0x64, 0x2a, 0x98, 0x8b, 0x44, 0x7e, 0x84, + 0x77, 0xc8, 0x6f, 0xfe, 0x87, 0xd1, 0x05, 0xfa, 0xcf, 0x3a, 0xcb, 0xff, + 0xe6, 0x98, 0xa3, 0xfc, 0xff, 0x5d, 0xb1, 0x4e, 0xb2, 0xff, 0xfb, 0x3d, + 0xf6, 0x31, 0xb2, 0x4d, 0xa7, 0x02, 0xca, 0x1a, 0x28, 0x38, 0xa5, 0x61, + 0x78, 0xad, 0x98, 0xf1, 0xf7, 0xf9, 0xcb, 0x90, 0xe2, 0xbf, 0xc2, 0xf3, + 0x5d, 0xbb, 0xf6, 0xa8, 0xba, 0x17, 0xff, 0x0b, 0x79, 0x0b, 0xcd, 0x76, + 0xef, 0xda, 0xa2, 0x4b, 0x5f, 0xb5, 0xdb, 0xbf, 0x6a, 0x8b, 0xc9, 0x73, + 0xef, 0x59, 0x61, 0x78, 0x79, 0xdb, 0x66, 0xd5, 0x10, 0xda, 0x7f, 0x9e, + 0x3c, 0xa9, 0x37, 0xe4, 0x28, 0x7b, 0x87, 0x5c, 0xcc, 0x07, 0x43, 0xf4, + 0xf6, 0xe3, 0xa0, 0x16, 0x32, 0x72, 0xb9, 0x2f, 0x37, 0xea, 0x21, 0x43, + 0xdf, 0x0a, 0x4b, 0xff, 0xc2, 0xce, 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, + 0x44, 0xb2, 0xbe, 0xda, 0xcd, 0xdb, 0xda, 0xd6, 0x58, 0x50, 0xb2, 0xdb, + 0xab, 0x2d, 0xe5, 0x95, 0xb5, 0x9b, 0xad, 0xa0, 0x54, 0x22, 0x97, 0xf9, + 0x87, 0xec, 0x62, 0x35, 0x65, 0xf7, 0x9f, 0xe1, 0x59, 0x7d, 0xe8, 0xdc, + 0x3a, 0xcb, 0xff, 0x67, 0x9a, 0x45, 0x98, 0x11, 0x5a, 0xcb, 0xff, 0x63, + 0x6f, 0x62, 0x0c, 0xb3, 0x8b, 0x2f, 0xfa, 0x07, 0xb2, 0x3f, 0xac, 0x1a, + 0xcb, 0xc1, 0xed, 0xd6, 0x54, 0x93, 0x4e, 0x63, 0x2d, 0xc2, 0x23, 0x92, + 0x92, 0x07, 0xcf, 0x84, 0x3a, 0xbf, 0x87, 0xf0, 0xbc, 0xb8, 0xb2, 0xff, + 0x81, 0xb1, 0xbf, 0xc8, 0xd0, 0x16, 0x5f, 0xb8, 0xe6, 0xf9, 0x96, 0x5d, + 0x13, 0xac, 0xbf, 0xf6, 0x1f, 0x8f, 0x21, 0x39, 0x18, 0xb2, 0xb7, 0x0f, + 0x57, 0xe2, 0xf5, 0x08, 0xdd, 0xc3, 0xb6, 0x7d, 0xbd, 0xe3, 0x1d, 0x65, + 0xfc, 0x78, 0x23, 0x72, 0x75, 0x97, 0x39, 0xd6, 0x5f, 0xf9, 0xf5, 0x28, + 0xff, 0xa0, 0x22, 0xb5, 0x95, 0xb4, 0x22, 0x8f, 0x07, 0x7e, 0x5c, 0x11, + 0x6b, 0xf0, 0x7e, 0xde, 0x85, 0x97, 0xfe, 0xf4, 0x79, 0x8d, 0xff, 0x1c, + 0x0b, 0x2f, 0xf9, 0xe5, 0xc0, 0xfe, 0x3f, 0xc5, 0x97, 0xf1, 0x7f, 0x50, + 0xfd, 0xac, 0xb9, 0xf8, 0xb2, 0xff, 0xfc, 0xef, 0x27, 0xf6, 0xcc, 0x9c, + 0x3f, 0x6f, 0x42, 0xca, 0x9c, 0xfb, 0x26, 0x16, 0xb8, 0x3a, 0x59, 0x7e, + 0x97, 0x1f, 0x6f, 0x16, 0x5e, 0x77, 0xed, 0x51, 0x19, 0xaf, 0xf4, 0x75, + 0x28, 0xd1, 0xe4, 0xb2, 0xff, 0xff, 0xb9, 0xff, 0xb7, 0xba, 0x97, 0x08, + 0x38, 0x69, 0xac, 0xf2, 0x59, 0x6c, 0x02, 0x27, 0x7e, 0x69, 0x7f, 0xff, + 0xd2, 0xcd, 0x8f, 0xf0, 0xc6, 0xc1, 0x94, 0x6b, 0x4d, 0x87, 0x59, 0x50, + 0x9c, 0x07, 0x65, 0x5a, 0x86, 0x33, 0x94, 0x5f, 0xcd, 0x07, 0x9f, 0x0c, + 0x59, 0x71, 0x49, 0x65, 0x8e, 0xb2, 0xfc, 0xda, 0xf3, 0x8b, 0xd1, 0xea, + 0x9c, 0xb8, 0x41, 0x6b, 0x79, 0x65, 0xd1, 0xa5, 0x96, 0x6e, 0xcd, 0x3e, + 0xf1, 0x1b, 0xe6, 0xd3, 0xe9, 0x65, 0xdc, 0xdc, 0x59, 0x67, 0x91, 0xbb, + 0xf9, 0x0d, 0xff, 0xdc, 0x60, 0xf3, 0x08, 0x32, 0xce, 0x2c, 0xba, 0x3a, + 0x59, 0x79, 0x8b, 0xb5, 0x95, 0xc3, 0x67, 0xf1, 0x7b, 0xff, 0xe1, 0x5b, + 0x7f, 0x8d, 0xf2, 0x80, 0xbe, 0x8d, 0x59, 0x53, 0xae, 0xb9, 0xc8, 0x9c, + 0x67, 0xf8, 0x72, 0xd0, 0x99, 0x98, 0x93, 0x51, 0xcb, 0x9e, 0x12, 0xfe, + 0x75, 0x26, 0x4e, 0x13, 0x7d, 0xd8, 0x24, 0x37, 0xf9, 0xcc, 0xf3, 0x46, + 0xa1, 0x65, 0xff, 0xff, 0xf9, 0xc7, 0xcf, 0x61, 0xc9, 0xa7, 0xd8, 0x70, + 0x93, 0x9b, 0xe2, 0xcf, 0xeb, 0x16, 0x56, 0x91, 0x6c, 0x46, 0x57, 0xff, + 0xfb, 0xcd, 0xff, 0xb7, 0x04, 0x9e, 0x27, 0x2c, 0x00, 0x78, 0xb2, 0xfd, + 0xf6, 0x3c, 0x4c, 0xb2, 0xfe, 0xc8, 0xd9, 0x1c, 0x3a, 0xca, 0xc3, 0xd6, + 0xe1, 0x45, 0xfe, 0x27, 0x33, 0xe4, 0xe6, 0xac, 0xa9, 0x1e, 0xa7, 0xc8, + 0x6f, 0xb5, 0xa7, 0xe2, 0xcb, 0xf7, 0xb0, 0x9c, 0xeb, 0x2f, 0xba, 0xf4, + 0x71, 0x65, 0xe9, 0x9c, 0x96, 0x5e, 0x8f, 0xf1, 0x65, 0xff, 0xb0, 0xde, + 0x46, 0x10, 0xfd, 0x0b, 0x2b, 0x87, 0xb2, 0x11, 0xca, 0xd8, 0x98, 0x14, + 0x88, 0xb0, 0x9a, 0x62, 0x3e, 0x3a, 0xdf, 0xb7, 0x49, 0xcc, 0x1a, 0xcb, + 0xfd, 0x1a, 0x9f, 0x58, 0x3c, 0x59, 0x7f, 0xf7, 0xdb, 0x4e, 0x0d, 0x9d, + 0x4a, 0x0e, 0xb2, 0xfc, 0x51, 0x2e, 0x3a, 0xca, 0x84, 0x65, 0xc8, 0xad, + 0x8c, 0xf7, 0xa3, 0xdf, 0xf7, 0x7e, 0x83, 0xee, 0xe3, 0xcc, 0xb2, 0xde, + 0x59, 0x7f, 0xff, 0xf7, 0xd8, 0xfa, 0x6c, 0xe8, 0x83, 0xf8, 0xf6, 0xcd, + 0xed, 0xf9, 0xa1, 0x65, 0x62, 0x21, 0xfe, 0x23, 0x7f, 0xd0, 0x7f, 0x3f, + 0xdc, 0x80, 0xb2, 0xfc, 0xe4, 0x24, 0x01, 0x65, 0x42, 0x68, 0x99, 0x0c, + 0x46, 0x22, 0xd1, 0xbd, 0xfd, 0x2e, 0x71, 0xca, 0x4b, 0x2f, 0x4f, 0xce, + 0x2c, 0xbf, 0x17, 0xf8, 0x1d, 0x2c, 0xa7, 0x3f, 0x32, 0x2d, 0x08, 0xf5, + 0xce, 0x35, 0x97, 0xe9, 0x39, 0x07, 0xb5, 0x95, 0xd9, 0xbe, 0xe8, 0x5a, + 0xe7, 0xed, 0x65, 0xd1, 0xb8, 0xb2, 0xa7, 0x36, 0x02, 0xb1, 0x7b, 0xff, + 0x7d, 0xc8, 0x1b, 0x04, 0xce, 0x8c, 0x59, 0x7d, 0xff, 0xc1, 0xd6, 0x5f, + 0x4b, 0xed, 0x3a, 0xca, 0xc4, 0x44, 0x1a, 0x86, 0xe4, 0x57, 0x8b, 0x3b, + 0x59, 0x7f, 0xee, 0xdb, 0xec, 0x79, 0xb8, 0xc4, 0xb2, 0xff, 0xd0, 0xda, + 0xff, 0xf2, 0x34, 0x05, 0x96, 0xfc, 0x1f, 0xe4, 0xc7, 0xf7, 0xf8, 0xf9, + 0xa0, 0x10, 0x40, 0xb2, 0xd2, 0x59, 0x58, 0x98, 0x23, 0x42, 0x61, 0xca, + 0x04, 0x33, 0xbf, 0x02, 0x3f, 0x03, 0x59, 0x50, 0xaa, 0x73, 0x14, 0xda, + 0x15, 0xcf, 0x19, 0x98, 0x50, 0x6f, 0xff, 0x83, 0xfe, 0x75, 0x28, 0x20, + 0x73, 0x60, 0x49, 0x65, 0xe8, 0xfc, 0x2c, 0xa1, 0x9f, 0x76, 0xf5, 0x3b, + 0xe3, 0x87, 0xe1, 0x59, 0x7b, 0xd8, 0x4b, 0x29, 0x8f, 0x8b, 0xc4, 0x81, + 0x23, 0xbb, 0xd3, 0x2c, 0xbe, 0xc9, 0xb2, 0x65, 0x97, 0xed, 0x07, 0xf9, + 0x3a, 0xcb, 0xec, 0xd0, 0xe1, 0x65, 0xb9, 0xb0, 0xfb, 0x60, 0x8c, 0x8a, + 0x6d, 0xe5, 0x95, 0xd1, 0xe3, 0x39, 0xad, 0xf4, 0x4b, 0x09, 0x65, 0x32, + 0x61, 0xaf, 0x0c, 0xb0, 0x11, 0x5e, 0xcc, 0xed, 0x65, 0xff, 0x7f, 0x99, + 0xa0, 0x10, 0x40, 0xb2, 0xff, 0xe8, 0xff, 0x3d, 0x0d, 0xfe, 0x44, 0xeb, + 0x2f, 0xd9, 0xa8, 0x9b, 0x8b, 0x2b, 0x47, 0xd9, 0xe4, 0x4b, 0xef, 0xbf, + 0xa1, 0x65, 0xf7, 0xfc, 0x1d, 0xb5, 0x97, 0xfb, 0x23, 0x4f, 0x26, 0xf2, + 0xcb, 0xfc, 0xc6, 0x72, 0x3c, 0xfb, 0x8b, 0x2b, 0x47, 0xcf, 0xf3, 0x1b, + 0xf7, 0xfd, 0xd6, 0x6e, 0xac, 0xa1, 0xa6, 0x3d, 0xd1, 0x13, 0x10, 0x9e, + 0x11, 0xbe, 0x22, 0xbf, 0x71, 0xcd, 0xf3, 0x2c, 0xbf, 0xed, 0xc1, 0xf8, + 0x3c, 0xea, 0x4e, 0xb2, 0xe6, 0xf6, 0x1f, 0x30, 0x4a, 0x2a, 0x15, 0x52, + 0xe4, 0x78, 0x6f, 0x0b, 0x6b, 0xfc, 0xd2, 0x89, 0x41, 0xe4, 0xb2, 0xf0, + 0x98, 0x28, 0x59, 0x7f, 0xfa, 0x35, 0x00, 0xf3, 0x46, 0x80, 0x79, 0x2c, + 0xbf, 0xfc, 0x10, 0x1d, 0x8b, 0x00, 0x58, 0xf3, 0x2c, 0xbf, 0xcd, 0xe6, + 0x82, 0x98, 0x2b, 0x2f, 0x47, 0x85, 0x2b, 0x2f, 0xf3, 0x6b, 0x30, 0xba, + 0xfa, 0xca, 0x84, 0x42, 0x31, 0x93, 0x90, 0x5f, 0xf8, 0x23, 0xd6, 0x07, + 0xd0, 0x7c, 0x59, 0x7f, 0xfd, 0x9b, 0xf3, 0x60, 0x9f, 0x6d, 0x34, 0xee, + 0x75, 0x97, 0xff, 0xfd, 0x80, 0xdb, 0xcd, 0x85, 0x93, 0x89, 0x2d, 0x9c, + 0xe3, 0x19, 0xc5, 0x95, 0xe4, 0x62, 0x12, 0xa5, 0x42, 0xab, 0x9c, 0x32, + 0x62, 0x1d, 0x24, 0xfa, 0x19, 0x9c, 0x2d, 0xfc, 0x60, 0x57, 0xff, 0xc5, + 0xa8, 0xf3, 0xb7, 0xe3, 0xc5, 0xd3, 0x2c, 0xbf, 0xf7, 0xa3, 0x40, 0xd6, + 0xa0, 0xfc, 0x59, 0x7e, 0x7e, 0x13, 0x42, 0xcb, 0xff, 0x9b, 0x43, 0xf0, + 0x75, 0x9d, 0xfb, 0x16, 0x5f, 0x9b, 0x4f, 0xba, 0xcb, 0x2a, 0x47, 0xdd, + 0xda, 0x2d, 0xfd, 0x3b, 0xce, 0x41, 0xfa, 0xcb, 0xef, 0x85, 0xfe, 0xb2, + 0xf0, 0x5f, 0xeb, 0x2b, 0x61, 0xbe, 0xf9, 0x15, 0xed, 0xf9, 0xa5, 0x95, + 0x07, 0x83, 0x84, 0x77, 0x37, 0x16, 0x54, 0x2a, 0x26, 0xc4, 0xd3, 0x4f, + 0xfa, 0x84, 0x9b, 0x11, 0x94, 0x2b, 0xb6, 0xc8, 0x2f, 0x04, 0x23, 0x59, + 0x7f, 0x4c, 0xde, 0xd6, 0x1d, 0x65, 0xcc, 0x62, 0xcb, 0xb7, 0x71, 0x65, + 0x39, 0xef, 0x70, 0xbb, 0xe2, 0xf7, 0xf7, 0x23, 0xfc, 0xf3, 0x2c, 0xbf, + 0x16, 0x1f, 0x58, 0xb2, 0xfb, 0x5b, 0xf0, 0x6b, 0x2b, 0x0f, 0xdc, 0xe5, + 0xa1, 0x26, 0xbf, 0x7a, 0x34, 0x79, 0x2c, 0xbc, 0x3c, 0xfa, 0xcb, 0xfd, + 0x85, 0xb3, 0xd1, 0x9b, 0x8b, 0x2f, 0xfc, 0xdf, 0xe6, 0x0e, 0x62, 0x81, + 0xac, 0xbe, 0x03, 0x75, 0x25, 0x97, 0xfa, 0x0b, 0xed, 0x39, 0x42, 0xcb, + 0xff, 0xcd, 0xa6, 0x9e, 0x0b, 0x3d, 0xa0, 0xef, 0x59, 0x52, 0x4d, 0x5c, + 0x65, 0x07, 0x1c, 0xf1, 0xb0, 0x0f, 0x88, 0x8f, 0xe6, 0x37, 0xff, 0xa0, + 0xbb, 0x7f, 0xb9, 0xa2, 0x4f, 0x13, 0xac, 0xbf, 0xf3, 0x0c, 0x3f, 0xe3, + 0xfd, 0xcd, 0x59, 0x7f, 0x61, 0x9d, 0x4b, 0x9b, 0x0d, 0x44, 0x63, 0xa6, + 0xdf, 0xff, 0xd8, 0x58, 0x6f, 0x9e, 0x6f, 0x39, 0xb9, 0xac, 0xfa, 0xcb, + 0xff, 0x84, 0x8e, 0x84, 0x22, 0xc6, 0xeb, 0xeb, 0x29, 0x91, 0xd7, 0xe4, + 0xa7, 0x5b, 0xad, 0xad, 0xd2, 0x00, 0x6d, 0x0d, 0x71, 0x1c, 0x34, 0xec, + 0xf2, 0x8c, 0x2c, 0x70, 0xd0, 0xc9, 0xdb, 0x43, 0x63, 0x7a, 0xec, 0x8b, + 0xa8, 0xc3, 0x5a, 0x32, 0x49, 0xa3, 0x18, 0xd4, 0x70, 0x27, 0x85, 0x9f, + 0xa5, 0x83, 0xbc, 0x64, 0x60, 0x8c, 0xec, 0x56, 0x68, 0x52, 0xb0, 0x79, + 0x2b, 0xcf, 0xf2, 0xa5, 0x02, 0xe3, 0xbd, 0xef, 0x6e, 0x14, 0xa2, 0x47, + 0x0b, 0xbb, 0x1e, 0xdd, 0xff, 0x7e, 0x07, 0xad, 0x41, 0xf8, 0xb2, 0xe3, + 0x7b, 0x59, 0x7f, 0x1e, 0x51, 0x1c, 0x65, 0x97, 0x38, 0x16, 0x54, 0x1e, + 0x13, 0x96, 0x5f, 0x0d, 0xdf, 0xa5, 0x97, 0xf3, 0x74, 0xdd, 0xc0, 0x8b, + 0x29, 0xcf, 0x44, 0x88, 0xaf, 0x30, 0x87, 0x59, 0x7f, 0x16, 0x7b, 0xa7, + 0xdc, 0x59, 0x7b, 0xb7, 0xde, 0xb2, 0xef, 0x8b, 0x84, 0xe4, 0x4e, 0x73, + 0xe5, 0xb7, 0x71, 0x01, 0x07, 0x07, 0x7e, 0x61, 0x7f, 0xff, 0xf0, 0x7a, + 0x90, 0xb7, 0x2f, 0xe1, 0xf8, 0x3f, 0x46, 0x86, 0xee, 0x62, 0xcb, 0xff, + 0xa0, 0xc1, 0x78, 0x50, 0x66, 0xa0, 0xeb, 0x28, 0x5a, 0xe5, 0x56, 0x4b, + 0x7e, 0x27, 0x1f, 0xba, 0xdf, 0xfe, 0x16, 0x77, 0x90, 0xbc, 0xd7, 0x6e, + 0xfd, 0xaa, 0x26, 0x95, 0xff, 0xe1, 0x67, 0x79, 0x0b, 0xcd, 0x76, 0xef, + 0xda, 0xa2, 0x71, 0x5e, 0x01, 0x42, 0xcb, 0xf4, 0x98, 0x80, 0xcb, 0x2f, + 0xd2, 0xcf, 0xca, 0x4b, 0x2f, 0xf6, 0xf8, 0xf6, 0xc2, 0x89, 0x2c, 0xbf, + 0xf3, 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x14, 0x0a, 0xff, 0xf3, 0x41, + 0xdc, 0x7a, 0x8f, 0xfb, 0x06, 0xb2, 0xfb, 0x85, 0xd4, 0x96, 0x58, 0x5c, + 0x26, 0xb1, 0x83, 0x7d, 0x13, 0x31, 0x41, 0xcd, 0xbc, 0x9d, 0xf4, 0x8b, + 0xb6, 0xb1, 0x42, 0xcb, 0xee, 0xdd, 0xfb, 0x54, 0x5c, 0x0b, 0xfc, 0x3f, + 0x46, 0xde, 0x6a, 0x16, 0x56, 0x8f, 0x94, 0x8c, 0x2e, 0xeb, 0x8b, 0x2f, + 0x8d, 0xed, 0xc6, 0xb2, 0xe8, 0x11, 0x65, 0xfc, 0x59, 0xfe, 0xdb, 0x8b, + 0x2e, 0x86, 0x59, 0x7d, 0xe0, 0xbc, 0x96, 0x5f, 0xe2, 0x94, 0x30, 0xf0, + 0xeb, 0x28, 0x50, 0x9c, 0x76, 0x42, 0x17, 0xa2, 0x16, 0x18, 0xd1, 0x21, + 0xc5, 0xfc, 0x5b, 0xf1, 0x50, 0x91, 0x5f, 0xa4, 0x2c, 0xd1, 0x49, 0xab, + 0x28, 0x5a, 0x2e, 0x22, 0x10, 0xf7, 0xfb, 0x6a, 0xda, 0xc5, 0x32, 0x04, + 0x99, 0x65, 0xfc, 0x78, 0xf8, 0x66, 0x75, 0x97, 0x38, 0x16, 0x5f, 0xa6, + 0x94, 0x14, 0x96, 0x52, 0xca, 0xc3, 0x66, 0x45, 0x17, 0xf4, 0xb0, 0xd2, + 0xc0, 0x2c, 0xbc, 0x0c, 0x31, 0x65, 0xf1, 0x46, 0x79, 0x65, 0x41, 0xbd, + 0x9c, 0x76, 0xe6, 0x16, 0x2a, 0x26, 0xc7, 0x08, 0x5a, 0x2e, 0x24, 0x9f, + 0x8f, 0x88, 0xd5, 0x7f, 0xe2, 0xcf, 0xf5, 0xdb, 0x73, 0xcc, 0xb2, 0xfd, + 0xae, 0xdd, 0xfb, 0x54, 0x49, 0x2b, 0xa4, 0x2e, 0x0f, 0xd7, 0x0f, 0xec, + 0x2f, 0xc9, 0x86, 0x3c, 0x37, 0xaf, 0xd8, 0x60, 0x03, 0xc5, 0x97, 0x18, + 0x05, 0x97, 0xfe, 0xef, 0xd1, 0xac, 0xf9, 0x41, 0xd6, 0x5f, 0xe7, 0xf9, + 0x64, 0xee, 0x4b, 0x2f, 0xd1, 0x31, 0x40, 0xd6, 0x5c, 0x69, 0x8b, 0x2f, + 0xe9, 0x3e, 0xa7, 0x1c, 0x2c, 0xbf, 0xb0, 0x9f, 0xa9, 0x71, 0x65, 0xff, + 0xf8, 0x24, 0xe6, 0xfc, 0xd8, 0x29, 0x67, 0x98, 0xeb, 0x2f, 0xff, 0xd9, + 0xdc, 0x7a, 0x0f, 0xdf, 0x9b, 0xf9, 0x87, 0x59, 0x7e, 0x3e, 0xb0, 0x7f, + 0x59, 0x7f, 0xa3, 0xa1, 0x3e, 0x50, 0x05, 0x95, 0x07, 0xb8, 0x12, 0x8b, + 0xf6, 0xef, 0xa0, 0x8d, 0x59, 0x61, 0xac, 0xbf, 0xa7, 0x2c, 0xde, 0x18, + 0x59, 0x53, 0x9e, 0x03, 0x88, 0xdc, 0xe2, 0xe7, 0x55, 0xfe, 0x32, 0x9c, + 0x18, 0x34, 0xfb, 0xb3, 0x1e, 0x89, 0xe6, 0x19, 0xd1, 0x71, 0xcb, 0x49, + 0x57, 0x90, 0xb1, 0xf9, 0x0e, 0xdb, 0x5d, 0x4e, 0xed, 0x28, 0x65, 0x6a, + 0x41, 0xbb, 0x47, 0x99, 0x70, 0x11, 0xda, 0x72, 0x55, 0x8f, 0xe5, 0x4c, + 0x6f, 0x96, 0x5f, 0x7e, 0xd7, 0xc8, 0x3f, 0x59, 0x7f, 0xe3, 0x5c, 0x5e, + 0x6b, 0xb7, 0x7e, 0xd5, 0x16, 0xa2, 0xfb, 0x91, 0xfe, 0x2c, 0xbf, 0xf3, + 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x12, 0xaa, 0xe6, 0x31, 0x65, 0x2c, + 0xb0, 0xbc, 0x4c, 0x24, 0xd2, 0x8e, 0x93, 0xce, 0x45, 0xf4, 0xed, 0xd1, + 0x7b, 0xfb, 0x35, 0xdb, 0xbf, 0x6a, 0x88, 0xa5, 0x7f, 0xe7, 0x73, 0xe6, + 0x80, 0x41, 0x02, 0xcb, 0xff, 0x47, 0xf9, 0x9a, 0x01, 0x04, 0x0b, 0x2f, + 0x9b, 0x90, 0xeb, 0x2f, 0xf1, 0x38, 0x39, 0xfc, 0xed, 0x65, 0xc7, 0x17, + 0xe4, 0x67, 0x11, 0xef, 0x0f, 0xbe, 0x41, 0x42, 0xd3, 0x53, 0x78, 0xc2, + 0x6f, 0xda, 0xed, 0xdf, 0xb5, 0x44, 0x68, 0xbf, 0x89, 0x87, 0xa6, 0x9d, + 0x65, 0x85, 0xe1, 0xf1, 0xb1, 0xb5, 0xe1, 0x57, 0xb7, 0xb5, 0xac, 0xbe, + 0xda, 0xb6, 0x90, 0xab, 0x15, 0x6b, 0x2e, 0x0f, 0x96, 0x5f, 0xf8, 0x78, + 0x76, 0xd6, 0x72, 0x68, 0x59, 0x7f, 0xbf, 0xf6, 0x7d, 0xf1, 0xf5, 0x97, + 0xff, 0xf8, 0x3c, 0xf6, 0x0c, 0x41, 0x38, 0xc2, 0x7d, 0xb9, 0x30, 0x8b, + 0x2a, 0x11, 0x36, 0xe6, 0x97, 0xff, 0xa6, 0x66, 0xf4, 0xd9, 0xf8, 0xfc, + 0x0d, 0x65, 0xe6, 0x73, 0x12, 0x5f, 0xfa, 0x23, 0x7c, 0x14, 0x4d, 0x13, + 0x2c, 0xbf, 0x4d, 0xc7, 0xcf, 0xac, 0xbf, 0xda, 0xd4, 0x75, 0xcf, 0x0d, + 0x65, 0xbd, 0x07, 0xba, 0xc5, 0x17, 0xff, 0xd1, 0xe8, 0x9b, 0x81, 0xf8, + 0x43, 0x34, 0x6f, 0x59, 0x4c, 0xa9, 0xdb, 0x72, 0x1b, 0x33, 0x10, 0x9d, + 0x28, 0x87, 0x3f, 0x09, 0xcd, 0xe4, 0xd7, 0xdd, 0xbb, 0xf6, 0xa8, 0xa7, + 0xd7, 0xff, 0x9b, 0x5e, 0x7f, 0xf1, 0xfa, 0x72, 0x02, 0xcb, 0xbf, 0x0b, + 0x2b, 0x48, 0x8f, 0xf1, 0x87, 0xd2, 0x6f, 0x8c, 0xee, 0x61, 0x4a, 0xcb, + 0xff, 0xef, 0x37, 0xf9, 0x9b, 0xfc, 0xdb, 0x79, 0xa3, 0x56, 0x5f, 0xe6, + 0xfb, 0x7f, 0xc1, 0xfa, 0xcb, 0xe8, 0x3e, 0x9d, 0x65, 0xfe, 0x8f, 0xf9, + 0xe6, 0xd9, 0x8b, 0x2e, 0x6e, 0x96, 0x54, 0xc7, 0x99, 0xa3, 0x5a, 0xd2, + 0x30, 0xc8, 0xcf, 0xed, 0xb7, 0xfc, 0xf2, 0x61, 0xfa, 0x25, 0xc5, 0x97, + 0xe0, 0xff, 0xf1, 0xbd, 0x65, 0xff, 0xd1, 0x34, 0xcc, 0x08, 0x9a, 0x6c, + 0x02, 0xcb, 0xde, 0x68, 0xd1, 0xf8, 0x91, 0x55, 0xde, 0x0a, 0xca, 0xc3, + 0xc8, 0x09, 0x8d, 0xfb, 0x3c, 0xc5, 0xf5, 0x97, 0xff, 0x1c, 0x83, 0xe6, + 0xd6, 0x72, 0x68, 0x59, 0x7f, 0xff, 0xfe, 0x8f, 0xb1, 0x3f, 0x39, 0x9f, + 0xf3, 0x9f, 0xd8, 0x51, 0x1c, 0x70, 0xef, 0x59, 0x7c, 0xf3, 0x37, 0x96, + 0x5f, 0xfe, 0xd6, 0x34, 0xdc, 0x0c, 0x74, 0x51, 0xf5, 0x97, 0xed, 0xe1, + 0xdc, 0x80, 0x2c, 0xa9, 0x27, 0x06, 0xc4, 0xda, 0x44, 0x3c, 0x20, 0x3e, + 0x44, 0x14, 0xab, 0xee, 0xbe, 0x1d, 0x2c, 0xbf, 0xf7, 0xf4, 0x19, 0xb9, + 0xdb, 0xcd, 0xc5, 0x95, 0x87, 0xce, 0x12, 0x4b, 0xfc, 0xe5, 0x1f, 0x28, + 0xfa, 0xcb, 0xff, 0x47, 0xfa, 0xcf, 0xc4, 0xcd, 0xc5, 0x97, 0xfe, 0x98, + 0x25, 0x3f, 0x3b, 0x79, 0xb8, 0xb2, 0xa1, 0x10, 0x58, 0x7f, 0x73, 0xf1, + 0x65, 0xf8, 0x33, 0x4c, 0xe6, 0xac, 0xbf, 0xef, 0xc7, 0x4f, 0x36, 0xa3, + 0x7a, 0xca, 0xdc, 0x3f, 0xde, 0x0b, 0x7c, 0xae, 0xf8, 0x3e, 0x6d, 0x2c, + 0xb6, 0x2c, 0xb0, 0xbd, 0xad, 0x95, 0x87, 0xb5, 0x15, 0xed, 0x07, 0x51, + 0x2a, 0x37, 0x23, 0x03, 0x34, 0xc3, 0xb2, 0xa6, 0x8c, 0x60, 0xe5, 0xfe, + 0x87, 0x8b, 0xc7, 0x48, 0x50, 0xc3, 0xe1, 0x0f, 0xe1, 0x64, 0x18, 0x4f, + 0x6d, 0x99, 0x6e, 0x91, 0x5f, 0xfe, 0x16, 0x77, 0x90, 0xbc, 0xd7, 0x6e, + 0xfd, 0xaa, 0x26, 0xa5, 0xfd, 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x76, 0xbf, + 0xfd, 0x9b, 0xad, 0xf6, 0x96, 0xc2, 0x8f, 0xf1, 0x65, 0x2c, 0xb8, 0xc1, + 0x7e, 0x3d, 0x83, 0x13, 0x68, 0x5a, 0x31, 0x5a, 0x12, 0x77, 0x01, 0x96, + 0x58, 0x6b, 0x2e, 0x83, 0xac, 0xaf, 0x1a, 0x7e, 0x08, 0xdb, 0x6d, 0x65, + 0x89, 0x65, 0x4e, 0x69, 0x0e, 0x29, 0x74, 0xf0, 0xb2, 0xfb, 0xb7, 0x7e, + 0xd5, 0x15, 0xf2, 0xf1, 0x86, 0x18, 0x92, 0xc4, 0x90, 0x59, 0xa0, 0xad, + 0x1f, 0x91, 0xd4, 0x2f, 0xf7, 0xb0, 0xd7, 0x8e, 0xb7, 0x56, 0x5e, 0x94, + 0x74, 0xb2, 0xfb, 0x3f, 0xe6, 0x59, 0x70, 0x78, 0xb2, 0xec, 0xf2, 0xca, + 0x19, 0xad, 0x98, 0x5e, 0xe7, 0xde, 0xb2, 0xff, 0x18, 0xff, 0xe4, 0x64, + 0xeb, 0x2f, 0x72, 0x00, 0xb2, 0xbc, 0x7a, 0x1f, 0x34, 0xbe, 0x27, 0xeb, + 0x8b, 0x2b, 0x0f, 0x13, 0xe4, 0x57, 0x8c, 0xcd, 0x2c, 0xb7, 0xd6, 0x5f, + 0xf3, 0x6b, 0x27, 0x69, 0x60, 0xd6, 0x5f, 0xed, 0x03, 0xfc, 0x70, 0x62, + 0xca, 0x64, 0x4c, 0xe8, 0x75, 0xc4, 0x42, 0x71, 0x7b, 0xc4, 0x05, 0x97, + 0xdb, 0xbe, 0x08, 0x8b, 0x2f, 0x4d, 0x93, 0x2c, 0xb3, 0x2c, 0xae, 0x8f, + 0x56, 0x62, 0x73, 0x8f, 0x5b, 0x4b, 0x29, 0x65, 0x31, 0x79, 0xa1, 0x1a, + 0x59, 0x66, 0x59, 0x69, 0xcd, 0x2e, 0xfc, 0x17, 0x6d, 0xeb, 0x2b, 0xc7, + 0xea, 0xe7, 0x41, 0x28, 0xbe, 0xc2, 0x89, 0x2c, 0xb0, 0xb1, 0x51, 0x74, + 0xd6, 0x0f, 0x67, 0x45, 0x91, 0x16, 0x42, 0x27, 0xb2, 0x29, 0x8d, 0xf4, + 0x3a, 0xe9, 0xc0, 0x22, 0x28, 0x56, 0x72, 0x17, 0x5f, 0x3b, 0x0b, 0x8e, + 0xdc, 0x30, 0x84, 0x2e, 0xbf, 0xfc, 0x2c, 0xef, 0x21, 0x79, 0xae, 0xdd, + 0xfb, 0x54, 0x4f, 0x6b, 0x0a, 0xd6, 0x5f, 0xf0, 0xdf, 0xb8, 0xec, 0x24, + 0x35, 0x97, 0xff, 0xcd, 0x2e, 0x6e, 0x78, 0x3d, 0xe4, 0xfb, 0x07, 0xa5, + 0x97, 0xd1, 0xba, 0xfd, 0x2c, 0xbc, 0xc4, 0x05, 0x95, 0x3a, 0x34, 0xa4, + 0x75, 0xe5, 0x8d, 0xe4, 0xb7, 0xff, 0x07, 0x53, 0x69, 0xa7, 0x73, 0xb7, + 0x16, 0x5f, 0x98, 0x71, 0xae, 0x2c, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x17, + 0x0a, 0xf8, 0xe1, 0xff, 0x16, 0x5f, 0xef, 0x34, 0x82, 0x08, 0x99, 0x65, + 0xfd, 0x0d, 0xad, 0x31, 0x8b, 0x2c, 0x2c, 0x52, 0xa9, 0x3a, 0x21, 0xcf, + 0x3a, 0x04, 0x91, 0xb0, 0x9c, 0xd3, 0x66, 0x23, 0x39, 0xa5, 0xff, 0xc2, + 0xde, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0x93, 0xd7, 0xfe, 0x69, 0x85, + 0xc0, 0x63, 0xf0, 0x05, 0x97, 0xf8, 0xd1, 0x73, 0x7a, 0x08, 0xd5, 0x95, + 0x0d, 0xce, 0xdc, 0xf1, 0xdb, 0xca, 0x11, 0xc6, 0xd2, 0xba, 0xfb, 0x8c, + 0xc6, 0x68, 0xc8, 0x75, 0x3a, 0xbd, 0xe8, 0xc0, 0x39, 0x2a, 0xab, 0x7c, + 0x20, 0xcc, 0x56, 0x11, 0x02, 0xff, 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, + 0x2a, 0x5f, 0xb5, 0xdb, 0xbf, 0x6a, 0x8a, 0x65, 0x7f, 0x37, 0xb1, 0xfa, + 0x02, 0xcb, 0x0b, 0xc3, 0xe3, 0xdb, 0x36, 0xbf, 0xfc, 0x2c, 0xef, 0x21, + 0x79, 0xae, 0xdd, 0xfb, 0x54, 0x4c, 0xeb, 0xff, 0xc2, 0xce, 0xf2, 0x17, + 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x1a, 0xa9, 0xd3, 0x8a, 0x1c, 0x29, 0x8d, + 0x2c, 0xfa, 0xe5, 0xff, 0x9e, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0x8e, + 0x97, 0xf1, 0x67, 0xf9, 0x07, 0x59, 0x7a, 0x3f, 0xc5, 0x97, 0xb5, 0x38, + 0xbe, 0x1e, 0x40, 0x85, 0x97, 0xff, 0xfb, 0x52, 0x17, 0x84, 0x1f, 0x84, + 0xdf, 0xf5, 0xdb, 0x6b, 0x8b, 0x28, 0x5a, 0x66, 0xb1, 0x09, 0x66, 0x38, + 0xb8, 0x3e, 0x59, 0x7e, 0x14, 0x0a, 0x75, 0xce, 0x2c, 0xbe, 0xef, 0xb0, + 0xf6, 0xb2, 0xfb, 0x81, 0x3b, 0x2c, 0xb8, 0xcf, 0x2c, 0xa6, 0x37, 0x46, + 0x11, 0x5f, 0xb0, 0x87, 0x93, 0xac, 0xbf, 0xe6, 0xd7, 0x0b, 0x07, 0xe8, + 0x59, 0x7f, 0xa2, 0x3b, 0xcd, 0x6b, 0x16, 0x53, 0x22, 0x43, 0xc4, 0xe4, + 0x6f, 0x7e, 0xcd, 0x76, 0x13, 0x56, 0x5f, 0xf7, 0x70, 0x7c, 0x63, 0xc6, + 0xe2, 0xcb, 0xe6, 0xd3, 0xb2, 0xcb, 0xff, 0x16, 0x1a, 0xf3, 0x73, 0xd0, + 0x35, 0x97, 0xa6, 0x7f, 0xac, 0xbe, 0xed, 0xdf, 0xb5, 0x45, 0x34, 0xbf, + 0x67, 0x46, 0x3f, 0x96, 0x5f, 0xfd, 0xcc, 0x21, 0xc6, 0xc1, 0x53, 0x78, + 0x19, 0x65, 0x0d, 0x38, 0x6c, 0x2a, 0x34, 0xed, 0x88, 0x26, 0x3f, 0xd0, + 0xe9, 0x18, 0x70, 0xa6, 0xfb, 0x4e, 0x36, 0x59, 0x7f, 0xfb, 0xb7, 0xd7, + 0x3c, 0xed, 0xce, 0x67, 0x16, 0x5f, 0xff, 0xf6, 0x17, 0xf8, 0xdd, 0xe1, + 0x73, 0xbf, 0x37, 0xbb, 0x12, 0x75, 0x97, 0xfd, 0xc7, 0xeb, 0x26, 0x8f, + 0x71, 0x65, 0x9b, 0xc8, 0xee, 0x24, 0xaf, 0xb5, 0x5f, 0xed, 0x4f, 0xcd, + 0x6a, 0x0c, 0x59, 0x7f, 0x64, 0xf9, 0xde, 0x0d, 0x65, 0x79, 0x13, 0x0e, + 0x68, 0x46, 0xd7, 0xfe, 0xf3, 0x14, 0xfc, 0x0c, 0x6a, 0x65, 0x97, 0xff, + 0xec, 0x9e, 0x38, 0xda, 0xcd, 0x98, 0xc5, 0x07, 0x59, 0x52, 0x44, 0xa7, + 0xd0, 0x2f, 0x48, 0xf2, 0x59, 0x7d, 0xfe, 0x38, 0x16, 0x5e, 0x07, 0xd9, + 0x65, 0xfe, 0xe7, 0x6d, 0xad, 0x34, 0xeb, 0x2a, 0x0f, 0xcd, 0xc8, 0xb8, + 0x39, 0x7f, 0xff, 0x4e, 0x1d, 0x4d, 0xc9, 0xe2, 0x6e, 0x7b, 0x06, 0xdb, + 0xd6, 0x5f, 0xff, 0xef, 0x39, 0xa5, 0x92, 0xf4, 0x4b, 0x3c, 0x58, 0xf3, + 0xac, 0xbf, 0xec, 0xd3, 0xc3, 0x14, 0x1d, 0x65, 0xff, 0xff, 0xf4, 0x75, + 0xdf, 0xb3, 0x67, 0xb3, 0xbf, 0x37, 0xb0, 0x9c, 0xdc, 0xdf, 0x1d, 0x2c, + 0xbf, 0x4f, 0xb3, 0xc0, 0xde, 0xb2, 0xa7, 0x4e, 0x9c, 0x6c, 0x5c, 0x5f, + 0xde, 0x6a, 0x24, 0x20, 0xef, 0xfb, 0x7f, 0x7e, 0x60, 0x79, 0x8e, 0xb2, + 0xff, 0x4b, 0x64, 0x11, 0xbe, 0x65, 0x95, 0x88, 0xc5, 0x65, 0x47, 0x3c, + 0xbb, 0x41, 0x59, 0x7d, 0x9e, 0x13, 0x4b, 0x28, 0xe6, 0xe8, 0x85, 0xee, + 0x3e, 0xda, 0xcb, 0xf9, 0xcb, 0xbd, 0x93, 0xf1, 0x65, 0x00, 0xf2, 0xc2, + 0x35, 0x7f, 0x41, 0x7f, 0x6f, 0x3e, 0xb2, 0xff, 0xd1, 0xe8, 0x3c, 0x17, + 0xfc, 0xcb, 0x2f, 0xf3, 0x81, 0xff, 0xfc, 0xf2, 0xca, 0x92, 0x27, 0x7b, + 0x2f, 0x30, 0xf2, 0xfb, 0xcd, 0x9a, 0x59, 0x77, 0x82, 0xb2, 0xd2, 0x59, + 0x58, 0x7f, 0x6c, 0x64, 0x02, 0x1d, 0xe2, 0xf7, 0xbc, 0x60, 0x16, 0x5b, + 0xeb, 0x29, 0x8d, 0x7f, 0x87, 0xae, 0x1c, 0x2c, 0xbf, 0xff, 0x7f, 0x82, + 0x73, 0x50, 0x3c, 0xf7, 0x78, 0x53, 0xac, 0xa8, 0x3e, 0xec, 0x16, 0xbf, + 0xa1, 0x80, 0xff, 0x0a, 0xcb, 0xff, 0x60, 0x33, 0x26, 0x98, 0xa0, 0x6b, + 0x2b, 0x13, 0x18, 0x3c, 0x23, 0xbc, 0x40, 0x45, 0x97, 0xbf, 0x12, 0x59, + 0x7f, 0xc1, 0xff, 0xb2, 0x69, 0x47, 0x4b, 0x2f, 0xff, 0x13, 0xff, 0x3f, + 0xcc, 0xf6, 0x6e, 0x7d, 0x65, 0x79, 0x14, 0x44, 0x39, 0xbc, 0xee, 0xd3, + 0x2c, 0xb9, 0xfc, 0xb2, 0xfd, 0x9e, 0x72, 0x1a, 0xca, 0x9c, 0xf3, 0xa4, + 0x24, 0x01, 0x6b, 0xa0, 0xd5, 0x97, 0xf3, 0x83, 0x9b, 0x4f, 0x69, 0xed, + 0x35, 0x97, 0xf3, 0x41, 0xe7, 0xc3, 0x16, 0x5f, 0xff, 0x67, 0xfd, 0x92, + 0xd3, 0x97, 0xfc, 0xf2, 0x59, 0x74, 0x01, 0x65, 0xfe, 0x7e, 0xa3, 0xb6, + 0xec, 0x5e, 0x91, 0x24, 0x45, 0xc2, 0x27, 0x56, 0x27, 0xe8, 0xcf, 0xfe, + 0x30, 0x21, 0x7e, 0x43, 0x4a, 0xf3, 0xcd, 0xc5, 0x97, 0xe2, 0xe7, 0xb3, + 0x71, 0x65, 0xb4, 0xb2, 0xb0, 0xdd, 0x88, 0x55, 0x7e, 0x07, 0xa2, 0x5c, + 0x59, 0x78, 0x82, 0x6a, 0xcb, 0xc6, 0x3c, 0xeb, 0x2f, 0xfa, 0x00, 0xff, + 0x00, 0x85, 0x25, 0x95, 0xe3, 0xd7, 0x21, 0xea, 0x84, 0x5e, 0x91, 0x47, + 0xdd, 0x2c, 0x2f, 0x68, 0x6c, 0x52, 0x85, 0x50, 0xbc, 0x18, 0xc9, 0x80, + 0x70, 0xb1, 0xc8, 0xed, 0x0d, 0x71, 0xee, 0x3a, 0x7e, 0xa1, 0x84, 0xc4, + 0x7a, 0x84, 0x87, 0xa5, 0x4c, 0xbb, 0x38, 0x1a, 0xca, 0x33, 0xae, 0x47, + 0x07, 0xf9, 0x5a, 0xe1, 0x4d, 0xdb, 0x58, 0x12, 0x1b, 0xd7, 0x4f, 0xb6, + 0xb2, 0xf9, 0x88, 0x0c, 0xb2, 0xfb, 0xb7, 0x7e, 0xd5, 0x15, 0x52, 0xa4, + 0x7a, 0x1a, 0x20, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x13, 0x6a, 0xfb, 0xfa, + 0x6e, 0x96, 0x5e, 0x79, 0x0b, 0xc3, 0xd9, 0x63, 0x6b, 0x0b, 0x9d, 0x31, + 0x9c, 0x6b, 0x3b, 0xdd, 0xfe, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x7e, + 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x16, 0x32, 0xed, 0xd9, 0x2c, 0xb0, 0xbc, + 0x3d, 0x09, 0x8d, 0xaf, 0xdc, 0xef, 0xd0, 0x6a, 0xcb, 0xfe, 0x9e, 0x38, + 0xe0, 0xe3, 0x0d, 0x65, 0xfc, 0x19, 0x67, 0x1f, 0xeb, 0x2f, 0xf0, 0x73, + 0x5d, 0xf9, 0xb8, 0xb2, 0xb4, 0x89, 0xa2, 0x39, 0xe1, 0x6d, 0xfe, 0xd4, + 0x19, 0xb6, 0x27, 0x9d, 0x65, 0xf8, 0x7b, 0x46, 0xd0, 0x46, 0xac, 0xbe, + 0xff, 0x1f, 0xa5, 0x95, 0xb5, 0x9e, 0xb4, 0x19, 0xdf, 0xf1, 0x06, 0x79, + 0xa5, 0x1a, 0x9d, 0x65, 0xda, 0xfa, 0xcb, 0xe7, 0x96, 0x0d, 0x65, 0xfd, + 0xfc, 0xd0, 0xf0, 0x96, 0x5b, 0x06, 0x79, 0xbf, 0x21, 0xba, 0x58, 0xb2, + 0xfe, 0x77, 0xff, 0xf3, 0xcb, 0x2f, 0xff, 0x61, 0xc9, 0xcd, 0x2c, 0x06, + 0xc3, 0x05, 0x0b, 0x28, 0xd4, 0x49, 0x68, 0x58, 0x8b, 0x2f, 0xf1, 0x90, + 0x63, 0x97, 0x5f, 0x59, 0x7e, 0xd7, 0xfd, 0x93, 0xac, 0xa8, 0x3d, 0xec, + 0x35, 0xbf, 0xbe, 0xc7, 0xea, 0x5c, 0x59, 0x61, 0x78, 0xac, 0x67, 0x45, + 0xe7, 0x84, 0x77, 0x89, 0x9c, 0xf0, 0x99, 0x39, 0x0b, 0x91, 0x21, 0x1d, + 0xba, 0x41, 0x66, 0x16, 0xb8, 0xeb, 0xa9, 0x7b, 0xb7, 0xed, 0x76, 0xef, + 0xda, 0xa2, 0xd5, 0x5f, 0xb5, 0xdb, 0xbf, 0x6a, 0x8a, 0x09, 0x74, 0xfe, + 0x59, 0x79, 0xe4, 0x2f, 0x0f, 0x38, 0x06, 0xd7, 0xe8, 0x33, 0x6f, 0x34, + 0xb2, 0xc2, 0xf1, 0x1c, 0x67, 0x84, 0x20, 0x86, 0x97, 0xdf, 0xd3, 0xf9, + 0x65, 0xfd, 0xe6, 0x9e, 0x70, 0xf1, 0x65, 0xfd, 0x83, 0xd4, 0x7f, 0x8b, + 0x2f, 0xe8, 0x3b, 0xf5, 0xf9, 0x2c, 0xac, 0x45, 0x6f, 0x64, 0x44, 0x61, + 0xc2, 0xdb, 0xfb, 0x3c, 0x2d, 0xf5, 0xf5, 0x97, 0x39, 0x82, 0xcf, 0xaf, + 0xe7, 0x97, 0xf0, 0xaa, 0xda, 0xbf, 0xb7, 0x9e, 0x59, 0x7f, 0xa0, 0x81, + 0x1b, 0x8e, 0x75, 0x97, 0xff, 0xa6, 0x8d, 0xef, 0xae, 0x71, 0xb5, 0x86, + 0xac, 0xbf, 0xcd, 0x34, 0x6f, 0x7d, 0x71, 0x65, 0xb8, 0xb2, 0xa0, 0xf1, + 0x88, 0xd6, 0xff, 0xe8, 0x00, 0x7f, 0xc2, 0x8d, 0xd8, 0x9d, 0x65, 0xda, + 0x85, 0x95, 0x24, 0xd1, 0x18, 0xd3, 0xd0, 0x93, 0xde, 0x41, 0xba, 0x8f, + 0x7c, 0xde, 0x7e, 0x2c, 0xbe, 0xed, 0xdf, 0xb5, 0x45, 0xc4, 0xbf, 0x82, + 0xfd, 0x0f, 0x34, 0xb2, 0xb4, 0x7b, 0xdc, 0x30, 0xbf, 0xff, 0x48, 0x4f, + 0x49, 0xfe, 0xe0, 0x09, 0x3e, 0xf1, 0xac, 0xb8, 0x49, 0x96, 0x5f, 0xf7, + 0x31, 0x80, 0x27, 0xdf, 0xcb, 0x2f, 0xdd, 0xb7, 0x3c, 0xcb, 0x2e, 0x6e, + 0x96, 0x57, 0x46, 0xff, 0x45, 0x15, 0x3a, 0x2c, 0xfc, 0x33, 0xf7, 0x8b, + 0xff, 0xe9, 0x47, 0xc1, 0xb3, 0x3d, 0xac, 0x00, 0x66, 0x59, 0x76, 0x1a, + 0xb2, 0xff, 0x6f, 0xcf, 0xf3, 0x7c, 0x79, 0x65, 0x48, 0xf3, 0xbc, 0x2f, + 0x58, 0x8c, 0x36, 0x85, 0x0d, 0xff, 0xbe, 0x4e, 0x0e, 0x7a, 0x0b, 0xeb, + 0x2f, 0xd8, 0x76, 0xdd, 0x1a, 0xcb, 0xa0, 0xeb, 0x2a, 0x0f, 0xf7, 0x70, + 0xf7, 0x45, 0x57, 0xf0, 0x49, 0xcd, 0x90, 0x16, 0x5f, 0x3e, 0xeb, 0x4e, + 0xb2, 0xfd, 0xe0, 0x9b, 0x84, 0xb2, 0xfc, 0x3c, 0xdc, 0x8f, 0x2c, 0xbd, + 0xba, 0xdd, 0xac, 0xa1, 0x9f, 0x96, 0x8a, 0x37, 0x4a, 0xaf, 0xf1, 0xde, + 0x5c, 0x61, 0xe2, 0xcb, 0xc6, 0xc7, 0x16, 0x5f, 0xe9, 0x44, 0xcf, 0xe8, + 0xdc, 0x59, 0x7f, 0xe9, 0x83, 0x21, 0x37, 0xc7, 0x9f, 0x7a, 0xca, 0x84, + 0x4c, 0x60, 0xeb, 0x9b, 0x5b, 0x8b, 0x2f, 0xfb, 0x3d, 0xf2, 0x80, 0x6c, + 0x65, 0x97, 0xe2, 0xf9, 0x39, 0xab, 0x29, 0x65, 0x61, 0xb2, 0xdb, 0x27, + 0xa7, 0x44, 0xf9, 0x08, 0xf1, 0xae, 0xfe, 0x3b, 0xef, 0x8d, 0x6e, 0xac, + 0xbf, 0xf3, 0x0f, 0x37, 0x9f, 0x25, 0xd4, 0x96, 0x5f, 0x9f, 0x8e, 0x40, + 0x59, 0x7f, 0x36, 0xf9, 0x1e, 0x26, 0x59, 0x7f, 0xe8, 0xc2, 0x3c, 0x7b, + 0x75, 0xf7, 0x56, 0x54, 0x8f, 0xcb, 0x46, 0x17, 0xfd, 0x87, 0xcd, 0x64, + 0xf8, 0x62, 0xca, 0x84, 0xd9, 0xb0, 0xc8, 0xd4, 0x16, 0x84, 0xc7, 0x88, + 0xad, 0xb5, 0xac, 0xbf, 0xb3, 0x4f, 0xf0, 0xc2, 0xcb, 0xff, 0xe7, 0x28, + 0x6d, 0xde, 0x37, 0x33, 0xd9, 0xb6, 0xb2, 0x86, 0x7f, 0xdb, 0xcb, 0x2f, + 0xfe, 0x62, 0x0c, 0xb3, 0x9c, 0x61, 0xe2, 0xca, 0x98, 0xf9, 0xbe, 0x49, + 0x61, 0x62, 0xa3, 0x2b, 0x52, 0x23, 0x80, 0x92, 0xa6, 0x3f, 0xf4, 0x44, + 0xd1, 0x85, 0xcd, 0x0f, 0x4d, 0x42, 0x8c, 0xe6, 0x3e, 0x2e, 0x78, 0x4b, + 0x80, 0xc8, 0xa1, 0x95, 0xc8, 0x66, 0x7e, 0x39, 0x4d, 0xb4, 0xe1, 0x21, + 0xf5, 0x7f, 0x6d, 0x5b, 0x56, 0x9d, 0xe4, 0xb2, 0xff, 0x6d, 0x65, 0xb4, + 0x7f, 0x6f, 0x68, 0x1a, 0xcb, 0xfd, 0xb5, 0x60, 0x44, 0xf4, 0x1a, 0xb2, + 0xe7, 0x14, 0xac, 0xa1, 0x49, 0xea, 0x11, 0xd5, 0xf8, 0x51, 0xb4, 0x80, + 0x6c, 0x2c, 0xbf, 0xf3, 0x75, 0xb4, 0xf9, 0xad, 0x9b, 0x3d, 0xb6, 0xb2, + 0xfb, 0xd1, 0xfe, 0xd6, 0x50, 0xaa, 0x3f, 0x11, 0xa7, 0x5f, 0xf4, 0x69, + 0xfe, 0x01, 0x0a, 0x4b, 0x2f, 0xfe, 0x34, 0xcd, 0xc9, 0xc6, 0x28, 0xd9, + 0xb3, 0xdb, 0x6b, 0x2f, 0xa3, 0x35, 0x25, 0x95, 0xb4, 0xcf, 0xe4, 0x96, + 0x2f, 0xdc, 0xe3, 0xef, 0xc5, 0x97, 0xdd, 0xbb, 0xf6, 0xa8, 0xba, 0x57, + 0xe2, 0x0f, 0xe3, 0x8b, 0x2b, 0x47, 0xaf, 0xe3, 0x0b, 0xfc, 0xe3, 0x12, + 0x4c, 0x0e, 0x2c, 0xbe, 0x27, 0x1c, 0x2c, 0xbf, 0xd1, 0xbd, 0xca, 0x37, + 0xf1, 0x65, 0x41, 0xea, 0xf8, 0x82, 0xff, 0xed, 0xaf, 0x9c, 0x9a, 0x42, + 0xbd, 0x9b, 0x3d, 0xb6, 0xb2, 0xfe, 0x94, 0x74, 0xfc, 0x92, 0xcb, 0xfe, + 0x29, 0xb5, 0x1d, 0x49, 0x8e, 0xb2, 0xff, 0xdb, 0xe0, 0xbf, 0xc0, 0xff, + 0x34, 0xb2, 0xa0, 0xfe, 0xb0, 0xea, 0xfa, 0x5b, 0xb9, 0xf5, 0x97, 0xdc, + 0x8d, 0xde, 0x2c, 0xa8, 0x3c, 0xad, 0xd2, 0x5b, 0xd1, 0xfd, 0xd5, 0x97, + 0xf6, 0x49, 0xa2, 0x5b, 0x8b, 0x2f, 0x0f, 0x06, 0xb2, 0x86, 0x79, 0x78, + 0x5f, 0x7f, 0xa7, 0x82, 0xec, 0x62, 0x71, 0x65, 0xff, 0x36, 0x17, 0xb3, + 0xf0, 0x35, 0x97, 0xfe, 0x62, 0xd4, 0x7d, 0xbb, 0x61, 0xac, 0xa9, 0xd1, + 0x53, 0xf3, 0x6d, 0xe6, 0xd7, 0xfb, 0x7c, 0x7f, 0x81, 0xec, 0x56, 0xb2, + 0xb0, 0xfb, 0x9c, 0xce, 0xff, 0xc3, 0xf3, 0x19, 0xfe, 0xbb, 0x6f, 0x2c, + 0xb9, 0xc4, 0x59, 0x7f, 0xef, 0xec, 0xe3, 0x97, 0x7e, 0x6d, 0x2c, 0xb7, + 0x27, 0x3d, 0x8c, 0x17, 0xbf, 0xd1, 0xf7, 0x9c, 0x2d, 0x25, 0x97, 0x09, + 0xe5, 0x94, 0x47, 0x96, 0x21, 0x9d, 0xff, 0xf9, 0xe4, 0x51, 0xcc, 0xeb, + 0xb2, 0x7c, 0xeb, 0xb5, 0x97, 0xfc, 0xde, 0xce, 0x81, 0x21, 0xe2, 0xcb, + 0x0b, 0xda, 0xd9, 0x1e, 0xbb, 0x51, 0xbe, 0xd1, 0x09, 0xad, 0xa6, 0x4b, + 0x10, 0xa4, 0x9c, 0xa2, 0x50, 0xb2, 0x19, 0x3e, 0x42, 0x03, 0xb2, 0x26, + 0x84, 0x4e, 0xe1, 0x0c, 0xcb, 0x1a, 0x85, 0x41, 0xda, 0xbc, 0x48, 0xed, + 0x45, 0x19, 0xc7, 0x08, 0x3f, 0x09, 0xa0, 0xb9, 0xef, 0x22, 0xdb, 0x56, + 0xba, 0x36, 0xd6, 0x5f, 0xfe, 0x2f, 0xb1, 0xfd, 0x0c, 0x4f, 0xa3, 0x56, + 0x5f, 0xcf, 0xf8, 0x3c, 0x12, 0xca, 0xc3, 0xf3, 0xd2, 0x45, 0xff, 0x8f, + 0xc0, 0xfe, 0x4d, 0xbf, 0xcc, 0xb2, 0xfe, 0xcc, 0xe7, 0x7f, 0x85, 0x97, + 0xf4, 0xf1, 0xf7, 0x34, 0x2b, 0x29, 0x65, 0xff, 0xd1, 0xa0, 0x6c, 0xe7, + 0xa0, 0xee, 0x4b, 0x2f, 0xf4, 0x68, 0x4f, 0x7b, 0x00, 0xb2, 0xa4, 0x7f, + 0x3e, 0x45, 0xbf, 0xa4, 0xf2, 0x72, 0xed, 0x65, 0xc5, 0x0b, 0x2d, 0xc5, + 0x95, 0x06, 0x9b, 0xe2, 0xb7, 0xff, 0xb3, 0xf0, 0x60, 0x93, 0xf3, 0x0f, + 0x1b, 0x8b, 0x2c, 0x75, 0x97, 0xf3, 0xcb, 0x4c, 0x63, 0x2c, 0xbe, 0x28, + 0x1e, 0x96, 0x5f, 0xf9, 0xa4, 0xda, 0xea, 0x0a, 0x38, 0xb2, 0xa7, 0x3d, + 0xef, 0x90, 0xd8, 0x5e, 0xd6, 0xa8, 0x9f, 0x21, 0x09, 0x31, 0x17, 0x94, + 0xc8, 0x83, 0xe9, 0xfb, 0x62, 0x22, 0x42, 0x2e, 0xb4, 0xab, 0x8c, 0xf2, + 0x95, 0xaf, 0xb0, 0xcd, 0xac, 0xeb, 0x2f, 0xe2, 0x8e, 0x8e, 0xff, 0x59, + 0x7f, 0xf8, 0xc7, 0x1f, 0xa3, 0xaf, 0xc7, 0x9f, 0x71, 0x65, 0x9b, 0x47, + 0xf7, 0xe2, 0xdb, 0xff, 0xfe, 0x0e, 0xa5, 0xcf, 0x3b, 0x6b, 0x5a, 0x0f, + 0x4d, 0xa7, 0xe2, 0xcb, 0xff, 0xb5, 0xdc, 0x67, 0xa3, 0xe5, 0x1f, 0x59, + 0x78, 0x3e, 0xe2, 0xcb, 0xff, 0x39, 0xbd, 0xf9, 0xa6, 0xd4, 0x18, 0xb2, + 0xf4, 0x67, 0x5d, 0x9e, 0xf9, 0x0e, 0xdf, 0xfc, 0xe7, 0xe7, 0xc9, 0xc1, + 0xd7, 0xf6, 0x9a, 0xcb, 0x7f, 0x47, 0xfc, 0x13, 0x3b, 0xff, 0x13, 0x99, + 0xfc, 0xf3, 0xcc, 0xeb, 0x2f, 0xff, 0xc0, 0x04, 0x6c, 0xf4, 0x7c, 0x3d, + 0xfa, 0x09, 0xd6, 0x5f, 0xff, 0x88, 0x2f, 0xb9, 0x92, 0xf6, 0x1b, 0x83, + 0x98, 0x2b, 0x2b, 0x11, 0x61, 0xe5, 0x7b, 0xbb, 0xc5, 0x97, 0xf4, 0x49, + 0xba, 0xfe, 0x2c, 0xbf, 0xfe, 0x7e, 0xa5, 0xce, 0xbe, 0x4f, 0xec, 0xeb, + 0xeb, 0x2a, 0x11, 0x70, 0x69, 0x16, 0x85, 0xdc, 0xb6, 0xfb, 0x5c, 0x6d, + 0x2c, 0xbf, 0xff, 0xfe, 0xfc, 0x34, 0x9f, 0x9c, 0x8e, 0x67, 0x98, 0xa0, + 0xfa, 0x81, 0x1c, 0x96, 0x5f, 0xb9, 0x1e, 0x12, 0x65, 0x94, 0xc8, 0xa3, + 0xfb, 0xcd, 0x42, 0x39, 0xde, 0x18, 0xb7, 0xa5, 0x07, 0x59, 0x6d, 0xa1, + 0x65, 0xdc, 0x92, 0xcb, 0xff, 0xf7, 0xb0, 0x61, 0xff, 0x3b, 0xf3, 0x70, + 0x2f, 0xd2, 0xca, 0x34, 0xfb, 0xfe, 0x2f, 0x7f, 0xb5, 0xa7, 0x94, 0xf8, + 0x62, 0xca, 0x59, 0x74, 0xc1, 0x59, 0x58, 0x7b, 0x1e, 0x35, 0x30, 0x2e, + 0xff, 0xbc, 0x27, 0xdb, 0x4d, 0x3c, 0x2c, 0xbe, 0xd4, 0x19, 0xc5, 0x97, + 0xbd, 0x93, 0x2c, 0xbf, 0xfe, 0x09, 0x7f, 0x98, 0xc7, 0xc1, 0xc4, 0xa3, + 0x0f, 0x03, 0xe4, 0x75, 0x24, 0xc3, 0x30, 0xbf, 0x8f, 0x57, 0xff, 0x60, + 0xe2, 0x51, 0xa8, 0x11, 0xc9, 0x65, 0xff, 0xb7, 0xe4, 0x8e, 0x36, 0xdf, + 0x03, 0x59, 0x7f, 0xfc, 0xde, 0x09, 0xce, 0xf2, 0xf3, 0x9d, 0xb8, 0xb2, + 0x8e, 0x8d, 0x37, 0x42, 0xfa, 0x15, 0xce, 0x2e, 0x75, 0xff, 0x9c, 0x68, + 0xea, 0x32, 0x09, 0x8a, 0x35, 0x1d, 0x37, 0xa3, 0x23, 0x72, 0x62, 0x1c, + 0xe4, 0x21, 0x7f, 0x1c, 0x38, 0x91, 0x81, 0xd7, 0x99, 0x1d, 0x85, 0x48, + 0x20, 0xbf, 0xd2, 0xcf, 0xfa, 0x04, 0x25, 0x97, 0xfe, 0xfb, 0x76, 0xc3, + 0x72, 0x36, 0x16, 0x5f, 0xf4, 0x75, 0xe7, 0xe7, 0xe0, 0xc5, 0x95, 0x07, + 0xf1, 0xa3, 0xeb, 0xfc, 0xff, 0x20, 0xcf, 0xd6, 0xe2, 0xcb, 0x0a, 0x56, + 0x5c, 0x1f, 0x2c, 0xbf, 0x16, 0x79, 0xfe, 0xb2, 0xfe, 0x93, 0xe6, 0xf8, + 0x1a, 0xca, 0x14, 0x9e, 0xa0, 0xa8, 0x4d, 0x7e, 0x14, 0x0a, 0x75, 0xce, + 0x2c, 0xbe, 0x60, 0xca, 0x16, 0x5f, 0x67, 0x50, 0x75, 0x97, 0xcc, 0x50, + 0x05, 0x97, 0xe8, 0xde, 0xf9, 0xa5, 0x97, 0xb7, 0x47, 0x0b, 0x2b, 0xc7, + 0x8e, 0x12, 0x8b, 0xf3, 0xcd, 0x26, 0xfa, 0xcb, 0xfc, 0x1d, 0xd6, 0xdf, + 0xfc, 0xf2, 0xcb, 0xff, 0x40, 0xf5, 0x12, 0x6e, 0xbf, 0x8b, 0x2f, 0xff, + 0x9f, 0xd1, 0x21, 0xfa, 0x3a, 0xfb, 0x1f, 0x8b, 0x2a, 0x49, 0xdd, 0x1a, + 0x43, 0xd9, 0x17, 0x99, 0xc0, 0x44, 0x45, 0x1f, 0x38, 0xde, 0x7d, 0x7f, + 0xda, 0xe7, 0x9b, 0xbe, 0xc3, 0x3a, 0xcb, 0xf8, 0xcc, 0xde, 0x41, 0x92, + 0xcb, 0xf8, 0x26, 0xe1, 0x6e, 0xe2, 0xcb, 0xff, 0xff, 0xb5, 0x2e, 0xfc, + 0xc7, 0x3b, 0x19, 0xce, 0xbb, 0x6c, 0xd0, 0xe3, 0xa5, 0x95, 0x09, 0x8a, + 0x61, 0xe9, 0x18, 0x04, 0xc2, 0xff, 0xff, 0xa0, 0x7e, 0xce, 0xbe, 0x4f, + 0xe0, 0x3f, 0x38, 0xfa, 0xed, 0x65, 0xf4, 0xfb, 0x6e, 0x6a, 0xcb, 0xfd, + 0x99, 0x86, 0x9a, 0xf2, 0x59, 0x46, 0xa3, 0x07, 0xcc, 0xff, 0x27, 0xbf, + 0x67, 0x3b, 0xfc, 0x2c, 0xbf, 0xfc, 0xc6, 0x73, 0xbf, 0x37, 0x5f, 0xd6, + 0xa1, 0x65, 0xff, 0xb5, 0xf7, 0x97, 0x37, 0x87, 0x4c, 0xb2, 0xff, 0xe7, + 0xe1, 0x39, 0xa3, 0xf0, 0x5f, 0x8b, 0x2a, 0x11, 0x0a, 0x14, 0x1b, 0xff, + 0xfe, 0x73, 0x04, 0xcd, 0x13, 0xf5, 0x2e, 0xe3, 0xfc, 0xce, 0xbe, 0xb2, + 0xfc, 0x58, 0x08, 0x02, 0xcb, 0xfa, 0x71, 0x33, 0xcf, 0xd2, 0xcb, 0xfd, + 0x26, 0x29, 0xa4, 0xde, 0x59, 0x68, 0x92, 0x22, 0x70, 0x9a, 0x63, 0x0a, + 0xc5, 0x48, 0x9a, 0x28, 0xf4, 0x34, 0x9c, 0x88, 0xa1, 0xe7, 0x7e, 0xde, + 0xda, 0xc1, 0xac, 0xbf, 0xfe, 0xe7, 0x9b, 0x9f, 0xf6, 0x0d, 0xb9, 0x84, + 0xb2, 0xf7, 0xa0, 0xb0, 0xfd, 0xc2, 0x53, 0x7e, 0x7f, 0x48, 0xbb, 0x59, + 0x7f, 0xa0, 0xf8, 0xc7, 0x8d, 0xc5, 0x97, 0xfa, 0x47, 0xe3, 0x17, 0x52, + 0x59, 0x5d, 0x9f, 0x44, 0xc6, 0x97, 0xf9, 0xb4, 0xe4, 0x0c, 0x25, 0x97, + 0xfb, 0xec, 0x59, 0xd4, 0xa1, 0x65, 0xff, 0xda, 0xd3, 0xcb, 0x85, 0x87, + 0x13, 0xa5, 0x95, 0x07, 0xf1, 0x86, 0x57, 0xfc, 0xd2, 0x2c, 0xf1, 0x3c, + 0x96, 0x5f, 0xff, 0xa5, 0x84, 0x3f, 0x46, 0x14, 0x00, 0xef, 0x25, 0x94, + 0x48, 0x88, 0x10, 0xda, 0xf3, 0xbf, 0x6a, 0x89, 0x31, 0x7b, 0x75, 0xb8, + 0xb2, 0xa4, 0x7d, 0x7d, 0x91, 0xee, 0x94, 0xdf, 0xbb, 0xda, 0x62, 0x8d, + 0xac, 0x52, 0xb2, 0xff, 0xff, 0xf6, 0x77, 0x01, 0xef, 0xd1, 0xad, 0x98, + 0x4d, 0xd7, 0x04, 0x9c, 0xb0, 0x6b, 0x2f, 0xf6, 0xf7, 0x3e, 0x1b, 0x1c, + 0x59, 0x7b, 0xa9, 0x73, 0x62, 0x2c, 0x71, 0xf2, 0xff, 0x67, 0x5f, 0xfb, + 0xcb, 0x8b, 0x2a, 0x13, 0x59, 0xc8, 0x77, 0x68, 0xde, 0xff, 0x13, 0xff, + 0x9d, 0x84, 0x96, 0x5f, 0xff, 0x01, 0x80, 0x66, 0x36, 0xf2, 0xcf, 0xf9, + 0x96, 0x5e, 0x9f, 0xec, 0xb2, 0xff, 0xe2, 0x73, 0x38, 0x63, 0x8e, 0x3a, + 0xe2, 0xcb, 0x62, 0xca, 0xd1, 0xeb, 0x7d, 0x1a, 0xfd, 0xc7, 0x79, 0x71, + 0x65, 0xfc, 0xf2, 0xe6, 0x10, 0x16, 0x59, 0xf6, 0x23, 0xa0, 0x6e, 0x7d, + 0x11, 0x7c, 0x9e, 0xda, 0xc4, 0xdf, 0x7d, 0x19, 0xc5, 0xff, 0xfc, 0xf3, + 0x94, 0x75, 0xd7, 0x61, 0x7d, 0x03, 0x3a, 0xfa, 0xca, 0xc5, 0x47, 0xcd, + 0x1d, 0x81, 0x17, 0xdf, 0xf3, 0xcb, 0x98, 0x51, 0xd7, 0x16, 0x5f, 0x72, + 0x4c, 0x05, 0x97, 0xff, 0xdf, 0x35, 0xf9, 0xad, 0x64, 0xe0, 0x3c, 0x49, + 0x65, 0x48, 0xfd, 0x0c, 0x22, 0xbf, 0xff, 0xf7, 0xb2, 0x5e, 0xc1, 0x94, + 0x76, 0x24, 0x19, 0x9c, 0xe3, 0x9a, 0xb2, 0xa1, 0x12, 0x3f, 0x23, 0xbf, + 0xf1, 0x98, 0x37, 0x97, 0xf8, 0xe0, 0x59, 0x7f, 0xf8, 0xa0, 0xc1, 0x3e, + 0x50, 0x0c, 0xeb, 0xeb, 0x2f, 0xf6, 0x6b, 0xc5, 0x1d, 0x49, 0x65, 0xcf, + 0xd6, 0x1f, 0xf0, 0x89, 0x74, 0xc8, 0xeb, 0x0c, 0x2f, 0x6f, 0xfe, 0x6e, + 0x8c, 0xff, 0x9a, 0x0b, 0x3b, 0x59, 0x7f, 0xf0, 0xc9, 0xce, 0x06, 0xd3, + 0x74, 0x05, 0x97, 0xfc, 0xc6, 0xc0, 0xe7, 0x3c, 0x69, 0x65, 0x49, 0x94, + 0x0e, 0x33, 0x1c, 0x84, 0x81, 0xa4, 0x9d, 0xc2, 0xa3, 0x51, 0x89, 0x9e, + 0x38, 0xcf, 0x4a, 0x72, 0x01, 0xa9, 0x46, 0x7b, 0xc8, 0xc3, 0x7e, 0x4e, + 0x14, 0x5d, 0xe8, 0x97, 0xf0, 0xc0, 0x29, 0xe0, 0x36, 0xd6, 0x5e, 0xdd, + 0xdd, 0x85, 0x97, 0xff, 0x87, 0x86, 0x79, 0xff, 0xc8, 0xf0, 0x93, 0x2c, + 0xbd, 0xc6, 0x1a, 0xcb, 0xf8, 0xa3, 0xa3, 0xbf, 0xd6, 0x5f, 0xf4, 0x77, + 0xf0, 0xfb, 0x50, 0x62, 0xcb, 0xfe, 0x6c, 0x33, 0xbf, 0x43, 0x6d, 0xac, + 0xbf, 0xfd, 0x05, 0x2c, 0x0e, 0xa7, 0x06, 0x60, 0xd6, 0x5f, 0xee, 0xdb, + 0x5c, 0x9a, 0x1d, 0x65, 0xfe, 0x6f, 0x82, 0x3c, 0x27, 0x16, 0x5f, 0x3c, + 0xa0, 0x96, 0x5f, 0x83, 0xcf, 0x3c, 0xa4, 0x7a, 0x9e, 0x34, 0xbf, 0x9c, + 0x18, 0x43, 0x92, 0xcb, 0xff, 0x9f, 0xaf, 0xfb, 0x18, 0x70, 0x5d, 0xac, + 0xa3, 0x53, 0x80, 0xe9, 0x27, 0x50, 0x88, 0x23, 0xfe, 0x16, 0x59, 0x86, + 0xab, 0x7a, 0x64, 0xdd, 0x0e, 0x1c, 0xb4, 0x56, 0x77, 0xf8, 0xef, 0x2f, + 0xc3, 0x8e, 0x7d, 0x96, 0x5f, 0xb2, 0x73, 0xb4, 0xcb, 0x2a, 0x15, 0xdc, + 0xfa, 0x58, 0x03, 0xb4, 0x91, 0x3d, 0xf7, 0xd8, 0xee, 0xb2, 0xf8, 0xcf, + 0x07, 0xb5, 0x96, 0x35, 0x65, 0xfd, 0xee, 0x47, 0xe0, 0x6b, 0x2a, 0x0f, + 0x93, 0x09, 0x58, 0x4a, 0xb1, 0x16, 0x3f, 0x84, 0x2d, 0xff, 0xe0, 0xbf, + 0x9c, 0x72, 0x3f, 0xa0, 0x42, 0x59, 0x7f, 0x79, 0xb9, 0xe8, 0xd2, 0xcb, + 0xfe, 0x8f, 0x7d, 0xa7, 0x3c, 0x76, 0xb2, 0xff, 0xfc, 0xfd, 0xea, 0x3c, + 0x59, 0xfc, 0x16, 0x61, 0x86, 0x24, 0xa9, 0x26, 0x65, 0xd9, 0x3b, 0xa5, + 0x70, 0xb7, 0xe7, 0x57, 0xee, 0xc3, 0xd9, 0x42, 0xcb, 0xf7, 0x26, 0xf4, + 0x7d, 0x65, 0xed, 0x37, 0x4b, 0x2b, 0xb3, 0xef, 0x98, 0xa7, 0xe5, 0x37, + 0xff, 0x75, 0x22, 0x89, 0x6a, 0x3e, 0xff, 0x59, 0x7f, 0xc3, 0x12, 0x3a, + 0xdb, 0xcd, 0x42, 0xcb, 0xa2, 0x4b, 0x2b, 0x11, 0x2e, 0xe8, 0x84, 0x7b, + 0x7c, 0x1d, 0xc8, 0x92, 0xcb, 0xff, 0x3f, 0xe3, 0x5c, 0xf4, 0x17, 0xd6, + 0x5f, 0xb2, 0x4c, 0xfb, 0xd6, 0x57, 0x91, 0x14, 0x44, 0xbc, 0x3d, 0xa9, + 0x23, 0x98, 0x30, 0xb7, 0xbc, 0x77, 0xf2, 0xcb, 0xff, 0xc5, 0x12, 0xd6, + 0x83, 0xd3, 0x69, 0xf8, 0xb2, 0xff, 0xfb, 0x98, 0x69, 0x67, 0xf9, 0x92, + 0x27, 0x31, 0x65, 0x9b, 0xc8, 0x99, 0xfa, 0x55, 0x32, 0x37, 0x77, 0xc2, + 0xd6, 0xfb, 0x76, 0x3d, 0xc5, 0x97, 0xfd, 0x07, 0xff, 0xb0, 0xa0, 0x0b, + 0x2f, 0xc7, 0x89, 0x6e, 0x76, 0xb2, 0xfc, 0x50, 0x1f, 0xf1, 0x65, 0x00, + 0xf4, 0xfe, 0x59, 0x7f, 0xdc, 0x93, 0x7c, 0x02, 0x14, 0x96, 0x54, 0xe7, + 0xb9, 0xd1, 0x15, 0xfe, 0x3f, 0xf2, 0x69, 0x39, 0x2c, 0xac, 0x3d, 0x76, + 0x24, 0xa8, 0x4e, 0xaf, 0x0a, 0x58, 0x97, 0x51, 0x9e, 0xdf, 0xff, 0xf7, + 0x5d, 0xf9, 0x8e, 0x4d, 0x3c, 0x7f, 0x82, 0x7f, 0xd8, 0x35, 0x97, 0xfc, + 0x6e, 0xc1, 0x33, 0x5b, 0x6e, 0x6a, 0xcb, 0x0a, 0xd6, 0x54, 0x1e, 0xb3, + 0xa0, 0xdf, 0xff, 0xc4, 0xe6, 0xfa, 0x1a, 0x4c, 0x5f, 0x96, 0x6b, 0x16, + 0x54, 0x26, 0x70, 0x50, 0xc0, 0x09, 0x05, 0xff, 0xe0, 0x67, 0x5f, 0xc2, + 0x0f, 0xc1, 0x12, 0x59, 0x7e, 0x0f, 0xbf, 0x13, 0x2c, 0xbf, 0xfe, 0xfc, + 0x76, 0xdf, 0x63, 0xec, 0xe3, 0x8c, 0x6b, 0x2f, 0xf7, 0x9c, 0xe3, 0xcd, + 0x87, 0x59, 0x70, 0x21, 0x65, 0x0c, 0xf2, 0xc0, 0x6b, 0x7f, 0xef, 0x36, + 0xfc, 0xdc, 0x19, 0x3e, 0x96, 0x5f, 0x06, 0x7e, 0xb7, 0x16, 0x57, 0x67, + 0xd4, 0x48, 0x54, 0xc9, 0xa5, 0xf2, 0x13, 0xbf, 0x84, 0x65, 0xff, 0xe8, + 0x9c, 0xb3, 0x27, 0xf9, 0xb0, 0x52, 0x59, 0x7f, 0xe7, 0x29, 0xfc, 0xe7, + 0x6e, 0x32, 0xca, 0xc5, 0x4f, 0xfe, 0x4a, 0x78, 0xdd, 0x08, 0xe8, 0xc4, + 0xab, 0xff, 0x83, 0xb9, 0xec, 0xc1, 0x96, 0x4f, 0x0b, 0x2f, 0xfb, 0xed, + 0xc6, 0x08, 0xac, 0x70, 0xb2, 0xf1, 0x86, 0x18, 0x92, 0xfa, 0x73, 0xb7, + 0x12, 0x0b, 0x34, 0x17, 0x40, 0xd6, 0x53, 0x9e, 0x59, 0x1a, 0xdf, 0xf3, + 0x72, 0x25, 0x37, 0x98, 0x0b, 0x2f, 0xf6, 0x75, 0xac, 0xdb, 0x60, 0x2c, + 0xa1, 0xa6, 0xf8, 0xc8, 0xda, 0x85, 0x3f, 0x88, 0x08, 0xe6, 0xe1, 0x3c, + 0xb2, 0xfd, 0x18, 0x4e, 0x75, 0x97, 0xfe, 0x79, 0x79, 0xba, 0x06, 0x9c, + 0x6b, 0x2e, 0x19, 0x8b, 0x2f, 0xff, 0xd9, 0xbe, 0x0b, 0xe7, 0x8c, 0x21, + 0xe7, 0x5f, 0x59, 0x79, 0xcb, 0xb9, 0xcf, 0xb7, 0x43, 0x14, 0xc9, 0x8e, + 0x80, 0x60, 0x89, 0x43, 0x0a, 0xcb, 0xf6, 0xa7, 0x8d, 0x4e, 0xb2, 0xfc, + 0xc5, 0xf1, 0x0e, 0xb2, 0xd2, 0x83, 0xd2, 0x01, 0x55, 0xff, 0x7a, 0x0f, + 0x05, 0xff, 0x32, 0xcb, 0xff, 0xb3, 0x9c, 0xc3, 0x8d, 0xb7, 0xc0, 0xd6, + 0x54, 0x1f, 0xe7, 0x8d, 0xef, 0xe8, 0x3c, 0xde, 0x6d, 0x2c, 0xbf, 0xb3, + 0x98, 0x77, 0xe9, 0x65, 0xfb, 0x8d, 0x84, 0x05, 0x95, 0xa3, 0xd3, 0xe1, + 0x6d, 0xed, 0x66, 0xe2, 0xcb, 0xff, 0xc1, 0xe7, 0x9b, 0x26, 0x69, 0xf3, + 0xaf, 0xac, 0xbf, 0xe3, 0x04, 0x9f, 0x98, 0x78, 0xdc, 0x59, 0x7f, 0xf8, + 0x3d, 0x66, 0x84, 0xff, 0x30, 0xd6, 0xd2, 0xcb, 0xff, 0xcd, 0xde, 0x10, + 0xf4, 0xfd, 0xe7, 0x5f, 0x59, 0x50, 0x8d, 0x7f, 0x1f, 0xf1, 0x36, 0xff, + 0xcc, 0x42, 0x64, 0xdc, 0x6e, 0x8c, 0x59, 0x7c, 0xe0, 0xf8, 0xad, 0x65, + 0x76, 0xaa, 0x72, 0x62, 0x1d, 0x42, 0x04, 0xe4, 0x44, 0x3f, 0xf8, 0xc8, + 0xf7, 0x97, 0x98, 0x83, 0x7e, 0xce, 0xbf, 0xe8, 0x59, 0x7e, 0x6d, 0xff, + 0x8c, 0x59, 0x5e, 0x3d, 0x0e, 0x14, 0x54, 0x2e, 0x19, 0xe4, 0xb3, 0xf7, + 0x86, 0x95, 0xff, 0xf9, 0xb9, 0xc8, 0xd4, 0xb5, 0x1f, 0xe0, 0x85, 0x25, + 0x97, 0xf0, 0x99, 0xad, 0xb7, 0x35, 0x65, 0xfb, 0x35, 0xb6, 0xe6, 0xac, + 0xbb, 0x39, 0xb0, 0xf7, 0x44, 0x32, 0xbf, 0xfd, 0x31, 0x47, 0xf9, 0xfe, + 0xbb, 0x62, 0x9d, 0x65, 0xff, 0xb0, 0xbf, 0xa7, 0x7e, 0xa5, 0xc5, 0x97, + 0xfc, 0xe6, 0xec, 0xf4, 0x02, 0x37, 0x16, 0x56, 0x23, 0xe5, 0x8c, 0x3c, + 0x9a, 0xe7, 0xd7, 0xff, 0xfe, 0x00, 0x85, 0x9a, 0xd6, 0x19, 0x9b, 0x98, + 0x50, 0x03, 0xbc, 0x96, 0x5f, 0xff, 0xff, 0xf1, 0x67, 0x01, 0xde, 0x13, + 0x75, 0xc2, 0xcf, 0xf3, 0x24, 0x4e, 0x67, 0x5f, 0x0b, 0xf1, 0x65, 0x98, + 0x93, 0x02, 0xde, 0xdd, 0x7f, 0xff, 0x7f, 0x81, 0x1f, 0x9b, 0x26, 0x76, + 0xdc, 0x6e, 0xa4, 0xb2, 0xff, 0xfe, 0x2c, 0x03, 0x90, 0x35, 0xac, 0x33, + 0x00, 0xfd, 0x2c, 0xa2, 0x45, 0xcf, 0xd7, 0xef, 0xcd, 0xf9, 0xf0, 0xc5, + 0x97, 0xfd, 0x1d, 0xf8, 0x83, 0xf8, 0xe2, 0xcb, 0xff, 0x6e, 0xc7, 0x70, + 0x7c, 0x1b, 0x9d, 0x65, 0xfb, 0x70, 0x42, 0x8e, 0xd6, 0x53, 0x1f, 0x6b, + 0xa0, 0xdf, 0xfd, 0x2e, 0x64, 0x0d, 0x89, 0xf4, 0x6a, 0xcb, 0xf6, 0xa3, + 0x06, 0xcb, 0x2f, 0xef, 0x30, 0xc7, 0x86, 0x2c, 0xbf, 0x6b, 0x37, 0xfb, + 0x36, 0x1e, 0xa7, 0x64, 0xd5, 0x08, 0xda, 0x78, 0x4b, 0xdf, 0xff, 0xff, + 0x03, 0x99, 0x2f, 0x43, 0x68, 0x00, 0x8d, 0x60, 0x4d, 0x1b, 0x69, 0xf8, + 0xb2, 0xff, 0xfb, 0xd9, 0x2d, 0x9d, 0xf9, 0xbf, 0xd7, 0x6d, 0xa5, 0x95, + 0x08, 0xd2, 0xfb, 0xed, 0x49, 0x5f, 0x43, 0x43, 0x8f, 0x44, 0x47, 0x29, + 0xf4, 0x29, 0x81, 0x0f, 0xa2, 0x87, 0xc5, 0xff, 0xef, 0xc1, 0xfb, 0x71, + 0xe1, 0x82, 0x6a, 0x4b, 0x2f, 0x8a, 0x7d, 0xe3, 0x59, 0x7f, 0xe7, 0xd6, + 0xc2, 0x7f, 0xc9, 0xc6, 0xb2, 0xff, 0xfe, 0x62, 0x1e, 0xb3, 0xbf, 0x47, + 0xb3, 0x5a, 0x83, 0x56, 0x54, 0x91, 0x35, 0xe3, 0xfb, 0xf9, 0xdf, 0xfb, + 0x6d, 0xda, 0xcb, 0xfe, 0x3b, 0x8c, 0x4d, 0xd8, 0x29, 0x2c, 0xbf, 0xee, + 0xc3, 0xb9, 0xc6, 0x33, 0x34, 0xb2, 0xa0, 0xfe, 0xbb, 0x3c, 0xbf, 0xff, + 0xef, 0x87, 0x4f, 0xce, 0xfc, 0xd3, 0x13, 0x99, 0xfc, 0xf1, 0xd6, 0x5f, + 0xfe, 0xe6, 0x6b, 0x67, 0x7e, 0x6d, 0xec, 0x43, 0x59, 0x4c, 0x8b, 0x7e, + 0x34, 0xd3, 0x23, 0xed, 0xe1, 0xb3, 0x7f, 0xe6, 0x18, 0x7f, 0xc8, 0x26, + 0xc5, 0x97, 0xfc, 0x78, 0xd6, 0xfc, 0xd4, 0x4c, 0xb2, 0xff, 0xff, 0x67, + 0xfc, 0x1e, 0xbf, 0xc7, 0xeb, 0xbd, 0xbc, 0xe7, 0x31, 0x65, 0xff, 0xb5, + 0xd9, 0xe3, 0xae, 0x66, 0xfc, 0x59, 0x73, 0xee, 0x2c, 0xa5, 0x97, 0x68, + 0xd5, 0x94, 0x69, 0xa3, 0x70, 0xbb, 0xff, 0xfa, 0x62, 0x81, 0xe7, 0x5f, + 0xc9, 0x41, 0x4e, 0x7c, 0x59, 0x7f, 0x03, 0x6f, 0x07, 0x87, 0x59, 0x5a, + 0x45, 0x67, 0x88, 0x49, 0x6e, 0xfb, 0xef, 0xae, 0x2c, 0xbf, 0x6c, 0xdb, + 0xcd, 0x42, 0xca, 0x9c, 0xf3, 0x88, 0x8a, 0xa1, 0x3c, 0x99, 0xd0, 0xb2, + 0x1d, 0x0e, 0xfb, 0x7f, 0xd2, 0x6f, 0xf3, 0xb8, 0xff, 0x16, 0x5f, 0xc0, + 0xd9, 0x83, 0x79, 0x2c, 0xa9, 0x8f, 0xa5, 0xce, 0xac, 0x6a, 0xcb, 0xff, + 0xb3, 0xbf, 0x47, 0xb3, 0x5a, 0x83, 0x56, 0x5f, 0xb3, 0x5a, 0x83, 0x56, + 0x5f, 0x13, 0x03, 0x90, 0x7f, 0xfa, 0x12, 0xf2, 0x2d, 0xff, 0x79, 0xc0, + 0x77, 0x93, 0xf1, 0x65, 0xfe, 0x79, 0x4a, 0x25, 0xdf, 0x16, 0x56, 0x1f, + 0x60, 0x4e, 0x2f, 0xff, 0xfe, 0x6f, 0xfb, 0x07, 0x26, 0xfe, 0x1f, 0x8f, + 0x2d, 0xbc, 0xe7, 0x31, 0x65, 0x62, 0x7c, 0xad, 0x0a, 0x1f, 0x42, 0xc3, + 0x84, 0x37, 0xff, 0x9e, 0x7f, 0x34, 0x16, 0x4c, 0xda, 0x65, 0x95, 0x26, + 0xc0, 0x18, 0x71, 0xd6, 0x64, 0xe9, 0x27, 0x4f, 0x0c, 0x9b, 0x34, 0x2f, + 0xf4, 0x47, 0xe8, 0xe9, 0x5c, 0x98, 0x07, 0x84, 0x77, 0xc9, 0x46, 0x1f, + 0x95, 0x1e, 0x62, 0x35, 0xff, 0xfb, 0x09, 0x87, 0xcf, 0x3f, 0x18, 0x8a, + 0x3a, 0x59, 0x7e, 0x2c, 0xf3, 0xfd, 0x65, 0xff, 0xa5, 0x05, 0x38, 0x9a, + 0x20, 0xc9, 0x65, 0xee, 0x66, 0x96, 0x5f, 0xc4, 0xe3, 0x07, 0x40, 0x59, + 0x5b, 0x88, 0xb0, 0x98, 0x9b, 0xc8, 0x1c, 0x1c, 0xbf, 0xf9, 0xca, 0x5a, + 0x7e, 0xbd, 0x19, 0xc5, 0x97, 0xff, 0x76, 0xda, 0xf6, 0x4d, 0xe6, 0xd4, + 0xeb, 0x2f, 0xbf, 0x3e, 0x0d, 0x65, 0xff, 0x31, 0xa2, 0x68, 0x07, 0x6e, + 0x2c, 0xa9, 0x8f, 0x7b, 0x6c, 0x8e, 0xff, 0xcd, 0xd7, 0x00, 0xe4, 0x39, + 0x82, 0xb2, 0xf1, 0x86, 0x18, 0xb2, 0xff, 0xe2, 0x80, 0x60, 0xf9, 0x87, + 0x8e, 0xd2, 0x0b, 0x34, 0x14, 0x04, 0x5a, 0xfd, 0x82, 0xff, 0x79, 0xb0, + 0x70, 0x5f, 0x59, 0x47, 0x3d, 0x4d, 0xe4, 0x77, 0xfe, 0x70, 0x77, 0xe6, + 0x98, 0xa0, 0x0b, 0x2b, 0x0f, 0x8d, 0x89, 0x2f, 0xed, 0x66, 0xef, 0x9c, + 0x6b, 0x2f, 0xfd, 0x9d, 0x6c, 0x2c, 0xdf, 0xa6, 0xe2, 0xcb, 0xfb, 0xbf, + 0x34, 0x17, 0x6b, 0x2a, 0x0f, 0xc3, 0x10, 0xaf, 0xf6, 0xa3, 0xed, 0xdb, + 0x0d, 0x65, 0xfa, 0x53, 0x66, 0x76, 0xb2, 0xff, 0x06, 0x78, 0x61, 0xe1, + 0xd6, 0x5b, 0x4b, 0x2b, 0x6a, 0x45, 0x04, 0x19, 0x91, 0x48, 0x86, 0x77, + 0xe3, 0x30, 0xef, 0xd2, 0xcb, 0xe0, 0x63, 0xee, 0x2c, 0xa8, 0x3c, 0xd6, + 0x29, 0xb9, 0xb8, 0xb2, 0xa4, 0xbc, 0x03, 0x91, 0x81, 0x1a, 0x83, 0xd2, + 0x1b, 0x42, 0x97, 0xd1, 0xc9, 0x39, 0x01, 0x42, 0x83, 0x90, 0xc0, 0xfc, + 0x23, 0xb6, 0xc8, 0x2f, 0x8a, 0x78, 0xf2, 0xcb, 0xf7, 0xbf, 0xc0, 0xee, + 0x2c, 0xb8, 0xcd, 0xa9, 0x65, 0x41, 0xe4, 0xf4, 0x59, 0x7e, 0xff, 0xd8, + 0xfc, 0x59, 0x73, 0xb2, 0xcb, 0xf7, 0x5f, 0xdf, 0x84, 0xb2, 0xfc, 0xff, + 0x93, 0x8d, 0x65, 0x8d, 0xc3, 0xd1, 0x22, 0xab, 0xa5, 0xe5, 0x94, 0xc8, + 0xcc, 0xf1, 0x43, 0xb3, 0x7c, 0x9e, 0xcc, 0xb2, 0xff, 0xff, 0x19, 0x05, + 0x06, 0x94, 0x1a, 0x26, 0xdc, 0x6a, 0x3b, 0x85, 0x97, 0xf7, 0xa3, 0x67, + 0x6d, 0x3a, 0xcb, 0xff, 0x39, 0xf3, 0x46, 0x9a, 0x12, 0xfa, 0xcb, 0xfd, + 0x1f, 0xe7, 0x18, 0xa6, 0x59, 0x5e, 0x3f, 0x32, 0x40, 0xbf, 0xf1, 0x8e, + 0x52, 0xf0, 0x63, 0xae, 0x2c, 0xbf, 0xff, 0x9c, 0xfa, 0xcd, 0xf0, 0x5f, + 0xcf, 0x36, 0xbc, 0xeb, 0x2f, 0xf9, 0xff, 0xcf, 0xfd, 0xe5, 0xc5, 0x95, + 0x32, 0x3d, 0x34, 0x43, 0xe4, 0x02, 0x5a, 0xbf, 0xf9, 0xf4, 0xf2, 0xce, + 0x3f, 0xf2, 0x65, 0x97, 0xfd, 0xfd, 0x46, 0x75, 0xb1, 0xf8, 0xb2, 0xfe, + 0xd3, 0xe8, 0xa2, 0x4b, 0x2f, 0xff, 0xf7, 0xff, 0x12, 0x27, 0xf4, 0x1f, + 0xd8, 0x37, 0xe8, 0x96, 0x5f, 0xfe, 0xff, 0xb3, 0x7f, 0x9b, 0x67, 0x38, + 0xc7, 0x59, 0x58, 0x8a, 0xd7, 0x5f, 0xbf, 0xe9, 0x36, 0xba, 0x82, 0x8e, + 0x2c, 0xbf, 0xe8, 0xc9, 0xf5, 0x1f, 0x7f, 0xac, 0xa6, 0x3f, 0x00, 0x9c, + 0x56, 0xd2, 0x5c, 0x53, 0x81, 0x01, 0xb2, 0xe4, 0x73, 0x1d, 0x9e, 0xf4, + 0x87, 0xa3, 0xb2, 0x86, 0xcf, 0xe1, 0x23, 0x7f, 0x4a, 0x26, 0xc6, 0x02, + 0xcb, 0x0b, 0xda, 0x9f, 0x24, 0xe3, 0x68, 0x15, 0x14, 0x35, 0x8a, 0xa2, + 0xb8, 0x8f, 0xae, 0x78, 0xe2, 0x65, 0x0f, 0xc1, 0xca, 0x75, 0xca, 0x56, + 0x89, 0xb0, 0xee, 0xee, 0x5f, 0x7f, 0x52, 0x89, 0x9a, 0x17, 0x53, 0x47, + 0x5d, 0xa9, 0x56, 0x07, 0x8d, 0xe7, 0xd2, 0xac, 0xde, 0x3c, 0xc0, 0x46, + 0xd6, 0x53, 0x98, 0xdc, 0xac, 0x10, 0xbf, 0x3d, 0xd6, 0x18, 0x5e, 0x18, + 0xd7, 0xb7, 0x0e, 0xe1, 0x27, 0x23, 0xb7, 0x61, 0x2d, 0x7e, 0x97, 0x50, + 0x43, 0x59, 0x52, 0x54, 0x96, 0x52, 0x88, 0xef, 0xff, 0x6b, 0x0c, 0x1f, + 0xb2, 0x62, 0xcd, 0x49, 0x65, 0xed, 0x66, 0xe2, 0xcb, 0xff, 0x41, 0x82, + 0x4f, 0xcc, 0x3c, 0x6e, 0x2c, 0xad, 0x22, 0xb8, 0xe9, 0x7f, 0x1f, 0xbf, + 0xfe, 0x73, 0xc6, 0xbb, 0xd0, 0x4d, 0xd0, 0x5f, 0x8b, 0x2b, 0x11, 0x04, + 0x13, 0x0b, 0xfd, 0xae, 0xc2, 0xe3, 0x3c, 0x2c, 0xbf, 0xfa, 0x34, 0x27, + 0xdb, 0xfe, 0xc1, 0xb2, 0xcb, 0xfc, 0x5d, 0x03, 0x38, 0xfb, 0x8b, 0x2f, + 0xf8, 0xa2, 0x71, 0x3d, 0xe7, 0xdc, 0x59, 0x7d, 0x18, 0x3e, 0x96, 0x56, + 0x22, 0x57, 0xc6, 0xdb, 0xcf, 0x6f, 0xe7, 0x7f, 0xed, 0xb7, 0x6b, 0x2e, + 0xdf, 0xba, 0xb2, 0xff, 0xff, 0x98, 0x98, 0x1c, 0xd6, 0x77, 0xe8, 0xf6, + 0x6b, 0x50, 0x6a, 0xca, 0x84, 0xfc, 0x27, 0x34, 0xc8, 0x6c, 0xe8, 0xc4, + 0x06, 0x1f, 0x1c, 0xbc, 0x2a, 0x6d, 0x52, 0x59, 0x79, 0xf5, 0x3a, 0xcb, + 0xfd, 0x9f, 0xe3, 0x77, 0x84, 0xb2, 0xe3, 0x0c, 0x59, 0x79, 0xfb, 0x17, + 0xd9, 0xf4, 0x10, 0xe9, 0x86, 0x57, 0xed, 0x3c, 0x9b, 0xcb, 0x2f, 0xfe, + 0xd7, 0x3c, 0xc6, 0x79, 0xa7, 0x72, 0x59, 0x50, 0x7d, 0x8e, 0x4f, 0x7e, + 0xc3, 0xf9, 0xc6, 0xb2, 0xc2, 0xf6, 0xa7, 0xdf, 0xbe, 0x88, 0x46, 0x48, + 0x84, 0x68, 0x39, 0x2c, 0x40, 0xd2, 0xce, 0xe9, 0x31, 0xf3, 0x17, 0xea, + 0x15, 0x7e, 0x21, 0x7b, 0xcb, 0xbb, 0x28, 0xd6, 0xf9, 0x28, 0x4b, 0xeb, + 0x9b, 0xe1, 0x1e, 0x64, 0x2c, 0x37, 0x48, 0x2a, 0x50, 0x93, 0x70, 0x1d, + 0x63, 0x01, 0xd4, 0xa7, 0xad, 0x1c, 0x9e, 0x12, 0x7e, 0x9c, 0x9f, 0x04, + 0x62, 0xe5, 0x1a, 0xaf, 0x29, 0x60, 0x9f, 0xa5, 0x0e, 0x86, 0xf8, 0x50, + 0xaf, 0xd8, 0x3f, 0x41, 0x8b, 0x2f, 0xee, 0x44, 0xd2, 0x69, 0x96, 0x5f, + 0xf7, 0xe0, 0x98, 0x19, 0xd7, 0xd6, 0x5f, 0x6d, 0xb9, 0x01, 0x65, 0xd1, + 0x3e, 0x1e, 0xe0, 0x87, 0x14, 0x48, 0xe1, 0xe1, 0x40, 0x90, 0x8b, 0xbf, + 0xcf, 0xae, 0xc5, 0xcb, 0x3a, 0x59, 0x7f, 0xfa, 0x4f, 0xc1, 0x65, 0x19, + 0xf8, 0xea, 0x4b, 0x2f, 0x1a, 0xda, 0x59, 0x74, 0x01, 0x65, 0xf7, 0xff, + 0x07, 0x59, 0x79, 0x86, 0x2d, 0x8f, 0x57, 0xc3, 0xa2, 0x0b, 0x5f, 0xfa, + 0x24, 0x2c, 0x48, 0x30, 0x49, 0xb8, 0xb2, 0xcd, 0xda, 0x21, 0xc0, 0x85, + 0x42, 0xd3, 0xbc, 0x9c, 0xd5, 0x8d, 0xff, 0x19, 0x3d, 0xff, 0x9f, 0xb1, + 0x61, 0x03, 0x4b, 0x24, 0xb2, 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x46, 0xab, + 0xff, 0xef, 0x31, 0x8e, 0x5d, 0xea, 0x1a, 0x4f, 0xc5, 0x97, 0xdf, 0xd3, + 0x74, 0xb2, 0xfc, 0x1f, 0x86, 0x68, 0x59, 0x7e, 0x61, 0xbe, 0x7d, 0x65, + 0xe3, 0x7a, 0xe2, 0xcb, 0x0b, 0x9d, 0x35, 0x7c, 0x41, 0xec, 0xd9, 0x93, + 0xfc, 0x46, 0xe5, 0x3f, 0x26, 0xbf, 0xff, 0xdb, 0xe0, 0xbe, 0x2d, 0xf7, + 0xb8, 0xf0, 0x6e, 0x77, 0x1a, 0xcb, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x52, + 0xad, 0xda, 0xa2, 0x1a, 0x52, 0xca, 0x73, 0x54, 0x01, 0xfb, 0x0b, 0xc4, + 0x40, 0x3b, 0x05, 0xf7, 0xdf, 0xa0, 0x2c, 0xbf, 0xfd, 0x9e, 0x61, 0x3e, + 0xc4, 0x19, 0x67, 0x16, 0x5f, 0xec, 0xf1, 0x3f, 0xff, 0x0b, 0x2f, 0x13, + 0x8b, 0x74, 0x4e, 0xfc, 0x8c, 0x44, 0x9b, 0xdb, 0x5e, 0xd2, 0x14, 0x2c, + 0xbf, 0x39, 0xe7, 0x7d, 0xc5, 0x97, 0xdd, 0xbb, 0xf6, 0xa8, 0x8f, 0x97, + 0x0e, 0x16, 0x56, 0x8f, 0x18, 0xe6, 0x17, 0xfb, 0x8d, 0xe3, 0x1f, 0x52, + 0x59, 0x78, 0x7e, 0x0a, 0xcb, 0xba, 0xe2, 0xcb, 0x1a, 0xb2, 0xb0, 0xd5, + 0x6d, 0x8c, 0x5f, 0xfc, 0x1d, 0x03, 0xbf, 0x34, 0xc5, 0x00, 0x59, 0x7f, + 0xa5, 0x9b, 0x8e, 0x40, 0x14, 0x2c, 0xbd, 0xf8, 0xc5, 0x97, 0xff, 0x7e, + 0x50, 0x6e, 0xc8, 0xff, 0x20, 0x0b, 0x2c, 0x58, 0x7c, 0x4e, 0x37, 0x74, + 0x85, 0xed, 0x6a, 0x98, 0xe7, 0x2c, 0xc7, 0x1e, 0x88, 0x9c, 0xd0, 0x08, + 0xfc, 0x23, 0xfa, 0x30, 0x90, 0x9b, 0xae, 0xd5, 0x9f, 0x3c, 0xaa, 0x5b, + 0xf8, 0x5f, 0x1e, 0x3a, 0x92, 0xcb, 0xf7, 0xfd, 0x04, 0x6a, 0xcb, 0xfb, + 0x4e, 0x07, 0xcd, 0x2c, 0xbe, 0xf0, 0x4a, 0x75, 0x97, 0xfe, 0x79, 0xe3, + 0xcd, 0xa6, 0x83, 0xac, 0xbf, 0xd1, 0xac, 0x2f, 0xe7, 0x96, 0x5d, 0x82, + 0xe1, 0x1c, 0xa3, 0x28, 0xf1, 0x66, 0xd9, 0x18, 0x87, 0xb4, 0x6a, 0x6d, + 0xe7, 0x8c, 0x56, 0x85, 0xa7, 0x8d, 0x11, 0xcd, 0xdf, 0xff, 0xe0, 0xe8, + 0xd7, 0xe6, 0x0e, 0x3a, 0xe0, 0x9f, 0x35, 0x8d, 0x59, 0x7d, 0x1c, 0x7e, + 0x2c, 0xa9, 0x22, 0x1e, 0x66, 0x6b, 0xc6, 0x1b, 0xda, 0xcb, 0xf7, 0x5d, + 0x4b, 0x3e, 0xb2, 0xb8, 0x79, 0x41, 0x20, 0xbf, 0xfd, 0xb4, 0xcd, 0x33, + 0x72, 0x71, 0x8a, 0x36, 0x6c, 0xf6, 0xda, 0xcb, 0xff, 0x05, 0xf5, 0x22, + 0xce, 0x46, 0x96, 0x5f, 0x76, 0xef, 0xda, 0xa2, 0xc7, 0x5f, 0xa3, 0xc4, + 0xe2, 0x2c, 0xad, 0x1e, 0xb9, 0xcc, 0x2f, 0xf6, 0x31, 0x4f, 0xfc, 0xf2, + 0xcb, 0x9f, 0x8b, 0x2f, 0xe9, 0xc4, 0xd6, 0xb3, 0x4b, 0x2f, 0x1f, 0x90, + 0xb2, 0xa4, 0x7c, 0x4e, 0x2c, 0x13, 0x0b, 0xfe, 0x27, 0x37, 0xcd, 0x05, + 0x3a, 0xcb, 0xf8, 0xbf, 0xa0, 0xc1, 0xd6, 0x5f, 0xff, 0x89, 0xcd, 0xd9, + 0xf3, 0x60, 0xa5, 0x9e, 0x63, 0xac, 0xa7, 0x44, 0x20, 0x4b, 0x6f, 0xe0, + 0x3f, 0xf9, 0x06, 0xac, 0xbb, 0x7e, 0x2c, 0xbf, 0xcd, 0xf8, 0xd1, 0xbe, + 0x65, 0x97, 0xff, 0xd2, 0x9f, 0x69, 0xc6, 0xd1, 0x3f, 0x7a, 0xd9, 0xb3, + 0xdb, 0x6b, 0x2f, 0xfb, 0x37, 0xc4, 0xba, 0x96, 0x7d, 0x65, 0x62, 0x63, + 0x6c, 0x5c, 0xe3, 0x00, 0x33, 0x26, 0x7b, 0x9a, 0x4b, 0x2f, 0xf6, 0x17, + 0xb3, 0xf0, 0x35, 0x97, 0xec, 0xdf, 0xe7, 0x92, 0xcb, 0x7d, 0x8f, 0x68, + 0x8c, 0x68, 0x68, 0x96, 0xc7, 0x0b, 0xfe, 0x93, 0x7c, 0x4d, 0x47, 0xa1, + 0x65, 0xf9, 0xbf, 0xf6, 0xfa, 0xcb, 0xff, 0xf0, 0x49, 0xcd, 0xf9, 0xb0, + 0x52, 0xcf, 0x31, 0xd6, 0x5f, 0x6b, 0x59, 0xb6, 0xb2, 0xfd, 0xa0, 0x37, + 0xa1, 0x65, 0x6c, 0x4c, 0x07, 0x0e, 0x4e, 0x4e, 0xea, 0xa1, 0x25, 0xbf, + 0x66, 0xb3, 0x26, 0x59, 0x61, 0x70, 0xbd, 0xaf, 0x3b, 0x74, 0x88, 0x86, + 0xc9, 0x90, 0x94, 0x34, 0x89, 0xa1, 0x29, 0x31, 0x71, 0xe1, 0x79, 0xe8, + 0xcf, 0x4a, 0x1b, 0xbc, 0x8c, 0x8c, 0x44, 0xbb, 0xdd, 0x7f, 0x16, 0x5e, + 0x6d, 0x4c, 0xb2, 0xfa, 0x5f, 0x08, 0xd6, 0x51, 0xa7, 0x81, 0xd0, 0xed, + 0xff, 0xff, 0xfb, 0xd8, 0xed, 0xcf, 0x60, 0x36, 0x73, 0x07, 0x87, 0x6e, + 0xa4, 0x50, 0x68, 0x16, 0x5f, 0xc4, 0xe6, 0x7f, 0x3c, 0xb2, 0xb6, 0xa4, + 0x58, 0xcd, 0x08, 0x4b, 0x8e, 0x6a, 0xca, 0x14, 0x9e, 0x36, 0xd3, 0x2e, + 0xbf, 0x16, 0x79, 0xfe, 0xb2, 0xf0, 0xab, 0xda, 0x80, 0xb2, 0x85, 0x27, + 0x9d, 0xb4, 0xc9, 0xaf, 0xfd, 0xb5, 0x6d, 0x62, 0x90, 0xe6, 0x8a, 0x00, + 0xb2, 0xfe, 0xce, 0xe3, 0xed, 0xbd, 0x65, 0xff, 0xb0, 0xce, 0x63, 0x73, + 0xf9, 0xb8, 0xb2, 0xbc, 0x7e, 0x04, 0x5f, 0x7b, 0xc1, 0x1a, 0xcb, 0xf8, + 0x78, 0x7d, 0xaf, 0x69, 0x6d, 0x6b, 0x2f, 0xfa, 0x26, 0x6f, 0xf1, 0x8a, + 0x65, 0x97, 0xff, 0xbb, 0x80, 0x7b, 0x71, 0x8f, 0xfe, 0x3f, 0x4b, 0x2f, + 0x6e, 0x8e, 0x16, 0x53, 0x1f, 0x70, 0x53, 0xef, 0xf3, 0x83, 0x8f, 0xff, + 0xba, 0xcb, 0x8f, 0xda, 0xcb, 0xfe, 0x71, 0xb7, 0x52, 0xfb, 0x69, 0x65, + 0xff, 0xa3, 0x40, 0x2c, 0x9a, 0x4d, 0x32, 0xca, 0x1a, 0xa0, 0x6c, 0x21, + 0x61, 0xdd, 0x1f, 0x7a, 0x14, 0xe4, 0x43, 0xf3, 0x2d, 0xe3, 0x1b, 0xa7, + 0x37, 0xfc, 0x66, 0xb0, 0x9f, 0xa9, 0x71, 0x65, 0xc4, 0x6a, 0xcb, 0xb0, + 0x6b, 0x2b, 0x0f, 0x9d, 0xce, 0xb7, 0x8b, 0xdf, 0xbc, 0xe7, 0x82, 0x59, + 0x7d, 0xcf, 0x31, 0x8b, 0x2f, 0xfe, 0x9b, 0x71, 0xa7, 0xf6, 0x4c, 0x58, + 0x62, 0xcb, 0xfb, 0xb7, 0xd6, 0xdb, 0xf9, 0x65, 0xde, 0xf2, 0xcb, 0xf4, + 0x19, 0xfc, 0xf2, 0xcb, 0x84, 0xc5, 0x97, 0xc3, 0xce, 0xbe, 0xb2, 0xa0, + 0xdd, 0x30, 0xbd, 0x6c, 0x4d, 0x73, 0x09, 0x8d, 0x23, 0x64, 0xa1, 0x59, + 0x89, 0x0b, 0xf1, 0x8a, 0xfe, 0x28, 0x04, 0xbb, 0x9d, 0x65, 0xff, 0xd1, + 0x1b, 0xbe, 0xc7, 0x1e, 0x61, 0xd6, 0x5d, 0xfe, 0x4c, 0x7e, 0x7e, 0x2f, + 0xb7, 0x6b, 0x2f, 0x03, 0x6b, 0xf2, 0xca, 0xda, 0x46, 0xd3, 0x82, 0x57, + 0xc1, 0xe7, 0xb1, 0x65, 0x68, 0xf2, 0x48, 0x9e, 0xff, 0xf6, 0x6e, 0xe7, + 0x7f, 0xea, 0x58, 0x40, 0x75, 0x97, 0xff, 0xff, 0x31, 0x6f, 0xc1, 0x93, + 0xbe, 0xfc, 0xdc, 0xfe, 0xe3, 0x7c, 0xa0, 0x0b, 0x2f, 0x30, 0x40, 0xb2, + 0xdd, 0x6e, 0x22, 0x4e, 0x67, 0x7b, 0xc7, 0x6d, 0x2c, 0xac, 0x3c, 0xa0, + 0x17, 0x5e, 0xc7, 0x25, 0x97, 0xbd, 0x13, 0x2c, 0xb9, 0xbe, 0xc6, 0xdd, + 0xc6, 0xae, 0x90, 0xd6, 0x5f, 0xfd, 0x86, 0x70, 0xb2, 0x69, 0x04, 0xbe, + 0xb2, 0xfa, 0x5b, 0x8c, 0x75, 0x97, 0xdc, 0x77, 0xdc, 0x59, 0x7e, 0xcf, + 0x6e, 0x31, 0x39, 0xe4, 0xfc, 0x96, 0xd8, 0x48, 0xcd, 0xdf, 0x08, 0xeb, + 0xff, 0xde, 0x8e, 0xb2, 0x72, 0x08, 0x7f, 0x1e, 0x59, 0x7f, 0xcd, 0xdf, + 0x9b, 0xfc, 0x7e, 0x96, 0x5f, 0x8b, 0x07, 0x9e, 0xed, 0x10, 0xbe, 0x4b, + 0xbf, 0xdd, 0xb1, 0x99, 0x33, 0xee, 0x2c, 0xad, 0x1f, 0xbf, 0x8f, 0xef, + 0xff, 0xfc, 0x58, 0x72, 0x08, 0x0d, 0xdc, 0x62, 0x1e, 0x4e, 0x60, 0x5e, + 0x75, 0x95, 0x08, 0x93, 0xc2, 0x2b, 0xff, 0xfd, 0x06, 0x7b, 0x34, 0xe7, + 0xcf, 0xfb, 0x30, 0xf9, 0xda, 0xcb, 0xff, 0xe9, 0xb3, 0x74, 0xb3, 0x79, + 0x60, 0x0f, 0x12, 0x59, 0x50, 0x8b, 0x3c, 0x60, 0xbf, 0xe7, 0xe8, 0xb3, + 0xfc, 0xc3, 0x16, 0x54, 0x2f, 0x24, 0x64, 0x2b, 0x3b, 0x21, 0x68, 0xca, + 0xb7, 0x16, 0x26, 0x2a, 0xd4, 0x39, 0x3d, 0x1d, 0xe9, 0x43, 0x50, 0x24, + 0x37, 0xef, 0x36, 0x83, 0x25, 0x97, 0xfd, 0x3b, 0x7a, 0x67, 0x93, 0x79, + 0x65, 0xfb, 0x40, 0xdb, 0x0f, 0xd6, 0x5f, 0xed, 0xfe, 0x61, 0xfb, 0x38, + 0xb2, 0xff, 0xff, 0x82, 0x1e, 0x8b, 0x37, 0xec, 0x1e, 0x7e, 0x59, 0xef, + 0x3c, 0x96, 0x5f, 0xf1, 0xf9, 0xec, 0xf9, 0x41, 0xd6, 0x5e, 0x2c, 0xe1, + 0x22, 0x8f, 0x6d, 0xae, 0x9d, 0x30, 0xdd, 0xf0, 0xd8, 0xbf, 0xfd, 0xad, + 0x44, 0xf8, 0x67, 0x52, 0xf8, 0x46, 0xb2, 0xfb, 0x30, 0x8d, 0x59, 0x7f, + 0xe6, 0x37, 0x24, 0xcf, 0xbf, 0xcc, 0xb2, 0xd0, 0xc8, 0xae, 0xd2, 0x77, + 0x88, 0x6a, 0x15, 0x22, 0xb4, 0x67, 0x3e, 0x86, 0xc5, 0xfe, 0x2f, 0x8a, + 0x1f, 0xe1, 0x85, 0x97, 0xf4, 0x8b, 0x3a, 0xfb, 0xac, 0xbf, 0x87, 0xf3, + 0x58, 0x86, 0xb2, 0xa1, 0x12, 0x2e, 0x6c, 0x12, 0xdb, 0xc3, 0xc2, 0x59, + 0x7f, 0x9e, 0x7f, 0xf1, 0xdf, 0x71, 0x65, 0x4e, 0x7a, 0x3b, 0xc6, 0xef, + 0xfc, 0xda, 0xef, 0xcd, 0x33, 0xbc, 0x96, 0x5f, 0xfd, 0xe8, 0x3f, 0x7e, + 0x6f, 0xe6, 0x1d, 0x65, 0xf6, 0xa7, 0x83, 0x56, 0x59, 0x96, 0x5c, 0xe6, + 0xe1, 0xb4, 0xf9, 0x25, 0x42, 0x29, 0x09, 0xe2, 0xff, 0xf1, 0x67, 0x84, + 0xe7, 0x02, 0x7e, 0x3f, 0x4b, 0x2f, 0x81, 0x8c, 0xeb, 0x2f, 0x01, 0x84, + 0x59, 0x7f, 0xff, 0xfa, 0x0b, 0xfc, 0x6f, 0x31, 0xc7, 0x1e, 0xcd, 0xfb, + 0x8c, 0x43, 0xc9, 0xd6, 0x57, 0x69, 0x81, 0xba, 0x60, 0x08, 0x3e, 0x3b, + 0x7f, 0xcf, 0xa9, 0xfc, 0xd9, 0xa9, 0x96, 0x5f, 0xfc, 0xee, 0x40, 0xe6, + 0x6e, 0x4c, 0xee, 0xb2, 0xff, 0xff, 0xff, 0x63, 0x7b, 0x71, 0x8b, 0x3f, + 0xf8, 0x9c, 0x65, 0x10, 0x0f, 0xcb, 0x08, 0x9e, 0x4b, 0x2b, 0xb4, 0xc2, + 0xe6, 0x3a, 0xfa, 0x2d, 0xfa, 0x5c, 0x9f, 0x0c, 0x59, 0x7b, 0x35, 0x3a, + 0xcb, 0xce, 0x53, 0x2c, 0xaf, 0x1b, 0x97, 0x1d, 0xbc, 0xef, 0xda, 0xa2, + 0xd0, 0x5f, 0xff, 0xec, 0x1c, 0x76, 0xc5, 0x3f, 0x3b, 0xf3, 0x0c, 0x78, + 0x4b, 0x2f, 0xcf, 0xa9, 0xf0, 0xc5, 0x97, 0x9c, 0xcd, 0xdd, 0x88, 0x8a, + 0xed, 0x86, 0xfe, 0x04, 0x14, 0x7f, 0x8b, 0x2a, 0x13, 0x9d, 0x1b, 0x1f, + 0x64, 0x1a, 0x85, 0x98, 0x0e, 0xef, 0x49, 0x80, 0xb2, 0xff, 0xba, 0xfc, + 0x1b, 0xb8, 0xc1, 0x1a, 0xcb, 0xf9, 0xbf, 0xe7, 0x23, 0x56, 0x54, 0xc8, + 0x87, 0x71, 0xce, 0x1f, 0x5e, 0x08, 0x74, 0xb2, 0xf1, 0x46, 0x96, 0x5d, + 0xa9, 0xa6, 0x37, 0x1c, 0x1d, 0xbf, 0xff, 0xdc, 0x72, 0xf4, 0x6f, 0xf6, + 0x7f, 0x1c, 0xbb, 0xc1, 0xac, 0xbf, 0xff, 0xcd, 0x1f, 0x6f, 0x47, 0x3d, + 0x9c, 0xd6, 0x77, 0x9f, 0x59, 0x7f, 0xf4, 0x03, 0x85, 0x9b, 0x83, 0x8f, + 0xf1, 0x65, 0x9c, 0x91, 0x4b, 0xc5, 0xfb, 0x6a, 0x13, 0x2c, 0xf4, 0x60, + 0xb7, 0xf4, 0xfb, 0x26, 0x94, 0x4e, 0xb2, 0xb1, 0x3b, 0xd6, 0x8d, 0x6d, + 0xcb, 0xef, 0xc3, 0x89, 0x98, 0xeb, 0x2f, 0xe3, 0x0b, 0x27, 0x12, 0x4b, + 0x2f, 0xc3, 0xc0, 0x3c, 0x2c, 0xbf, 0xff, 0xf3, 0xea, 0x5c, 0x61, 0xe6, + 0xa7, 0x6e, 0x79, 0xc1, 0xcc, 0x25, 0x95, 0x88, 0x91, 0xe1, 0x35, 0x32, + 0x38, 0xc3, 0x0c, 0x1b, 0xf4, 0xe7, 0x77, 0x25, 0x97, 0xfc, 0xe0, 0xc6, + 0xe7, 0x20, 0x0b, 0x2a, 0x0f, 0x7b, 0x84, 0xf7, 0xfe, 0x1e, 0xde, 0x70, + 0x7e, 0x6d, 0x4e, 0xb2, 0xff, 0xfb, 0x0c, 0xf9, 0xe3, 0x3f, 0xec, 0xc2, + 0xed, 0x65, 0x42, 0x24, 0xbc, 0x87, 0x7b, 0x6a, 0x14, 0xed, 0x0b, 0x2f, + 0xb0, 0xa4, 0xcb, 0x2f, 0xfe, 0xcd, 0x69, 0xe4, 0x21, 0x3f, 0xf8, 0xb2, + 0xa0, 0xf9, 0x24, 0x41, 0x66, 0xd2, 0x2c, 0x3f, 0x08, 0xfb, 0xfd, 0x37, + 0xa3, 0xfe, 0x89, 0x96, 0x54, 0x33, 0xf7, 0xa7, 0x28, 0x94, 0xa7, 0xf1, + 0xc3, 0x33, 0x1f, 0xcd, 0x25, 0xee, 0x1c, 0x6d, 0x19, 0x26, 0xe4, 0x69, + 0x3a, 0x8f, 0x40, 0xf0, 0xd7, 0xf4, 0xa2, 0x57, 0x34, 0x28, 0xc2, 0xf9, + 0x08, 0x5f, 0xc2, 0xcf, 0x7c, 0x34, 0x84, 0x2d, 0xbf, 0xff, 0x37, 0x52, + 0x28, 0x71, 0xb7, 0x79, 0xe7, 0xfa, 0xcb, 0x01, 0x65, 0xe1, 0xfa, 0x16, + 0x5f, 0x67, 0x5f, 0x75, 0x96, 0xe6, 0xc3, 0x7c, 0x43, 0x96, 0x0e, 0x8f, + 0xdf, 0xe9, 0xf6, 0xc5, 0x97, 0xff, 0x87, 0xe8, 0x86, 0xff, 0x18, 0xba, + 0x92, 0xcb, 0x04, 0x67, 0xb2, 0x42, 0x17, 0x61, 0xd6, 0x5f, 0xff, 0x1a, + 0xda, 0xce, 0xbf, 0xe6, 0x12, 0x07, 0x0b, 0x2f, 0xfd, 0xd6, 0xff, 0x6e, + 0x37, 0xca, 0x0e, 0xb2, 0xb1, 0x12, 0xae, 0xa3, 0x7a, 0x27, 0x65, 0x95, + 0x8a, 0x96, 0xcd, 0x86, 0x5b, 0x42, 0x07, 0x44, 0xef, 0x0a, 0xb2, 0x21, + 0xbf, 0xff, 0xed, 0x60, 0xc9, 0xdf, 0x7f, 0x33, 0x73, 0xe5, 0x99, 0xa9, + 0x96, 0x5f, 0x8b, 0xfb, 0x0f, 0x3a, 0xcb, 0xe0, 0x9d, 0xfe, 0xb2, 0xff, + 0xfc, 0xd3, 0x96, 0x6f, 0xf3, 0x7f, 0xa9, 0x41, 0x4c, 0xb2, 0xa1, 0x14, + 0xa3, 0x2b, 0xf1, 0x15, 0xff, 0xff, 0x9b, 0x4d, 0x9b, 0xf2, 0x7c, 0x6f, + 0xc1, 0xc9, 0xcd, 0xf3, 0x2c, 0xbf, 0xfa, 0x50, 0xf2, 0xd8, 0xd3, 0x36, + 0x12, 0xcb, 0xfe, 0x98, 0xa0, 0xfe, 0x8d, 0xe7, 0x59, 0x7f, 0xfa, 0x4d, + 0xa0, 0x3f, 0xf2, 0x69, 0x37, 0xd6, 0x5f, 0xbe, 0xdb, 0x79, 0x3a, 0xcb, + 0xdb, 0x56, 0xd7, 0xb5, 0x2c, 0xbf, 0xdc, 0xcf, 0x37, 0x03, 0x3a, 0xcb, + 0xe6, 0xdb, 0xc9, 0xd6, 0x5c, 0xfd, 0x6c, 0x45, 0x86, 0xd3, 0x2b, 0xe1, + 0x67, 0xcd, 0x2e, 0x7e, 0x96, 0x56, 0x27, 0x3b, 0xd1, 0xdf, 0x21, 0xf5, + 0xf5, 0x1b, 0x30, 0xd5, 0x5f, 0x76, 0x5f, 0xd3, 0x5f, 0xe3, 0xe1, 0xbf, + 0xef, 0x37, 0xf8, 0xfd, 0x00, 0xc5, 0x97, 0x86, 0xf3, 0xac, 0xbb, 0x53, + 0xf6, 0x7b, 0x02, 0x1d, 0xdf, 0xff, 0x06, 0x7d, 0x37, 0xe7, 0x0e, 0xa5, + 0xcd, 0xc6, 0x59, 0x4c, 0xb9, 0xef, 0xe9, 0x79, 0x8f, 0x0a, 0x42, 0x31, + 0xbf, 0xb3, 0xf8, 0x4f, 0x32, 0xcb, 0xfb, 0x4d, 0xd9, 0x47, 0x96, 0x5f, + 0xf0, 0x5f, 0xef, 0x27, 0xea, 0x4b, 0x2f, 0xce, 0x26, 0x75, 0xf5, 0x97, + 0x6b, 0x8b, 0x2a, 0x48, 0xd2, 0xc2, 0xce, 0xcb, 0x78, 0x73, 0xb6, 0x53, + 0x7f, 0x98, 0x78, 0x7d, 0x98, 0x35, 0x97, 0x3f, 0x16, 0x5f, 0x98, 0xcd, + 0xac, 0x53, 0xb5, 0xac, 0xbf, 0xfe, 0x0e, 0xb5, 0x05, 0x86, 0xb7, 0xbd, + 0x82, 0x2c, 0xb0, 0xad, 0x65, 0x68, 0xf9, 0x42, 0xa1, 0x7d, 0x1a, 0x89, + 0x96, 0x5e, 0x28, 0x3a, 0xcb, 0x42, 0xca, 0x98, 0xd5, 0x9c, 0x6e, 0xff, + 0x1c, 0x25, 0xfe, 0x07, 0x4b, 0x2a, 0x49, 0xd5, 0x8c, 0xd0, 0xd1, 0x6d, + 0x42, 0x70, 0xe4, 0x44, 0x9b, 0xb6, 0x45, 0x6d, 0x2c, 0xbd, 0xac, 0xc5, + 0x94, 0x03, 0x59, 0xba, 0x23, 0x7f, 0xff, 0x75, 0xc8, 0x96, 0xb2, 0x78, + 0xd6, 0x7d, 0xba, 0x31, 0x65, 0x8d, 0x59, 0x53, 0x9f, 0x81, 0x2f, 0x5f, + 0xba, 0x96, 0xb9, 0xc5, 0x95, 0x07, 0x99, 0x84, 0x57, 0xff, 0x6e, 0x84, + 0xfe, 0x83, 0xcd, 0xb8, 0xc3, 0x59, 0x7f, 0xba, 0xf6, 0x4d, 0x33, 0xf1, + 0x65, 0x32, 0x20, 0x9d, 0x32, 0xfe, 0x2e, 0xa5, 0xf0, 0x8d, 0x65, 0xfb, + 0x73, 0x08, 0xec, 0xb2, 0xa0, 0xf6, 0x1c, 0xbe, 0xf8, 0xa3, 0x0c, 0x59, + 0x78, 0xb0, 0x0b, 0x2f, 0xff, 0x9b, 0x66, 0xe3, 0x4f, 0xb3, 0xd9, 0x31, + 0x61, 0x8b, 0x2f, 0xa6, 0xcc, 0x9d, 0x65, 0xfb, 0x8d, 0xf2, 0x85, 0x97, + 0x67, 0xb8, 0x79, 0x3f, 0x23, 0xb1, 0x82, 0x94, 0xc2, 0xb4, 0x43, 0xe1, + 0xbf, 0xc2, 0x86, 0xfe, 0x33, 0xe5, 0x07, 0xe2, 0xca, 0x73, 0xfc, 0x0a, + 0x75, 0xfa, 0x6f, 0x60, 0x1d, 0x65, 0x42, 0xbe, 0xa9, 0x43, 0x83, 0x21, + 0x45, 0xe7, 0x92, 0x8e, 0x9b, 0x79, 0x0d, 0xff, 0xff, 0x7b, 0x3f, 0xf7, + 0x9f, 0x3e, 0x76, 0x09, 0x4c, 0x58, 0x62, 0xcb, 0xff, 0x3e, 0xbf, 0x9d, + 0x01, 0xde, 0x65, 0x97, 0xff, 0xfc, 0x4e, 0x0e, 0x77, 0xe6, 0x2c, 0x69, + 0x7a, 0x3c, 0xc6, 0xac, 0xa1, 0xa6, 0x17, 0x33, 0x3f, 0xcf, 0xef, 0xef, + 0xfb, 0x25, 0x20, 0x2c, 0xa8, 0x3e, 0x02, 0x32, 0xbf, 0xc4, 0xef, 0xbe, + 0x5b, 0xc0, 0xb2, 0xff, 0xfb, 0x91, 0x37, 0xa3, 0x79, 0x60, 0xfd, 0x1c, + 0x59, 0x43, 0x44, 0x3f, 0xcd, 0xaf, 0xbb, 0x80, 0x71, 0x65, 0xfd, 0xe6, + 0x33, 0x6e, 0x00, 0xb2, 0xff, 0xf1, 0xdb, 0xa9, 0x70, 0xb3, 0xbf, 0x84, + 0x96, 0x5f, 0xee, 0x66, 0xe0, 0x1d, 0xe6, 0x59, 0x58, 0x8f, 0x8e, 0xc8, + 0xe6, 0x23, 0x39, 0x8f, 0x92, 0xef, 0xfe, 0xff, 0xb3, 0x7e, 0xe3, 0x04, + 0x78, 0x35, 0x97, 0xfc, 0xff, 0x2c, 0x1f, 0xb3, 0xeb, 0x2f, 0xe0, 0x34, + 0xb8, 0xc3, 0x59, 0x50, 0xaa, 0x5f, 0x23, 0x9f, 0x64, 0xb7, 0x49, 0x09, + 0xbd, 0xf8, 0xbb, 0x7e, 0x32, 0xcb, 0xff, 0xfb, 0x45, 0x11, 0xd6, 0xce, + 0x7c, 0xa0, 0x7e, 0x8f, 0xac, 0xb9, 0xbc, 0xb2, 0xfa, 0x44, 0xe2, 0x2c, + 0xbf, 0xc3, 0x70, 0x6b, 0x4e, 0x05, 0x97, 0xda, 0xef, 0x70, 0xc5, 0x97, + 0xc6, 0x8a, 0x5c, 0xc5, 0x95, 0x87, 0xa0, 0xe5, 0x14, 0xc8, 0xa3, 0x28, + 0x41, 0xd4, 0x27, 0x09, 0x84, 0xfb, 0x8b, 0x8e, 0x2c, 0x18, 0x62, 0xdf, + 0xfd, 0xa2, 0xcd, 0xfa, 0xc6, 0xf4, 0x0d, 0x65, 0xe7, 0xdc, 0x65, 0x97, + 0xfe, 0x13, 0xe6, 0xb1, 0xb1, 0x85, 0x0b, 0x2d, 0xd2, 0xcb, 0xff, 0xcc, + 0xef, 0x37, 0xfd, 0x92, 0xf3, 0x6f, 0x59, 0x7f, 0xfd, 0x9f, 0xe6, 0x19, + 0x9e, 0x6d, 0x06, 0x00, 0xb2, 0xa1, 0x15, 0x9b, 0x82, 0x44, 0x97, 0x7e, + 0x13, 0xe5, 0x00, 0x59, 0x50, 0x9d, 0x37, 0x48, 0x9a, 0x1e, 0x3c, 0x3a, + 0xf7, 0x98, 0xdf, 0xa3, 0xf9, 0xe8, 0x59, 0x7f, 0xe0, 0x94, 0xde, 0xc2, + 0xc6, 0x1a, 0xcb, 0xd3, 0xcd, 0x8b, 0x2f, 0xff, 0xb7, 0xe7, 0x7a, 0x77, + 0xea, 0x5c, 0xdc, 0x62, 0x59, 0x50, 0x7e, 0x6e, 0x3d, 0x7f, 0xf6, 0xe3, + 0x67, 0xa3, 0x7f, 0x3d, 0x1d, 0x2c, 0xa6, 0x4c, 0x67, 0xd0, 0xb0, 0xe1, + 0x05, 0xf4, 0x7f, 0x0e, 0xb2, 0xff, 0xdc, 0xf6, 0x19, 0xe6, 0x30, 0xb1, + 0x65, 0x00, 0xf8, 0x37, 0x90, 0xdf, 0xba, 0x91, 0x41, 0xd6, 0x5f, 0xff, + 0xff, 0xe3, 0xee, 0x37, 0x81, 0x8e, 0x5d, 0xe7, 0x52, 0xe3, 0x7f, 0x8d, + 0xd4, 0x8a, 0x3d, 0x0b, 0x2f, 0xec, 0xf3, 0x66, 0xa6, 0x59, 0x7f, 0xec, + 0xea, 0x5c, 0x6f, 0xb9, 0x62, 0xcb, 0xfd, 0x87, 0xf6, 0x4c, 0xf3, 0x2c, + 0xbf, 0x34, 0xfe, 0x88, 0xd8, 0x7e, 0x3f, 0x3d, 0xad, 0x88, 0xde, 0xc8, + 0x4f, 0x5f, 0xfe, 0xf4, 0x75, 0x9a, 0x8f, 0xb7, 0x6c, 0x35, 0x97, 0x83, + 0xa9, 0x96, 0x5f, 0x64, 0xd9, 0xf1, 0x9f, 0x47, 0x12, 0xac, 0xc3, 0x46, + 0x57, 0xa1, 0x23, 0x50, 0xaa, 0x3b, 0x0a, 0x3d, 0x28, 0xe6, 0xff, 0xff, + 0xcc, 0x59, 0xf8, 0x39, 0x81, 0x79, 0xf6, 0x67, 0x9b, 0x5e, 0x75, 0x97, + 0xe3, 0x4d, 0x7f, 0xf1, 0x65, 0xff, 0xf6, 0x4e, 0xe3, 0x60, 0xf7, 0xa6, + 0x32, 0x66, 0x59, 0x50, 0x8e, 0x9c, 0x6d, 0xd1, 0x55, 0xcf, 0xba, 0xb2, + 0xf7, 0x98, 0xc5, 0x97, 0xee, 0xa5, 0xc2, 0xc3, 0x9b, 0x6f, 0x8c, 0xdf, + 0xfb, 0x3a, 0x97, 0x26, 0xd3, 0xff, 0x8b, 0x2f, 0xc5, 0x1d, 0xc8, 0xeb, + 0x2f, 0xff, 0x66, 0xe7, 0x83, 0x37, 0xb2, 0x69, 0x47, 0x4b, 0x2f, 0xfe, + 0xe6, 0x4d, 0xe8, 0xdf, 0x9e, 0xf4, 0x2c, 0xa1, 0xa2, 0xfb, 0x45, 0x1f, + 0x50, 0xbf, 0xce, 0x0e, 0x1d, 0xfa, 0xfa, 0xca, 0x59, 0x7f, 0xdc, 0x20, + 0x87, 0xf2, 0x83, 0x56, 0x57, 0x47, 0x8b, 0xf0, 0xba, 0xc4, 0x66, 0x39, + 0x80, 0x5e, 0x6f, 0xfd, 0x93, 0xea, 0x23, 0xed, 0xe8, 0x59, 0x7f, 0xe6, + 0x9b, 0x84, 0xee, 0x3f, 0x32, 0xcb, 0xf8, 0xb3, 0x9e, 0x81, 0xac, 0xa8, + 0x3e, 0x9c, 0x3d, 0xa2, 0x46, 0x37, 0x21, 0x4d, 0x7f, 0xfa, 0x4c, 0x6b, + 0x7c, 0xb2, 0x5a, 0xe7, 0x16, 0x5f, 0xfd, 0x87, 0x0c, 0x9c, 0x7b, 0x3e, + 0x70, 0x2c, 0xbf, 0xa2, 0x6c, 0xde, 0xda, 0x59, 0x7f, 0xfa, 0x5e, 0x79, + 0x76, 0x4f, 0xbb, 0xbb, 0xba, 0xcb, 0x2a, 0x11, 0x05, 0x85, 0xf7, 0xcd, + 0xac, 0x25, 0x95, 0x09, 0xaa, 0x79, 0x28, 0xa1, 0x93, 0xc2, 0x1b, 0xff, + 0xcc, 0x11, 0xe1, 0x06, 0x4c, 0x3c, 0x02, 0xcb, 0xff, 0x82, 0xe7, 0xf9, + 0x64, 0xe5, 0x9d, 0x2c, 0xbf, 0xec, 0xee, 0x3c, 0xd0, 0x43, 0x59, 0x7f, + 0xf7, 0xb0, 0xc0, 0xe3, 0x7b, 0x91, 0x3a, 0xcb, 0x98, 0x33, 0x9f, 0xe7, + 0x46, 0xf5, 0x3b, 0x2f, 0xe8, 0x71, 0x9f, 0xe4, 0x25, 0x7b, 0x95, 0x65, + 0xa8, 0xc8, 0x1d, 0x90, 0x07, 0xc5, 0x1e, 0x5f, 0x21, 0xe9, 0xf8, 0xde, + 0xf7, 0xa0, 0x98, 0x91, 0xbb, 0x0c, 0x0b, 0xe9, 0xa4, 0xd3, 0x2c, 0xb8, + 0xa7, 0x59, 0x7c, 0x0d, 0x3e, 0xda, 0xca, 0xd8, 0x7c, 0x1b, 0x41, 0x27, + 0x42, 0xf7, 0xfe, 0x63, 0x37, 0x1a, 0x7e, 0x44, 0x4c, 0xb2, 0xdb, 0xab, + 0x2e, 0xf6, 0xea, 0xcb, 0xff, 0xd9, 0xbf, 0xcf, 0x20, 0x3f, 0x40, 0x6e, + 0x96, 0x5b, 0xf0, 0x7c, 0xfe, 0x1a, 0xbf, 0xfe, 0xd4, 0xf1, 0xb9, 0xc2, + 0xcf, 0xfd, 0xb5, 0xda, 0xcb, 0xfb, 0x27, 0xe1, 0x66, 0xf5, 0x95, 0x24, + 0xc9, 0x59, 0xed, 0xc9, 0xfe, 0xa9, 0x63, 0x56, 0x54, 0x33, 0xe0, 0xb2, + 0x98, 0x98, 0xd1, 0xa4, 0xee, 0x1b, 0xbc, 0x6d, 0x02, 0x1e, 0x5f, 0xff, + 0xa5, 0x9c, 0x72, 0x07, 0xb2, 0x3f, 0xc8, 0x02, 0xcb, 0xe7, 0x3b, 0xc9, + 0x65, 0xff, 0xde, 0x6d, 0x98, 0x58, 0xda, 0x7d, 0xeb, 0x2f, 0xfe, 0x62, + 0x71, 0x96, 0x0f, 0xd1, 0xc5, 0x97, 0x84, 0x8d, 0x2c, 0xbf, 0xe9, 0xcf, + 0x1a, 0xf9, 0x44, 0xeb, 0x2f, 0xbb, 0xe8, 0xde, 0xd6, 0x5e, 0x12, 0x00, + 0xb2, 0x98, 0xf1, 0x00, 0x4f, 0x7d, 0xbe, 0x0b, 0xb5, 0x97, 0xff, 0xf4, + 0x16, 0x03, 0x98, 0x3f, 0x44, 0xe7, 0x09, 0x0d, 0x65, 0x31, 0xff, 0x78, + 0x92, 0xfc, 0xdf, 0xfc, 0x49, 0x65, 0xd1, 0xd2, 0xca, 0x92, 0xa9, 0x31, + 0xa9, 0x9a, 0x43, 0xda, 0x2e, 0x90, 0x5c, 0x74, 0x9f, 0xbf, 0x09, 0xfd, + 0xe4, 0x3b, 0x64, 0xf7, 0xf1, 0x7e, 0x39, 0xf6, 0x59, 0x7f, 0xff, 0x44, + 0xd8, 0x3f, 0x46, 0xff, 0x67, 0xca, 0x20, 0xeb, 0x2f, 0xee, 0x86, 0x3c, + 0x79, 0xd6, 0x5f, 0xff, 0xbc, 0xdb, 0xcb, 0x0c, 0xc6, 0xfb, 0x69, 0xc0, + 0xb2, 0xf1, 0x40, 0xd6, 0x5f, 0x4b, 0x3d, 0x8b, 0x2f, 0x4e, 0x12, 0x59, + 0x77, 0x5c, 0x84, 0x6e, 0xf6, 0x5f, 0x32, 0xab, 0x8d, 0x88, 0x43, 0x7f, + 0x79, 0xa6, 0x77, 0x9d, 0x65, 0xe8, 0xc0, 0x2c, 0xb4, 0x76, 0x79, 0x33, + 0x17, 0x54, 0x2a, 0x2e, 0x39, 0x63, 0xc6, 0x70, 0x08, 0x50, 0xdf, 0x34, + 0xe7, 0x85, 0x97, 0xf4, 0x6a, 0x78, 0xd4, 0xeb, 0x2f, 0xff, 0x13, 0x99, + 0xe8, 0x93, 0x16, 0x1e, 0x16, 0x5f, 0xfd, 0x9d, 0x7e, 0x33, 0x5a, 0x88, + 0xdd, 0x59, 0x63, 0x26, 0x44, 0x69, 0x23, 0xd4, 0x91, 0xcd, 0x90, 0xbc, + 0xbf, 0xed, 0xee, 0x40, 0xf6, 0x01, 0xd6, 0x5f, 0x98, 0xdf, 0xb4, 0xeb, + 0x2f, 0xff, 0x66, 0x00, 0xf1, 0x37, 0x07, 0xe7, 0x9d, 0x65, 0x32, 0x2b, + 0x7c, 0x72, 0x45, 0x37, 0xff, 0xa3, 0xd0, 0x79, 0x8b, 0x0c, 0xfe, 0x79, + 0x65, 0xf3, 0xf9, 0x89, 0x65, 0xf6, 0x02, 0x09, 0x65, 0x8a, 0x73, 0xc0, + 0xf1, 0x05, 0x2c, 0xbf, 0x4b, 0x51, 0x83, 0x59, 0x73, 0x07, 0xa3, 0x64, + 0x41, 0x77, 0xff, 0xfb, 0x25, 0xdf, 0x9b, 0xd1, 0x9a, 0x97, 0xca, 0x0f, + 0xc5, 0x97, 0xfe, 0xd3, 0xce, 0x18, 0xc2, 0x0c, 0xeb, 0x2b, 0xc8, 0x9f, + 0xe3, 0x05, 0xff, 0xd1, 0xc2, 0xc3, 0x5b, 0xde, 0xcd, 0xc5, 0x97, 0xfc, + 0x1f, 0xee, 0x73, 0x18, 0x86, 0xb2, 0xf8, 0x31, 0xd0, 0xd6, 0x5f, 0xec, + 0x3e, 0x4d, 0x26, 0xc5, 0x94, 0x35, 0x5a, 0xdd, 0x97, 0x3c, 0x22, 0xb8, + 0xb5, 0xf8, 0x65, 0x84, 0x8f, 0x7a, 0x31, 0x87, 0x62, 0x11, 0xdc, 0x33, + 0xac, 0xbe, 0xdd, 0x8d, 0x4e, 0xb2, 0xf0, 0x7f, 0xc5, 0x97, 0xb7, 0x58, + 0xc5, 0x95, 0x0b, 0x96, 0x59, 0x2e, 0xaa, 0x68, 0x47, 0x38, 0xb8, 0x49, + 0xb7, 0x47, 0x6f, 0xf6, 0xbb, 0x9b, 0x1b, 0xc1, 0x59, 0x7f, 0xfe, 0x6f, + 0xf1, 0xbb, 0x7d, 0x77, 0xe6, 0xde, 0xe7, 0x59, 0x7f, 0xff, 0xce, 0x6f, + 0x06, 0xd9, 0xd7, 0x6c, 0x4f, 0xd1, 0xe2, 0x38, 0xb2, 0xff, 0x44, 0xbe, + 0x6b, 0x76, 0xcb, 0x2b, 0xc8, 0x9b, 0x26, 0x7b, 0xc3, 0xc9, 0x2c, 0xbd, + 0xb8, 0xc6, 0x2c, 0xbc, 0x6b, 0x76, 0xb2, 0xfc, 0xdb, 0xcb, 0x39, 0xb0, + 0xf6, 0xbc, 0x39, 0xf2, 0x0b, 0xfe, 0xdf, 0x83, 0x9b, 0x30, 0x8d, 0x59, + 0x7f, 0xfa, 0x51, 0xcf, 0x41, 0x7f, 0xdb, 0x8c, 0x75, 0x94, 0x48, 0x87, + 0xf9, 0xdd, 0xfe, 0xff, 0xb7, 0x1b, 0xcf, 0x32, 0xcb, 0xfa, 0x3b, 0x27, + 0xeb, 0xeb, 0x2f, 0xf7, 0x35, 0x13, 0xbe, 0xbb, 0x59, 0x7d, 0x3e, 0xdc, + 0x1d, 0x65, 0x31, 0xed, 0x88, 0x6b, 0x52, 0x4f, 0x65, 0xa1, 0xab, 0xb8, + 0x44, 0x73, 0x7f, 0xc2, 0x26, 0xfd, 0x1f, 0x9f, 0x0c, 0x59, 0x7f, 0xee, + 0xbb, 0x27, 0x9d, 0xe4, 0xde, 0x59, 0x5a, 0x3e, 0x90, 0x94, 0xdf, 0x63, + 0x03, 0x8b, 0x2f, 0xfe, 0xe3, 0xf5, 0xff, 0xe7, 0x63, 0x0c, 0xeb, 0x2d, + 0x9d, 0x9f, 0x4f, 0xc8, 0x6f, 0xc3, 0xec, 0x39, 0xb8, 0xb2, 0xff, 0xc5, + 0x1d, 0x7a, 0x18, 0x9c, 0x6b, 0x2a, 0x63, 0xe8, 0x39, 0x65, 0xf7, 0x30, + 0x8d, 0x59, 0x7d, 0x19, 0x27, 0x59, 0x5d, 0x1e, 0x17, 0x88, 0xaf, 0xda, + 0x06, 0xd0, 0x29, 0xda, 0x96, 0x54, 0x22, 0xfc, 0x6c, 0xae, 0x47, 0x7f, + 0x87, 0xbe, 0x0b, 0xf8, 0x05, 0x97, 0xe8, 0xff, 0xa3, 0xeb, 0x2e, 0x20, + 0x2c, 0xa9, 0xcf, 0xc7, 0x46, 0x8e, 0x4f, 0x7f, 0xff, 0xf8, 0x3a, 0xf6, + 0x4d, 0x33, 0xea, 0x6f, 0xf8, 0x20, 0xe6, 0x36, 0xf1, 0xc2, 0xcb, 0xfe, + 0x6f, 0x73, 0x4c, 0x50, 0x75, 0x97, 0xf4, 0x73, 0x71, 0xba, 0xfa, 0xcb, + 0xfa, 0x39, 0x31, 0x64, 0xcb, 0x29, 0x93, 0x13, 0xdc, 0x7d, 0xd1, 0xbf, + 0x8c, 0x6f, 0xdf, 0xf3, 0x91, 0xab, 0x2f, 0xf6, 0xe9, 0x04, 0x3d, 0xb1, + 0xab, 0x2d, 0xf5, 0x94, 0xb2, 0xf9, 0x8c, 0x3b, 0xf4, 0x5e, 0x7c, 0x46, + 0xff, 0x06, 0x71, 0xfb, 0x0a, 0x16, 0x54, 0x22, 0xff, 0xb5, 0x42, 0x38, + 0xbf, 0xfe, 0x83, 0xee, 0x34, 0x41, 0x6b, 0x18, 0xf8, 0xb2, 0xff, 0xec, + 0x1f, 0xa0, 0xce, 0xa5, 0xf0, 0x8d, 0x65, 0xff, 0xc0, 0xf3, 0x07, 0xfc, + 0xf0, 0x73, 0xeb, 0x2e, 0xce, 0x2c, 0xb9, 0xfe, 0xb2, 0xd2, 0xd1, 0xac, + 0xf0, 0xb5, 0xb8, 0xe8, 0x98, 0x0b, 0x8d, 0xb0, 0x6a, 0xaa, 0xf1, 0x03, + 0xb8, 0x73, 0xcc, 0x5e, 0x49, 0xdf, 0x86, 0xfd, 0xff, 0xec, 0xd0, 0xa3, + 0x9f, 0x26, 0xeb, 0x9b, 0x3e, 0xb2, 0xff, 0xf6, 0x41, 0x67, 0x65, 0x9f, + 0x0b, 0x98, 0xb2, 0xff, 0xf4, 0x17, 0xb2, 0x3a, 0x76, 0xe0, 0x86, 0xac, + 0xbf, 0xec, 0x06, 0xde, 0x38, 0xf3, 0x8b, 0x2f, 0xfe, 0x6f, 0xfb, 0x1a, + 0x5c, 0xce, 0xbe, 0xb2, 0x86, 0x98, 0x86, 0x24, 0x12, 0x57, 0x0e, 0xaf, + 0xf8, 0x05, 0x9f, 0xe3, 0xb9, 0x2c, 0xbf, 0xf8, 0x39, 0x36, 0x37, 0x65, + 0x9e, 0xc5, 0x96, 0x07, 0x67, 0xf2, 0x46, 0xd7, 0x8e, 0xfd, 0x2c, 0xbf, + 0xff, 0xa4, 0xc3, 0xcf, 0x64, 0xf1, 0x26, 0xe7, 0x33, 0x71, 0x65, 0x69, + 0x14, 0x40, 0x28, 0xf8, 0xed, 0xc1, 0x35, 0x65, 0xfe, 0xcf, 0x0f, 0xd0, + 0x53, 0xac, 0xb0, 0xfc, 0x79, 0x66, 0x0c, 0x5f, 0x7b, 0x06, 0xcb, 0x2a, + 0x0f, 0x2b, 0x85, 0x35, 0x0c, 0xea, 0x99, 0x1a, 0x8e, 0x1e, 0x79, 0x29, + 0x55, 0xa1, 0x81, 0xa8, 0x45, 0xfa, 0x34, 0xf7, 0x84, 0xf9, 0x4b, 0xed, + 0xe3, 0x47, 0xe3, 0x61, 0x0c, 0x6a, 0xe2, 0x43, 0x16, 0xff, 0x60, 0xe7, + 0xd0, 0x60, 0x0b, 0x2f, 0xff, 0x80, 0xfe, 0xc0, 0x01, 0xf5, 0x9b, 0xfd, + 0x8b, 0x2f, 0xff, 0xdf, 0xe1, 0x04, 0x3d, 0x4b, 0x83, 0xf6, 0x37, 0xd6, + 0x5a, 0x34, 0x8d, 0xb3, 0x9a, 0x12, 0x85, 0xff, 0xe2, 0x61, 0x8e, 0x3f, + 0xc1, 0xfa, 0x09, 0x65, 0x8e, 0xb2, 0xfc, 0x06, 0x29, 0x71, 0x65, 0x74, + 0x6e, 0x3e, 0x23, 0x58, 0x8a, 0x26, 0x84, 0x05, 0xfd, 0xe9, 0x9b, 0xcc, + 0x75, 0x97, 0x03, 0x8b, 0x2f, 0xbb, 0x20, 0xf1, 0x65, 0xff, 0x0f, 0x0e, + 0x59, 0xff, 0x32, 0xcb, 0xf0, 0x74, 0x0d, 0xaf, 0x69, 0x2c, 0xac, 0x44, + 0x73, 0x11, 0xf0, 0xde, 0xb1, 0x30, 0x16, 0x2e, 0xf4, 0x29, 0x6f, 0xda, + 0xe1, 0x44, 0xeb, 0x2f, 0xff, 0xdb, 0xa5, 0x9b, 0xdf, 0x8d, 0x85, 0xed, + 0xc6, 0x3a, 0xcb, 0x4b, 0x11, 0x04, 0xc5, 0x17, 0xda, 0x8c, 0x25, 0x97, + 0xc6, 0xea, 0x0e, 0xb2, 0xf4, 0xf8, 0x62, 0xcb, 0xb2, 0x75, 0x95, 0xb0, + 0xfe, 0x20, 0x80, 0xc2, 0x3d, 0xb1, 0xeb, 0xfc, 0xc5, 0xf9, 0x66, 0xb1, + 0x65, 0xfd, 0x1d, 0xe9, 0xa0, 0xeb, 0x2a, 0x47, 0xbc, 0x46, 0x37, 0xff, + 0x8e, 0x07, 0xd6, 0x6f, 0xc6, 0x1f, 0x99, 0x65, 0xff, 0x9c, 0x1a, 0x82, + 0xff, 0xb2, 0x4b, 0x2f, 0xff, 0x03, 0x18, 0xbf, 0x87, 0x7f, 0x81, 0xd6, + 0x54, 0x23, 0xbf, 0x08, 0x59, 0x28, 0x27, 0xb7, 0xb3, 0xce, 0xb2, 0xf0, + 0x42, 0x4b, 0x2f, 0xcd, 0xef, 0x60, 0xd6, 0x5a, 0x65, 0x83, 0x3c, 0x3e, + 0x0e, 0x50, 0xd1, 0x1c, 0xeb, 0xd7, 0xfe, 0xc9, 0x79, 0xe5, 0xb3, 0xf2, + 0x65, 0x97, 0xe2, 0xc0, 0x07, 0x8b, 0x2f, 0xf4, 0x7f, 0xd8, 0xc4, 0xeb, + 0x2a, 0x73, 0xd7, 0xd1, 0x3d, 0xfe, 0x06, 0xde, 0x38, 0xf3, 0x8b, 0x2f, + 0x6e, 0x31, 0xd6, 0x5f, 0xff, 0x38, 0x39, 0x00, 0xfe, 0x30, 0xf0, 0xa6, + 0x59, 0xe2, 0xfe, 0xa1, 0x1a, 0x98, 0x46, 0xea, 0x97, 0xfa, 0x5f, 0xf6, + 0x6a, 0x3e, 0xb2, 0xfe, 0x33, 0x3b, 0xef, 0x0c, 0x59, 0x77, 0x7b, 0xd6, + 0x58, 0x0b, 0x2f, 0xff, 0x4b, 0x99, 0xa8, 0xe1, 0x60, 0x03, 0xc5, 0x95, + 0x87, 0xb4, 0xe2, 0x35, 0x08, 0x94, 0xf3, 0xa5, 0x62, 0x39, 0xff, 0x0c, + 0x5b, 0xff, 0xd9, 0xba, 0x03, 0xc4, 0xdf, 0x60, 0xeb, 0x8b, 0x2f, 0xf1, + 0xf3, 0x0b, 0xfb, 0x78, 0xb2, 0xff, 0xee, 0x7e, 0x23, 0x40, 0x98, 0xb0, + 0xc5, 0x97, 0xde, 0x6c, 0xe9, 0x65, 0x74, 0x89, 0xb7, 0x34, 0x02, 0x2d, + 0xe3, 0x64, 0x15, 0x97, 0xef, 0x46, 0xa7, 0x3a, 0xcb, 0xfc, 0x17, 0x2f, + 0x63, 0xcc, 0xb2, 0xdd, 0x4c, 0x7b, 0x66, 0x14, 0xd3, 0x22, 0x91, 0xde, + 0x6a, 0x15, 0x8f, 0xe4, 0x63, 0x4c, 0x4e, 0xf0, 0xe9, 0x28, 0x6a, 0x54, + 0x32, 0xb6, 0x25, 0x0d, 0x6c, 0x8c, 0x9f, 0xa8, 0x5b, 0x34, 0x27, 0xfd, + 0x1c, 0x73, 0xc3, 0x20, 0x04, 0x45, 0x1b, 0x5f, 0x25, 0xa6, 0x5c, 0x12, + 0x59, 0x7d, 0xd7, 0x23, 0xa5, 0x94, 0x2b, 0x37, 0x44, 0x2d, 0x7e, 0x99, + 0xa7, 0xce, 0x96, 0x5e, 0xd0, 0x64, 0xb2, 0xba, 0x3c, 0x7f, 0x95, 0x5f, + 0xdb, 0x3e, 0x50, 0x7e, 0x2c, 0xa6, 0x3d, 0x27, 0x23, 0xbf, 0xf3, 0xeb, + 0x58, 0x26, 0x0d, 0xe4, 0xb2, 0xf1, 0x60, 0x16, 0x5a, 0x16, 0x50, 0x0d, + 0x5f, 0xc6, 0xee, 0x7f, 0xac, 0xad, 0x1b, 0x7f, 0x10, 0xdf, 0x1e, 0x35, + 0xc5, 0x97, 0xfa, 0x0e, 0x58, 0x00, 0xf1, 0x65, 0xff, 0x6b, 0x3d, 0x93, + 0xec, 0x6e, 0x2c, 0xac, 0x45, 0x83, 0x10, 0x91, 0x10, 0x4c, 0xaf, 0xf4, + 0x9b, 0x9c, 0x8d, 0x49, 0x65, 0xf3, 0x9e, 0x19, 0x65, 0xef, 0xb1, 0x8b, + 0x28, 0x67, 0xe1, 0x31, 0x99, 0x84, 0x17, 0xf3, 0x10, 0x65, 0x9c, 0x59, + 0x7f, 0xfe, 0x93, 0x7f, 0x9d, 0xf9, 0xbf, 0xd4, 0x9b, 0xfc, 0x59, 0x7f, + 0xd0, 0x03, 0xbc, 0xb5, 0x93, 0xac, 0xbd, 0x3e, 0x6e, 0xac, 0xbf, 0xa3, + 0x3f, 0xc7, 0xe9, 0x65, 0xff, 0x7e, 0x3a, 0x03, 0xfb, 0xcc, 0xb2, 0xf9, + 0xb6, 0xf2, 0x75, 0x95, 0x87, 0xbd, 0xf3, 0x9b, 0x1d, 0x65, 0xfc, 0xc4, + 0x19, 0x67, 0x36, 0x1b, 0x2d, 0xe4, 0x35, 0x0a, 0x84, 0x4d, 0x31, 0x98, + 0xb3, 0xcb, 0x04, 0x73, 0xc2, 0x0f, 0xc2, 0xf6, 0xfb, 0xc1, 0xcf, 0xac, + 0xbf, 0xf0, 0x7a, 0x97, 0x3d, 0x93, 0x84, 0x96, 0x5f, 0x89, 0xfe, 0xe7, + 0x59, 0x4c, 0x88, 0x9d, 0x11, 0x08, 0x83, 0x61, 0x7b, 0x5b, 0xfa, 0xdd, + 0xed, 0x4b, 0xbb, 0x44, 0x63, 0x62, 0x87, 0xa1, 0x50, 0xb2, 0x25, 0x61, + 0x4f, 0x0e, 0xe9, 0x47, 0x16, 0x39, 0xf2, 0x4c, 0xac, 0x22, 0x0d, 0x97, + 0x35, 0xdc, 0xea, 0xe7, 0x51, 0x8d, 0xb4, 0x7f, 0x13, 0x4e, 0x41, 0xea, + 0x71, 0xa8, 0xf1, 0xe9, 0x7a, 0xb1, 0x78, 0x79, 0x60, 0x60, 0x95, 0x8a, + 0x2b, 0x48, 0x29, 0xdb, 0xae, 0x53, 0xc4, 0x3f, 0x4c, 0x9e, 0x0c, 0x3c, + 0xb7, 0xc2, 0xf4, 0xc2, 0x0d, 0xb8, 0xd4, 0x04, 0x95, 0x77, 0xbb, 0x0f, + 0x4b, 0xfb, 0x42, 0xc7, 0xbd, 0xa1, 0x65, 0xfd, 0xba, 0xc3, 0x28, 0x99, + 0x65, 0xe8, 0x72, 0x59, 0x7d, 0x9e, 0x7f, 0xac, 0xb0, 0xa7, 0x0f, 0xaf, + 0xc6, 0x04, 0x35, 0x7f, 0x0a, 0x9b, 0x43, 0xff, 0x37, 0x56, 0x5f, 0xfd, + 0x07, 0x28, 0xd9, 0x34, 0xa3, 0x53, 0xac, 0xbf, 0xfd, 0x1a, 0x0c, 0xd3, + 0x37, 0x98, 0xee, 0x35, 0x97, 0xf1, 0x3f, 0xf9, 0x1b, 0x8b, 0x2f, 0xef, + 0x09, 0xbb, 0x04, 0x05, 0x97, 0xff, 0xfe, 0x2f, 0xf2, 0x1a, 0x59, 0xba, + 0x5f, 0x8f, 0x41, 0xa1, 0x8d, 0xd5, 0x97, 0xb7, 0x47, 0x0b, 0x29, 0xd1, + 0x1e, 0x17, 0x0b, 0xf0, 0x7f, 0x34, 0x1a, 0xb2, 0xff, 0xa2, 0x7e, 0x4c, + 0xc7, 0x79, 0x96, 0x50, 0xd5, 0x04, 0x76, 0x8e, 0xc9, 0x73, 0x17, 0xfa, + 0x18, 0x04, 0x45, 0xba, 0x55, 0x7f, 0xff, 0xf6, 0x6e, 0x93, 0xf7, 0xba, + 0x2f, 0x8c, 0x61, 0x67, 0x36, 0x3f, 0xc3, 0x0b, 0x2e, 0x03, 0x2c, 0xad, + 0x22, 0x47, 0x8f, 0x77, 0xf7, 0x6f, 0xa9, 0xf0, 0xc5, 0x95, 0x87, 0xa6, + 0xc4, 0x77, 0xff, 0xef, 0x61, 0x61, 0xbe, 0x79, 0x78, 0xc7, 0x10, 0xeb, + 0x2d, 0xd2, 0xcb, 0xfe, 0x86, 0xe6, 0x37, 0xa3, 0xeb, 0x2a, 0x47, 0x91, + 0xe1, 0x2b, 0xee, 0xdd, 0xfb, 0x54, 0x5a, 0xcb, 0xff, 0x9b, 0x5e, 0x7e, + 0x3f, 0xc9, 0xc0, 0xb2, 0xf9, 0xb5, 0xb8, 0x35, 0x95, 0x24, 0xd6, 0x1a, + 0x13, 0xfa, 0x22, 0xf1, 0x86, 0xf4, 0x2b, 0xf6, 0x49, 0xbc, 0x15, 0x97, + 0xfd, 0x20, 0xb7, 0xa7, 0x72, 0x1a, 0xcb, 0xff, 0x13, 0xea, 0x26, 0xd9, + 0x9a, 0x65, 0x97, 0xf3, 0x1d, 0xe6, 0xcf, 0x2c, 0xa6, 0x3e, 0xc3, 0x9f, + 0xdf, 0x81, 0x9b, 0xa5, 0xf5, 0x97, 0xf8, 0x25, 0x9b, 0xac, 0x63, 0x2c, + 0xbe, 0xe3, 0x97, 0x6b, 0x2b, 0xc7, 0xaf, 0xba, 0x6b, 0x50, 0x8a, 0x6c, + 0x84, 0x0d, 0xed, 0x41, 0xd6, 0x5f, 0xde, 0xce, 0x44, 0xfb, 0xab, 0x2f, + 0xff, 0x0e, 0x0e, 0x51, 0xb2, 0x69, 0x46, 0xa7, 0x59, 0x70, 0x06, 0xb2, + 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x50, 0x6b, 0xec, 0xef, 0x3a, 0x59, 0x74, + 0x85, 0xc2, 0x2f, 0x46, 0x9b, 0x82, 0xfe, 0x36, 0xac, 0x4c, 0xdd, 0xe1, + 0xdd, 0x7f, 0xde, 0xdd, 0x70, 0x0b, 0x8e, 0x18, 0xb2, 0xf4, 0xd1, 0xf5, + 0x95, 0x07, 0xb9, 0x87, 0xf6, 0xed, 0x65, 0xfd, 0xec, 0xff, 0x9c, 0xeb, + 0x2f, 0xf6, 0xcf, 0xc1, 0xdb, 0x53, 0x2c, 0xac, 0x3e, 0x30, 0x16, 0xdf, + 0xd8, 0x5d, 0xb9, 0x01, 0x65, 0x6c, 0x46, 0x11, 0x3a, 0xf0, 0x86, 0xff, + 0x4a, 0x35, 0x3c, 0x6a, 0x75, 0x97, 0xfb, 0xa9, 0x46, 0x7f, 0x66, 0x2c, + 0xbd, 0xdc, 0x76, 0xb2, 0xa1, 0x11, 0x18, 0x6a, 0xe6, 0xb7, 0xe3, 0xe6, + 0xe9, 0x01, 0x65, 0xec, 0x3b, 0x2c, 0xbe, 0xd3, 0x1a, 0x75, 0x97, 0xbf, + 0x9e, 0x59, 0x7f, 0xa0, 0xbf, 0x1a, 0x63, 0xac, 0xbb, 0xec, 0xb2, 0xff, + 0xfb, 0x00, 0xfa, 0xcd, 0xf8, 0x3c, 0x3c, 0x76, 0xb2, 0xa1, 0x31, 0xb1, + 0x95, 0x60, 0xd9, 0xa4, 0x7e, 0x1c, 0x73, 0x12, 0x16, 0xb8, 0xf3, 0x2c, + 0xbe, 0x00, 0x4a, 0x65, 0x97, 0x37, 0x6b, 0x2a, 0x0d, 0xd6, 0xd9, 0x1d, + 0xbd, 0xb0, 0xfd, 0x45, 0xa9, 0x5f, 0x9f, 0x87, 0x80, 0x2c, 0xbf, 0x4c, + 0x07, 0x29, 0x96, 0x5c, 0x4c, 0xb2, 0xa0, 0xdf, 0x76, 0x53, 0x7c, 0xe0, + 0xcd, 0x2c, 0xbe, 0x81, 0x63, 0x1a, 0xcb, 0xfd, 0x81, 0xef, 0xd1, 0xac, + 0x59, 0x7f, 0xda, 0x83, 0x0b, 0x06, 0xda, 0x59, 0x7f, 0xfd, 0x9e, 0xf3, + 0xb7, 0xe0, 0xb3, 0xd9, 0xda, 0xca, 0xc4, 0xeb, 0xcd, 0x2c, 0x66, 0x5f, + 0x10, 0x91, 0x0f, 0x09, 0x02, 0x67, 0xb6, 0x71, 0x7f, 0xa6, 0x6f, 0x86, + 0x66, 0xfa, 0xcb, 0xff, 0x9f, 0x77, 0x99, 0xba, 0x4f, 0xfc, 0xdd, 0x59, + 0x7f, 0xff, 0xf6, 0x80, 0xe3, 0x8d, 0x6e, 0xf3, 0x37, 0x48, 0x11, 0x30, + 0x9b, 0xa1, 0x3a, 0xcb, 0xff, 0xf9, 0xff, 0x87, 0xc6, 0x9a, 0x5e, 0xc1, + 0x87, 0xfc, 0x59, 0x7f, 0xfd, 0xc6, 0x9d, 0xf8, 0xe4, 0xff, 0xf4, 0x4c, + 0xb2, 0xff, 0xce, 0x40, 0xcf, 0xc1, 0x30, 0x16, 0x54, 0x26, 0xc4, 0x37, + 0xdf, 0xad, 0xed, 0xa7, 0xd8, 0x58, 0xa1, 0xb1, 0x21, 0xda, 0x46, 0xf1, + 0x29, 0x0a, 0x51, 0xa9, 0x64, 0x6f, 0x06, 0xa8, 0xf4, 0x4e, 0xd0, 0xa5, + 0x9a, 0x18, 0xfa, 0x26, 0x3c, 0x6a, 0x7e, 0x84, 0x1b, 0xc3, 0x88, 0xa1, + 0x73, 0xc8, 0xd2, 0x3f, 0x2a, 0x18, 0x2e, 0x66, 0x1a, 0x89, 0x1d, 0x6d, + 0xfe, 0x34, 0x5b, 0xfb, 0xd9, 0x3a, 0xcb, 0xff, 0xc2, 0xce, 0xf2, 0x17, + 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x16, 0xbf, 0xc2, 0xf3, 0x5d, 0xbb, 0xf6, + 0xa8, 0xba, 0x95, 0x10, 0x9d, 0x34, 0x94, 0x73, 0xb8, 0xd9, 0xdc, 0x39, + 0x1a, 0x77, 0x28, 0xf3, 0xf1, 0x3e, 0xbf, 0x69, 0x87, 0x94, 0xda, 0x0a, + 0xc6, 0xf4, 0xa3, 0x5c, 0xe1, 0xbf, 0xd7, 0x2f, 0xda, 0xed, 0xdf, 0xb5, + 0x44, 0x42, 0xb4, 0xeb, 0x2f, 0x79, 0x89, 0x65, 0xd8, 0x35, 0x96, 0xed, + 0x65, 0x76, 0x78, 0x7e, 0x1b, 0x21, 0x6b, 0xec, 0xde, 0xda, 0x59, 0x7c, + 0xda, 0xce, 0x96, 0x56, 0x23, 0xfc, 0xd3, 0x6e, 0x95, 0x77, 0x0b, 0xf6, + 0xc8, 0xef, 0x8a, 0x01, 0xc5, 0x97, 0xf6, 0x83, 0xed, 0xf8, 0x35, 0x97, + 0xb3, 0x06, 0xb2, 0xef, 0x8b, 0x98, 0xfb, 0x34, 0x42, 0x46, 0x14, 0x2d, + 0x1f, 0x59, 0x0b, 0xdb, 0xff, 0x85, 0x8a, 0xe0, 0xbe, 0x21, 0xcb, 0x27, + 0x59, 0x6d, 0xb5, 0x97, 0xd1, 0xe8, 0x3a, 0xcb, 0xee, 0xdd, 0xfb, 0x54, + 0x46, 0xca, 0xec, 0xf4, 0x74, 0x43, 0x61, 0x63, 0x44, 0x46, 0x32, 0xdf, + 0xe1, 0x79, 0xae, 0xdd, 0xfb, 0x54, 0x53, 0x6b, 0x9e, 0x4b, 0x2f, 0xbb, + 0x77, 0xed, 0x51, 0x50, 0x28, 0x67, 0x8d, 0xa1, 0x6b, 0xd9, 0xd1, 0x8b, + 0x2c, 0x2f, 0x0f, 0x03, 0xc4, 0x57, 0xf8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, + 0x15, 0x32, 0xe0, 0x32, 0xcb, 0xc1, 0x6d, 0x2c, 0xbe, 0xed, 0xdf, 0xb5, + 0x45, 0x60, 0xbe, 0xfc, 0x75, 0x25, 0x95, 0xa3, 0xd3, 0x39, 0x85, 0xf9, + 0x8c, 0x18, 0x74, 0xb2, 0xd3, 0xac, 0xb8, 0x49, 0x2c, 0xbc, 0xe5, 0xda, + 0xca, 0x83, 0xc6, 0x00, 0x97, 0xc6, 0x2e, 0xe1, 0x2c, 0xb8, 0x66, 0xac, + 0xbd, 0x00, 0x65, 0x97, 0x1f, 0x8b, 0x2f, 0xcf, 0x2f, 0xb4, 0xeb, 0x2f, + 0xdc, 0xe1, 0x60, 0x16, 0x53, 0x1e, 0x7b, 0x94, 0x5c, 0xdb, 0x6b, 0x2d, + 0xa5, 0x97, 0x9b, 0x6d, 0xe0, 0xd5, 0x04, 0x66, 0xff, 0x0b, 0xcd, 0x76, + 0xef, 0xda, 0xa2, 0x3f, 0x5c, 0x1e, 0x2c, 0xbc, 0x50, 0x35, 0x95, 0x08, + 0xa8, 0x91, 0x98, 0xd0, 0xd8, 0x5e, 0xfb, 0x30, 0xa4, 0xb2, 0xd0, 0xb2, + 0xd3, 0xac, 0xbf, 0x37, 0x3e, 0x17, 0x59, 0x50, 0x6e, 0x46, 0x25, 0x52, + 0x3e, 0x9c, 0x49, 0xbd, 0x30, 0x74, 0xb2, 0xe1, 0x92, 0xca, 0x83, 0x69, + 0xe1, 0xeb, 0xfb, 0xa9, 0x3c, 0x98, 0x96, 0x5e, 0x82, 0x99, 0x65, 0xf4, + 0xd2, 0x8e, 0x96, 0x5f, 0x47, 0x1a, 0x65, 0x95, 0x88, 0x8f, 0x34, 0xb5, + 0x87, 0x34, 0x49, 0x78, 0xd7, 0xfa, 0xcb, 0x9f, 0xeb, 0x2e, 0x3e, 0xea, + 0xcb, 0xbf, 0xf5, 0x96, 0x16, 0x2a, 0x2e, 0xa6, 0x8c, 0x5b, 0x1b, 0xfb, + 0x22, 0xe9, 0xbd, 0x8b, 0xb7, 0x05, 0xb4, 0x30, 0x71, 0xbf, 0x33, 0x3c, + 0x3c, 0x80, 0x76, 0x50, 0x89, 0xe2, 0xaf, 0xe1, 0x5e, 0x13, 0xcd, 0xb1, + 0xd1, 0x05, 0xb7, 0x46, 0xaf, 0xff, 0x0b, 0x3b, 0xc8, 0x5e, 0x6b, 0xb7, + 0x7e, 0xd5, 0x13, 0x7a, 0xff, 0xe3, 0xbc, 0x85, 0xe6, 0xbb, 0x77, 0xed, + 0x51, 0x3f, 0x2f, 0x6d, 0x5b, 0x5e, 0xd4, 0xb2, 0xff, 0xff, 0xbc, 0x1f, + 0x93, 0x9b, 0xd7, 0xf5, 0x19, 0xd3, 0xb7, 0x4e, 0xb2, 0xdb, 0x56, 0xd4, + 0x89, 0x4c, 0x2c, 0xbf, 0x9c, 0xf0, 0x78, 0x11, 0x65, 0xff, 0xb6, 0xb1, + 0x4b, 0xcb, 0xcd, 0xbf, 0x27, 0x59, 0x73, 0xc9, 0x65, 0xcc, 0x75, 0x95, + 0xb5, 0xa3, 0x57, 0x6a, 0x32, 0x14, 0x96, 0xed, 0x24, 0xad, 0x0b, 0x5f, + 0xfb, 0x6a, 0x81, 0xe6, 0xf2, 0x08, 0x90, 0xb2, 0xfb, 0x6a, 0x9f, 0x80, + 0x59, 0x7e, 0x79, 0xfe, 0x13, 0x56, 0x5f, 0xbb, 0xd1, 0x44, 0x96, 0x50, + 0xab, 0x3f, 0xbd, 0x14, 0xb9, 0x55, 0xc2, 0x1d, 0x65, 0xfd, 0x86, 0xb7, + 0xca, 0x16, 0x57, 0x67, 0x89, 0xb6, 0x31, 0x74, 0x8e, 0xb2, 0xfe, 0xe3, + 0x9f, 0x51, 0xc5, 0x97, 0xed, 0x47, 0x83, 0x0b, 0x2f, 0xde, 0xcf, 0xc0, + 0xd6, 0x56, 0xd6, 0x9f, 0x86, 0xd5, 0x0c, 0x01, 0x4b, 0xc6, 0xd3, 0x26, + 0x15, 0x62, 0xec, 0x5a, 0xe4, 0xf7, 0xed, 0xaa, 0x3f, 0x03, 0x59, 0x7b, + 0x98, 0x4b, 0x2f, 0xe1, 0x46, 0xd0, 0x78, 0xcf, 0xac, 0xbf, 0xc2, 0xaf, + 0x6a, 0x6d, 0xbf, 0x30, 0xad, 0x65, 0xc5, 0xda, 0xcb, 0xee, 0x4c, 0x7e, + 0x2c, 0xbf, 0x17, 0xfc, 0xc7, 0x59, 0x7d, 0x30, 0x5c, 0x45, 0x95, 0x07, + 0x96, 0xe4, 0xf7, 0x8f, 0x1c, 0x59, 0x77, 0x7d, 0xac, 0xbf, 0xdd, 0xf9, + 0xbf, 0x98, 0x75, 0x97, 0x6f, 0xed, 0x71, 0x81, 0x2b, 0x6b, 0x4f, 0xdc, + 0x50, 0x59, 0xb4, 0xc6, 0xc5, 0x59, 0xb4, 0x22, 0xb0, 0xbc, 0xcd, 0xfa, + 0x20, 0x00, 0xe7, 0x06, 0x7e, 0x67, 0x7e, 0xda, 0xc5, 0x3b, 0x79, 0xd2, + 0xcb, 0xfb, 0x6a, 0x79, 0xfc, 0xdb, 0x8b, 0x2f, 0xfb, 0x67, 0xfd, 0x87, + 0xcd, 0x62, 0xcb, 0xf8, 0x55, 0x6d, 0x7b, 0x58, 0xa7, 0x90, 0xb2, 0xfd, + 0xb4, 0x1a, 0x6e, 0x6e, 0x2c, 0xbf, 0xbe, 0xc4, 0x66, 0x12, 0xcb, 0xb7, + 0xf6, 0xb8, 0xc0, 0x56, 0xf2, 0xcb, 0x80, 0x05, 0x95, 0xb5, 0x27, 0x28, + 0x29, 0x35, 0x14, 0x1b, 0x6d, 0x23, 0xa1, 0x56, 0x85, 0x86, 0x5f, 0x2c, + 0x09, 0x38, 0x82, 0x37, 0xd2, 0x71, 0xb2, 0xcb, 0xfb, 0xcd, 0xf2, 0x89, + 0x96, 0x5c, 0xf8, 0xb2, 0xbb, 0x3c, 0x2d, 0x16, 0xdf, 0x38, 0xf0, 0xeb, + 0x2f, 0x77, 0x04, 0xb2, 0xff, 0xdb, 0xe3, 0xcd, 0x13, 0x4d, 0x1d, 0xac, + 0xa1, 0x4a, 0x60, 0xbb, 0x43, 0x18, 0xa8, 0x47, 0x84, 0x2c, 0x39, 0x7c, + 0x28, 0x9c, 0xfc, 0x59, 0x7f, 0x64, 0xd0, 0x4d, 0xd2, 0xcb, 0xf8, 0x98, + 0xdf, 0x3c, 0x96, 0x5f, 0xff, 0x3f, 0xe0, 0xbb, 0x63, 0x8c, 0x2f, 0xa9, + 0x2c, 0xa3, 0x9f, 0xe1, 0x16, 0xdf, 0x8c, 0xff, 0xe0, 0xeb, 0x2b, 0x68, + 0x3c, 0xa9, 0xc8, 0x6f, 0xf9, 0xfc, 0xdb, 0xc5, 0x98, 0x61, 0x89, 0x2f, + 0xf7, 0x9f, 0xff, 0x77, 0x31, 0x65, 0xd0, 0x35, 0x97, 0xec, 0xed, 0xf8, + 0xcb, 0x28, 0x50, 0x9f, 0x9e, 0xd2, 0x28, 0x15, 0x21, 0xe6, 0x2a, 0x8a, + 0x05, 0x5a, 0x07, 0x46, 0x7e, 0x16, 0xbf, 0xff, 0xde, 0x6e, 0x44, 0xb3, + 0xcd, 0xaf, 0x3e, 0x07, 0x3c, 0xb2, 0xff, 0xfb, 0x50, 0xdf, 0xf6, 0x0d, + 0xb9, 0x84, 0x05, 0x96, 0x14, 0xba, 0x2a, 0xf8, 0xbd, 0x77, 0x21, 0x65, + 0x6d, 0x67, 0x85, 0x22, 0xcb, 0xfb, 0x72, 0x34, 0xef, 0x25, 0x97, 0xef, + 0x33, 0x80, 0x55, 0xac, 0xbd, 0x1d, 0x49, 0x65, 0x6d, 0x48, 0xa0, 0xda, + 0x64, 0xff, 0x2f, 0xdd, 0x2d, 0xbf, 0xf6, 0xd1, 0xb5, 0x4c, 0x50, 0x3c, + 0xeb, 0xeb, 0x2f, 0xb0, 0x6f, 0x25, 0x97, 0xfb, 0x04, 0x3e, 0x16, 0x6e, + 0x2c, 0xbd, 0xa0, 0xee, 0xac, 0xad, 0xa1, 0x18, 0x02, 0xa2, 0x50, 0xaa, + 0x21, 0x09, 0xad, 0xff, 0xfb, 0x6a, 0x27, 0xfc, 0x61, 0x48, 0xf1, 0x84, + 0x35, 0x97, 0xc5, 0x8c, 0x05, 0x97, 0xdb, 0x48, 0x06, 0xc2, 0xcb, 0xf3, + 0x68, 0x00, 0x85, 0x97, 0x34, 0xeb, 0x2b, 0x6b, 0x46, 0xe8, 0xa5, 0x58, + 0x50, 0x41, 0x22, 0x9f, 0x93, 0xde, 0x7c, 0xf2, 0xcb, 0xfe, 0x7f, 0xf5, + 0x2f, 0xe6, 0x8d, 0x59, 0x73, 0x01, 0x65, 0x6d, 0x47, 0xd8, 0x2a, 0xc6, + 0xc8, 0xee, 0xf8, 0x54, 0xda, 0x05, 0x7b, 0x52, 0xcb, 0xff, 0x44, 0x44, + 0x44, 0x47, 0x5c, 0x59, 0x7a, 0x68, 0xfa, 0xcb, 0xa2, 0x20, 0xf6, 0x26, + 0x3b, 0xbf, 0xfd, 0xe8, 0x9b, 0xae, 0x67, 0x5b, 0x91, 0x04, 0xb2, 0xf3, + 0x75, 0x8b, 0x2f, 0xda, 0x69, 0xdc, 0xe9, 0x2e, 0x30, 0xc4, 0x95, 0x87, + 0x82, 0x61, 0x45, 0x82, 0x90, 0x59, 0xa2, 0xbd, 0xec, 0xed, 0x65, 0x42, + 0x67, 0x3e, 0x2c, 0x02, 0x77, 0x1f, 0xc4, 0x23, 0xbf, 0x07, 0x6e, 0x03, + 0xd2, 0xcb, 0xff, 0x47, 0xb0, 0x18, 0x3f, 0x3c, 0x96, 0x5f, 0x39, 0x46, + 0xea, 0xcb, 0xfa, 0x50, 0x78, 0xd6, 0x96, 0x56, 0x22, 0xe7, 0x45, 0x8e, + 0x7a, 0x12, 0x3b, 0xff, 0xfb, 0xec, 0x7c, 0x2f, 0xf2, 0x0d, 0xe0, 0x47, + 0xe6, 0x59, 0x7f, 0xba, 0x96, 0xce, 0x30, 0x74, 0xb2, 0xff, 0xf3, 0xb1, + 0x60, 0x36, 0x46, 0xa7, 0x8f, 0xac, 0xbf, 0xf6, 0xeb, 0x6e, 0x7a, 0x68, + 0xdc, 0x73, 0xac, 0xbf, 0xf6, 0x1e, 0x39, 0xcc, 0x96, 0xde, 0x2c, 0xa1, + 0xa3, 0x4b, 0xc9, 0x44, 0x91, 0x7e, 0x3b, 0x9f, 0x06, 0xb2, 0xff, 0xbf, + 0xdf, 0x98, 0x8a, 0x3a, 0x59, 0x50, 0x7c, 0x0e, 0x4f, 0x7f, 0xe8, 0x9e, + 0x38, 0xdb, 0x79, 0xa8, 0x59, 0x5b, 0x15, 0x29, 0xe2, 0xdb, 0x46, 0x13, + 0xe8, 0x47, 0x91, 0x05, 0xff, 0x14, 0x6c, 0x9a, 0x51, 0xa9, 0xd6, 0x5f, + 0xec, 0x1b, 0x6f, 0xe0, 0x3b, 0x59, 0x7f, 0xff, 0xec, 0xde, 0xdf, 0x96, + 0x03, 0x85, 0x80, 0xd4, 0x4e, 0xfa, 0xed, 0x65, 0xd1, 0x27, 0x45, 0x27, + 0x0d, 0xaf, 0xef, 0xf3, 0x32, 0x78, 0x59, 0x47, 0x4c, 0xeb, 0xd0, 0xe0, + 0x22, 0xdb, 0xee, 0x0f, 0xe1, 0x59, 0x7f, 0xff, 0xf6, 0xf8, 0xd6, 0x0c, + 0x9f, 0x46, 0xbf, 0xc3, 0xf6, 0xff, 0x3c, 0xcb, 0x2f, 0xf6, 0x82, 0x41, + 0xf8, 0x7e, 0xb2, 0xf7, 0xa0, 0x96, 0x53, 0x1e, 0x7f, 0xcd, 0x2f, 0xb4, + 0x27, 0xf8, 0xb2, 0xa0, 0xf1, 0x70, 0x86, 0xff, 0x44, 0xc5, 0x07, 0x0c, + 0xeb, 0x2f, 0xcf, 0xc6, 0x38, 0x56, 0x51, 0xcf, 0x6f, 0xc6, 0x97, 0x1a, + 0x62, 0xcb, 0xff, 0xf4, 0xa0, 0x8a, 0x27, 0x31, 0xe7, 0xf3, 0x41, 0x2c, + 0xa8, 0x54, 0xd3, 0xd9, 0xab, 0x11, 0xfa, 0x30, 0x77, 0x7b, 0xf9, 0x10, + 0x46, 0x6f, 0x9a, 0x77, 0x3a, 0xcb, 0xc4, 0xd0, 0xb2, 0xfd, 0x02, 0x1f, + 0xcc, 0xb2, 0x86, 0x7c, 0x9a, 0x22, 0x21, 0xab, 0xed, 0xf2, 0x3c, 0x2c, + 0xbf, 0x3c, 0xf0, 0xfd, 0xac, 0xbe, 0x8e, 0x41, 0xd6, 0x5f, 0xe8, 0x9c, + 0x83, 0x9d, 0x7d, 0x65, 0x84, 0xd8, 0x7a, 0xbe, 0x21, 0xac, 0x46, 0x67, + 0x89, 0x1d, 0xf6, 0xfe, 0x97, 0x3f, 0x84, 0x6a, 0xcb, 0xee, 0x3c, 0xb7, + 0x16, 0x5f, 0xfa, 0x5c, 0x89, 0x40, 0x39, 0x9b, 0xd6, 0x5e, 0x81, 0xb2, + 0xcb, 0xfd, 0xa1, 0x3f, 0xc9, 0xf0, 0xc5, 0x97, 0xff, 0x47, 0x79, 0xac, + 0xf3, 0x6b, 0xce, 0xb2, 0xff, 0xf3, 0x73, 0x07, 0xa8, 0x0f, 0xc9, 0xb7, + 0xac, 0xb9, 0xcc, 0x59, 0x5d, 0x9f, 0x09, 0x89, 0x57, 0xff, 0x46, 0xa5, + 0xdf, 0x9a, 0x62, 0x73, 0x16, 0x5f, 0xfd, 0xa7, 0x9c, 0x7e, 0x8e, 0x7c, + 0x3e, 0x59, 0x5c, 0x44, 0x67, 0xd1, 0xaf, 0x7d, 0xa6, 0x59, 0x63, 0xc9, + 0x3e, 0x6c, 0x1b, 0xd1, 0xbf, 0xa1, 0x49, 0xc8, 0x58, 0x7c, 0x8e, 0xfa, + 0x0f, 0x1e, 0x59, 0x7e, 0x83, 0x07, 0x87, 0x59, 0x66, 0x91, 0xe4, 0x88, + 0x43, 0x50, 0xab, 0xfb, 0x25, 0x13, 0x7a, 0x16, 0x17, 0xf3, 0x81, 0xfb, + 0x7d, 0x2c, 0xbf, 0xfe, 0x09, 0x14, 0x1a, 0x7f, 0x47, 0x5f, 0x8f, 0x2c, + 0xbf, 0xff, 0x8b, 0xfc, 0x0c, 0x7a, 0x0e, 0x58, 0x03, 0xc4, 0x96, 0x5e, + 0x1b, 0xf9, 0x65, 0xff, 0x47, 0xa3, 0xa9, 0x4a, 0x27, 0x59, 0x7d, 0xdf, + 0x9b, 0x4b, 0x2f, 0xed, 0xc2, 0xc9, 0xf0, 0xc5, 0x95, 0x09, 0x81, 0xe2, + 0xce, 0x87, 0x1c, 0xe8, 0x24, 0x77, 0xff, 0xbc, 0xc7, 0x1c, 0x6c, 0xdb, + 0x0f, 0x9b, 0x4b, 0x2f, 0xef, 0xc7, 0x8a, 0x24, 0xb2, 0xb6, 0x1f, 0xdb, + 0x27, 0xd2, 0xcb, 0xf8, 0x9c, 0xd6, 0xd4, 0x48, 0xd7, 0x78, 0x8e, 0xf9, + 0xff, 0xa8, 0x59, 0x7e, 0x8d, 0x69, 0xe6, 0x59, 0x73, 0x74, 0xb2, 0xff, + 0x00, 0x38, 0x03, 0xbc, 0x96, 0x5d, 0x90, 0xb2, 0xa4, 0x7b, 0xfd, 0x0b, + 0x9c, 0xce, 0xa7, 0x45, 0xbb, 0xc2, 0x1e, 0xff, 0xff, 0x79, 0xba, 0x82, + 0x8e, 0x0f, 0xd1, 0xc6, 0x2e, 0xa4, 0xb2, 0xff, 0xff, 0xbc, 0xe3, 0xf3, + 0x13, 0xfe, 0x26, 0x63, 0x58, 0xb3, 0x7a, 0xcb, 0xfe, 0x6f, 0xe6, 0xb4, + 0x19, 0xf7, 0xac, 0xbf, 0xee, 0x67, 0xc7, 0x98, 0x0e, 0x2c, 0xaf, 0x1f, + 0xa7, 0xcf, 0x2f, 0xf9, 0xbf, 0x9a, 0xd0, 0x67, 0xde, 0xb2, 0xe0, 0x96, + 0xc3, 0xde, 0xf1, 0x15, 0x42, 0x78, 0xf8, 0xc1, 0xc8, 0xce, 0x2a, 0x4c, + 0x90, 0xe1, 0xcb, 0x23, 0xc3, 0xce, 0xcb, 0x75, 0x1a, 0x9f, 0xa1, 0xe2, + 0x04, 0x22, 0x86, 0xc7, 0x23, 0xef, 0xbe, 0x3b, 0x0e, 0x16, 0x5f, 0xcd, + 0xed, 0x69, 0xa7, 0x59, 0x50, 0x79, 0xfe, 0x21, 0xb8, 0xcf, 0xac, 0xbf, + 0xf9, 0x9b, 0xd3, 0x67, 0xe3, 0xf0, 0x35, 0x97, 0xc2, 0x1a, 0x21, 0xab, + 0x2d, 0x0b, 0x2f, 0xff, 0xa3, 0xa9, 0x39, 0x03, 0x60, 0x1b, 0x4c, 0x6a, + 0xca, 0x84, 0x72, 0x4c, 0x30, 0x62, 0x1e, 0xd9, 0x3e, 0xe8, 0x85, 0xfe, + 0x8e, 0xa6, 0xf4, 0x11, 0xab, 0x2e, 0x29, 0x96, 0x5e, 0xe7, 0x99, 0x65, + 0x1c, 0xd9, 0xfc, 0x5e, 0xfa, 0x73, 0xb4, 0x96, 0x5f, 0x40, 0x04, 0x3a, + 0xcb, 0xe2, 0x0b, 0xc9, 0x65, 0x76, 0x78, 0x9c, 0x23, 0xbf, 0xa0, 0xe2, + 0xc0, 0x08, 0x59, 0x78, 0x57, 0x1f, 0x59, 0x7f, 0x1e, 0x30, 0xbf, 0xc5, + 0x95, 0xe3, 0xfb, 0x09, 0x7e, 0xe9, 0x05, 0x42, 0x66, 0xf8, 0xce, 0xd0, + 0x9e, 0xbf, 0x37, 0xbf, 0x9d, 0xac, 0xbd, 0x84, 0x05, 0x95, 0x31, 0xe1, + 0xee, 0x94, 0x54, 0x2a, 0x5c, 0xc6, 0x8d, 0x46, 0xb0, 0xee, 0xd7, 0xf8, + 0x62, 0x46, 0xe7, 0x83, 0xc5, 0x97, 0xed, 0xd6, 0x3e, 0x7d, 0x65, 0xfb, + 0xf9, 0xf2, 0x85, 0x95, 0xd2, 0x22, 0x0e, 0x70, 0x45, 0x57, 0x82, 0xfc, + 0x59, 0x74, 0x18, 0xb2, 0xb4, 0x6c, 0xf8, 0x39, 0x73, 0xf9, 0x65, 0xd3, + 0x42, 0xcb, 0xa3, 0xeb, 0x2a, 0x0d, 0x69, 0xa2, 0xf7, 0xc3, 0xc2, 0x92, + 0xcb, 0xf6, 0x34, 0xbd, 0x0b, 0x2e, 0x9b, 0xec, 0x78, 0xfe, 0x21, 0xbf, + 0xff, 0x0f, 0xd1, 0xa6, 0x04, 0x09, 0x13, 0x14, 0x1d, 0x65, 0xfe, 0x36, + 0x0b, 0xfc, 0x7f, 0x2c, 0xa8, 0x45, 0xb3, 0x17, 0x3a, 0xad, 0xf8, 0xb1, + 0xca, 0x75, 0x95, 0x0a, 0x8e, 0x31, 0x8d, 0x88, 0x5d, 0x0c, 0xa3, 0x1e, + 0xe1, 0x6d, 0xe7, 0xcd, 0x2c, 0xbf, 0xec, 0xe4, 0x0f, 0x90, 0xc3, 0x59, + 0x7f, 0x44, 0xfa, 0x8c, 0x1a, 0xcb, 0xff, 0x61, 0xf9, 0xe8, 0xeb, 0xf1, + 0xe5, 0x97, 0xf7, 0xa3, 0xff, 0x83, 0xac, 0xbf, 0xff, 0xb5, 0x83, 0xe1, + 0x07, 0x24, 0x17, 0x1f, 0x33, 0x4b, 0x28, 0x68, 0x87, 0x62, 0xda, 0xd2, + 0x6c, 0xe7, 0x1b, 0xf1, 0xbf, 0xcb, 0x44, 0x86, 0x35, 0xf1, 0x41, 0xf8, + 0xb2, 0xf1, 0xdf, 0xa5, 0x9f, 0x34, 0x37, 0x7f, 0xb5, 0x97, 0xcd, 0xa0, + 0x71, 0x65, 0x61, 0xf3, 0xe8, 0xb7, 0xe3, 0x17, 0xf1, 0x46, 0xc0, 0x02, + 0x16, 0x5f, 0x38, 0x22, 0x4b, 0x2f, 0xe9, 0x78, 0x1b, 0xc5, 0x3b, 0x52, + 0xcb, 0xf9, 0xca, 0x3d, 0xe8, 0x59, 0x7f, 0xa3, 0x4f, 0x12, 0x89, 0x2c, + 0xb8, 0x24, 0xb2, 0xec, 0xed, 0x65, 0xd1, 0x2f, 0x1a, 0xdf, 0x8b, 0x57, + 0x48, 0xef, 0x98, 0xeb, 0x45, 0x64, 0xbd, 0x7f, 0xfc, 0x59, 0xbf, 0xb7, + 0xd4, 0xef, 0xf7, 0xe8, 0x0b, 0x2f, 0xf6, 0x0d, 0xb8, 0x63, 0xe9, 0x65, + 0x42, 0xb0, 0x91, 0xc3, 0x67, 0x0b, 0xbb, 0x2e, 0x68, 0xc4, 0x1c, 0xfb, + 0xea, 0x77, 0xf8, 0x9e, 0x7e, 0xa5, 0x1b, 0xab, 0x2f, 0xf7, 0x3c, 0xe2, + 0x7a, 0x24, 0xb2, 0xa7, 0x3e, 0xbe, 0x8d, 0xee, 0xc9, 0x96, 0x5f, 0xf9, + 0xfa, 0xf4, 0x30, 0x1f, 0xe1, 0x59, 0x7f, 0xff, 0xa1, 0xa4, 0xfc, 0xe4, + 0x61, 0x44, 0xb0, 0xef, 0xd2, 0xcb, 0x61, 0xd1, 0x37, 0xf3, 0xea, 0xc4, + 0x6d, 0x72, 0x16, 0x57, 0xec, 0x9f, 0x3a, 0x92, 0xcb, 0xff, 0xef, 0x41, + 0xdb, 0x4d, 0xbb, 0x02, 0x4f, 0x86, 0x2c, 0xbf, 0xf6, 0x0e, 0x04, 0x39, + 0x47, 0x52, 0x59, 0x7f, 0x60, 0x7b, 0x13, 0x3a, 0x59, 0x43, 0x47, 0x64, + 0xc5, 0x3c, 0x54, 0xde, 0x7f, 0x7f, 0xe6, 0xd4, 0x70, 0x42, 0x28, 0xd2, + 0xcb, 0xfe, 0x89, 0x13, 0xfe, 0x4d, 0xbd, 0x65, 0xe1, 0x20, 0x0b, 0x2b, + 0xc7, 0xad, 0xc3, 0x9b, 0x6e, 0x2c, 0xbf, 0xec, 0x98, 0xa2, 0x7e, 0x47, + 0x6b, 0x2e, 0x96, 0x2c, 0xaf, 0x1e, 0x87, 0xce, 0xae, 0xe6, 0x2c, 0xbf, + 0x44, 0xcd, 0x1c, 0x59, 0x7f, 0xf7, 0x23, 0x5d, 0xfc, 0xb2, 0x77, 0x25, + 0x97, 0xfe, 0xff, 0xb3, 0x7b, 0x90, 0xf0, 0x0b, 0x2d, 0xe5, 0x95, 0x0a, + 0x93, 0x27, 0x40, 0xc8, 0x49, 0xb1, 0x13, 0xb2, 0x00, 0x88, 0x85, 0xbe, + 0x4e, 0x14, 0x43, 0x0f, 0xee, 0xf9, 0xd6, 0x5f, 0xcf, 0x9a, 0x00, 0x21, + 0x65, 0xfb, 0x3c, 0xcf, 0x25, 0x97, 0xdc, 0xe8, 0xb4, 0xb2, 0xff, 0x6b, + 0x3c, 0xc5, 0x07, 0x59, 0x7f, 0xfd, 0x8c, 0x59, 0x34, 0x4e, 0xf3, 0x9d, + 0xa7, 0x59, 0x50, 0x88, 0x1e, 0x18, 0xd4, 0x26, 0x5e, 0xe2, 0xfc, 0x2c, + 0xf9, 0x30, 0x61, 0x49, 0x7f, 0xdf, 0x7e, 0x67, 0xbc, 0xc7, 0x59, 0x77, + 0xb8, 0xb2, 0xff, 0xb3, 0x98, 0xc3, 0x76, 0x9d, 0x65, 0xff, 0x89, 0xc1, + 0x85, 0xfe, 0x3c, 0x96, 0x54, 0x23, 0x08, 0xd3, 0x8d, 0x0b, 0xfc, 0xde, + 0xfc, 0x51, 0x3c, 0x4e, 0xb2, 0x86, 0x7c, 0xb3, 0x1e, 0xdf, 0xc3, 0x87, + 0xd0, 0x02, 0xb2, 0xec, 0xf2, 0xca, 0x9c, 0xf0, 0xf7, 0x96, 0xdf, 0xd8, + 0x30, 0x31, 0x7d, 0x65, 0xff, 0xf6, 0x31, 0xd8, 0x0f, 0xf2, 0xc9, 0xf5, + 0x0b, 0x2f, 0x7b, 0xec, 0xb2, 0xfe, 0xdc, 0xcd, 0xe5, 0x92, 0x59, 0x73, + 0x4c, 0xb2, 0x98, 0xf2, 0x3e, 0x63, 0x7b, 0xde, 0x85, 0x97, 0xf1, 0xaf, + 0x2e, 0x30, 0xd6, 0x56, 0x1e, 0x53, 0x0e, 0x54, 0x27, 0xe7, 0x8c, 0xda, + 0x25, 0xf1, 0x63, 0xa6, 0xf1, 0x93, 0xed, 0x77, 0x06, 0x4b, 0x2f, 0xef, + 0x36, 0xb5, 0x9f, 0x59, 0x7f, 0xc4, 0xdb, 0xe0, 0x8b, 0x3e, 0xb2, 0xa7, + 0x3f, 0xbe, 0xc5, 0xfe, 0x5b, 0x7f, 0x9b, 0x9e, 0x73, 0xc6, 0xe2, 0xcb, + 0xff, 0xd3, 0x49, 0xb7, 0xc6, 0xb1, 0xa4, 0x1d, 0x2c, 0xad, 0x22, 0x05, + 0xcd, 0x6e, 0x79, 0x2c, 0xbf, 0x17, 0xf6, 0xe0, 0xeb, 0x29, 0xcf, 0x00, + 0x22, 0xd7, 0xdb, 0x8c, 0x67, 0x6b, 0x2e, 0x69, 0x2c, 0xa8, 0x37, 0xbf, + 0x27, 0xbf, 0xec, 0x3f, 0x1b, 0x6f, 0x35, 0x0b, 0x2b, 0x69, 0x3a, 0xdf, + 0x48, 0x8f, 0x1e, 0x78, 0xc1, 0x25, 0x2a, 0x38, 0x72, 0xfe, 0x72, 0x19, + 0xdd, 0xc3, 0xeb, 0xa2, 0xe6, 0xa4, 0x9e, 0x6e, 0x43, 0xb6, 0x68, 0xc1, + 0x75, 0x2a, 0xb4, 0xf2, 0xc0, 0xbd, 0x39, 0x94, 0xf0, 0xd9, 0x04, 0x3f, + 0x8a, 0x5a, 0xff, 0x23, 0xbe, 0xfc, 0xb6, 0x80, 0xc3, 0x77, 0x7c, 0x2c, + 0xb6, 0xd8, 0x84, 0x5e, 0xdd, 0x20, 0xb3, 0x2c, 0xbb, 0x60, 0x16, 0x56, + 0xc3, 0x53, 0xc1, 0x0b, 0x8d, 0xfa, 0xcb, 0xff, 0xfe, 0x15, 0x05, 0x11, + 0x82, 0xab, 0x42, 0x8d, 0xa7, 0xbf, 0x70, 0x55, 0x87, 0x66, 0xcf, 0x6d, + 0xac, 0xbf, 0xe9, 0x40, 0x39, 0x31, 0x40, 0xd6, 0x5c, 0xd0, 0xb2, 0xf4, + 0xc2, 0x1d, 0x65, 0xff, 0x67, 0xf9, 0x9f, 0xf6, 0x01, 0x65, 0xfe, 0xd9, + 0x1b, 0x0e, 0xc5, 0xf5, 0x97, 0xf9, 0x8d, 0x72, 0xfe, 0x12, 0xcb, 0xfc, + 0xe6, 0xb7, 0x38, 0xec, 0xb2, 0xb1, 0x33, 0xe3, 0x4e, 0x5c, 0x54, 0x87, + 0xf8, 0x71, 0xf3, 0x6d, 0xe6, 0x37, 0x39, 0x2c, 0xad, 0x1f, 0xd1, 0xd9, + 0x6f, 0xa3, 0xf8, 0x75, 0x97, 0xef, 0xc1, 0x30, 0x16, 0x5d, 0xd7, 0x4b, + 0x2f, 0xda, 0x0e, 0xf0, 0x18, 0xb2, 0xe2, 0xe2, 0xcb, 0xfb, 0x0c, 0x70, + 0x1f, 0x16, 0x5f, 0xc5, 0x9f, 0x0b, 0x98, 0xb2, 0xb6, 0x23, 0xf3, 0x08, + 0x7a, 0x26, 0xf0, 0xc8, 0x0b, 0x08, 0x5b, 0x79, 0x6d, 0xff, 0xa0, 0xed, + 0xd7, 0x03, 0x30, 0x4d, 0x59, 0x7e, 0x2f, 0xfb, 0x24, 0xb2, 0xee, 0x62, + 0xca, 0x63, 0x7a, 0xe4, 0xf7, 0xf8, 0xa0, 0xcd, 0xbc, 0xd4, 0x2c, 0xbf, + 0xf0, 0x5b, 0xde, 0xcd, 0x69, 0x8e, 0xb2, 0xf8, 0x87, 0x1b, 0xab, 0x2c, + 0x66, 0xc4, 0xcd, 0x64, 0xfe, 0x31, 0xf3, 0x9a, 0xb9, 0xf5, 0xf4, 0xf1, + 0xfe, 0x2c, 0xbd, 0x00, 0xe2, 0xca, 0xd1, 0xbf, 0x22, 0x3b, 0xe7, 0xd3, + 0xc9, 0x65, 0xb5, 0x87, 0x82, 0x44, 0x17, 0x8c, 0x30, 0xc5, 0x97, 0xd3, + 0x93, 0x42, 0x41, 0x66, 0x82, 0xf0, 0x4b, 0xeb, 0x2f, 0xe7, 0x29, 0x0e, + 0x27, 0x59, 0x6d, 0xcc, 0x3c, 0x9f, 0x0e, 0x5f, 0x3f, 0xe0, 0x6b, 0x2f, + 0x61, 0x76, 0xb2, 0xee, 0xa4, 0xb2, 0xff, 0x1b, 0x1f, 0xe7, 0x9c, 0x2b, + 0x2f, 0xcd, 0x3e, 0x75, 0xf5, 0x97, 0xf9, 0xfc, 0x59, 0xbd, 0xfb, 0x59, + 0x60, 0x2c, 0xb7, 0x6b, 0x2b, 0x0d, 0x1b, 0x08, 0xd4, 0x23, 0xac, 0xd1, + 0x83, 0x9a, 0x11, 0x4f, 0xd5, 0xef, 0xfa, 0x5d, 0x71, 0xb5, 0xdf, 0xb1, + 0x65, 0xf8, 0xd7, 0xe6, 0xf9, 0x2c, 0xae, 0x91, 0x5f, 0xa4, 0x9f, 0x9d, + 0xdf, 0x9c, 0xa4, 0xc7, 0x59, 0x7b, 0x03, 0xb6, 0xb2, 0xb6, 0x32, 0x53, + 0x45, 0x24, 0x7b, 0x4c, 0x62, 0x25, 0x26, 0x0e, 0x31, 0xec, 0x8e, 0x71, + 0xa1, 0xa7, 0xe4, 0x67, 0x7c, 0x22, 0xae, 0x10, 0x86, 0x3b, 0x6d, 0xe6, + 0x3b, 0x64, 0xd7, 0xb6, 0xad, 0xa5, 0xb5, 0xac, 0xbf, 0xef, 0x3c, 0xc5, + 0x19, 0xa9, 0x2c, 0xbf, 0xf3, 0x90, 0x93, 0x71, 0x8b, 0xa9, 0x2c, 0xbf, + 0xf1, 0x99, 0xc2, 0x68, 0xd6, 0x4e, 0xb2, 0xb7, 0x11, 0x6c, 0x13, 0x8d, + 0xe8, 0x17, 0xc1, 0x9e, 0x26, 0x59, 0x7f, 0xff, 0xff, 0xdb, 0x3d, 0x9d, + 0x4b, 0xc7, 0xd9, 0xdf, 0x83, 0xff, 0xe1, 0x7b, 0x3f, 0x03, 0xd9, 0xb3, + 0xdb, 0x6b, 0x2a, 0x11, 0x8f, 0xb8, 0x49, 0x7e, 0x28, 0xd3, 0xf1, 0x65, + 0xff, 0x0f, 0x02, 0x2b, 0x6f, 0x39, 0xd6, 0x5f, 0xa0, 0xe5, 0x93, 0x2c, + 0xc3, 0x79, 0x7e, 0xe6, 0x79, 0xbc, 0xb2, 0xf6, 0xa3, 0x7a, 0xcb, 0xdb, + 0xf0, 0x6b, 0x2f, 0xef, 0x34, 0x10, 0x61, 0x65, 0xfe, 0x8d, 0xc3, 0x73, + 0x8f, 0xb8, 0xb2, 0x8d, 0x3e, 0x4f, 0x15, 0xdf, 0xb0, 0x62, 0x03, 0x8b, + 0x2f, 0xb8, 0xe5, 0x25, 0x95, 0xb1, 0x30, 0xdf, 0x0f, 0x3c, 0x20, 0x88, + 0x8f, 0x85, 0x37, 0xde, 0x81, 0x3c, 0xb2, 0xfc, 0xf3, 0x72, 0x3a, 0x59, + 0x5b, 0x15, 0x34, 0x0d, 0x88, 0x06, 0xdc, 0x8c, 0xd3, 0xea, 0x1b, 0xc8, + 0xef, 0xe8, 0x97, 0xa3, 0x7b, 0x2c, 0xbf, 0x61, 0xe7, 0x7d, 0xc5, 0x97, + 0xbc, 0x27, 0x16, 0x5f, 0xe6, 0x94, 0x03, 0xd2, 0x85, 0x97, 0xc1, 0x28, + 0x3a, 0xcb, 0xce, 0xe7, 0x59, 0x47, 0x37, 0x9e, 0x21, 0xb0, 0xd6, 0x5c, + 0xfc, 0x59, 0x6d, 0x1c, 0xd3, 0x84, 0x46, 0xa0, 0xfb, 0xdd, 0x22, 0xe9, + 0x7d, 0x65, 0xf4, 0xd1, 0xf7, 0x59, 0x7c, 0x10, 0x61, 0x76, 0x6e, 0x42, + 0x2f, 0x69, 0x2c, 0xa9, 0xcf, 0x27, 0xc7, 0x17, 0xff, 0x47, 0x84, 0x1f, + 0xdb, 0x26, 0x83, 0xac, 0xbf, 0xfb, 0xb2, 0x7f, 0xc6, 0x18, 0xe4, 0xeb, + 0x2f, 0x41, 0x1a, 0xb2, 0xff, 0xdf, 0x63, 0x3b, 0xf3, 0x6f, 0x61, 0xac, + 0xbf, 0xda, 0x97, 0xb3, 0x7c, 0x1d, 0x65, 0xf0, 0x45, 0x7c, 0xc5, 0x95, + 0x08, 0xfb, 0xed, 0x0b, 0xa1, 0xc6, 0x42, 0x73, 0x5b, 0xf3, 0xcb, 0x8d, + 0xbd, 0x65, 0xf6, 0x6a, 0x06, 0xb2, 0xfa, 0x6f, 0x64, 0xcb, 0x2f, 0x66, + 0xb3, 0x61, 0xe2, 0xb9, 0x0d, 0xe3, 0x87, 0x7a, 0xcb, 0xfb, 0x25, 0xd4, + 0xb3, 0xeb, 0x2d, 0xf9, 0x22, 0x03, 0x0c, 0xfc, 0x3f, 0x73, 0x76, 0xb2, + 0xfc, 0x71, 0x46, 0xee, 0xe0, 0xd6, 0x50, 0x0f, 0x28, 0x22, 0xf7, 0xbe, + 0x13, 0xac, 0xbe, 0xea, 0x5e, 0x65, 0x95, 0x07, 0x80, 0xe3, 0xb7, 0xf7, + 0xe3, 0x7b, 0x10, 0x16, 0x52, 0xa2, 0x0e, 0x5f, 0xcf, 0x38, 0x1c, 0x86, + 0x8a, 0xc1, 0xab, 0x73, 0x11, 0x03, 0xd9, 0x76, 0xd8, 0xc5, 0x1d, 0x1b, + 0x5f, 0x85, 0x0d, 0xff, 0x36, 0x7f, 0x9a, 0xc1, 0xe2, 0xcb, 0xfb, 0xce, + 0x72, 0x8e, 0x96, 0x5f, 0x1f, 0x8f, 0x2f, 0x1f, 0x20, 0x86, 0xf7, 0xf0, + 0x3c, 0x59, 0xfe, 0x2c, 0xbf, 0x8b, 0x37, 0x96, 0x71, 0x65, 0xa3, 0x47, + 0xb5, 0xf2, 0xda, 0x84, 0xd1, 0xf2, 0x11, 0x9c, 0x84, 0xa5, 0xb8, 0xb2, + 0xfd, 0xe8, 0xdc, 0x0c, 0x96, 0x54, 0x1b, 0xc7, 0x11, 0xbe, 0x7f, 0xe1, + 0x8b, 0x2a, 0x4c, 0x84, 0x81, 0x97, 0x61, 0x59, 0xa3, 0xdd, 0xc3, 0x77, + 0x50, 0xa2, 0x39, 0x1f, 0xa3, 0x40, 0x02, 0x49, 0x43, 0xbb, 0x8f, 0xff, + 0x95, 0x07, 0xbd, 0xd7, 0x6c, 0x7e, 0xfe, 0x91, 0x67, 0x5f, 0xc5, 0x97, + 0xa5, 0xf9, 0xd6, 0x5f, 0xfe, 0x2c, 0xf6, 0x3f, 0x7e, 0x82, 0x08, 0xd6, + 0x5f, 0xfe, 0x04, 0x75, 0x93, 0x8d, 0xdf, 0xb7, 0x1a, 0xcb, 0x09, 0xda, + 0x24, 0xc0, 0x91, 0x50, 0x98, 0x48, 0xcb, 0x75, 0x0b, 0x1b, 0xf8, 0xbf, + 0x2c, 0xd6, 0x2c, 0xbb, 0x6d, 0xd6, 0x53, 0x9e, 0x28, 0x85, 0x97, 0xfb, + 0x53, 0xf1, 0xfb, 0xd6, 0x2c, 0xbf, 0xde, 0xce, 0xdf, 0xd1, 0xe5, 0x97, + 0xff, 0x3b, 0x7e, 0x0b, 0xbc, 0xff, 0x99, 0x65, 0xfc, 0x4c, 0x0e, 0x79, + 0x96, 0x5d, 0xa1, 0xac, 0xb8, 0xc3, 0x16, 0x54, 0x8d, 0x81, 0x82, 0xf7, + 0xa1, 0xb7, 0xa4, 0x16, 0x68, 0xaf, 0xf9, 0x89, 0x81, 0xcc, 0xf3, 0xac, + 0xbf, 0x8b, 0x0c, 0xc2, 0x1a, 0xca, 0xc4, 0xe1, 0x3c, 0x66, 0xe8, 0x5c, + 0x7e, 0xf9, 0x78, 0x86, 0xd7, 0xf4, 0x17, 0xfd, 0x92, 0x59, 0x70, 0x38, + 0xb2, 0xfe, 0x6f, 0x31, 0xa6, 0xc2, 0xcb, 0x08, 0x33, 0xc5, 0xf8, 0xbd, + 0x69, 0x13, 0x5c, 0x71, 0xbe, 0x20, 0xb8, 0x8b, 0x2a, 0x15, 0x77, 0xb4, + 0x77, 0x22, 0x43, 0xc7, 0x74, 0x8e, 0xee, 0x7d, 0x65, 0xe6, 0x27, 0x59, + 0x69, 0xd6, 0x5b, 0x24, 0x6b, 0x08, 0x6a, 0xff, 0xa0, 0xfb, 0x33, 0x53, + 0xb4, 0xeb, 0x2b, 0xb4, 0x52, 0x6e, 0x21, 0x91, 0x2d, 0xef, 0x44, 0x2c, + 0xbf, 0x8f, 0x83, 0x82, 0xed, 0x65, 0x1c, 0xf2, 0x04, 0x1b, 0xbc, 0x61, + 0x86, 0x24, 0xa4, 0x82, 0xcd, 0x05, 0xf3, 0x18, 0xd3, 0x24, 0xae, 0xcf, + 0x01, 0x87, 0x6f, 0xb5, 0x1b, 0xf1, 0x65, 0xe9, 0xb3, 0xcb, 0x2b, 0x0f, + 0x01, 0xc8, 0xef, 0xb3, 0xe1, 0x75, 0x97, 0x60, 0xad, 0x65, 0x6d, 0x0d, + 0xa9, 0xd4, 0x43, 0x8e, 0x78, 0x7e, 0x64, 0xa8, 0xd6, 0xa4, 0x55, 0xea, + 0x3e, 0xd3, 0xbd, 0x7a, 0x58, 0x8b, 0xc3, 0xc0, 0x0f, 0x65, 0x08, 0x3e, + 0x31, 0x7c, 0x80, 0xc2, 0x1b, 0xf1, 0x3c, 0xb0, 0x6b, 0x2f, 0xb5, 0x20, + 0xe2, 0xcb, 0xfe, 0xf7, 0x6d, 0x00, 0x3c, 0x49, 0x65, 0xfc, 0x58, 0x00, + 0x60, 0x16, 0x5f, 0xff, 0xf7, 0xf9, 0x9b, 0xca, 0x3a, 0xc3, 0xbf, 0x33, + 0x4f, 0xd1, 0x8b, 0x2f, 0xdf, 0x13, 0xce, 0x05, 0x95, 0x3a, 0x24, 0xba, + 0x69, 0xae, 0x91, 0xc6, 0x50, 0xbe, 0xbc, 0x4d, 0xc5, 0x97, 0x9f, 0x3b, + 0x59, 0x79, 0xb2, 0x75, 0x97, 0xff, 0xb5, 0xe3, 0x1c, 0x7b, 0x04, 0x00, + 0x1b, 0x75, 0x65, 0xf0, 0xdc, 0x80, 0xb2, 0xff, 0x9c, 0xed, 0xee, 0xb9, + 0x03, 0x59, 0x7f, 0xf4, 0x10, 0x0a, 0x3a, 0x9a, 0x08, 0x0b, 0x2b, 0x62, + 0xa8, 0x6c, 0x8c, 0x71, 0x8a, 0x34, 0x37, 0xe1, 0xc7, 0x1c, 0x02, 0x91, + 0x10, 0xf0, 0xe6, 0xfa, 0x40, 0x91, 0x2c, 0xbf, 0x4d, 0xb6, 0x0d, 0xbc, + 0x59, 0x7b, 0xef, 0xe5, 0x97, 0xef, 0x94, 0x1f, 0x8b, 0x2a, 0x0f, 0x0f, + 0xa1, 0xcb, 0xff, 0x0f, 0x27, 0x3e, 0x75, 0xf8, 0x3a, 0xcb, 0xf6, 0xb3, + 0x7b, 0xf9, 0x65, 0x99, 0x65, 0xff, 0x39, 0xbd, 0xf9, 0x86, 0xf2, 0x59, + 0x7d, 0xd7, 0x6d, 0xa5, 0x97, 0xd3, 0xce, 0xfd, 0x2c, 0xb7, 0x19, 0x12, + 0x64, 0x21, 0xf3, 0xa1, 0x09, 0x2f, 0xff, 0xf7, 0xa0, 0xa0, 0x3d, 0xfd, + 0xfd, 0x87, 0x6f, 0x80, 0x2b, 0x28, 0xd4, 0xd7, 0x81, 0x0b, 0xcf, 0xa1, + 0x5f, 0xfe, 0x35, 0xbe, 0x59, 0x2d, 0x9d, 0x9c, 0x10, 0xb2, 0xfb, 0x35, + 0xe6, 0x59, 0x7f, 0xf9, 0xe4, 0x59, 0xbd, 0xe6, 0x8c, 0xff, 0x16, 0x54, + 0x1f, 0x5b, 0x90, 0xdb, 0x6d, 0x65, 0xf0, 0xdd, 0x86, 0xb2, 0xb6, 0x83, + 0x6b, 0x82, 0x97, 0xb7, 0xe1, 0x2c, 0xbd, 0xf0, 0x05, 0x65, 0xff, 0x31, + 0x93, 0x6c, 0x8d, 0x6b, 0x16, 0x54, 0x1f, 0xb3, 0x0e, 0xcc, 0x3b, 0x7f, + 0xb2, 0x71, 0x3d, 0xec, 0xdc, 0x59, 0x7f, 0xf0, 0x3d, 0x99, 0x3b, 0x66, + 0xf8, 0xe9, 0x65, 0x41, 0xff, 0x18, 0x71, 0x7f, 0xf4, 0x1f, 0x5a, 0x89, + 0xfe, 0xee, 0x6a, 0xcb, 0xa0, 0xc5, 0x94, 0x03, 0xdc, 0x24, 0x5b, 0xff, + 0xe0, 0x8a, 0xf9, 0xce, 0xfc, 0xdd, 0x7f, 0x5a, 0x85, 0x97, 0xb9, 0xec, + 0x59, 0x50, 0x7e, 0x61, 0x57, 0xbc, 0x78, 0xed, 0x65, 0xff, 0x3c, 0xb8, + 0x07, 0xdf, 0x83, 0x59, 0x76, 0x7b, 0x0f, 0x5f, 0xc3, 0xb7, 0xff, 0xe6, + 0xd7, 0x83, 0xe7, 0x6f, 0xc4, 0x82, 0x3c, 0x59, 0x7e, 0xd3, 0x4e, 0xe7, + 0x59, 0x71, 0x86, 0x2c, 0xac, 0x3c, 0x13, 0x0a, 0x2c, 0x14, 0x82, 0xcd, + 0x15, 0x1d, 0x1b, 0x5e, 0x85, 0xbd, 0xff, 0xed, 0xfe, 0x6c, 0x2e, 0xfc, + 0xc7, 0x8e, 0xd6, 0x5f, 0xce, 0x0e, 0xa5, 0x9f, 0x59, 0x58, 0x7f, 0x4c, + 0x99, 0x7a, 0x42, 0x1d, 0x65, 0xf3, 0xf4, 0x31, 0xac, 0xbd, 0x00, 0xe2, + 0xca, 0x92, 0xa2, 0x56, 0x8c, 0x1b, 0xd0, 0xa2, 0x72, 0x0e, 0x0f, 0x04, + 0x8e, 0xf6, 0x1f, 0x71, 0x65, 0xff, 0x9f, 0x7e, 0x08, 0x51, 0xe6, 0x9d, + 0x65, 0xfe, 0xce, 0x16, 0x7f, 0xcc, 0xb2, 0x86, 0x89, 0x0d, 0x0f, 0x92, + 0x05, 0xfc, 0xde, 0x72, 0x63, 0xac, 0xa1, 0xb2, 0x49, 0x32, 0x39, 0xe6, + 0x37, 0x9a, 0x17, 0x1a, 0x55, 0x3c, 0x26, 0xfd, 0x0a, 0xc0, 0x3f, 0x14, + 0x25, 0x3f, 0x2a, 0x77, 0x7c, 0x3c, 0xb7, 0x4b, 0xe9, 0x65, 0xfd, 0x1c, + 0x6f, 0x94, 0x2c, 0xa8, 0x36, 0xde, 0x0b, 0xbe, 0xcf, 0x31, 0x8b, 0x2f, + 0xa4, 0x0c, 0x02, 0xcb, 0xe7, 0xc1, 0x31, 0x65, 0xfd, 0xfc, 0x98, 0xa0, + 0xeb, 0x88, 0x09, 0x7c, 0x43, 0xf4, 0x2a, 0x20, 0x20, 0xb3, 0x75, 0x53, + 0xa3, 0x7f, 0xa2, 0x2f, 0x11, 0x3a, 0xdd, 0xff, 0xba, 0x91, 0x34, 0xff, + 0x79, 0x71, 0x65, 0xff, 0x70, 0x78, 0x50, 0x41, 0x85, 0x96, 0x63, 0x4f, + 0xdb, 0xa4, 0x0b, 0xff, 0xfb, 0xd1, 0xee, 0xdb, 0x98, 0x32, 0xc9, 0xa6, + 0x89, 0xd6, 0x5f, 0x8e, 0x0d, 0x67, 0x4b, 0x28, 0x68, 0x86, 0xc5, 0xdb, + 0xf6, 0x98, 0x22, 0xb8, 0x59, 0x7f, 0xb5, 0x9d, 0x70, 0x0f, 0xf5, 0x97, + 0xd3, 0x19, 0x1d, 0x2c, 0xa8, 0x44, 0x21, 0xa5, 0x7c, 0x34, 0xb0, 0x67, + 0x46, 0xb7, 0x70, 0xa6, 0xbf, 0x44, 0x9f, 0xa3, 0x16, 0x5f, 0xf6, 0xcd, + 0x6b, 0x3d, 0xd4, 0xb8, 0xb2, 0xff, 0xff, 0x67, 0x02, 0xfd, 0x66, 0x11, + 0xbc, 0xe6, 0x17, 0xf8, 0xb2, 0xff, 0xa4, 0xc5, 0xff, 0x64, 0xb6, 0xd6, + 0x57, 0x68, 0xd8, 0xe8, 0xf4, 0xec, 0x17, 0x1b, 0xbd, 0x65, 0xff, 0x7f, + 0x51, 0x9d, 0x6d, 0x21, 0x53, 0x68, 0x59, 0x7f, 0xdf, 0x0c, 0x64, 0xfb, + 0x48, 0x54, 0xda, 0x16, 0x5c, 0xe6, 0x0d, 0x15, 0xdd, 0x0d, 0x08, 0x95, + 0x58, 0xaf, 0x51, 0xa3, 0x85, 0xd1, 0x83, 0xc6, 0x02, 0x50, 0xe0, 0xbe, + 0xff, 0x03, 0x25, 0x97, 0xe0, 0xed, 0xe6, 0x80, 0xb2, 0xfd, 0xa0, 0x1d, + 0xe4, 0xb2, 0x9c, 0xfd, 0xb8, 0x46, 0x21, 0x5d, 0xa7, 0x59, 0x7e, 0xd9, + 0x93, 0x31, 0xd6, 0x5f, 0xfa, 0x3a, 0xfe, 0x49, 0x88, 0x0c, 0xb2, 0xff, + 0xf0, 0x63, 0x66, 0xef, 0xdb, 0x9e, 0xe9, 0xcc, 0x59, 0x53, 0xa2, 0xe1, + 0x8a, 0xb8, 0x7b, 0x7f, 0xec, 0x1f, 0x9c, 0x5c, 0x7a, 0x3a, 0x59, 0x7f, + 0xde, 0x7e, 0x31, 0x14, 0x74, 0xb2, 0x96, 0x0a, 0x53, 0x71, 0xd4, 0x32, + 0x8e, 0x61, 0xc4, 0x0b, 0xfe, 0x23, 0x74, 0x4d, 0xd8, 0x49, 0x65, 0xfb, + 0xf1, 0x85, 0x0b, 0x29, 0x8f, 0x78, 0x8e, 0x6f, 0x08, 0x5f, 0x59, 0x79, + 0x8e, 0xeb, 0x2f, 0xf8, 0x78, 0xc6, 0xb0, 0xdc, 0xeb, 0x2a, 0x73, 0xf0, + 0x34, 0x74, 0xe3, 0x77, 0xfe, 0x86, 0xe4, 0x7f, 0x91, 0xe8, 0x59, 0x7f, + 0xd9, 0x39, 0x41, 0xb9, 0xd7, 0xd6, 0x51, 0xa7, 0xec, 0x21, 0xe5, 0xfb, + 0xbc, 0x6e, 0x1d, 0x65, 0xff, 0xdc, 0x82, 0xf8, 0x93, 0x79, 0xbf, 0xc5, + 0x97, 0xd9, 0xa8, 0xde, 0xb2, 0xba, 0x3e, 0x9f, 0xa3, 0x5f, 0xff, 0xee, + 0xc0, 0x78, 0x96, 0x76, 0x36, 0x2c, 0xd7, 0x71, 0x8b, 0x2b, 0xa4, 0x42, + 0x11, 0x1d, 0x1d, 0x33, 0x87, 0x8c, 0x56, 0xa1, 0x5b, 0x46, 0x42, 0xb1, + 0xa1, 0x20, 0xf0, 0xa7, 0x0c, 0x6b, 0x97, 0xb7, 0x63, 0xa5, 0x97, 0xf8, + 0xb0, 0x1c, 0x11, 0xfe, 0xb2, 0xf4, 0x61, 0xd6, 0x5c, 0xd8, 0xb2, 0xfe, + 0xcd, 0x69, 0xa6, 0xe2, 0xca, 0x91, 0xe1, 0xfc, 0x56, 0xf1, 0xe7, 0x85, + 0x97, 0xfb, 0x0a, 0x3a, 0xe3, 0xf6, 0xb2, 0x8d, 0x3f, 0x2e, 0xc8, 0x8c, + 0x1d, 0xbe, 0xce, 0x4b, 0xb5, 0x97, 0x80, 0x7f, 0xac, 0xa9, 0x27, 0x2a, + 0xc4, 0x07, 0x33, 0x78, 0x68, 0x00, 0xc8, 0x88, 0xef, 0xfd, 0x87, 0x8e, + 0xdb, 0xfa, 0x09, 0xd6, 0x5f, 0xbc, 0xf3, 0x8f, 0x7a, 0xcb, 0xff, 0x69, + 0xa7, 0xd4, 0x34, 0x9f, 0x8b, 0x2f, 0xfc, 0xf9, 0x84, 0x68, 0x9f, 0x08, + 0xd6, 0x5e, 0x99, 0xc6, 0xb2, 0xd3, 0xe9, 0x13, 0x5e, 0x3e, 0x09, 0xfd, + 0xe6, 0xeb, 0x8b, 0x2f, 0xfe, 0xe4, 0x4f, 0x9a, 0x98, 0xa0, 0x1c, 0x59, + 0x7f, 0x9b, 0xd9, 0xad, 0x67, 0x4b, 0x2f, 0xd3, 0x14, 0x6a, 0x4b, 0x2d, + 0x12, 0x3d, 0xbc, 0x33, 0xa9, 0x2a, 0x1e, 0xec, 0xfd, 0xe1, 0x8a, 0x03, + 0x7f, 0x8e, 0x99, 0x0a, 0x0b, 0xed, 0x3c, 0xa6, 0x59, 0x7f, 0xee, 0xbf, + 0x85, 0x00, 0xc2, 0x02, 0xcb, 0xee, 0x40, 0x36, 0xa5, 0x95, 0x87, 0xc9, + 0xc3, 0xda, 0x35, 0x15, 0x06, 0x42, 0x1e, 0xfb, 0xd8, 0x07, 0x59, 0x50, + 0x9a, 0xbb, 0xc6, 0x19, 0xc2, 0xab, 0xfd, 0xa9, 0xb8, 0xc5, 0xf6, 0x59, + 0x7f, 0xe9, 0x31, 0xcc, 0xc2, 0x1f, 0xa1, 0x65, 0xfe, 0x37, 0x34, 0x03, + 0xb7, 0x16, 0x57, 0x47, 0xe4, 0x47, 0xd7, 0xfb, 0xcd, 0xd0, 0x34, 0xe3, + 0x59, 0x69, 0x96, 0x5f, 0x74, 0x0d, 0x42, 0x4b, 0x8c, 0x31, 0x25, 0x41, + 0xbc, 0x30, 0x8e, 0xcc, 0x90, 0x59, 0xa1, 0xaf, 0x22, 0x44, 0x9b, 0xef, + 0xff, 0xfe, 0x21, 0x79, 0x9b, 0xb1, 0x33, 0x1e, 0x26, 0xd8, 0x5d, 0x4b, + 0xc1, 0x02, 0xcb, 0x9b, 0xb5, 0x96, 0xdd, 0x59, 0x7c, 0xfb, 0x04, 0x3a, + 0xca, 0xde, 0x6e, 0x4c, 0x14, 0xbf, 0x86, 0xdb, 0xfd, 0x9b, 0xab, 0x2d, + 0x32, 0xca, 0xc3, 0xc4, 0x63, 0x2a, 0x59, 0x76, 0xa5, 0xb1, 0x52, 0x24, + 0xa1, 0x8b, 0xd1, 0x16, 0x9e, 0xbc, 0xa0, 0xed, 0x00, 0x20, 0xa8, 0x55, + 0xbe, 0xf2, 0x99, 0xaf, 0xc5, 0x2e, 0xc3, 0x3a, 0xcb, 0xd1, 0xa9, 0x96, + 0x53, 0x9e, 0x38, 0x4a, 0xaf, 0xe1, 0x0e, 0x4f, 0xfe, 0x2c, 0xad, 0x8e, + 0x8f, 0x33, 0x68, 0x26, 0x89, 0x55, 0x13, 0xc2, 0x12, 0x44, 0x43, 0x72, + 0xca, 0x4a, 0x37, 0x51, 0x84, 0x34, 0x3f, 0xf5, 0x39, 0x10, 0x78, 0x67, + 0xfa, 0x74, 0x21, 0xe3, 0xf2, 0x29, 0x79, 0xff, 0x35, 0x0c, 0xb8, 0x43, + 0x1c, 0x44, 0x21, 0xbd, 0xf6, 0x31, 0x65, 0x8d, 0x59, 0x7f, 0x4f, 0xb6, + 0x1f, 0x36, 0x96, 0x5f, 0xe2, 0x97, 0x07, 0xe6, 0x31, 0x65, 0xe9, 0xdc, + 0xeb, 0x2e, 0xe8, 0x96, 0x5f, 0xba, 0x97, 0x84, 0xe2, 0xcb, 0x3e, 0x1e, + 0x11, 0x0b, 0xdc, 0xc3, 0x59, 0x69, 0x96, 0x5c, 0x78, 0x59, 0x7b, 0xec, + 0x62, 0xe3, 0x08, 0x5c, 0xe2, 0x2a, 0x20, 0x77, 0x46, 0xaa, 0xb6, 0x22, + 0x1d, 0x84, 0x82, 0x81, 0x52, 0x47, 0x9f, 0x89, 0x7f, 0x09, 0xda, 0xd8, + 0x9f, 0xfc, 0x09, 0x31, 0x93, 0x9a, 0x06, 0x35, 0x2b, 0xf8, 0x18, 0x51, + 0x3c, 0x2c, 0xbb, 0x42, 0xb5, 0x95, 0xa3, 0xc7, 0x22, 0xcb, 0xfb, 0x08, + 0x19, 0x83, 0x59, 0x7f, 0x8d, 0x76, 0xeb, 0x8c, 0xeb, 0x2f, 0xff, 0xfd, + 0x2e, 0xfc, 0xda, 0x9c, 0xf1, 0xdf, 0xa1, 0x87, 0x1e, 0x89, 0x2c, 0xbd, + 0xe8, 0x35, 0x65, 0x74, 0x88, 0xbd, 0xed, 0xd7, 0xf0, 0x35, 0xa6, 0xe8, + 0x0b, 0x2f, 0xfe, 0x94, 0x10, 0x33, 0x40, 0x3b, 0x71, 0x65, 0xfe, 0xce, + 0xe2, 0x72, 0x8e, 0xd6, 0x5f, 0xbb, 0x28, 0xea, 0x4b, 0x2c, 0x05, 0x96, + 0xdc, 0xd8, 0x7d, 0xd8, 0x68, 0xc5, 0x37, 0xec, 0xff, 0x1f, 0xa5, 0x97, + 0x40, 0x56, 0x5f, 0x82, 0x40, 0x12, 0x4b, 0x2f, 0xf7, 0xa0, 0x07, 0x79, + 0x6c, 0xc3, 0x7f, 0xc1, 0x6a, 0x1a, 0x2c, 0x44, 0x67, 0xbf, 0xd0, 0x09, + 0xa4, 0xc1, 0x15, 0xac, 0xbc, 0x59, 0xcd, 0x87, 0xb8, 0x21, 0x25, 0x1a, + 0xac, 0xf9, 0xe1, 0x7c, 0x44, 0xdf, 0x2f, 0x0c, 0x2c, 0x77, 0xc6, 0x8b, + 0x7f, 0xf6, 0x9b, 0xa1, 0x3f, 0x8d, 0x27, 0xe2, 0xcb, 0xfe, 0x0c, 0xf1, + 0xb2, 0x3f, 0x03, 0x59, 0x5a, 0x44, 0x07, 0x91, 0x6f, 0xe8, 0xd9, 0xbb, + 0xbb, 0x1b, 0x8b, 0x2f, 0xc7, 0x79, 0x00, 0xeb, 0x2d, 0xad, 0x1f, 0x00, + 0x0e, 0x2f, 0x3e, 0xa7, 0x59, 0x71, 0x86, 0x2c, 0xbf, 0xda, 0x6c, 0xde, + 0x24, 0x85, 0xf6, 0x6d, 0x8c, 0x1d, 0xbe, 0x27, 0xe8, 0x0b, 0x2f, 0xfc, + 0xc6, 0xec, 0xe0, 0x40, 0x78, 0x92, 0xcb, 0xfd, 0xcc, 0xfb, 0x9f, 0x09, + 0x65, 0x0d, 0x3c, 0x66, 0x84, 0x1e, 0x97, 0x8e, 0xa1, 0xe2, 0x2f, 0xa1, + 0x5f, 0xfb, 0x98, 0x59, 0xec, 0xef, 0x09, 0x65, 0xff, 0xe6, 0xe6, 0x16, + 0xc1, 0x35, 0x36, 0x61, 0x8b, 0x2f, 0xb4, 0xd0, 0x75, 0x97, 0xfb, 0x9f, + 0xf6, 0x1f, 0x24, 0xb2, 0xe8, 0xe2, 0xca, 0x91, 0xe4, 0x80, 0xce, 0xf8, + 0xc7, 0x10, 0xeb, 0x2f, 0x3f, 0x50, 0xb2, 0xfd, 0x86, 0xf9, 0xe5, 0xe3, + 0xc0, 0x10, 0x92, 0xa4, 0x9c, 0xa8, 0xcf, 0x0d, 0x4d, 0x66, 0xa2, 0x62, + 0xa8, 0x54, 0x77, 0x91, 0xf8, 0xdf, 0xed, 0xe6, 0x61, 0x0f, 0xd0, 0xb2, + 0xfe, 0x61, 0xeb, 0x0f, 0x8b, 0x2f, 0xfb, 0xfc, 0x13, 0x51, 0xf8, 0x92, + 0xcb, 0xee, 0xdd, 0xfb, 0x54, 0x43, 0x0b, 0xfc, 0xd1, 0xa9, 0x06, 0x31, + 0x65, 0x6c, 0x44, 0xde, 0x8e, 0x88, 0xc2, 0xf8, 0xe7, 0x79, 0x6c, 0x47, + 0xc6, 0x43, 0x1e, 0xff, 0xff, 0x8b, 0x3b, 0xf4, 0x75, 0x2d, 0xbc, 0xf7, + 0x6d, 0x84, 0xe6, 0xac, 0xbb, 0xb0, 0x2c, 0xb9, 0xf9, 0x88, 0x82, 0x3b, + 0x55, 0x62, 0x3b, 0xc3, 0x0c, 0x2b, 0xfd, 0xcf, 0xbf, 0x5b, 0x6c, 0x6a, + 0xcb, 0xf6, 0x4d, 0x04, 0x35, 0x95, 0x07, 0xbf, 0xa3, 0x8a, 0x86, 0x5b, + 0x0c, 0x88, 0x5a, 0x5b, 0x4f, 0xa7, 0x3a, 0xdc, 0xa4, 0xa5, 0x0e, 0x06, + 0x10, 0xd7, 0xe2, 0x80, 0x74, 0x05, 0x97, 0xec, 0x94, 0x68, 0x0b, 0x2e, + 0x81, 0x16, 0x5f, 0x9e, 0x72, 0x89, 0x24, 0xa9, 0x8d, 0xf7, 0x85, 0xef, + 0xf3, 0xb7, 0xe3, 0x50, 0x05, 0x97, 0xfe, 0xf9, 0x40, 0x06, 0x4d, 0xd7, + 0xd6, 0x5b, 0xfe, 0x3e, 0xf1, 0x0c, 0x6f, 0xde, 0x72, 0x12, 0x75, 0x95, + 0x24, 0xdc, 0x0d, 0x28, 0x3b, 0x29, 0x42, 0x44, 0xc2, 0x9b, 0xff, 0x37, + 0x71, 0xc7, 0xd6, 0x98, 0xc5, 0x97, 0xfd, 0x3c, 0x8f, 0x1e, 0x76, 0x35, + 0x65, 0xff, 0xbe, 0xc5, 0x3e, 0x75, 0xff, 0x3a, 0xcb, 0xff, 0x9b, 0x46, + 0xf7, 0xe6, 0xf1, 0x06, 0x75, 0x95, 0x88, 0x86, 0x01, 0xfd, 0xff, 0xfc, + 0x3d, 0x13, 0x99, 0xb1, 0xb5, 0x05, 0x9e, 0xce, 0xd6, 0x51, 0x26, 0x7d, + 0xc8, 0x60, 0x18, 0x45, 0x7c, 0x1c, 0xe3, 0x2c, 0xbb, 0x81, 0x59, 0x7f, + 0x4b, 0xce, 0xe5, 0x0b, 0x2d, 0x1d, 0x9e, 0x17, 0x42, 0xf7, 0xff, 0x67, + 0xe3, 0xcd, 0x86, 0x9b, 0x12, 0x59, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x20, + 0xa5, 0xef, 0x41, 0xd6, 0x5f, 0xfa, 0x27, 0x7f, 0xeb, 0x25, 0xb7, 0x8b, + 0x2f, 0x4e, 0xda, 0x59, 0x43, 0x47, 0xa6, 0x22, 0x31, 0xb1, 0x0e, 0x71, + 0x06, 0xfd, 0xe8, 0x38, 0x7a, 0x59, 0x7b, 0x91, 0xd2, 0xcb, 0xef, 0xf2, + 0x00, 0x92, 0xf3, 0xea, 0x74, 0x97, 0xc1, 0x27, 0x35, 0x25, 0xfe, 0x69, + 0xf3, 0xfc, 0x80, 0x24, 0xa4, 0x97, 0xf6, 0x77, 0x1e, 0x83, 0xa4, 0xb8, + 0xc3, 0x12, 0x5f, 0xc5, 0x05, 0x3b, 0x69, 0x25, 0x62, 0x62, 0x3d, 0x91, + 0x1c, 0x77, 0xc4, 0x40, 0x33, 0x20, 0xb3, 0x0b, 0x44, 0x19, 0xb6, 0x92, + 0x0b, 0x3f, 0x3a, 0x59, 0x5d, 0x27, 0xa0, 0xd1, 0xd0, 0x88, 0x49, 0x52, + 0x54, 0xf1, 0x32, 0x3f, 0xa3, 0xf9, 0xbf, 0xfe, 0x33, 0x85, 0x9d, 0x7d, + 0xca, 0x7c, 0xeb, 0xeb, 0x2f, 0xed, 0xfb, 0x1e, 0x52, 0xc5, 0x95, 0x08, + 0x83, 0xc5, 0x2b, 0xff, 0xf1, 0x67, 0xc2, 0x03, 0xbc, 0x84, 0x3e, 0xdb, + 0x1a, 0xb2, 0xe7, 0xd2, 0xcb, 0xf4, 0xf8, 0x38, 0x3a, 0xcb, 0xf3, 0x7b, + 0xb8, 0x39, 0x86, 0xf8, 0x41, 0x6a, 0x1a, 0x36, 0x3f, 0x09, 0x8a, 0x85, + 0xfd, 0x9c, 0x51, 0x68, 0xdf, 0x74, 0x6d, 0xe6, 0x37, 0x97, 0x2a, 0x50, + 0xbc, 0x0c, 0x3e, 0x6f, 0xff, 0xe7, 0x97, 0xca, 0x33, 0xac, 0xee, 0x3f, + 0xe6, 0xde, 0xb2, 0xe7, 0x1a, 0xca, 0x34, 0xfc, 0x8e, 0xb9, 0x7f, 0xff, + 0xc5, 0x9f, 0xfc, 0x75, 0x2d, 0x9e, 0x83, 0x87, 0xae, 0x7a, 0x16, 0x5f, + 0xd8, 0x5c, 0x62, 0xc5, 0x97, 0xf1, 0xf0, 0x7e, 0xc9, 0xd6, 0x5f, 0xfe, + 0x27, 0x37, 0x80, 0xff, 0xfa, 0xfe, 0x76, 0xb2, 0xfd, 0xfd, 0x9f, 0xd4, + 0x2c, 0xa8, 0x45, 0x29, 0xa5, 0xdd, 0x26, 0xde, 0xf0, 0x4e, 0xb2, 0x8d, + 0x4e, 0xab, 0x70, 0x8f, 0xcd, 0x45, 0x0c, 0xfd, 0xd3, 0x1b, 0xf8, 0xb3, + 0x9a, 0x8e, 0x2c, 0xbc, 0x19, 0x62, 0xca, 0x73, 0xc8, 0x01, 0x65, 0xfb, + 0x09, 0xff, 0xc5, 0x97, 0xde, 0x82, 0x92, 0xcb, 0xf6, 0x78, 0x9e, 0x65, + 0x94, 0x33, 0xee, 0xc2, 0x62, 0x21, 0xa9, 0x22, 0xf3, 0x90, 0x8f, 0xbe, + 0x79, 0xb3, 0xcb, 0x2f, 0xfa, 0x18, 0x9f, 0xf3, 0x31, 0x8b, 0x2f, 0xfd, + 0x98, 0x67, 0x3a, 0x82, 0x8e, 0x2c, 0xb6, 0xb6, 0x22, 0x63, 0x84, 0x5f, + 0x38, 0xa8, 0x47, 0xc3, 0x43, 0x02, 0xfe, 0x3b, 0x8f, 0xd0, 0x4b, 0x2f, + 0xda, 0xea, 0x59, 0xf5, 0x97, 0xf9, 0x9f, 0xf9, 0xdc, 0x01, 0x65, 0xff, + 0xf3, 0xb0, 0x39, 0x86, 0xb9, 0xf5, 0x18, 0x4b, 0x2f, 0x76, 0x20, 0x16, + 0x5f, 0xff, 0xdf, 0xe7, 0xb3, 0x75, 0xc8, 0xd1, 0xe3, 0x6b, 0x50, 0xb2, + 0xa0, 0xff, 0x1c, 0x7e, 0xfb, 0xd1, 0xd7, 0x16, 0x5f, 0x36, 0x75, 0xf5, + 0x95, 0x87, 0x8b, 0xf2, 0x3b, 0xff, 0xfe, 0xf3, 0x6b, 0x06, 0xe7, 0xc2, + 0xf9, 0x41, 0x99, 0xfe, 0x2c, 0xb4, 0x2c, 0xbe, 0x8d, 0xe3, 0x8e, 0xcf, + 0xd0, 0x0c, 0x97, 0xfe, 0x79, 0x79, 0xff, 0xcc, 0x29, 0x2c, 0xaf, 0x1f, + 0xc7, 0xce, 0xea, 0x4a, 0xb9, 0x34, 0x58, 0x72, 0x9f, 0x19, 0x14, 0x32, + 0x78, 0xcb, 0xf8, 0xc3, 0x6f, 0xff, 0x66, 0x81, 0xfd, 0x64, 0xff, 0x8c, + 0xe2, 0xcb, 0xdd, 0xe1, 0xd6, 0x5f, 0xff, 0xd9, 0xdc, 0x07, 0xbf, 0x46, + 0xbc, 0xe3, 0xf3, 0xe9, 0x65, 0xfc, 0x37, 0xff, 0x03, 0x25, 0x97, 0x4b, + 0x6e, 0x11, 0x4f, 0x83, 0xa2, 0x2e, 0x5f, 0xcf, 0xa8, 0xfb, 0x6f, 0x59, + 0x5d, 0x1f, 0x61, 0x1f, 0x5f, 0xff, 0xfb, 0x5a, 0x8e, 0xa5, 0xd7, 0x1b, + 0x5d, 0xfb, 0x04, 0xd3, 0x40, 0xd6, 0x5f, 0x88, 0xd1, 0x33, 0xa5, 0x97, + 0xfc, 0xfa, 0xce, 0xa5, 0x00, 0x85, 0x95, 0x08, 0xf4, 0xc2, 0x26, 0x70, + 0x09, 0x55, 0xff, 0x75, 0x2f, 0xe7, 0x3f, 0x9b, 0x8b, 0x2f, 0xff, 0xdd, + 0x9a, 0xfc, 0xcd, 0x49, 0xbc, 0xe5, 0xd4, 0x96, 0x5f, 0xfb, 0xb8, 0xff, + 0x33, 0xed, 0xd1, 0x8b, 0x2b, 0x11, 0x30, 0x6a, 0xbd, 0x42, 0x3e, 0x1e, + 0x1a, 0xb5, 0x0b, 0x83, 0x23, 0x70, 0xf4, 0xa5, 0x12, 0x8c, 0xca, 0xfd, + 0xc2, 0x0e, 0xf9, 0x2c, 0xbf, 0x61, 0x7b, 0x09, 0x65, 0xe9, 0xc4, 0xed, + 0x65, 0xf1, 0x34, 0xdb, 0x8b, 0x2a, 0x11, 0x29, 0xe2, 0xa7, 0x25, 0xe1, + 0x05, 0xce, 0x05, 0x95, 0x23, 0xd1, 0xf9, 0xdd, 0xff, 0x4b, 0x3e, 0x78, + 0xc2, 0x1a, 0xcb, 0xff, 0xf3, 0xbc, 0x9f, 0xdb, 0x32, 0x70, 0xfc, 0x2e, + 0x22, 0xa2, 0xfb, 0x5e, 0xde, 0x1f, 0xac, 0xba, 0x06, 0xb2, 0xa0, 0xda, + 0x80, 0x7e, 0xfe, 0x7e, 0xe0, 0xa0, 0x0b, 0x2f, 0xfd, 0xc6, 0x2e, 0xa5, + 0xa0, 0xc7, 0x16, 0x5f, 0xb3, 0x58, 0x38, 0x59, 0x5d, 0x27, 0x05, 0x31, + 0xbe, 0xa1, 0x35, 0xe2, 0x0f, 0x96, 0x6f, 0x3f, 0xbf, 0x7b, 0x26, 0x8d, + 0xc5, 0x97, 0xe1, 0xeb, 0x58, 0x62, 0xca, 0x9c, 0xf5, 0x08, 0xae, 0xfe, + 0x62, 0xcf, 0xc4, 0xcb, 0x2f, 0xf7, 0xa0, 0x3d, 0x49, 0xb6, 0xd6, 0x5f, + 0xfd, 0x2e, 0x41, 0xf3, 0xb2, 0x7c, 0xed, 0x65, 0xf4, 0x11, 0xa3, 0x59, + 0x79, 0xc1, 0x0b, 0x2f, 0xff, 0x0d, 0x8f, 0xd4, 0xb8, 0x59, 0xa1, 0x3e, + 0xb2, 0xa1, 0x35, 0x29, 0x11, 0x76, 0x59, 0xd1, 0xbf, 0x91, 0x38, 0x45, + 0xf1, 0xbb, 0xa5, 0xc5, 0x97, 0xe9, 0x37, 0x6f, 0xa5, 0x97, 0xff, 0x9c, + 0xb3, 0xf0, 0xda, 0x63, 0x4d, 0x85, 0x95, 0xc3, 0xf0, 0x10, 0xa2, 0xdd, + 0xac, 0xbf, 0xff, 0xc0, 0x6d, 0x1b, 0xe8, 0x3c, 0xd2, 0x62, 0xf4, 0x6a, + 0x16, 0x5b, 0xf8, 0x7e, 0x7c, 0x12, 0xbc, 0xda, 0xc5, 0x97, 0x8b, 0x24, + 0xb2, 0xbb, 0x36, 0xdf, 0x1b, 0xbc, 0x50, 0x75, 0x95, 0x08, 0x9a, 0x65, + 0xde, 0x11, 0x5f, 0xf3, 0x4b, 0xfe, 0xcd, 0x37, 0x16, 0x5f, 0xff, 0xa5, + 0x84, 0x3f, 0x46, 0x14, 0x00, 0xef, 0x25, 0x94, 0x48, 0x8a, 0x10, 0xe2, + 0xff, 0x67, 0xba, 0x97, 0xe0, 0xeb, 0x2f, 0xd2, 0x2c, 0xc9, 0xd6, 0x5d, + 0xa9, 0xd6, 0x5f, 0xf4, 0xc2, 0x9f, 0xb0, 0xc7, 0x84, 0xb2, 0xa0, 0xff, + 0x30, 0x9d, 0x86, 0x2f, 0xf3, 0x8e, 0x01, 0x06, 0x71, 0x65, 0x62, 0x61, + 0xfe, 0x85, 0x83, 0x96, 0x5f, 0xdb, 0x62, 0xab, 0x66, 0xcf, 0x6d, 0xae, + 0x20, 0x15, 0xfe, 0xf8, 0x04, 0x29, 0x7b, 0x17, 0x10, 0x0a, 0xf3, 0xea, + 0x4b, 0x88, 0x05, 0x58, 0x7d, 0x41, 0x41, 0xb9, 0xe4, 0xb8, 0x80, 0x57, + 0xce, 0x5d, 0x49, 0x71, 0x00, 0xaf, 0xf3, 0x77, 0xec, 0x00, 0x21, 0x71, + 0x00, 0xaf, 0x31, 0x0d, 0x71, 0x00, 0xa8, 0x68, 0xba, 0x39, 0x1f, 0x8b, + 0xf7, 0xa0, 0x58, 0xd5, 0xc4, 0x02, 0xbd, 0xa8, 0xfa, 0xe2, 0x01, 0x52, + 0xe2, 0x01, 0x5e, 0xdb, 0x60, 0x2e, 0x20, 0x15, 0xd0, 0x75, 0xc4, 0x02, + 0xa1, 0x9f, 0x3e, 0x0c, 0x31, 0x65, 0xf3, 0x1c, 0x70, 0xb8, 0x80, 0x57, + 0xbe, 0xfd, 0xae, 0x20, 0x15, 0xff, 0x89, 0xe4, 0x2f, 0xcd, 0xdb, 0xe9, + 0x71, 0x00, 0xaf, 0xfe, 0x7f, 0x86, 0x76, 0x2f, 0xf9, 0xe4, 0xb8, 0x80, + 0x57, 0x38, 0xd7, 0x10, 0x0a, 0xff, 0x13, 0x99, 0xce, 0x40, 0x17, 0x10, + 0x0a, 0xfc, 0xc6, 0xb9, 0x01, 0x71, 0x00, 0xae, 0x6e, 0x2e, 0x20, 0x15, + 0x68, 0xf5, 0xfe, 0x69, 0x7f, 0xfb, 0xcd, 0xff, 0xe7, 0x36, 0x69, 0xa0, + 0xeb, 0x88, 0x05, 0x7e, 0xf9, 0x47, 0x52, 0x54, 0x40, 0x2b, 0x81, 0x0b, + 0x88, 0x04, 0x2c, 0xda, 0xd2, 0xe2, 0x01, 0x5f, 0x41, 0xdc, 0x6b, 0x88, + 0x05, 0x43, 0x3c, 0x66, 0x18, 0xbe, 0x0b, 0x97, 0x6b, 0x88, 0x05, 0x7a, + 0x35, 0xda, 0xe2, 0x01, 0x5f, 0xfb, 0x3a, 0xe0, 0xe3, 0x08, 0x1c, 0x5c, + 0x40, 0x2b, 0xf0, 0x5e, 0x52, 0x85, 0xc4, 0x02, 0xbf, 0x3f, 0x7e, 0x8e, + 0x97, 0x10, 0x0a, 0xb1, 0x16, 0xbe, 0x4b, 0x09, 0xa5, 0xda, 0x02, 0xe2, + 0x01, 0x54, 0x95, 0xb3, 0x0c, 0x8f, 0x21, 0x2f, 0xd9, 0x13, 0x42, 0x37, + 0xcf, 0x60, 0x21, 0xe1, 0x7f, 0xe1, 0xbe, 0x12, 0xfb, 0xf6, 0x7f, 0x8f, + 0xd2, 0xe2, 0x01, 0x5f, 0xe1, 0xc7, 0x73, 0x6a, 0x3e, 0xb8, 0x80, 0x43, + 0x36, 0xb7, 0xb5, 0x06, 0x2e, 0x20, 0x15, 0x76, 0x7f, 0x9a, 0x52, 0xbf, + 0xc1, 0x79, 0x4a, 0x04, 0x3a, 0xe2, 0x01, 0x5f, 0x31, 0x4b, 0x8b, 0x88, + 0x05, 0x7f, 0x3c, 0xd2, 0xce, 0xa4, 0xb8, 0x80, 0x55, 0x88, 0xce, 0xf1, + 0x18, 0x10, 0x42, 0x5d, 0x7f, 0xde, 0x8e, 0x0b, 0xe0, 0x74, 0x05, 0xc4, + 0x02, 0xb3, 0x2e, 0x20, 0x15, 0xcf, 0x38, 0xcf, 0x9b, 0xc9, 0x37, 0x68, + 0x0b, 0x88, 0x05, 0x7e, 0x7f, 0xf1, 0xba, 0x5c, 0x40, 0x2b, 0xf9, 0x88, + 0x32, 0xce, 0x2e, 0x20, 0x15, 0x42, 0x24, 0x88, 0x93, 0xe6, 0xb5, 0x0c, + 0xab, 0x21, 0xc2, 0xdb, 0x21, 0xb6, 0xc7, 0xf3, 0x0f, 0xea, 0x12, 0x1e, + 0x2d, 0x72, 0xe0, 0x15, 0x12, 0x6f, 0x25, 0xdb, 0xfe, 0x50, 0xd6, 0xdc, + 0x28, 0x84, 0x86, 0x05, 0xef, 0xb1, 0x8b, 0x8c, 0x25, 0x79, 0xdf, 0xb5, + 0x44, 0x02, 0x16, 0x98, 0xa7, 0x50, 0xea, 0xbd, 0x06, 0x71, 0x65, 0xbe, + 0xb2, 0xf1, 0x67, 0x7d, 0x9a, 0xe6, 0x1d, 0xb8, 0x67, 0x59, 0x7f, 0xfc, + 0x40, 0xff, 0xb3, 0xb8, 0x3f, 0x27, 0x94, 0xeb, 0x2f, 0xf0, 0x7f, 0x9c, + 0xfe, 0x76, 0xb2, 0xb6, 0x92, 0x27, 0x9c, 0x5c, 0x0a, 0x77, 0xf7, 0xcb, + 0x01, 0xb7, 0x8b, 0x28, 0x69, 0x9a, 0x1b, 0x0d, 0x03, 0x9a, 0xdf, 0xe9, + 0x37, 0xcd, 0x37, 0x37, 0x16, 0x5f, 0x47, 0xe0, 0x6b, 0x2d, 0x3a, 0xca, + 0x91, 0xb3, 0xde, 0x43, 0x7f, 0x4f, 0x1a, 0xf3, 0xee, 0x2c, 0xb7, 0x16, + 0x5f, 0x14, 0x0f, 0xcb, 0x2b, 0xc6, 0xcb, 0x78, 0x8d, 0x42, 0x2a, 0x70, + 0x8d, 0x98, 0xef, 0xfc, 0x59, 0xdf, 0x98, 0x00, 0x0c, 0xcb, 0x2f, 0xf8, + 0x78, 0x69, 0x67, 0xe0, 0xc5, 0x97, 0xf6, 0x6b, 0x25, 0x28, 0x59, 0x52, + 0x45, 0x28, 0x10, 0x08, 0xe6, 0xfd, 0xfc, 0x1b, 0xf9, 0x65, 0xc0, 0x84, + 0x96, 0x35, 0x25, 0xef, 0x44, 0xeb, 0x2e, 0x30, 0xc4, 0x94, 0xc7, 0xbd, + 0xb8, 0x2d, 0x30, 0x91, 0x83, 0xb6, 0xe2, 0x41, 0x67, 0x81, 0x58, 0x8e, + 0x96, 0x86, 0x2d, 0xff, 0xd8, 0x09, 0x37, 0xe0, 0xf0, 0x43, 0x59, 0x47, + 0x3e, 0x87, 0x26, 0xbf, 0xb0, 0x7e, 0x82, 0x1a, 0xcb, 0xfb, 0xfc, 0xc3, + 0x3c, 0xcb, 0x2d, 0xf5, 0x95, 0xf3, 0x7e, 0x12, 0xeb, 0xf4, 0x4f, 0xc3, + 0xc9, 0x65, 0x31, 0xe5, 0x7c, 0x86, 0xff, 0xfd, 0xd4, 0xb8, 0x5d, 0x41, + 0xbc, 0x8e, 0xa4, 0xc7, 0x59, 0x7f, 0xfb, 0xfc, 0xc3, 0x5b, 0x42, 0x00, + 0x11, 0xd2, 0xca, 0x14, 0x36, 0xd1, 0x11, 0x08, 0x79, 0xe3, 0x30, 0x94, + 0x2e, 0x07, 0x19, 0x97, 0x74, 0xbf, 0xa6, 0x8e, 0xce, 0x63, 0x7d, 0x46, + 0x28, 0xf0, 0xd2, 0x04, 0x70, 0x04, 0x43, 0xf8, 0x5a, 0x84, 0x84, 0x45, + 0x9b, 0xfe, 0xc9, 0x30, 0xdf, 0xbe, 0x49, 0x65, 0xfe, 0x62, 0xed, 0xb4, + 0xc0, 0x59, 0x7b, 0x30, 0x0b, 0x28, 0xe7, 0x9a, 0x46, 0x55, 0xda, 0x29, + 0xfd, 0x08, 0x6b, 0xfb, 0xe3, 0xf0, 0x5c, 0x96, 0x5e, 0xef, 0xc4, 0xb2, + 0xff, 0xef, 0xed, 0xe4, 0xd2, 0x7d, 0x4e, 0x38, 0x59, 0x5d, 0x22, 0x4c, + 0xe5, 0xa4, 0x3b, 0x7f, 0xfb, 0xcd, 0xbd, 0xbb, 0xd4, 0x4e, 0xfa, 0xed, + 0x65, 0xfd, 0x1d, 0x41, 0x3f, 0xd6, 0x5c, 0x40, 0x59, 0x74, 0x71, 0x65, + 0x31, 0xac, 0xde, 0x2d, 0x5e, 0x3f, 0xad, 0xeb, 0x16, 0xff, 0x68, 0xec, + 0x12, 0x19, 0x17, 0xfb, 0x3a, 0xff, 0xde, 0x5c, 0x59, 0x7f, 0x84, 0x83, + 0x35, 0x18, 0x4b, 0x2f, 0x48, 0x57, 0x25, 0x97, 0x75, 0x25, 0xc6, 0x00, + 0xbf, 0xfd, 0x86, 0x47, 0xf2, 0x69, 0x37, 0xf8, 0xeb, 0x2f, 0xa6, 0xd4, + 0x7d, 0x65, 0x49, 0x1c, 0xdd, 0x19, 0x91, 0x0f, 0x09, 0x7e, 0x95, 0x7f, + 0xfe, 0x8c, 0xf7, 0x09, 0xfe, 0x1f, 0x8f, 0xcc, 0x6a, 0xcb, 0xfe, 0x6e, + 0xb9, 0xf2, 0x83, 0xf1, 0x65, 0xff, 0xff, 0xff, 0xfc, 0x1d, 0xc2, 0x7c, + 0xf3, 0x88, 0x59, 0xbf, 0x09, 0xcd, 0x9a, 0x41, 0xe7, 0x0c, 0x71, 0xf9, + 0x8c, 0xe6, 0x38, 0xd6, 0x51, 0xa8, 0xf5, 0xe1, 0xcd, 0x42, 0xe6, 0xd6, + 0x42, 0xf1, 0xa3, 0x1c, 0xd1, 0x83, 0xc6, 0x34, 0x49, 0x5f, 0x8d, 0x2a, + 0xff, 0xfc, 0x44, 0x1e, 0xb3, 0xaf, 0x8f, 0x4f, 0xd6, 0x4e, 0xb2, 0xfd, + 0x9f, 0xd4, 0x71, 0x65, 0x31, 0xff, 0x92, 0xc5, 0xe0, 0x44, 0x96, 0x5a, + 0x75, 0x94, 0xb2, 0xf4, 0xd2, 0x8d, 0x17, 0xa0, 0x12, 0xbe, 0x83, 0x60, + 0xeb, 0x2a, 0x48, 0xad, 0xe8, 0x83, 0x47, 0x27, 0x32, 0xbf, 0xf4, 0xb9, + 0xb0, 0xb0, 0xf1, 0xa3, 0x56, 0x5f, 0xff, 0xf4, 0xa0, 0xe2, 0x67, 0x9c, + 0xf8, 0x76, 0xfe, 0x1a, 0xda, 0x59, 0x7e, 0xd9, 0xb3, 0x3c, 0xeb, 0x2f, + 0xfb, 0xce, 0xdf, 0x97, 0x82, 0x6a, 0xcb, 0xcf, 0xee, 0x2c, 0xae, 0x1e, + 0xb1, 0x87, 0x57, 0xf4, 0xa3, 0x40, 0x10, 0xeb, 0x2f, 0xfe, 0x63, 0x4d, + 0x62, 0xef, 0x64, 0xfe, 0x35, 0x65, 0xff, 0xdb, 0xcb, 0x39, 0xfc, 0x29, + 0x67, 0x16, 0x5f, 0x1e, 0x03, 0xf5, 0x95, 0x87, 0xcc, 0xe8, 0x97, 0xdf, + 0xfb, 0xe9, 0x65, 0xfb, 0x26, 0xf4, 0x4e, 0xb2, 0x9c, 0xf2, 0xc8, 0x8a, + 0xff, 0xc4, 0xff, 0xe3, 0x74, 0x50, 0x62, 0xcb, 0xdf, 0x72, 0x59, 0x67, + 0xd8, 0x9f, 0x3e, 0x11, 0xf8, 0xbc, 0xa1, 0x63, 0xc6, 0xb1, 0x08, 0x37, + 0x4f, 0xab, 0x62, 0xad, 0xbf, 0x4a, 0x68, 0xbf, 0xe8, 0xdc, 0x1f, 0xa2, + 0x77, 0x25, 0x97, 0xff, 0xd0, 0x71, 0x0b, 0xfe, 0x0b, 0xcb, 0xc1, 0xe2, + 0xcb, 0xfe, 0x8e, 0xe0, 0xec, 0x70, 0x32, 0xca, 0xe9, 0x70, 0xcf, 0x52, + 0xd0, 0x7c, 0x5c, 0x47, 0x7b, 0xaa, 0x37, 0xf0, 0x86, 0x69, 0xb3, 0xc9, + 0x2f, 0xf3, 0xfe, 0x24, 0x11, 0xe2, 0xcb, 0xef, 0x46, 0x4e, 0xb2, 0x88, + 0xf5, 0x38, 0x65, 0x7d, 0xc6, 0x80, 0x2c, 0xbe, 0x9b, 0x30, 0xc5, 0x97, + 0xd2, 0x6d, 0x71, 0x65, 0xf3, 0x7e, 0x34, 0xb2, 0xff, 0x9b, 0x3a, 0xfc, + 0xd2, 0x7d, 0x2c, 0xb0, 0x3c, 0x7b, 0x64, 0x43, 0x7d, 0x37, 0x9e, 0x65, + 0x97, 0xdd, 0xbe, 0xa7, 0x59, 0x7a, 0x67, 0xfa, 0xcb, 0xf6, 0x4d, 0x28, + 0xe9, 0x65, 0xcd, 0x32, 0xcb, 0xcd, 0x04, 0xb2, 0xfd, 0x9a, 0x1f, 0xb1, + 0x65, 0x0c, 0xf0, 0x78, 0x35, 0x5e, 0x3f, 0xae, 0x2c, 0x5e, 0x72, 0x02, + 0xcb, 0xc5, 0x12, 0x49, 0x7f, 0xe2, 0x03, 0x6e, 0xee, 0x86, 0x51, 0xb8, + 0xb2, 0xc7, 0x59, 0x5b, 0x11, 0x1d, 0x83, 0x6e, 0x36, 0x22, 0x3d, 0x6c, + 0x55, 0xff, 0x04, 0x23, 0x21, 0xc2, 0x3e, 0x9f, 0x74, 0x4f, 0xe2, 0x47, + 0x24, 0x21, 0xdf, 0xc2, 0x8f, 0x76, 0x16, 0x15, 0x0c, 0x93, 0x1c, 0x3e, + 0x69, 0xc7, 0x4f, 0x2b, 0xbc, 0xb8, 0x2b, 0xf7, 0x35, 0xa8, 0xfa, 0xcb, + 0xfd, 0x9e, 0x7c, 0x00, 0x9f, 0x59, 0x7b, 0xed, 0x3a, 0xca, 0xe8, 0xfe, + 0x37, 0x0a, 0x0e, 0x67, 0x7e, 0xe1, 0xba, 0x7e, 0xd6, 0x5d, 0xc9, 0x2c, + 0xa9, 0x1e, 0x0e, 0xf2, 0xab, 0xc5, 0xfe, 0x2c, 0xbf, 0xdd, 0xf9, 0x87, + 0x05, 0xf5, 0x97, 0x34, 0x96, 0x57, 0x47, 0x92, 0x46, 0x77, 0x10, 0x16, + 0x5f, 0xb5, 0xe7, 0x73, 0xac, 0xbe, 0x09, 0x07, 0xb5, 0x94, 0xe7, 0x95, + 0xc2, 0x7b, 0xfb, 0xf3, 0x4b, 0x3a, 0x92, 0xca, 0x84, 0xd7, 0x18, 0x91, + 0xd9, 0x7e, 0x44, 0x16, 0x01, 0x08, 0x6f, 0xf8, 0x4c, 0xc0, 0xfb, 0x37, + 0xc2, 0xcb, 0xff, 0x19, 0x1a, 0xe6, 0x18, 0xfa, 0x35, 0x65, 0xec, 0xe0, + 0x56, 0x5f, 0xff, 0xbd, 0x9d, 0x90, 0x46, 0x50, 0x26, 0x9a, 0x09, 0x65, + 0x62, 0x3a, 0xfc, 0x74, 0x48, 0x3f, 0x1c, 0xbf, 0xc6, 0x67, 0x5f, 0xfc, + 0x1d, 0x65, 0xf8, 0xb0, 0x01, 0xe2, 0xcb, 0xfe, 0xed, 0xb0, 0xb3, 0x7b, + 0xf1, 0x65, 0x4e, 0x7c, 0x1e, 0x27, 0xa7, 0x45, 0xc7, 0x21, 0x2b, 0x7c, + 0x31, 0xe1, 0xd6, 0x5c, 0x08, 0x49, 0x71, 0x86, 0x24, 0xa6, 0x35, 0xe6, + 0x0b, 0x5f, 0x86, 0x17, 0xd4, 0x92, 0x0b, 0x34, 0x35, 0x88, 0xac, 0x35, + 0xca, 0xff, 0xf7, 0xfa, 0xed, 0xbd, 0xb7, 0x1f, 0xf0, 0x9c, 0x59, 0x61, + 0x51, 0x65, 0xfe, 0x89, 0x37, 0xe5, 0x1f, 0x59, 0x70, 0xaf, 0x8b, 0x05, + 0x59, 0xe4, 0x68, 0x5a, 0xff, 0xbc, 0xff, 0xe7, 0x65, 0x93, 0xac, 0xbd, + 0xb4, 0x85, 0x02, 0x85, 0x97, 0x76, 0xcb, 0x2f, 0x89, 0xba, 0x92, 0xcb, + 0xfe, 0x6e, 0xbd, 0x83, 0xd3, 0xf6, 0xb2, 0xa0, 0xf7, 0x34, 0x45, 0x7d, + 0x9b, 0xf0, 0x96, 0x5f, 0xee, 0x63, 0x7c, 0xd6, 0xf2, 0xcb, 0xfe, 0xf4, + 0x6a, 0x3b, 0x62, 0xed, 0x65, 0xe3, 0x5f, 0x9b, 0x49, 0x34, 0xde, 0xca, + 0xf4, 0xe7, 0xe2, 0x1f, 0x91, 0x6e, 0x99, 0xd6, 0x27, 0xf7, 0xf8, 0xe1, + 0xea, 0x4b, 0x9c, 0xbd, 0x43, 0xcf, 0x50, 0xd3, 0x39, 0x18, 0x61, 0x32, + 0x64, 0xa3, 0xab, 0xf7, 0x9b, 0x81, 0x9d, 0x65, 0xfc, 0x61, 0xaf, 0xf2, + 0x85, 0x97, 0x8e, 0x1d, 0x2c, 0xbd, 0xdb, 0x71, 0x65, 0xf0, 0x4f, 0x83, + 0x59, 0x5d, 0x22, 0x29, 0x8b, 0xbc, 0x3b, 0xba, 0x3b, 0x7f, 0xff, 0x6a, + 0x41, 0x8c, 0xf7, 0x6d, 0xcc, 0x1c, 0xf8, 0x62, 0xcb, 0xff, 0x7b, 0x37, + 0x5c, 0x8d, 0xce, 0xbe, 0xb2, 0xfe, 0xf3, 0x0f, 0xc1, 0x35, 0x65, 0xf8, + 0xa2, 0x66, 0xe9, 0x65, 0xb3, 0xb3, 0xd7, 0x62, 0xfb, 0xdf, 0xce, 0xd6, + 0x51, 0xcf, 0x13, 0x84, 0xf7, 0xa4, 0x70, 0x2c, 0xbf, 0x7c, 0xb3, 0x50, + 0xb2, 0xa1, 0x39, 0xf3, 0x57, 0x41, 0x0d, 0xdf, 0x91, 0x18, 0x3b, 0x7d, + 0x84, 0xc6, 0xac, 0xbf, 0xe3, 0x5f, 0x64, 0x1c, 0x98, 0xd5, 0x97, 0xfe, + 0x7e, 0x1e, 0x1b, 0x5a, 0x63, 0x16, 0x5f, 0xa7, 0xc1, 0xc1, 0xd6, 0x5b, + 0x86, 0xa2, 0x87, 0xc7, 0x62, 0x1f, 0x5f, 0xff, 0xfd, 0xe8, 0xe6, 0x02, + 0x3f, 0xcd, 0x64, 0xf1, 0xae, 0x7b, 0xb6, 0xe2, 0xcb, 0xd2, 0x7d, 0x2c, + 0xa1, 0xa2, 0x3d, 0xdc, 0xef, 0xe3, 0xeb, 0x4d, 0xd0, 0x16, 0x5f, 0x7d, + 0xfd, 0x32, 0xcb, 0xf8, 0xa3, 0xbf, 0x36, 0xea, 0xcb, 0xc6, 0xc7, 0x16, + 0x5f, 0xf6, 0x7f, 0xec, 0x6f, 0xf3, 0xb5, 0x97, 0xf4, 0x75, 0xcc, 0xeb, + 0xeb, 0x2e, 0xd4, 0x2c, 0xa1, 0x9e, 0x2f, 0xcb, 0xef, 0xc1, 0x21, 0xed, + 0x1b, 0x42, 0xcb, 0xff, 0xef, 0xea, 0x33, 0xad, 0xb2, 0x38, 0x7e, 0x07, + 0x59, 0x7f, 0xbe, 0xdd, 0xb0, 0xe3, 0xeb, 0x2f, 0xdc, 0x8e, 0xf0, 0xeb, + 0x2a, 0x0f, 0x6f, 0x86, 0x76, 0xe6, 0xc5, 0x42, 0x50, 0x47, 0x23, 0x01, + 0x8e, 0xe3, 0xff, 0x64, 0x5d, 0x19, 0x6a, 0x15, 0xd5, 0x25, 0xc6, 0xce, + 0xa1, 0x84, 0x78, 0x63, 0xb9, 0x17, 0xe5, 0x20, 0xdf, 0xf7, 0xda, 0x78, + 0xe8, 0x1a, 0x85, 0x97, 0x7a, 0x75, 0x97, 0xb9, 0xfc, 0x59, 0x76, 0x73, + 0x61, 0xf7, 0x76, 0x74, 0x20, 0xc5, 0xf9, 0xc1, 0xb6, 0xc7, 0x59, 0x7f, + 0x76, 0xdc, 0x0c, 0x99, 0x65, 0xe2, 0x0f, 0x16, 0x57, 0x8f, 0x2b, 0x79, + 0x75, 0xff, 0xd9, 0xf6, 0xea, 0x45, 0x02, 0x81, 0x53, 0x6d, 0x65, 0xff, + 0x3b, 0x7d, 0x8b, 0xe1, 0xf2, 0xcb, 0xde, 0x6d, 0xeb, 0x2e, 0x0c, 0xbc, + 0x7a, 0xa2, 0x1b, 0xdf, 0xff, 0xec, 0xde, 0x38, 0xff, 0x03, 0xa2, 0xc1, + 0xfa, 0x0c, 0x85, 0x97, 0xf8, 0xdf, 0xf5, 0xdb, 0x6b, 0x8b, 0x2f, 0xd9, + 0xf0, 0x3f, 0xd6, 0x54, 0x27, 0x71, 0x22, 0x4d, 0x42, 0x97, 0xc5, 0xe1, + 0x62, 0xdb, 0x37, 0xbf, 0xff, 0x47, 0x9f, 0x0a, 0x34, 0x68, 0xc2, 0xfa, + 0x92, 0xca, 0x92, 0xb1, 0xde, 0x1f, 0x7e, 0x51, 0x66, 0xea, 0xfd, 0x43, + 0x2f, 0xcc, 0x6e, 0x59, 0x0b, 0x36, 0x8f, 0x7d, 0xe7, 0x2f, 0x43, 0x2f, + 0xa6, 0xf3, 0x3c, 0x96, 0x5b, 0x6d, 0x65, 0x78, 0xd7, 0xed, 0x8d, 0xdf, + 0xec, 0x29, 0x67, 0x04, 0x3a, 0xcb, 0xf1, 0xf8, 0x07, 0x75, 0x95, 0xf3, + 0xda, 0x10, 0xce, 0xff, 0x61, 0x6c, 0xf6, 0x74, 0x62, 0xcb, 0xfa, 0x3c, + 0xdb, 0xf2, 0x65, 0x95, 0xa3, 0xe5, 0x01, 0xb5, 0xff, 0x48, 0x82, 0x0d, + 0x9d, 0x9c, 0x0b, 0x2a, 0x74, 0xd9, 0x64, 0xfd, 0x90, 0x88, 0xe8, 0x8a, + 0xff, 0xb3, 0xa9, 0x7b, 0x77, 0x76, 0x37, 0x16, 0x5f, 0xfb, 0xdc, 0x69, + 0x37, 0xe3, 0xfc, 0x59, 0x7f, 0xf8, 0x04, 0x1e, 0x7f, 0x91, 0xac, 0xeb, + 0xeb, 0x29, 0xd1, 0x12, 0x47, 0xd7, 0xff, 0x36, 0xb6, 0x3c, 0x4a, 0x08, + 0x32, 0x59, 0x7d, 0x1a, 0xcd, 0xeb, 0x2f, 0xde, 0x6d, 0xb7, 0x9d, 0x65, + 0x49, 0x12, 0x5c, 0x44, 0xf9, 0x1d, 0xfe, 0x07, 0x30, 0xb3, 0x81, 0x59, + 0x58, 0x7c, 0x4e, 0x61, 0x69, 0x2c, 0xbf, 0xd1, 0x9d, 0x7f, 0x35, 0x0b, + 0x2b, 0x47, 0x86, 0x42, 0x37, 0xfe, 0x8f, 0x09, 0xc2, 0xcf, 0xfb, 0x16, + 0x5f, 0xfd, 0xe0, 0xf3, 0x91, 0xae, 0xf0, 0x4c, 0x59, 0x7b, 0x00, 0xeb, + 0x2d, 0xbd, 0x8f, 0x87, 0xc8, 0xd7, 0xa0, 0x18, 0xb2, 0xff, 0xe9, 0x1a, + 0xe2, 0x7d, 0xb5, 0x01, 0x15, 0xac, 0xaf, 0x1f, 0x2b, 0x8d, 0xd6, 0x22, + 0xbc, 0x30, 0x8e, 0xbf, 0xe7, 0xe8, 0x33, 0xc1, 0x47, 0x4b, 0x2a, 0x17, + 0x16, 0x31, 0x11, 0xa1, 0x99, 0xe8, 0xc5, 0x5d, 0x8c, 0x04, 0x25, 0x1a, + 0x70, 0x49, 0xef, 0xff, 0xc6, 0xb7, 0xcb, 0x25, 0xd7, 0xc9, 0xa7, 0xe0, + 0x56, 0x5f, 0x6f, 0x18, 0xe1, 0x65, 0xff, 0xd9, 0xad, 0x99, 0xe7, 0x34, + 0x83, 0xc5, 0x94, 0xc8, 0xc1, 0x75, 0x70, 0x92, 0x5f, 0xff, 0xda, 0x96, + 0xc1, 0xfa, 0x36, 0x16, 0x75, 0xf8, 0xc3, 0x16, 0x5d, 0xce, 0x2c, 0xbf, + 0x46, 0x7f, 0x8e, 0xb2, 0xf1, 0x86, 0x18, 0xb2, 0xe0, 0x3a, 0x41, 0x66, + 0x82, 0xff, 0x6a, 0x37, 0xe6, 0x1c, 0x6b, 0x29, 0x93, 0x19, 0xd3, 0x01, + 0xc5, 0xf8, 0x8c, 0x12, 0x8b, 0xff, 0x67, 0x09, 0xcd, 0x98, 0x9a, 0x65, + 0x97, 0xf0, 0x22, 0x5e, 0x13, 0x8b, 0x2f, 0xf9, 0x80, 0x26, 0x6f, 0x20, + 0xf1, 0x65, 0xfb, 0x81, 0x06, 0x12, 0xcb, 0xf9, 0x88, 0x1d, 0xf6, 0xcb, + 0x2f, 0x38, 0x31, 0x25, 0x49, 0x55, 0x51, 0xe3, 0x47, 0xf2, 0x50, 0x0f, + 0xc8, 0xbf, 0xe7, 0x7b, 0xc9, 0xf6, 0xcb, 0xaf, 0xa0, 0x6c, 0x35, 0x97, + 0xf7, 0x3c, 0xdd, 0xbe, 0x96, 0x5f, 0x87, 0xa6, 0x0c, 0xeb, 0x2f, 0xd9, + 0xfe, 0x3f, 0x4b, 0x2f, 0xf1, 0x98, 0x59, 0xbd, 0xb4, 0xb2, 0xfe, 0x2c, + 0xe8, 0x02, 0x49, 0x65, 0xff, 0xf7, 0x3f, 0x9e, 0x10, 0xf9, 0xdc, 0x7a, + 0x0e, 0xb2, 0xdc, 0x59, 0x58, 0x9a, 0x24, 0xc5, 0xda, 0x29, 0x22, 0x8f, + 0x9a, 0x04, 0xbc, 0xc5, 0x1b, 0xf6, 0x67, 0xfd, 0x8b, 0x2e, 0x73, 0xac, + 0xbf, 0xff, 0xb0, 0x8a, 0x25, 0xa8, 0xe1, 0x66, 0xf6, 0xf0, 0x56, 0x5f, + 0xf0, 0x79, 0xf8, 0x98, 0x3d, 0x71, 0x65, 0xf3, 0x6b, 0x50, 0xb2, 0xff, + 0x66, 0xfc, 0x16, 0x61, 0x86, 0x24, 0xbc, 0x66, 0x79, 0x65, 0xfa, 0x68, + 0xcf, 0x71, 0x65, 0x6c, 0x46, 0xe7, 0x8f, 0x08, 0x87, 0xe7, 0x42, 0x0e, + 0xdf, 0xe1, 0x5c, 0x07, 0xbf, 0x36, 0x96, 0x5e, 0x3b, 0xfd, 0x65, 0xfc, + 0x51, 0x30, 0x5c, 0x45, 0x95, 0x32, 0xa1, 0x93, 0x8b, 0x7a, 0x33, 0x50, + 0xa6, 0x6f, 0x38, 0x10, 0x72, 0xff, 0xfb, 0x06, 0xec, 0x4f, 0xf6, 0x29, + 0x73, 0x16, 0x5f, 0xde, 0x7d, 0x36, 0x69, 0x65, 0x41, 0xfb, 0xba, 0x5d, + 0x2c, 0xbe, 0xeb, 0xb6, 0xd2, 0xcb, 0x03, 0x6b, 0x35, 0xff, 0x0b, 0xbf, + 0xdb, 0xfc, 0xd9, 0x27, 0xde, 0xb2, 0xfd, 0xbd, 0xce, 0xc7, 0x59, 0x50, + 0x88, 0xbc, 0x2c, 0x23, 0x6b, 0xf6, 0x4d, 0x28, 0x92, 0xcb, 0xe8, 0x11, + 0x80, 0xb2, 0xff, 0x8e, 0xf2, 0xc9, 0x40, 0x38, 0xb2, 0xff, 0xf9, 0xbf, + 0xcf, 0x30, 0xcf, 0xf2, 0x8c, 0xe9, 0x65, 0x4e, 0x8a, 0x90, 0x11, 0x7c, + 0xe2, 0xfe, 0x9c, 0x71, 0x84, 0x35, 0x95, 0x0b, 0xf2, 0xd2, 0x7d, 0x68, + 0xd9, 0x7c, 0xca, 0xf2, 0x8f, 0xca, 0x1b, 0x5c, 0x86, 0xd7, 0xcb, 0x43, + 0x0d, 0x11, 0x0c, 0x6f, 0x38, 0x19, 0x65, 0xff, 0xb3, 0x7c, 0x47, 0xa2, + 0x78, 0xe9, 0x65, 0xff, 0x0c, 0x83, 0xcc, 0x9f, 0x27, 0x59, 0x7a, 0x34, + 0x4b, 0x2f, 0xf6, 0x0c, 0x9f, 0x8c, 0x35, 0x96, 0xf2, 0xcb, 0xc1, 0x79, + 0xc8, 0xf0, 0xb8, 0x63, 0x5a, 0x44, 0x87, 0xd7, 0x6f, 0x8f, 0xcc, 0x3a, + 0xca, 0x63, 0xc5, 0x72, 0x3b, 0xfa, 0x35, 0xff, 0xe6, 0xe2, 0xcb, 0xa3, + 0x7a, 0xca, 0x3a, 0x7a, 0x5e, 0x1b, 0x74, 0x01, 0x5c, 0x61, 0xe4, 0x41, + 0xba, 0x61, 0x7f, 0x08, 0x32, 0x8c, 0x9d, 0x65, 0x89, 0x65, 0xf4, 0x4f, + 0x12, 0x59, 0x43, 0x3e, 0x07, 0x2e, 0x21, 0x0b, 0xfb, 0xcd, 0xf2, 0x83, + 0xac, 0xbf, 0xfd, 0x83, 0x73, 0xe7, 0x52, 0xc0, 0x60, 0xd6, 0x5d, 0xe7, + 0x59, 0x74, 0xdc, 0x59, 0x7e, 0xcd, 0xec, 0x43, 0xc3, 0x5c, 0x20, 0xb5, + 0xfd, 0xb3, 0xf9, 0xce, 0x42, 0xcb, 0xec, 0xeb, 0xf0, 0xb2, 0xff, 0xe7, + 0xd6, 0x1a, 0xda, 0xcd, 0xef, 0xa5, 0x95, 0xe3, 0xe7, 0xde, 0x45, 0x7f, + 0xe2, 0xcd, 0x69, 0x8f, 0x9d, 0x7d, 0x65, 0xfb, 0x75, 0xe7, 0x12, 0x4b, + 0x2b, 0x62, 0x7b, 0x42, 0xdd, 0xe0, 0xfb, 0x21, 0x2d, 0xc2, 0x40, 0x9f, + 0x5d, 0xe7, 0x59, 0x7f, 0xef, 0x33, 0x83, 0x0a, 0x3a, 0xe2, 0xcb, 0x0f, + 0x0f, 0x4f, 0xe2, 0xd7, 0xfc, 0x52, 0xf6, 0x11, 0x41, 0x8b, 0x2f, 0xff, + 0x3c, 0xf1, 0xad, 0x3c, 0xb6, 0x00, 0x78, 0xb2, 0xb1, 0x10, 0x64, 0x6f, + 0x7f, 0xe2, 0xcf, 0xf9, 0xa3, 0x70, 0xf8, 0xb2, 0xff, 0xb5, 0xa7, 0x96, + 0xcd, 0xf1, 0xb8, 0xb2, 0xa0, 0xff, 0xf0, 0xfe, 0xa1, 0x18, 0x12, 0x85, + 0x05, 0x69, 0x52, 0x19, 0x42, 0xcb, 0xf1, 0xb5, 0x5f, 0xb0, 0x9f, 0xfc, + 0x59, 0x7f, 0x73, 0xd8, 0x4d, 0xc5, 0x97, 0xf7, 0x66, 0x39, 0x14, 0x2c, + 0xa9, 0x1f, 0xfe, 0x89, 0x88, 0xb2, 0xfa, 0x6f, 0x36, 0x96, 0x5f, 0x38, + 0xc4, 0x3a, 0xcb, 0xb3, 0x82, 0x93, 0xc6, 0x91, 0x1d, 0x42, 0xee, 0xb6, + 0x16, 0xb4, 0xe2, 0x4b, 0xc2, 0xec, 0x9d, 0x2f, 0xfb, 0x07, 0x85, 0x04, + 0x18, 0x59, 0x63, 0x16, 0x5f, 0xfe, 0x06, 0x75, 0xf8, 0xea, 0x5f, 0x04, + 0x49, 0x65, 0xfe, 0xf9, 0x37, 0x5c, 0x10, 0xeb, 0x28, 0x91, 0x03, 0xc4, + 0xcb, 0xf3, 0xbf, 0x52, 0xe2, 0xca, 0x84, 0x6e, 0xb4, 0x24, 0xf4, 0x45, + 0x51, 0x08, 0x26, 0x79, 0xe5, 0x0e, 0x4a, 0x97, 0xf0, 0x3a, 0x4e, 0x46, + 0x4a, 0xa2, 0x36, 0x52, 0x97, 0x73, 0xe4, 0x7d, 0x46, 0x60, 0xd1, 0xd2, + 0x4d, 0x28, 0x1f, 0x55, 0xb7, 0x71, 0xe7, 0xa4, 0x7d, 0x4a, 0xd6, 0x78, + 0x68, 0x82, 0x3d, 0x02, 0xac, 0x86, 0x79, 0x3c, 0xbb, 0xfa, 0x5c, 0x08, + 0x65, 0x3c, 0xef, 0x9e, 0x99, 0x11, 0x57, 0x76, 0x31, 0x2b, 0xfd, 0xa2, + 0x8f, 0xcb, 0x3c, 0xb2, 0xf7, 0x20, 0x0b, 0x2b, 0x0f, 0x3b, 0xe6, 0x57, + 0xfe, 0xf6, 0x0f, 0xd8, 0xe5, 0x9b, 0x8b, 0x2f, 0xe9, 0x16, 0x76, 0xdf, + 0x59, 0x7f, 0xf1, 0x76, 0x6b, 0xf3, 0x25, 0x05, 0xda, 0xcb, 0xec, 0x1b, + 0xc9, 0x65, 0xcd, 0x3a, 0xca, 0x01, 0xb8, 0xf9, 0x0d, 0x62, 0x61, 0x5d, + 0x1f, 0xb1, 0x69, 0x3e, 0xdf, 0xf7, 0xf9, 0xe6, 0x83, 0xb8, 0xd6, 0x5f, + 0x0f, 0x4f, 0x25, 0x97, 0x84, 0x80, 0x2c, 0xbe, 0xf0, 0x63, 0x8b, 0x2f, + 0x3b, 0x81, 0x65, 0xef, 0x47, 0x20, 0xde, 0xe8, 0x8a, 0xff, 0xde, 0x62, + 0x8e, 0xb8, 0xc7, 0x85, 0x97, 0xb9, 0x1a, 0x59, 0x77, 0xf8, 0x34, 0x45, + 0x76, 0x63, 0xd1, 0xed, 0x42, 0x6f, 0x86, 0x9c, 0x39, 0x10, 0x61, 0xc9, + 0x7a, 0x5f, 0x3a, 0xcb, 0xf8, 0xb2, 0x52, 0x7e, 0x2c, 0xbf, 0xa0, 0x4e, + 0x0f, 0xa3, 0xac, 0xae, 0xcf, 0x70, 0x8b, 0x2f, 0xe7, 0x33, 0x00, 0x27, + 0xd6, 0x5c, 0x36, 0x59, 0x7d, 0xd7, 0x23, 0xa5, 0x97, 0x3c, 0xb6, 0x1b, + 0xa6, 0x16, 0xbc, 0x6f, 0x99, 0x65, 0xff, 0xd3, 0x6a, 0x37, 0xfa, 0x1b, + 0x4d, 0x32, 0xca, 0x91, 0xf2, 0x74, 0x3b, 0x7f, 0x0f, 0xd9, 0xfe, 0x3a, + 0xcb, 0xfd, 0xc2, 0xc3, 0xbb, 0xce, 0xb2, 0x9c, 0xf7, 0xc2, 0x5b, 0x7f, + 0x73, 0x06, 0xdc, 0x9d, 0x65, 0xe9, 0x40, 0x16, 0x5f, 0x84, 0x9a, 0x51, + 0xb8, 0x92, 0xa1, 0x77, 0x53, 0x23, 0x2b, 0x36, 0x3b, 0x8e, 0xd0, 0x99, + 0xe7, 0x44, 0x5e, 0x69, 0x78, 0x48, 0x94, 0x20, 0xb8, 0x43, 0xf2, 0xe1, + 0x07, 0x2f, 0xe1, 0xe9, 0xfb, 0x7e, 0xd6, 0x5f, 0xff, 0xf0, 0xaa, 0x9e, + 0x36, 0x83, 0xc0, 0xaa, 0x14, 0x0a, 0xbf, 0xce, 0x0d, 0x9b, 0x3d, 0xb6, + 0xb2, 0xdd, 0xac, 0xbf, 0xf1, 0x05, 0xc4, 0xce, 0x34, 0x12, 0xcb, 0xf4, + 0xb9, 0xfd, 0xe0, 0x59, 0x46, 0x9f, 0x3f, 0x47, 0x97, 0xb6, 0xd8, 0x6b, + 0x2b, 0x47, 0x86, 0x72, 0x4b, 0xfb, 0x61, 0x66, 0xf7, 0xd2, 0xcb, 0xd0, + 0xfa, 0x59, 0x7f, 0x6f, 0x13, 0xff, 0x0f, 0x96, 0x5f, 0xc7, 0xff, 0xa3, + 0x7c, 0x2c, 0xbe, 0xc2, 0xec, 0x0b, 0x2f, 0xf7, 0xe5, 0x1f, 0xf3, 0xc9, + 0x65, 0xff, 0xbe, 0x13, 0xfa, 0x18, 0x9c, 0x6b, 0x2f, 0xa5, 0x27, 0xfa, + 0xca, 0x9d, 0x12, 0x5d, 0x19, 0xb9, 0xed, 0xf1, 0xba, 0x73, 0x16, 0x5d, + 0xde, 0xf5, 0x96, 0x11, 0x51, 0x02, 0xad, 0xf5, 0x50, 0x28, 0xad, 0x1e, + 0xbf, 0xc6, 0x8c, 0x1f, 0xac, 0x45, 0x5b, 0x3d, 0xdf, 0xdd, 0xb4, 0xff, + 0x71, 0xac, 0xbf, 0x98, 0x57, 0xdf, 0xa0, 0xc5, 0x97, 0xfb, 0xcc, 0x20, + 0xb0, 0x02, 0x12, 0x56, 0x8f, 0xa7, 0x6c, 0xce, 0xfd, 0x87, 0x77, 0x9d, + 0x65, 0xfa, 0x3b, 0xf4, 0x69, 0x65, 0xef, 0x04, 0xd5, 0x97, 0xb7, 0x45, + 0x7c, 0x59, 0x5e, 0x3c, 0x22, 0x1e, 0xa9, 0xd3, 0x6f, 0x68, 0x4c, 0x11, + 0x2f, 0xc9, 0xc4, 0x6a, 0xbf, 0x8f, 0xe8, 0x0f, 0x4c, 0xb2, 0xff, 0x88, + 0x03, 0xf3, 0x89, 0x93, 0xac, 0xbf, 0x60, 0x45, 0x79, 0xc5, 0x94, 0xc7, + 0xcb, 0xe3, 0xab, 0xff, 0xc4, 0x6b, 0xb9, 0x00, 0x82, 0xfd, 0x6d, 0x4b, + 0x2f, 0xf7, 0xf8, 0x1e, 0xbe, 0xc6, 0x2c, 0xac, 0x44, 0x21, 0x27, 0x5f, + 0xff, 0xb0, 0xc8, 0x38, 0x5c, 0x7f, 0xeb, 0xb6, 0x23, 0x16, 0x5f, 0xfb, + 0xaf, 0xf7, 0xe6, 0x1f, 0xb2, 0x75, 0x97, 0xf3, 0x75, 0xcf, 0x31, 0x8b, + 0x2c, 0x2b, 0x59, 0x40, 0x3c, 0x42, 0x2f, 0xac, 0x45, 0x3e, 0xa1, 0x0d, + 0x7f, 0x3f, 0x33, 0x08, 0xd5, 0x95, 0x87, 0xa6, 0x12, 0x7b, 0xce, 0xe6, + 0x2c, 0xa8, 0x4e, 0xc0, 0x64, 0x3e, 0x8d, 0x48, 0x88, 0x6f, 0xf7, 0xf9, + 0xb3, 0x0e, 0xc3, 0x59, 0x7f, 0xcf, 0xa9, 0x8a, 0x01, 0xc0, 0xac, 0xa8, + 0x3e, 0xe1, 0x9a, 0xdf, 0xbf, 0x81, 0x2f, 0xac, 0xbf, 0x4b, 0x82, 0x46, + 0xe2, 0xcb, 0x46, 0x1e, 0x9b, 0x93, 0xdf, 0xfb, 0x61, 0x39, 0xbb, 0x38, + 0x00, 0x42, 0xcb, 0xff, 0xd3, 0x84, 0x1c, 0x93, 0x73, 0x91, 0xa9, 0x2c, + 0xb3, 0x1a, 0x88, 0xfd, 0x21, 0xdf, 0xe7, 0xf7, 0x5c, 0x82, 0xfa, 0xca, + 0x92, 0x62, 0x1c, 0x85, 0xa7, 0xca, 0x6f, 0xff, 0xf0, 0xfd, 0x1d, 0xf9, + 0xa6, 0x77, 0x91, 0xae, 0x23, 0xee, 0x2c, 0xbf, 0xff, 0xf7, 0x9d, 0xb8, + 0xd2, 0xc1, 0xff, 0xd0, 0xda, 0xd3, 0x14, 0xeb, 0x2f, 0x8b, 0x37, 0xe2, + 0xca, 0x9d, 0x1e, 0x47, 0x66, 0x31, 0xaa, 0xff, 0x79, 0xa6, 0x94, 0x14, + 0x96, 0x5f, 0xff, 0xd1, 0xfe, 0x08, 0x5f, 0xf0, 0x5e, 0x5f, 0xe6, 0x18, + 0xb2, 0xff, 0xd1, 0x3e, 0x7e, 0x58, 0x4c, 0x35, 0x97, 0xfe, 0x73, 0x3f, + 0x9e, 0xfb, 0x46, 0xe2, 0xcb, 0xff, 0x41, 0x9c, 0x14, 0xbf, 0x79, 0xd7, + 0xd6, 0x54, 0x27, 0x0b, 0xd9, 0x96, 0x8c, 0xfc, 0xba, 0x47, 0xbf, 0x41, + 0xbe, 0x97, 0xb2, 0x75, 0x97, 0xcd, 0x3f, 0x72, 0x59, 0x7f, 0xd1, 0xd1, + 0xdf, 0xf9, 0xd7, 0xd6, 0x5c, 0xf3, 0xac, 0xae, 0x91, 0x31, 0xa2, 0x32, + 0x24, 0x30, 0xea, 0xf7, 0x9f, 0x8b, 0x2d, 0xd2, 0xca, 0x83, 0x5c, 0x31, + 0xcb, 0xfc, 0x77, 0xe1, 0x46, 0x1a, 0xb2, 0xc1, 0x59, 0x7f, 0xc1, 0x0f, + 0x9b, 0xfe, 0x79, 0x2c, 0xbd, 0x2c, 0xfa, 0xcb, 0xe7, 0xf6, 0x69, 0x65, + 0x78, 0xde, 0xef, 0x1c, 0xbf, 0x07, 0xda, 0x83, 0x16, 0x5d, 0xb6, 0xeb, + 0x2e, 0x8e, 0xf6, 0x26, 0x7d, 0x84, 0x06, 0x99, 0x1c, 0x45, 0xdd, 0xbe, + 0x46, 0x21, 0x4d, 0xe2, 0x15, 0xf1, 0x65, 0xf4, 0xbc, 0xdb, 0xd6, 0x5e, + 0x82, 0xfe, 0xc3, 0xc4, 0x62, 0x0b, 0xb4, 0xeb, 0x2f, 0xfe, 0xde, 0xdc, + 0xe6, 0x17, 0x6e, 0x40, 0x59, 0x7f, 0xbc, 0xc3, 0x1e, 0x19, 0x32, 0xcb, + 0xcd, 0xd7, 0x16, 0x5f, 0xb3, 0x7e, 0x48, 0x56, 0xb2, 0x8d, 0x3c, 0xaf, + 0x0e, 0xd8, 0x18, 0x8e, 0x7e, 0xd1, 0x7e, 0xff, 0x7c, 0x27, 0x9f, 0xeb, + 0x2d, 0x1a, 0x3d, 0x93, 0x9b, 0x53, 0x27, 0x61, 0xa3, 0x3f, 0x46, 0xad, + 0x7f, 0xe7, 0xeb, 0x99, 0xf6, 0x3b, 0xc9, 0x65, 0xbe, 0xb2, 0x80, 0x79, + 0xe2, 0x1f, 0x5f, 0xff, 0x13, 0xe7, 0x9b, 0x5e, 0x70, 0xfb, 0x0e, 0xb2, + 0xff, 0xde, 0x6e, 0xfd, 0x9f, 0xc3, 0x64, 0xb2, 0x86, 0x88, 0xdc, 0x4d, + 0xbf, 0xff, 0xf3, 0xe8, 0xd1, 0xfa, 0x39, 0xec, 0xea, 0x5f, 0x69, 0xa3, + 0x81, 0x59, 0x58, 0x89, 0x17, 0x22, 0xbe, 0x2d, 0x9d, 0xcc, 0xb2, 0xff, + 0xff, 0x4c, 0x50, 0x7d, 0x47, 0x79, 0xac, 0xf3, 0x6b, 0xce, 0xb2, 0xff, + 0xf9, 0xf4, 0x0d, 0xbc, 0xd4, 0x49, 0xba, 0xfe, 0x2c, 0xbf, 0xff, 0xf8, + 0x3c, 0xf3, 0xcb, 0x92, 0x6f, 0x89, 0xa8, 0xf4, 0x7f, 0x8f, 0xd2, 0xcb, + 0xff, 0xce, 0x0c, 0x28, 0x94, 0x6c, 0x83, 0x9d, 0x65, 0xfa, 0x30, 0xbf, + 0xb6, 0xb2, 0xfe, 0x6e, 0x81, 0xa7, 0x1a, 0xcb, 0xff, 0xdb, 0xcb, 0x39, + 0xb3, 0x08, 0x32, 0xce, 0x2c, 0xa5, 0x95, 0x87, 0xae, 0x74, 0xca, 0x3a, + 0x33, 0xfc, 0x52, 0x50, 0x85, 0xbf, 0x7a, 0x35, 0xc6, 0x59, 0x76, 0xb7, + 0x16, 0x5e, 0x90, 0x46, 0xb2, 0xe7, 0xeb, 0x62, 0x24, 0x86, 0x69, 0x31, + 0x3b, 0x8d, 0x5f, 0xe7, 0x21, 0x1e, 0x58, 0x35, 0x95, 0x0a, 0xdc, 0xf0, + 0x99, 0x98, 0x34, 0xa4, 0x4e, 0x9c, 0x8e, 0xa8, 0x29, 0x77, 0xf3, 0x68, + 0x51, 0xcf, 0xb2, 0xcb, 0xff, 0xfb, 0x0a, 0x7e, 0x72, 0x01, 0x9e, 0x6d, + 0x39, 0x9f, 0x59, 0x7f, 0x0f, 0x08, 0xdd, 0x42, 0xcb, 0xb6, 0xfa, 0x59, + 0x52, 0x6c, 0xb3, 0x07, 0x29, 0x57, 0xb8, 0x58, 0x75, 0x1c, 0x24, 0xd2, + 0xab, 0x75, 0x0e, 0xf3, 0xc7, 0x55, 0xe9, 0x4c, 0xe0, 0x84, 0x29, 0x46, + 0x83, 0xf9, 0x72, 0x9b, 0xda, 0x0c, 0x31, 0xdb, 0x5b, 0x10, 0xb6, 0xf9, + 0xe7, 0x09, 0x8b, 0x2e, 0x15, 0xee, 0xac, 0xbc, 0xc7, 0xc5, 0x97, 0x41, + 0xab, 0x2a, 0x47, 0xe9, 0xd1, 0x26, 0x87, 0x8c, 0x1b, 0xb7, 0x6b, 0x2f, + 0xff, 0xec, 0x1f, 0xa0, 0xc2, 0xc6, 0x9f, 0x6c, 0x3e, 0x6d, 0x2c, 0xad, + 0xc3, 0xf0, 0x21, 0x2a, 0x86, 0xd8, 0x33, 0x14, 0x1a, 0xb3, 0x5f, 0x78, + 0xe2, 0xc3, 0x0a, 0xeb, 0xe8, 0xed, 0xbb, 0x59, 0x7b, 0x4c, 0x62, 0xcb, + 0xfd, 0xcc, 0xd0, 0xc9, 0xe4, 0xb2, 0x86, 0x79, 0xfc, 0x1d, 0xbf, 0xcf, + 0xb0, 0xb0, 0x01, 0xe2, 0xcb, 0xde, 0xc0, 0x2c, 0xb4, 0x2c, 0xbf, 0xfe, + 0x99, 0xde, 0x5c, 0x83, 0x8f, 0xd0, 0x5d, 0xac, 0xa8, 0x3e, 0x06, 0x10, + 0xbf, 0xe0, 0xf7, 0x9a, 0x9e, 0x70, 0xce, 0xb2, 0xff, 0xb2, 0x69, 0x47, + 0x59, 0xd7, 0xd6, 0x56, 0xc4, 0xd2, 0x60, 0xd3, 0x1f, 0x0e, 0x40, 0x47, + 0xd7, 0xa7, 0x6e, 0x96, 0x5d, 0xe1, 0xac, 0xa9, 0xcf, 0xfd, 0x92, 0xb8, + 0x3d, 0x52, 0x55, 0x16, 0x37, 0x2d, 0x47, 0xd5, 0x7c, 0x3f, 0x06, 0x75, + 0x97, 0xf3, 0xcb, 0x27, 0x09, 0x2c, 0xbb, 0x06, 0xb2, 0x86, 0x78, 0x7d, + 0x96, 0xdf, 0xfb, 0x59, 0xb9, 0x37, 0x9c, 0xed, 0xc5, 0x97, 0xfd, 0x9f, + 0xfb, 0x18, 0x76, 0xfa, 0xcb, 0x4f, 0x09, 0x82, 0xe3, 0x3e, 0x88, 0xfc, + 0x85, 0x66, 0x59, 0x70, 0xaf, 0x16, 0x56, 0x1f, 0x6e, 0x90, 0xdc, 0x42, + 0xff, 0xdb, 0xdb, 0xf2, 0x8d, 0x9f, 0x80, 0xac, 0xb4, 0xcb, 0x2f, 0x6f, + 0xc1, 0xac, 0xbf, 0x6d, 0x87, 0xd9, 0xda, 0xcb, 0x8f, 0xc5, 0x95, 0x88, + 0xb5, 0x99, 0x08, 0xe2, 0x5f, 0x1e, 0x09, 0x65, 0xfd, 0x1f, 0x60, 0x44, + 0x96, 0x5d, 0x27, 0x59, 0x5a, 0x3c, 0x27, 0x2c, 0xbf, 0xba, 0x9d, 0xe5, + 0x1b, 0x8b, 0x2e, 0x29, 0x2c, 0xa8, 0x3c, 0x89, 0xcc, 0xae, 0x32, 0x16, + 0x56, 0xc7, 0x44, 0x2f, 0xb5, 0x17, 0x8a, 0x61, 0x1b, 0x10, 0xbc, 0x9c, + 0x8a, 0x46, 0x18, 0x36, 0x69, 0x97, 0x65, 0xed, 0x0b, 0x43, 0xc3, 0x73, + 0xd5, 0xbc, 0xe3, 0xca, 0xeb, 0x28, 0xea, 0xb9, 0x0e, 0x2f, 0xc2, 0x30, + 0x2d, 0x3b, 0x64, 0x57, 0xfe, 0x14, 0x89, 0x07, 0xef, 0xcf, 0xd0, 0x16, + 0x5f, 0xe9, 0x4d, 0x84, 0xfe, 0xc5, 0x97, 0xdd, 0x4a, 0x0e, 0xb2, 0xff, + 0xa0, 0xa7, 0xe6, 0x1e, 0x37, 0x16, 0x5f, 0xff, 0x4f, 0xfc, 0xe7, 0x83, + 0xc8, 0x9c, 0x25, 0x0b, 0x2e, 0x8f, 0x2c, 0xbf, 0x9e, 0x61, 0xc1, 0x4e, + 0xb2, 0xa7, 0x47, 0x98, 0xc8, 0xf0, 0xec, 0x94, 0x77, 0x8b, 0x5f, 0xef, + 0x3f, 0xf8, 0x66, 0x79, 0x65, 0xf4, 0x4c, 0xde, 0x59, 0x7f, 0xa3, 0xe5, + 0x93, 0xb6, 0x96, 0x5e, 0xdd, 0x83, 0xac, 0xac, 0x45, 0x3b, 0x9a, 0x70, + 0x8b, 0x74, 0xca, 0xfc, 0x43, 0xf4, 0x49, 0x65, 0xe2, 0x8e, 0xd6, 0x5f, + 0x44, 0xb3, 0x8b, 0x2f, 0xf9, 0xcc, 0x10, 0x8b, 0x3a, 0x92, 0xca, 0xc3, + 0xf7, 0xf0, 0xe3, 0x90, 0xdf, 0x6e, 0xc1, 0x76, 0xb2, 0xfe, 0xf6, 0x1a, + 0xf1, 0x3a, 0xcb, 0xe8, 0x9b, 0x50, 0xb2, 0xd0, 0xb2, 0xd8, 0xb2, 0xb4, + 0x68, 0x0e, 0x21, 0x47, 0x3e, 0x3f, 0x21, 0x5f, 0x40, 0x45, 0x6c, 0xb2, + 0xfb, 0x85, 0x06, 0x2c, 0xbf, 0x0f, 0xd8, 0x52, 0x59, 0x58, 0x79, 0x2e, + 0x45, 0x7a, 0x4c, 0x05, 0x97, 0xff, 0xf6, 0x7f, 0x82, 0x73, 0xfe, 0x72, + 0x37, 0x37, 0xc1, 0x8b, 0x2f, 0xb9, 0xf6, 0x99, 0x65, 0x1d, 0x10, 0x4e, + 0xbf, 0x7f, 0x9b, 0x51, 0x3b, 0xeb, 0xb5, 0x97, 0x77, 0x32, 0xcb, 0x7f, + 0x62, 0xb7, 0xc8, 0x3e, 0x1c, 0x27, 0xb0, 0xb7, 0xb2, 0x56, 0x84, 0x8e, + 0x88, 0xbc, 0xdc, 0xe4, 0x1c, 0x84, 0xf7, 0xc8, 0xb6, 0xcd, 0x2f, 0xff, + 0x6b, 0xb2, 0xcd, 0xe5, 0x91, 0xa8, 0xe2, 0xcb, 0xff, 0x1d, 0xb3, 0xac, + 0x61, 0xc6, 0xea, 0xcb, 0xfc, 0xf3, 0x7b, 0x0f, 0x9c, 0x59, 0x58, 0x8b, + 0xdd, 0x25, 0x6f, 0x40, 0xbd, 0xb7, 0x1f, 0x59, 0x7d, 0x1b, 0xdb, 0x7a, + 0xcb, 0xb0, 0xeb, 0x2c, 0x6e, 0xc3, 0x76, 0xc4, 0xb5, 0x3a, 0x20, 0xc9, + 0x6a, 0xfc, 0x6f, 0xf3, 0x0e, 0xb2, 0xff, 0xd2, 0x93, 0x77, 0x07, 0x9b, + 0x90, 0xb2, 0xff, 0xf4, 0xe2, 0x79, 0xa0, 0xa7, 0x01, 0xe2, 0x4b, 0x2b, + 0x11, 0xae, 0xc4, 0x6e, 0x50, 0x14, 0x0b, 0xff, 0x8b, 0x0d, 0x35, 0xff, + 0xc6, 0x29, 0x96, 0x5e, 0xc9, 0x32, 0xca, 0x98, 0xf8, 0x34, 0x8b, 0x7b, + 0x27, 0x25, 0x97, 0xb0, 0x3d, 0x2c, 0xaf, 0x1b, 0x92, 0x1c, 0xbf, 0x60, + 0xdb, 0x5c, 0x59, 0x7e, 0x12, 0x4c, 0x0e, 0x2c, 0xbc, 0x17, 0xd2, 0xcb, + 0xee, 0xe3, 0x27, 0x59, 0x4c, 0x6f, 0xf4, 0x39, 0x7b, 0xff, 0xe9, 0x65, + 0xff, 0xdd, 0x76, 0xde, 0xd9, 0xbb, 0x9e, 0x63, 0xac, 0xa0, 0x1f, 0x4f, + 0xc7, 0xae, 0x0e, 0x96, 0x56, 0x23, 0x0b, 0x90, 0x89, 0xdb, 0x22, 0xa9, + 0xd3, 0x88, 0x39, 0x39, 0x91, 0x95, 0x5f, 0x09, 0xec, 0xed, 0x65, 0xfb, + 0x9f, 0x77, 0x25, 0x95, 0xd1, 0xe5, 0x18, 0x49, 0x50, 0x8a, 0x76, 0x84, + 0x1d, 0x43, 0x2b, 0x7f, 0x27, 0x1b, 0x9a, 0x37, 0xbf, 0x47, 0x16, 0xf0, + 0x9a, 0xe2, 0xe7, 0xe5, 0x27, 0xdf, 0xf8, 0x98, 0x4e, 0xb3, 0x7f, 0x50, + 0x22, 0xcb, 0x49, 0x65, 0xff, 0xe6, 0xcd, 0x0e, 0x0c, 0xcf, 0x47, 0x5c, + 0x59, 0x7c, 0x24, 0x68, 0x0b, 0x2f, 0xfd, 0x1d, 0x7b, 0xd1, 0x3c, 0x04, + 0xeb, 0x2f, 0xfe, 0xd6, 0x9c, 0x19, 0xe6, 0xd7, 0x9d, 0x65, 0xa4, 0xb2, + 0xb8, 0x7a, 0x82, 0x21, 0xdc, 0xfa, 0x59, 0x7f, 0xfe, 0x37, 0x3e, 0xdc, + 0xf0, 0x73, 0xe0, 0x71, 0xc2, 0xcb, 0xfb, 0xed, 0x39, 0xe3, 0xb5, 0x94, + 0x34, 0x4d, 0x68, 0x5b, 0xca, 0xb7, 0xd2, 0x6d, 0x49, 0x65, 0xfc, 0x09, + 0xa4, 0xda, 0x92, 0xc9, 0x8d, 0x15, 0xfe, 0xf6, 0x7b, 0x3b, 0x7e, 0xd6, + 0x5c, 0xd3, 0xac, 0xae, 0xcf, 0x2f, 0xe6, 0x95, 0xd2, 0x2b, 0xb5, 0x08, + 0xbb, 0xfd, 0xdc, 0xcc, 0x70, 0xbf, 0x16, 0x5f, 0x60, 0x75, 0x3a, 0xcb, + 0xa3, 0x71, 0x65, 0x74, 0x7e, 0x27, 0x35, 0xf1, 0x1d, 0xf6, 0xa0, 0x3b, + 0x8b, 0x2f, 0x40, 0xc6, 0xb2, 0xec, 0xdd, 0x59, 0x7c, 0x01, 0x0a, 0x4b, + 0x2c, 0xe4, 0x6f, 0x3e, 0x33, 0x7e, 0xe7, 0x30, 0x80, 0xb2, 0x80, 0x79, + 0x84, 0x4b, 0x50, 0xaa, 0xd1, 0xa3, 0x00, 0x78, 0x4d, 0x70, 0xc3, 0xe4, + 0xa1, 0x85, 0x25, 0xa6, 0x59, 0x7f, 0xc1, 0x71, 0x26, 0x96, 0x75, 0x25, + 0x95, 0xd1, 0xe7, 0x10, 0x95, 0xf1, 0x3f, 0x5c, 0x59, 0x7d, 0xf0, 0x1f, + 0x16, 0x57, 0xcf, 0x10, 0x42, 0x2a, 0x3a, 0x22, 0x40, 0xcd, 0x74, 0x71, + 0x65, 0xf4, 0x7a, 0x06, 0xb2, 0xbb, 0x36, 0xf3, 0x0b, 0x5f, 0xf1, 0xa3, + 0xf4, 0x68, 0xa2, 0x4b, 0x2f, 0xde, 0x62, 0x79, 0xd6, 0x5f, 0xf4, 0x9f, + 0x5f, 0x28, 0x3f, 0x16, 0x5f, 0xe8, 0x1c, 0x68, 0x30, 0x05, 0x97, 0x8b, + 0x3a, 0x59, 0x6e, 0x76, 0x8a, 0xd9, 0x89, 0xce, 0x70, 0x46, 0x55, 0x09, + 0x95, 0x1e, 0x1c, 0xd7, 0xff, 0xd1, 0x9d, 0x7f, 0xd8, 0xd2, 0x63, 0x4d, + 0xc5, 0x97, 0xe2, 0x8d, 0xd2, 0x85, 0x97, 0xff, 0x9d, 0xf5, 0x3f, 0x9f, + 0xfe, 0x6d, 0x49, 0x65, 0xfb, 0x43, 0xf3, 0x4c, 0xb2, 0xe7, 0x30, 0x67, + 0xe7, 0x89, 0x57, 0xfc, 0xe5, 0x9f, 0xfb, 0x19, 0xf5, 0x97, 0xff, 0xff, + 0x4d, 0x26, 0x2f, 0xc0, 0x37, 0x7e, 0xc6, 0xeb, 0x23, 0xa9, 0x31, 0xd6, + 0x54, 0x22, 0xb8, 0x8e, 0x2a, 0x15, 0xdb, 0x62, 0xd3, 0x46, 0x9b, 0xa2, + 0x87, 0x50, 0x28, 0x4d, 0x86, 0x1b, 0x74, 0x28, 0x6d, 0xbe, 0x21, 0x1a, + 0x54, 0xc0, 0x4c, 0x84, 0x21, 0xa8, 0x7d, 0x88, 0xcc, 0x95, 0xe2, 0x30, + 0x42, 0x53, 0x92, 0xdc, 0x7f, 0x39, 0xe7, 0x7e, 0x61, 0x02, 0xfc, 0x59, + 0x7f, 0xf7, 0xfa, 0x96, 0x7d, 0xb7, 0xc1, 0x76, 0xb2, 0xfe, 0x80, 0xf4, + 0xdd, 0x6e, 0xac, 0xbf, 0x61, 0x99, 0xd7, 0xd6, 0x56, 0xc3, 0xdb, 0x63, + 0x2b, 0xfd, 0xd4, 0xb0, 0x7e, 0xc9, 0xd6, 0x50, 0xd3, 0x22, 0xe8, 0xa3, + 0x50, 0xa2, 0x22, 0x3b, 0xf4, 0x6b, 0xa9, 0x71, 0x65, 0xff, 0xff, 0x6a, + 0x67, 0xf3, 0x72, 0x26, 0x6f, 0xff, 0x3c, 0x06, 0xde, 0xb2, 0xa7, 0x44, + 0x90, 0x4a, 0x6f, 0x6b, 0x38, 0xb2, 0xfc, 0xc5, 0xbf, 0x24, 0xb2, 0xf6, + 0x34, 0xeb, 0x28, 0xd3, 0xe0, 0x38, 0xe7, 0x8a, 0x2f, 0xe8, 0x9f, 0x3f, + 0x87, 0x59, 0x7e, 0x13, 0x67, 0xb9, 0x8b, 0x2f, 0xfe, 0xc2, 0x0f, 0x7e, + 0xc3, 0xcc, 0xfd, 0xac, 0xa6, 0x46, 0x76, 0x8c, 0x00, 0x5b, 0xc2, 0xbb, + 0xe3, 0xb4, 0x0d, 0x65, 0xfe, 0x23, 0x7d, 0x07, 0x39, 0x2c, 0xbf, 0xb7, + 0x1a, 0x37, 0x43, 0xf5, 0x97, 0xe8, 0x9b, 0x33, 0xb5, 0x97, 0x8b, 0x37, + 0x56, 0x54, 0x23, 0x37, 0x08, 0x58, 0xcf, 0xc6, 0x61, 0x28, 0xbc, 0x77, + 0xfa, 0xcb, 0xe3, 0xbc, 0x74, 0xb2, 0x88, 0xdf, 0x18, 0x39, 0x7f, 0xbf, + 0xc6, 0xdf, 0xa6, 0xe2, 0xcb, 0xfe, 0x32, 0x4d, 0xa1, 0x0a, 0x50, 0xb2, + 0xe6, 0x92, 0xca, 0xc4, 0x42, 0xb1, 0xa9, 0x1d, 0x5e, 0x36, 0x3b, 0x59, + 0x7f, 0xef, 0x64, 0xcd, 0x30, 0x77, 0x43, 0xc5, 0x97, 0x9b, 0x46, 0xac, + 0xbe, 0xfb, 0x47, 0x4b, 0x2a, 0x11, 0x42, 0xc3, 0xc4, 0x89, 0xc1, 0xdb, + 0xfe, 0x89, 0xa3, 0xfe, 0xcd, 0x76, 0xb2, 0xf7, 0xa2, 0x65, 0x96, 0x8e, + 0x8f, 0x5f, 0x74, 0xea, 0xa4, 0x8b, 0xce, 0x42, 0x46, 0xf1, 0x33, 0x2c, + 0xb9, 0xe7, 0x59, 0x7f, 0x39, 0xf3, 0x7b, 0xe9, 0x65, 0x4e, 0x78, 0xa7, + 0x17, 0xbf, 0xf4, 0xcd, 0xe8, 0xea, 0x51, 0x34, 0x2c, 0xa6, 0x3e, 0x30, + 0x91, 0xdf, 0x1e, 0x3e, 0x75, 0x97, 0xfd, 0xc0, 0xcf, 0x13, 0x6c, 0x07, + 0xd6, 0x5f, 0x86, 0xe5, 0x1e, 0x59, 0x7f, 0x4a, 0x3a, 0xfe, 0x79, 0x65, + 0xff, 0xef, 0xf1, 0x81, 0x12, 0xe6, 0x67, 0x5f, 0x59, 0x53, 0x1f, 0xc7, + 0x0b, 0xab, 0xa4, 0x7f, 0xf8, 0xf8, 0xc8, 0x4f, 0x5f, 0xe3, 0xc4, 0xc7, + 0x81, 0xc2, 0xcb, 0xf4, 0xd8, 0xdb, 0xa3, 0x59, 0x6f, 0x31, 0xef, 0x39, + 0x9d, 0x42, 0x7b, 0x8d, 0x19, 0x0f, 0x21, 0x2b, 0x7e, 0xce, 0xa5, 0xe6, + 0x59, 0x7d, 0xba, 0x41, 0x9d, 0x65, 0x6c, 0x3c, 0xe3, 0x94, 0x5f, 0xcd, + 0xe6, 0x99, 0xa7, 0x59, 0x68, 0x59, 0x5c, 0x37, 0xdf, 0x2e, 0xbf, 0x7d, + 0x8a, 0x50, 0xb2, 0xfe, 0xea, 0x58, 0x1d, 0x4e, 0xb2, 0xff, 0xf6, 0xb5, + 0x05, 0x86, 0xb7, 0xbd, 0x82, 0x2c, 0xac, 0x45, 0x03, 0x13, 0x04, 0xc2, + 0xa1, 0x35, 0x1c, 0x62, 0xd4, 0x30, 0x6f, 0xe6, 0x35, 0xbe, 0xfe, 0x59, + 0x7b, 0xbf, 0x42, 0xcb, 0xb5, 0x0b, 0x2a, 0x47, 0xc1, 0xd1, 0x6c, 0xc3, + 0xb7, 0xe8, 0x6f, 0xed, 0x42, 0xad, 0x65, 0xf9, 0xd8, 0x70, 0x4b, 0x2e, + 0x80, 0xac, 0xa8, 0x44, 0xf7, 0x8c, 0x48, 0xcb, 0x84, 0xb7, 0x6e, 0xc2, + 0xcb, 0x8b, 0xb5, 0x95, 0x06, 0xc1, 0x86, 0x6f, 0xf0, 0x58, 0xb3, 0x9c, + 0xc5, 0x95, 0x39, 0xe8, 0x1c, 0x7e, 0xfb, 0xc0, 0x7f, 0xac, 0xb7, 0x96, + 0x53, 0x9b, 0x30, 0x91, 0x5f, 0xe2, 0xcf, 0xc4, 0x83, 0xa5, 0x95, 0xbc, + 0xf4, 0xb7, 0x48, 0x2f, 0xfe, 0x63, 0xb7, 0x3d, 0x0d, 0xa0, 0xee, 0x2c, + 0xa8, 0x4c, 0x55, 0xa1, 0x50, 0xe4, 0xf7, 0xf1, 0x71, 0xb7, 0xc0, 0xd6, + 0x5f, 0xf0, 0x18, 0xbf, 0x1c, 0x0f, 0x96, 0x5f, 0xed, 0x4e, 0xdd, 0xb6, + 0xb1, 0x65, 0xe2, 0x63, 0x56, 0x5f, 0x9f, 0x5a, 0x89, 0xd6, 0x5f, 0xdf, + 0x6d, 0x37, 0xc2, 0xb2, 0xb6, 0x23, 0x77, 0x0e, 0x0e, 0x69, 0xf1, 0xc1, + 0x0a, 0x2f, 0x71, 0xc0, 0xb2, 0xa0, 0xfa, 0x3e, 0x99, 0x7e, 0x13, 0xd9, + 0xd7, 0x16, 0x5c, 0xfb, 0x8b, 0x28, 0x27, 0x86, 0x21, 0x55, 0xff, 0xff, + 0xf4, 0x7c, 0x9f, 0xb6, 0xe4, 0xcd, 0xae, 0xe3, 0x9f, 0x8e, 0xa0, 0x4c, + 0xe2, 0xcb, 0xfd, 0xcc, 0xd4, 0x6f, 0x8d, 0xc5, 0x95, 0xa4, 0x5b, 0x7d, + 0xfe, 0xff, 0x7b, 0x3a, 0x8d, 0x31, 0xd6, 0x5f, 0x7e, 0x0f, 0x0b, 0x2f, + 0xfd, 0x1b, 0x0e, 0x4e, 0x6b, 0x78, 0x2b, 0x2f, 0xff, 0xff, 0xfb, 0x99, + 0xff, 0x39, 0xf9, 0xad, 0x37, 0x5f, 0x77, 0x37, 0x32, 0x60, 0xfe, 0x0c, + 0xea, 0x16, 0x5f, 0x83, 0x36, 0x6d, 0xe2, 0xcb, 0xbc, 0xeb, 0x2b, 0x88, + 0xd8, 0xfc, 0x25, 0xf7, 0x95, 0xdf, 0xf7, 0x5c, 0x26, 0x3f, 0xf3, 0x71, + 0x65, 0xd9, 0xa5, 0x95, 0x07, 0xa5, 0xe3, 0xcb, 0xfb, 0xe4, 0xe0, 0xc2, + 0x59, 0x74, 0x1a, 0xb2, 0xf9, 0xc1, 0x84, 0xb2, 0xa6, 0x36, 0xe4, 0x2f, + 0x5b, 0x11, 0x07, 0xf6, 0x2a, 0x85, 0x5c, 0x23, 0x23, 0xc3, 0x3e, 0xc8, + 0x5e, 0x31, 0x8f, 0xc2, 0x24, 0x30, 0xa4, 0xbf, 0xd2, 0x7e, 0x9b, 0x75, + 0x86, 0xb2, 0xff, 0xdf, 0x6e, 0x13, 0xfe, 0x67, 0x1a, 0xcb, 0xe0, 0x3f, + 0x5c, 0x59, 0x71, 0x86, 0x2c, 0xae, 0x1b, 0xc3, 0x08, 0xef, 0xbc, 0xf9, + 0xe4, 0x82, 0xcd, 0x15, 0xff, 0xf8, 0x46, 0x38, 0x79, 0x02, 0x31, 0xe2, + 0x68, 0x31, 0x65, 0xcd, 0x3a, 0xca, 0x84, 0xdd, 0x30, 0xd9, 0xa1, 0x38, + 0xe6, 0x7b, 0xd6, 0x2f, 0xc2, 0x61, 0xdb, 0x4b, 0x2f, 0xcd, 0xaf, 0xe7, + 0x6b, 0x2f, 0xdd, 0xb7, 0x3c, 0xcb, 0x2f, 0xee, 0x9a, 0x73, 0xb7, 0x16, + 0x5c, 0x77, 0x59, 0x7f, 0xbf, 0x05, 0xde, 0xd0, 0x03, 0xac, 0xa8, 0x3f, + 0xef, 0x17, 0x84, 0x5a, 0xe6, 0xe9, 0x65, 0xef, 0x40, 0x16, 0x5e, 0xdd, + 0xdd, 0x85, 0x97, 0xfc, 0x3f, 0x36, 0x9b, 0xa9, 0xa1, 0x65, 0x39, 0xee, + 0x04, 0x8a, 0xed, 0xaf, 0x7a, 0xca, 0xc4, 0xfc, 0x8d, 0x28, 0xe8, 0xa1, + 0xa1, 0x4d, 0xa2, 0xe7, 0x17, 0x27, 0x8f, 0x90, 0xde, 0xf6, 0xcd, 0xc5, + 0x97, 0x8b, 0xb6, 0x59, 0x7e, 0xf4, 0x16, 0x4e, 0xb2, 0xa0, 0xf9, 0x58, + 0x89, 0xc7, 0x2f, 0xcd, 0x3b, 0x84, 0x96, 0x5f, 0xd1, 0xf0, 0x9c, 0x3f, + 0x59, 0x7f, 0xa0, 0xbc, 0xe0, 0x0c, 0xcb, 0x2b, 0xc7, 0xc3, 0xba, 0x5d, + 0x50, 0xdc, 0xa3, 0x4f, 0x0d, 0x59, 0x46, 0xa4, 0x38, 0xc2, 0x72, 0x10, + 0xa6, 0xc2, 0x9b, 0xa8, 0xe2, 0x98, 0xa3, 0x72, 0x18, 0x53, 0x47, 0xfb, + 0xa8, 0xf6, 0x4f, 0x19, 0x97, 0xa3, 0xd0, 0x73, 0x30, 0x46, 0xe6, 0x2b, + 0x64, 0x29, 0x77, 0x5c, 0x8f, 0xa3, 0xf2, 0x90, 0x37, 0xc3, 0x68, 0x42, + 0xcd, 0xd8, 0x44, 0x5f, 0x6b, 0x3f, 0x8b, 0x2f, 0xf7, 0x7e, 0x6f, 0xf1, + 0xfa, 0x59, 0x7b, 0x35, 0xbd, 0x65, 0xed, 0x09, 0x32, 0xcb, 0x8f, 0xe5, + 0x94, 0xc6, 0xdb, 0x83, 0xf7, 0xfe, 0x20, 0x1d, 0xe4, 0x51, 0xfe, 0x2c, + 0xbb, 0x31, 0x65, 0xf7, 0x7e, 0x61, 0x16, 0x56, 0x26, 0x80, 0x69, 0x0b, + 0x1a, 0xf9, 0x51, 0xc8, 0x05, 0x67, 0xa2, 0x0a, 0xdf, 0xa6, 0x89, 0xbd, + 0x0b, 0x2f, 0xff, 0x17, 0xf8, 0x27, 0xd8, 0x83, 0x2c, 0xe2, 0xcb, 0x84, + 0x85, 0x97, 0xf7, 0xb2, 0x67, 0x29, 0xd6, 0x5e, 0x30, 0xc3, 0x12, 0x5f, + 0x4b, 0xf9, 0xda, 0x41, 0x66, 0x82, 0xfd, 0x83, 0x60, 0x71, 0x77, 0x7f, + 0x2b, 0x62, 0x2d, 0xf4, 0x9c, 0x46, 0xb7, 0x72, 0x4b, 0x2f, 0x71, 0xc0, + 0xb2, 0xa0, 0xd9, 0xf4, 0x2f, 0x7b, 0x0f, 0xb6, 0xb2, 0xa1, 0x3e, 0x5c, + 0x29, 0xd2, 0x53, 0xc3, 0x38, 0x0c, 0x84, 0x43, 0x7c, 0x71, 0xe1, 0x2c, + 0xbb, 0xfc, 0x59, 0x7f, 0xf8, 0x79, 0x86, 0xec, 0xcf, 0xb7, 0x3c, 0xcb, + 0x2f, 0xf7, 0xfd, 0x1f, 0xe7, 0x99, 0x65, 0xcf, 0x25, 0x97, 0xed, 0x99, + 0x33, 0x4e, 0xb2, 0xb6, 0x1f, 0xa1, 0xcc, 0xf8, 0x2d, 0x6e, 0x2c, 0xbf, + 0xdf, 0xea, 0x5e, 0x82, 0x9d, 0x25, 0xff, 0xb3, 0xa9, 0x36, 0x11, 0x60, + 0xd6, 0x5f, 0x1c, 0x3d, 0x7d, 0x65, 0xf6, 0x7a, 0x37, 0xac, 0xa9, 0xcf, + 0x1f, 0x84, 0x95, 0x09, 0xf9, 0xce, 0x2f, 0xd4, 0x2f, 0xf4, 0x62, 0x42, + 0x3c, 0x35, 0xfc, 0x20, 0xef, 0xf7, 0x7e, 0x61, 0xc3, 0xe9, 0x65, 0xe6, + 0xe3, 0x2c, 0xb3, 0x2c, 0xbe, 0x71, 0x1c, 0x6b, 0x2f, 0x46, 0x8d, 0x59, + 0x69, 0x78, 0xfa, 0x9c, 0x6c, 0x22, 0x06, 0x11, 0x5f, 0xff, 0xe1, 0xfb, + 0x3f, 0xf7, 0x2e, 0xf9, 0x1a, 0x79, 0x9b, 0xcb, 0x28, 0x69, 0xa0, 0x75, + 0x09, 0xd6, 0x42, 0xbf, 0xe2, 0x83, 0x38, 0xc5, 0xd4, 0x96, 0x5f, 0xff, + 0xfb, 0x80, 0x6d, 0x0f, 0x0b, 0xcd, 0xdf, 0x9b, 0xe6, 0xc1, 0x49, 0x65, + 0xd1, 0xda, 0xca, 0x24, 0x5e, 0x7c, 0xe7, 0x7b, 0x65, 0xe1, 0x23, 0x71, + 0x65, 0xde, 0x65, 0x96, 0x02, 0xca, 0x34, 0xd3, 0x90, 0xb5, 0x4e, 0x7d, + 0x0c, 0x8f, 0x7f, 0xdf, 0xf3, 0x40, 0x27, 0xe1, 0xab, 0x2f, 0xc5, 0x06, + 0x61, 0x2c, 0xbf, 0xef, 0x75, 0x06, 0xcd, 0x28, 0xdc, 0x59, 0x6e, 0x0c, + 0xf9, 0x70, 0x9a, 0xb4, 0x8e, 0x92, 0x22, 0xfc, 0x28, 0x29, 0x65, 0xfa, + 0x5a, 0x68, 0x3a, 0xcb, 0xc2, 0x74, 0x62, 0xca, 0x9c, 0xf4, 0xba, 0x0b, + 0xe1, 0x3d, 0x42, 0xe6, 0xd6, 0x47, 0x5e, 0xd0, 0xf2, 0x78, 0xe0, 0x83, + 0x08, 0x6b, 0xcc, 0x08, 0x59, 0x7d, 0x2c, 0xfb, 0x2c, 0xad, 0x86, 0xf3, + 0xa1, 0xbb, 0xfd, 0x2f, 0x47, 0x5f, 0x8f, 0x2c, 0xbf, 0xfd, 0x2f, 0x87, + 0xda, 0x83, 0x24, 0xc0, 0xc5, 0x97, 0x39, 0xd6, 0x57, 0x68, 0xb9, 0xe8, + 0x90, 0x8d, 0x37, 0xa5, 0xdf, 0xff, 0xbe, 0xfa, 0xc6, 0x07, 0x33, 0xcd, + 0xaf, 0x3a, 0xcb, 0xfe, 0xf3, 0x6a, 0x62, 0x88, 0xe9, 0x65, 0xe8, 0x21, + 0xac, 0xbf, 0x75, 0xc9, 0xb3, 0xeb, 0x2b, 0x13, 0x11, 0xe9, 0x01, 0x94, + 0xfc, 0x72, 0x43, 0x77, 0xf3, 0x7c, 0x9c, 0x1c, 0x59, 0x7e, 0x83, 0xff, + 0x3c, 0xb2, 0xf8, 0x48, 0x29, 0x96, 0x5f, 0x71, 0xa3, 0xb5, 0x97, 0xff, + 0x4d, 0x9a, 0xc7, 0x3c, 0x79, 0x86, 0xb2, 0xb0, 0xf9, 0x7e, 0x45, 0x7f, + 0x04, 0xf9, 0xee, 0x9d, 0x65, 0x1a, 0x99, 0x57, 0x65, 0x9e, 0x27, 0x28, + 0x44, 0x70, 0x86, 0xff, 0xf3, 0x0c, 0x9f, 0xa2, 0xcf, 0xe3, 0x01, 0x65, + 0xf4, 0xf3, 0xbe, 0xe2, 0xcb, 0xee, 0xc6, 0x19, 0xd6, 0x5e, 0x97, 0x02, + 0xb2, 0xfe, 0x2f, 0xb7, 0xa4, 0x4b, 0x2f, 0xff, 0xff, 0xde, 0x8c, 0x9e, + 0x4d, 0xfe, 0x46, 0xb0, 0x5b, 0x02, 0x23, 0x7c, 0x41, 0x76, 0xb2, 0xdf, + 0xc4, 0x79, 0x78, 0x95, 0xc7, 0x78, 0x59, 0x78, 0xc3, 0x0c, 0x59, 0x7f, + 0xfc, 0x7c, 0xeb, 0xe5, 0x93, 0x9f, 0x0f, 0x84, 0x90, 0x59, 0xa0, 0xa8, + 0x46, 0x13, 0x30, 0xdf, 0x4f, 0x9e, 0x75, 0x97, 0xfb, 0x44, 0xe6, 0x67, + 0x9d, 0x65, 0xff, 0xbf, 0x1f, 0xe6, 0x3e, 0xbd, 0x8b, 0x2f, 0xde, 0x7d, + 0x66, 0x96, 0x5f, 0xfd, 0x39, 0x06, 0x70, 0xf3, 0xfc, 0xc3, 0x16, 0x5f, + 0xba, 0xed, 0x8a, 0x75, 0x97, 0xfb, 0xd1, 0x29, 0xa4, 0xe4, 0xb2, 0xbe, + 0x7b, 0xa2, 0x15, 0x54, 0x23, 0x21, 0xe1, 0x4b, 0x70, 0x5d, 0x65, 0x0d, + 0x39, 0xac, 0x32, 0xec, 0xf7, 0xd0, 0xef, 0x22, 0x6b, 0xfe, 0x01, 0x67, + 0x6d, 0x9f, 0xe2, 0xcb, 0xdf, 0x81, 0xac, 0xbe, 0x97, 0xc2, 0x35, 0x97, + 0xe8, 0x69, 0x3f, 0x16, 0x54, 0x1f, 0x2f, 0x43, 0x9a, 0x23, 0xbf, 0xb3, + 0xfe, 0x0c, 0x74, 0xb2, 0xfb, 0xed, 0xac, 0x59, 0x7d, 0xd7, 0x18, 0xd1, + 0x9e, 0x7e, 0x17, 0x54, 0xe9, 0xd2, 0x69, 0x3c, 0xa1, 0x3b, 0xf7, 0xeb, + 0xfd, 0x9c, 0x2c, 0xdf, 0xe6, 0x59, 0x7f, 0xe3, 0xc7, 0x45, 0x80, 0xe4, + 0x6e, 0x2c, 0xad, 0x1f, 0xa1, 0xcc, 0xef, 0xf0, 0xcb, 0x37, 0xb6, 0x9d, + 0x65, 0x0a, 0x17, 0x1b, 0x22, 0x5b, 0x03, 0x42, 0xdc, 0x24, 0x57, 0xe9, + 0xf7, 0x1b, 0x3a, 0x59, 0x7e, 0x6e, 0x44, 0xe7, 0x5d, 0x9f, 0xab, 0xf4, + 0x3e, 0x80, 0x15, 0xd9, 0xfa, 0xb9, 0xe4, 0xbb, 0x3f, 0x57, 0xc1, 0x96, + 0x71, 0x76, 0x7e, 0xa8, 0x67, 0xa4, 0x44, 0x77, 0xe8, 0xce, 0x61, 0x2e, + 0xcf, 0xd5, 0x2e, 0xcf, 0xd5, 0xcf, 0xf5, 0xd9, 0xfa, 0x39, 0x71, 0x69, + 0x11, 0xfe, 0x05, 0x2a, 0xfb, 0x36, 0xd8, 0x0b, 0xb3, 0xf5, 0x4b, 0xb3, + 0xf5, 0x70, 0x21, 0x76, 0x7e, 0xaf, 0xfb, 0x00, 0xfa, 0xcd, 0xf8, 0x35, + 0xd9, 0xfa, 0xbf, 0xb3, 0xcd, 0xc0, 0xce, 0xbb, 0x3f, 0x54, 0x04, 0x52, + 0x11, 0x1f, 0x11, 0xaf, 0xb5, 0x3c, 0x7d, 0x76, 0x7e, 0xa9, 0x76, 0x7e, + 0xb0, 0xd8, 0x5c, 0x61, 0x8b, 0xb3, 0xf5, 0x52, 0x56, 0x30, 0x33, 0x5c, + 0x84, 0x37, 0x50, 0x9d, 0xd1, 0x39, 0xcc, 0x79, 0x0b, 0xcf, 0xaf, 0x98, + 0x4f, 0x74, 0x1a, 0x9b, 0x3f, 0x41, 0x68, 0x90, 0xbf, 0xe9, 0xe3, 0x7e, + 0x36, 0xb2, 0x75, 0x97, 0xff, 0x3f, 0xbb, 0xf3, 0x13, 0xe9, 0xe4, 0xb2, + 0xa4, 0x8b, 0x7d, 0x1c, 0xfc, 0xee, 0xfe, 0x8c, 0x12, 0x25, 0x25, 0x97, + 0xfb, 0x99, 0x29, 0x47, 0xfa, 0x59, 0x7f, 0xd1, 0xa0, 0x7d, 0x9c, 0xd9, + 0x2c, 0xac, 0x46, 0x51, 0x18, 0x70, 0xb4, 0x43, 0x4b, 0xff, 0x67, 0x63, + 0xcd, 0x18, 0xfe, 0x99, 0x65, 0x2c, 0xbf, 0xf1, 0x64, 0xd1, 0x38, 0x1f, + 0xae, 0x2c, 0xa8, 0x3c, 0xbe, 0x05, 0xdd, 0x29, 0xd2, 0x5f, 0x4c, 0xef, + 0xa5, 0x95, 0x3a, 0x64, 0x7d, 0x1e, 0x7a, 0x11, 0x84, 0x43, 0xba, 0x31, + 0x7c, 0x51, 0x37, 0x16, 0x5c, 0xd3, 0xac, 0xad, 0x2f, 0x82, 0xbc, 0xf3, + 0xc1, 0x2a, 0x7c, 0x8a, 0xed, 0xb3, 0x56, 0x5f, 0xdc, 0x28, 0xf0, 0x74, + 0xb2, 0xfe, 0xe1, 0x67, 0xf0, 0x0b, 0x2b, 0xa3, 0xd9, 0x39, 0x6d, 0xff, + 0x4c, 0x59, 0xbf, 0xdd, 0x3e, 0xe2, 0xcb, 0xfb, 0xf9, 0xe8, 0xd0, 0x16, + 0x5f, 0x69, 0xb3, 0x7a, 0xcb, 0xf6, 0x73, 0x3a, 0xfa, 0xcb, 0xe3, 0xc1, + 0x1b, 0xb0, 0xf2, 0xdc, 0x8e, 0xff, 0xb4, 0xc7, 0xe0, 0x91, 0x93, 0x2c, + 0xbf, 0xee, 0xe0, 0x03, 0x0b, 0xea, 0x4b, 0x2f, 0xfc, 0xef, 0x3e, 0x1d, + 0xcb, 0xa9, 0x2c, 0xbc, 0xe6, 0xf3, 0x0f, 0xe2, 0x63, 0xab, 0xfd, 0xff, + 0x61, 0xc4, 0x80, 0x2c, 0xbf, 0x6d, 0x46, 0xe9, 0xfb, 0x59, 0x6f, 0x6c, + 0x3e, 0x3d, 0xa6, 0x69, 0x7f, 0xfa, 0x39, 0x87, 0x8e, 0xdf, 0x06, 0xdb, + 0xd6, 0x56, 0x1f, 0xd1, 0x18, 0x58, 0xcd, 0x8a, 0xa5, 0x71, 0xe3, 0x47, + 0x45, 0x0b, 0x2f, 0xc6, 0x23, 0x5b, 0x15, 0xe4, 0xc3, 0xa6, 0x11, 0xbc, + 0xad, 0x4b, 0xe6, 0x35, 0x8c, 0x59, 0x7d, 0xff, 0x64, 0xeb, 0x28, 0xe7, + 0x8c, 0x44, 0x77, 0x0c, 0xc5, 0x97, 0xf8, 0x62, 0x6f, 0x77, 0x2e, 0xd6, + 0x54, 0x1f, 0x7e, 0x10, 0xb0, 0xc5, 0xe3, 0x83, 0x4b, 0x2e, 0xf9, 0x2c, + 0xbf, 0x3f, 0xf6, 0xf3, 0x8b, 0x2f, 0x10, 0x3b, 0x59, 0x43, 0x3d, 0xdf, + 0x0b, 0x70, 0xaa, 0xff, 0xf7, 0x5f, 0xf3, 0x08, 0x3c, 0xc2, 0xe3, 0x2c, + 0xbf, 0xff, 0x4b, 0x51, 0xbd, 0xe6, 0x81, 0xfa, 0x0e, 0xf3, 0x2c, 0xbf, + 0xdb, 0xaf, 0xc6, 0xe4, 0xd8, 0xb2, 0xff, 0xf4, 0x68, 0x19, 0xbd, 0xbf, + 0x18, 0x52, 0x59, 0x5b, 0x13, 0xca, 0x16, 0xf5, 0x85, 0xfd, 0x25, 0x69, + 0x60, 0x43, 0x6b, 0x7d, 0x65, 0xfb, 0x39, 0xc3, 0xf4, 0xb2, 0xe8, 0xeb, + 0x61, 0xba, 0x81, 0x1b, 0xcc, 0x52, 0x59, 0x50, 0xe8, 0x54, 0x67, 0x59, + 0x94, 0xf7, 0x76, 0x4a, 0x65, 0x68, 0xdc, 0xf7, 0x14, 0x66, 0x47, 0xd4, + 0x7b, 0x7e, 0x9c, 0x8d, 0x79, 0xf5, 0x32, 0x9c, 0x0f, 0xe4, 0x3e, 0x83, + 0x1f, 0xb1, 0x90, 0x97, 0xdd, 0x2e, 0xbf, 0x78, 0xf1, 0xb4, 0x62, 0xcb, + 0xfd, 0xdc, 0x7f, 0xd1, 0xbf, 0x16, 0x5d, 0x3e, 0x2c, 0xb7, 0x78, 0x79, + 0x80, 0x35, 0xa5, 0x96, 0x7d, 0x1b, 0x33, 0x94, 0x5f, 0xd8, 0x79, 0x9d, + 0xe4, 0xb2, 0xff, 0xfe, 0x7f, 0x44, 0x85, 0xe0, 0x22, 0x5c, 0x1f, 0xa3, + 0x4b, 0x2c, 0xc3, 0x44, 0x4f, 0x8b, 0x6f, 0xfc, 0x6c, 0x74, 0x51, 0xef, + 0x07, 0xb5, 0x97, 0xff, 0x6a, 0x30, 0xb2, 0x4d, 0xec, 0xde, 0xb2, 0xfb, + 0x34, 0xc6, 0xac, 0xbf, 0x79, 0xb9, 0x12, 0x59, 0x7f, 0xf9, 0xcd, 0xe6, + 0x6f, 0x8e, 0xbf, 0xc0, 0x9d, 0x65, 0x39, 0xfa, 0x91, 0x3d, 0x0d, 0x1f, + 0x47, 0x43, 0x28, 0x4b, 0xdf, 0xfc, 0x58, 0x77, 0x96, 0xd8, 0x46, 0xde, + 0x59, 0x7f, 0x8a, 0x3f, 0xd4, 0xce, 0x75, 0x97, 0xef, 0x87, 0xf8, 0x35, + 0x96, 0xc5, 0x94, 0xe6, 0xe3, 0x79, 0x45, 0xff, 0xde, 0xce, 0x73, 0x36, + 0x75, 0x2c, 0xfa, 0xca, 0x92, 0x63, 0x67, 0x46, 0x26, 0xcf, 0x91, 0x5f, + 0xb4, 0x07, 0xc0, 0x2c, 0xbf, 0xb3, 0x75, 0xbe, 0xd2, 0x59, 0x7d, 0xe8, + 0x9f, 0x98, 0x7a, 0xde, 0x27, 0xbf, 0x89, 0xcd, 0xf3, 0xc9, 0x65, 0xff, + 0x8e, 0x59, 0xf2, 0x8e, 0xda, 0x4b, 0x2f, 0xff, 0xef, 0xc7, 0x8b, 0x3f, + 0xe6, 0xd8, 0x7c, 0xfb, 0xfd, 0x65, 0x2c, 0xa6, 0x3e, 0x6d, 0x2d, 0xd3, + 0x23, 0x11, 0xe1, 0x47, 0x7e, 0xef, 0x0f, 0x1c, 0x59, 0x78, 0xc3, 0x0c, + 0x49, 0x78, 0x48, 0x02, 0x41, 0x66, 0x82, 0xff, 0x9e, 0x42, 0x6b, 0x37, + 0xbe, 0x96, 0x5b, 0x4b, 0x2f, 0xf1, 0x44, 0x8d, 0xd6, 0x71, 0x65, 0xff, + 0x88, 0xb2, 0x79, 0xa5, 0x1a, 0x9d, 0x65, 0xef, 0x64, 0xa1, 0x10, 0x98, + 0x22, 0x21, 0x9d, 0x12, 0x3f, 0xff, 0x0b, 0xfb, 0xfc, 0x52, 0x63, 0xe7, + 0x5f, 0x59, 0x7d, 0xd7, 0x6c, 0x4b, 0x29, 0xcf, 0x5b, 0xe6, 0x74, 0xb2, + 0xe0, 0x44, 0x8d, 0x60, 0xac, 0x86, 0xfd, 0xb2, 0x3b, 0xcd, 0x2c, 0xbf, + 0xff, 0xe6, 0xff, 0x9e, 0x42, 0xf3, 0xcf, 0xd0, 0x3e, 0x50, 0x7e, 0x2c, + 0xbf, 0xf6, 0xc8, 0x20, 0x9e, 0x0c, 0x8e, 0x2c, 0xb6, 0x0d, 0x1a, 0x5e, + 0x2a, 0x26, 0x8b, 0xfe, 0xfb, 0x96, 0x73, 0x51, 0xc5, 0x97, 0xd2, 0x80, + 0x74, 0xb2, 0xff, 0xff, 0x3b, 0x7e, 0x24, 0xda, 0x9c, 0x20, 0xdb, 0xdb, + 0xc1, 0xb2, 0xcb, 0xff, 0xfe, 0x7d, 0xed, 0xbc, 0x83, 0xc1, 0x0a, 0x07, + 0xe7, 0x96, 0x71, 0x65, 0xfc, 0x08, 0x2c, 0xeb, 0xeb, 0x2e, 0x70, 0x6c, + 0x4c, 0x7f, 0xc4, 0x64, 0xcc, 0x23, 0x4d, 0xff, 0xe1, 0x0a, 0x63, 0x5c, + 0x7e, 0xce, 0xf3, 0x4b, 0x29, 0x95, 0x92, 0x7a, 0x30, 0x27, 0x34, 0x28, + 0xd5, 0xb8, 0x97, 0x7b, 0xf2, 0x65, 0x97, 0xb7, 0xc6, 0x96, 0x5e, 0x0e, + 0x79, 0x65, 0x4e, 0xcb, 0x32, 0x94, 0x2b, 0xc6, 0x51, 0x91, 0x9d, 0xb4, + 0x69, 0xf3, 0x42, 0x4c, 0xe7, 0x3e, 0x87, 0x8b, 0x93, 0x01, 0x20, 0xa3, + 0x2e, 0xfc, 0xbc, 0xd0, 0xaa, 0xef, 0x1c, 0x30, 0x7a, 0xe6, 0x9d, 0x65, + 0xfe, 0x2e, 0xc6, 0xdb, 0xe0, 0x6b, 0x28, 0x67, 0x98, 0x11, 0x7b, 0xff, + 0xec, 0x6d, 0x7a, 0x1b, 0xfc, 0x62, 0xea, 0x4b, 0x2f, 0xec, 0xef, 0xfb, + 0x79, 0xe5, 0x94, 0xb2, 0xbc, 0x6f, 0x00, 0x63, 0x7f, 0xf4, 0xde, 0x89, + 0xc4, 0xff, 0x82, 0xf2, 0x59, 0x7e, 0x34, 0x32, 0x71, 0xac, 0xbf, 0xd1, + 0xb9, 0xb3, 0xcf, 0x9a, 0x59, 0x7b, 0x35, 0x0b, 0x2f, 0xbd, 0xec, 0xe9, + 0x65, 0xd8, 0x7d, 0xb3, 0x7c, 0x20, 0xdd, 0x62, 0x29, 0x49, 0xd6, 0xdb, + 0x8b, 0x2d, 0x32, 0xcb, 0x1d, 0x65, 0x31, 0xa3, 0x71, 0x2a, 0x34, 0xf5, + 0x8e, 0x6f, 0x7e, 0xc0, 0x72, 0x24, 0xb2, 0xfc, 0xc7, 0x18, 0xf1, 0x65, + 0x80, 0x47, 0x9d, 0xb6, 0x4f, 0x7f, 0xdf, 0xf6, 0x73, 0x67, 0xda, 0x75, + 0x97, 0xf6, 0x4d, 0x9a, 0x1b, 0x2c, 0xa8, 0x44, 0x9b, 0x15, 0x11, 0xe5, + 0xff, 0x13, 0x04, 0x57, 0xcd, 0xb8, 0xfa, 0xcb, 0xfc, 0x0d, 0x36, 0x78, + 0x3c, 0x59, 0x7b, 0x3a, 0x3a, 0xcb, 0xfb, 0x01, 0xbb, 0xf6, 0x3a, 0xca, + 0x84, 0x40, 0x11, 0x9f, 0xc7, 0x6f, 0xfe, 0x7f, 0xe8, 0x26, 0xe7, 0xd8, + 0x1c, 0x59, 0x79, 0xf4, 0x05, 0x95, 0x3a, 0xe5, 0xbc, 0xa1, 0x14, 0x32, + 0x16, 0x48, 0x9a, 0x19, 0xc7, 0x77, 0xf4, 0x60, 0x84, 0x5b, 0xf8, 0x5f, + 0x98, 0x5d, 0xb6, 0x8b, 0x7d, 0x9f, 0x12, 0x75, 0x97, 0xe2, 0x86, 0xea, + 0x4b, 0x2f, 0x18, 0x61, 0x89, 0x88, 0x40, 0xbe, 0xed, 0xdf, 0xb4, 0xc4, + 0x20, 0x0b, 0x35, 0xd7, 0xcf, 0xac, 0x31, 0x65, 0x68, 0xf9, 0x77, 0xa1, + 0xde, 0x30, 0xc3, 0x13, 0x10, 0x79, 0x49, 0x88, 0x3c, 0x16, 0x6b, 0xaf, + 0xef, 0xb9, 0xcf, 0x07, 0x59, 0x7e, 0x7f, 0xb9, 0x01, 0x65, 0xfd, 0x9f, + 0xf0, 0x5e, 0x4b, 0x2f, 0x18, 0x61, 0x8b, 0x2f, 0x72, 0x0d, 0x48, 0x2c, + 0xd0, 0x54, 0x2a, 0x06, 0xc8, 0x5d, 0x76, 0xa5, 0xd1, 0x5f, 0x8b, 0x48, + 0x9b, 0xe9, 0xb5, 0xb8, 0xaa, 0x50, 0xf2, 0x8a, 0xaf, 0x19, 0x04, 0xb2, + 0xff, 0xff, 0xe8, 0x29, 0xf9, 0xe7, 0x39, 0xde, 0x42, 0x16, 0xfc, 0x1e, + 0x75, 0xf5, 0x97, 0xff, 0x7a, 0x24, 0xdf, 0xcf, 0x77, 0x07, 0x59, 0x50, + 0x98, 0x23, 0x97, 0xf0, 0x73, 0x7b, 0xad, 0xff, 0xbc, 0xd3, 0x13, 0x99, + 0xfc, 0xf2, 0xcb, 0xa3, 0x8b, 0x2b, 0xb3, 0xd5, 0xf9, 0xfd, 0xff, 0xbc, + 0xc3, 0x82, 0xfe, 0x75, 0xf5, 0x97, 0xf8, 0xa0, 0xfc, 0xe0, 0x49, 0x65, + 0x76, 0x7e, 0x1c, 0x3e, 0xbf, 0xfb, 0xcd, 0xaf, 0x3e, 0x71, 0x9e, 0x75, + 0x97, 0xfe, 0x8f, 0xe6, 0xb3, 0x99, 0xd7, 0xd6, 0x56, 0x22, 0x04, 0x90, + 0xef, 0xfd, 0x39, 0xf0, 0xf8, 0x5f, 0xce, 0xd6, 0x5f, 0x47, 0xe0, 0xeb, + 0x2f, 0xf6, 0x13, 0x1b, 0xb3, 0xbf, 0x2c, 0xa1, 0x42, 0x7d, 0xdd, 0x42, + 0x4c, 0xf0, 0xa4, 0x22, 0x1f, 0x9f, 0x98, 0x43, 0x7f, 0xde, 0x82, 0xef, + 0xae, 0x3e, 0xe2, 0xcb, 0xdb, 0xb1, 0x3a, 0xcb, 0xe2, 0x0c, 0xe4, 0xb2, + 0xf3, 0x75, 0x25, 0x95, 0x23, 0x7e, 0x02, 0x2b, 0xf8, 0x7c, 0xc3, 0xc6, + 0xe2, 0xcb, 0xc1, 0x71, 0x16, 0x5d, 0x3f, 0x4b, 0x2c, 0xe3, 0x36, 0xc0, + 0x1d, 0xa9, 0x26, 0x92, 0x33, 0xde, 0x97, 0xdc, 0x84, 0xc6, 0x6b, 0xfd, + 0xcf, 0x67, 0x3f, 0x9d, 0xac, 0xbf, 0x17, 0xfd, 0x92, 0x59, 0x79, 0xa0, + 0xd5, 0x94, 0xc7, 0xee, 0xe6, 0x84, 0x4f, 0x7f, 0xd8, 0x51, 0xef, 0x41, + 0x8c, 0xb2, 0xfb, 0xbf, 0x31, 0x8b, 0x2f, 0x09, 0x00, 0x59, 0x7f, 0xff, + 0xff, 0xdb, 0x0b, 0x0d, 0x6f, 0x7b, 0x37, 0x36, 0x47, 0x6e, 0x26, 0xcc, + 0x29, 0xdb, 0x4c, 0x11, 0x5e, 0x2c, 0xa9, 0xd3, 0x45, 0x34, 0xb3, 0xa3, + 0x73, 0x92, 0x18, 0x3b, 0x7e, 0xee, 0x3d, 0x07, 0x49, 0x7e, 0x27, 0x22, + 0xc4, 0x97, 0x67, 0x69, 0x2e, 0x30, 0xc4, 0x95, 0x87, 0xf9, 0xc2, 0x8f, + 0x92, 0x18, 0x2f, 0x7f, 0x88, 0x48, 0x07, 0xb3, 0x75, 0x20, 0xb3, 0x79, + 0x7f, 0xfa, 0x71, 0xe9, 0xfb, 0x2c, 0xdf, 0xa6, 0xe2, 0xca, 0x85, 0xd5, + 0x4c, 0x8e, 0xc1, 0xa5, 0x04, 0x3c, 0x60, 0xe1, 0x48, 0xbf, 0xfb, 0xd0, + 0x0f, 0xfb, 0x25, 0xe6, 0xde, 0xb2, 0xff, 0xe8, 0x07, 0x33, 0x06, 0xe4, + 0xe6, 0xac, 0xbf, 0xef, 0xf1, 0xfa, 0x68, 0xeb, 0xeb, 0x2f, 0xf8, 0x81, + 0xe7, 0xff, 0xd8, 0x0b, 0x2f, 0xff, 0xde, 0x6d, 0xec, 0x43, 0xe4, 0x69, + 0xb3, 0xae, 0x2c, 0xbf, 0xd9, 0xbe, 0x0b, 0xf2, 0x15, 0xac, 0xbf, 0xdd, + 0xb7, 0x30, 0x72, 0x15, 0xac, 0xbf, 0xd9, 0x85, 0x12, 0x90, 0xad, 0x65, + 0xfc, 0x51, 0x9a, 0x70, 0x2c, 0xbf, 0xf4, 0x6b, 0xd0, 0xde, 0x82, 0x65, + 0x97, 0x4b, 0x98, 0x9c, 0xcf, 0x67, 0x1a, 0x56, 0xf1, 0xc1, 0x1c, 0x7c, + 0xd4, 0xc2, 0xbb, 0xfd, 0x05, 0x87, 0x6e, 0xa4, 0xb2, 0xff, 0x7a, 0x32, + 0x51, 0x80, 0x59, 0x7f, 0xf8, 0xb3, 0xa0, 0x3f, 0x1f, 0x4d, 0xd0, 0x16, + 0x50, 0xcf, 0xef, 0x86, 0x35, 0x25, 0x62, 0x7d, 0x47, 0xa7, 0xf7, 0x13, + 0x21, 0x5b, 0x7f, 0xbf, 0xe7, 0x91, 0x41, 0xd6, 0x5f, 0x7f, 0x81, 0xe2, + 0xca, 0x92, 0xe1, 0xe7, 0x91, 0x9e, 0x5a, 0xa9, 0x26, 0x70, 0xca, 0xf6, + 0xf1, 0x0e, 0xb2, 0xfb, 0xd3, 0xe1, 0x8b, 0x2f, 0x86, 0x12, 0x92, 0xcb, + 0x71, 0xcf, 0x18, 0x42, 0x4b, 0xf7, 0x63, 0xc7, 0x02, 0xcb, 0x0a, 0xb5, + 0x97, 0xfe, 0xce, 0x7e, 0x58, 0x69, 0x60, 0x16, 0x5e, 0x1e, 0x12, 0xca, + 0x14, 0x9f, 0x83, 0x8b, 0xee, 0x9f, 0x53, 0x23, 0x34, 0x30, 0x98, 0xbe, + 0x6f, 0x1d, 0xd6, 0x5f, 0xf8, 0xc1, 0xea, 0x3c, 0xe3, 0x91, 0xd6, 0x5f, + 0xff, 0xbf, 0xce, 0xb6, 0x0f, 0x07, 0x0f, 0xac, 0x20, 0x2c, 0xbf, 0xff, + 0xf6, 0xcf, 0xcb, 0x01, 0xb7, 0x9b, 0x07, 0x83, 0x87, 0xd6, 0x10, 0x10, + 0x85, 0xff, 0xd9, 0xfd, 0x9d, 0xf9, 0xbd, 0xe6, 0x02, 0xa1, 0x0b, 0x54, + 0x91, 0x93, 0xc7, 0x5b, 0xd1, 0x38, 0xbe, 0x26, 0x87, 0xf8, 0xc8, 0x2f, + 0xb3, 0xb7, 0xed, 0x65, 0xf8, 0xfc, 0x31, 0xfa, 0x59, 0x43, 0x44, 0x5f, + 0xcf, 0x84, 0x23, 0xa8, 0x54, 0xc1, 0xd1, 0x0f, 0x25, 0x07, 0x5f, 0xd9, + 0x34, 0x9b, 0x5c, 0x59, 0x7e, 0x9e, 0x3e, 0xd3, 0x2c, 0xbe, 0x13, 0x91, + 0x8b, 0x2b, 0xb3, 0xcb, 0xe8, 0xa6, 0xfb, 0x9b, 0x35, 0x8b, 0x2f, 0xbd, + 0xdb, 0x71, 0x65, 0x41, 0xf5, 0xb9, 0x27, 0xc9, 0x2f, 0xff, 0xf8, 0x41, + 0xfa, 0x25, 0xfc, 0xc3, 0x38, 0x59, 0xff, 0xb4, 0xeb, 0x2d, 0x8b, 0x2c, + 0xf3, 0x9f, 0xc6, 0xf6, 0x8b, 0xcc, 0x58, 0xb2, 0xfd, 0xad, 0x38, 0x21, + 0x65, 0x48, 0xf0, 0x5c, 0x6a, 0x85, 0x2e, 0xa4, 0xda, 0x29, 0x7b, 0xa3, + 0x8d, 0x17, 0x27, 0x36, 0x5a, 0x71, 0x33, 0x53, 0xfa, 0xaf, 0x39, 0x30, + 0x05, 0x21, 0x5b, 0x31, 0x43, 0xd7, 0x92, 0xa1, 0xfe, 0x72, 0x18, 0x72, + 0x19, 0x0a, 0x51, 0x1a, 0xee, 0xda, 0xf6, 0x85, 0x97, 0x8c, 0x30, 0xc4, + 0x97, 0x9c, 0x86, 0x90, 0x59, 0xa0, 0xbe, 0xcd, 0x67, 0xd6, 0x50, 0x0f, + 0x3b, 0x85, 0xb7, 0xde, 0x67, 0x92, 0xcb, 0xfc, 0x59, 0xef, 0x94, 0x01, + 0x65, 0xff, 0xe1, 0x08, 0xb2, 0x78, 0xea, 0x52, 0x83, 0xac, 0xbc, 0x51, + 0x25, 0x97, 0xda, 0xd3, 0x1d, 0x65, 0xb8, 0x33, 0x7a, 0xc3, 0x75, 0x24, + 0x57, 0x7e, 0x11, 0x17, 0x8f, 0x38, 0xd6, 0x54, 0xe9, 0x92, 0x94, 0x37, + 0xfe, 0x51, 0x7e, 0xd6, 0x77, 0x1e, 0x59, 0x7b, 0x61, 0xbb, 0x6b, 0x2f, + 0x7d, 0xc6, 0xb2, 0xb4, 0x6f, 0xf8, 0x47, 0x7f, 0xa3, 0xbf, 0x41, 0x64, + 0xcb, 0x2f, 0xf1, 0xbd, 0x7f, 0x51, 0x9d, 0x2c, 0xbe, 0x03, 0x68, 0xd4, + 0x97, 0xda, 0xd3, 0x4e, 0xb2, 0xdd, 0xc1, 0xe3, 0x39, 0x1d, 0xfc, 0x26, + 0x6b, 0x32, 0x65, 0x97, 0xe7, 0xf6, 0xc1, 0xc2, 0xca, 0x92, 0xb5, 0x31, + 0x91, 0x64, 0x68, 0xc6, 0x9b, 0x33, 0x3e, 0x88, 0x5c, 0xcc, 0x9f, 0x38, + 0x4f, 0xf2, 0xeb, 0xf3, 0xeb, 0x59, 0xd2, 0xcb, 0xff, 0xdf, 0xf3, 0x38, + 0x33, 0x43, 0x82, 0x92, 0xcb, 0xff, 0xdd, 0x6c, 0xe8, 0x10, 0x5d, 0xbc, + 0xe4, 0xeb, 0x2a, 0x11, 0x7d, 0x85, 0x04, 0x91, 0x7e, 0x8e, 0x08, 0x52, + 0x59, 0x7b, 0xb6, 0x92, 0xcb, 0xfd, 0x1f, 0x7d, 0x6b, 0x3a, 0x59, 0x5b, + 0x0f, 0x43, 0xc3, 0xb7, 0xfe, 0xef, 0x35, 0x8d, 0xcf, 0x46, 0xf5, 0x97, + 0xfe, 0x7e, 0x9c, 0x6f, 0xd6, 0x98, 0xd5, 0x97, 0xe8, 0xdd, 0x9f, 0x0c, + 0x59, 0x7f, 0xff, 0xf3, 0xb7, 0xdb, 0xdd, 0xb6, 0xc9, 0x37, 0x9c, 0xbf, + 0x2c, 0xd6, 0x2c, 0xbb, 0x3c, 0xb2, 0xec, 0xdd, 0x59, 0x53, 0x1a, 0xff, + 0x0b, 0x57, 0x91, 0x84, 0xf0, 0xa0, 0xbf, 0x30, 0x1c, 0x80, 0xb2, 0xff, + 0x47, 0x5c, 0x8f, 0xc0, 0xd6, 0x50, 0x0f, 0x64, 0x89, 0xaf, 0x70, 0x4e, + 0x6c, 0x45, 0x0e, 0x42, 0x02, 0x86, 0xa9, 0xbf, 0xa2, 0x43, 0xa0, 0x79, + 0x03, 0xf1, 0xc7, 0xdd, 0xc9, 0x2c, 0xbf, 0xed, 0x44, 0x9b, 0xec, 0x52, + 0x59, 0x7f, 0xff, 0xff, 0xd1, 0xc8, 0xfc, 0xf8, 0x66, 0xb3, 0xce, 0x27, + 0x30, 0xd7, 0x20, 0x41, 0x44, 0xde, 0x85, 0x97, 0xfa, 0x4d, 0xbc, 0x43, + 0xe4, 0xeb, 0x2f, 0xdc, 0xf3, 0xf7, 0x0b, 0x2f, 0xcf, 0x39, 0x8f, 0x25, + 0x95, 0x09, 0xa9, 0x91, 0xbf, 0xe1, 0x28, 0x61, 0xb8, 0x85, 0x17, 0xfd, + 0xcf, 0x43, 0xeb, 0x59, 0xd2, 0xcb, 0xff, 0xff, 0x1b, 0xd4, 0xbf, 0x85, + 0xfe, 0x6c, 0xe7, 0x33, 0x58, 0x4f, 0x25, 0x95, 0x88, 0xa8, 0x63, 0x9b, + 0xe0, 0x7f, 0x27, 0x59, 0x63, 0xac, 0xa8, 0x36, 0x87, 0x23, 0xbf, 0xf8, + 0x58, 0xca, 0x03, 0xde, 0x1a, 0xda, 0x59, 0x7b, 0x4f, 0xc5, 0x97, 0x61, + 0x8b, 0x2a, 0x0f, 0xe8, 0x68, 0xfc, 0x1c, 0xbe, 0x87, 0xd7, 0x16, 0x5e, + 0xff, 0xa1, 0x65, 0x61, 0xf5, 0xf8, 0xb9, 0xc8, 0x6f, 0xde, 0x82, 0x7f, + 0x2c, 0xbf, 0xa7, 0xf3, 0xff, 0x50, 0xb2, 0xf4, 0xb3, 0x8b, 0x2f, 0x47, + 0x5c, 0x59, 0x7f, 0x87, 0xe8, 0x99, 0xdf, 0xa5, 0x97, 0xee, 0xb8, 0x12, + 0x92, 0xcb, 0xde, 0x06, 0xf5, 0x95, 0x3a, 0x2d, 0x46, 0x39, 0xa1, 0xd2, + 0x34, 0xdd, 0x29, 0xb9, 0xa7, 0x59, 0x7b, 0xa7, 0xdc, 0x59, 0x5a, 0x36, + 0xfe, 0x17, 0xbe, 0x8d, 0xb6, 0x35, 0x65, 0x49, 0x50, 0x00, 0xcb, 0x74, + 0x4c, 0xf0, 0xe3, 0x28, 0x42, 0x7c, 0x86, 0xff, 0xfe, 0x37, 0xfe, 0x67, + 0x06, 0x14, 0x75, 0xcc, 0xeb, 0xeb, 0x2f, 0xfe, 0xcd, 0x00, 0xed, 0xc1, + 0x39, 0x18, 0xb2, 0xf4, 0x75, 0xb8, 0xb2, 0xfb, 0x84, 0xc6, 0xac, 0xad, + 0x1e, 0x17, 0xc8, 0x2f, 0xb0, 0x6f, 0x25, 0x94, 0x33, 0xc3, 0x34, 0x8a, + 0xff, 0xe3, 0x4c, 0x8d, 0x7a, 0x19, 0xff, 0xc5, 0x97, 0xc7, 0x28, 0x99, + 0x65, 0xff, 0xf7, 0x9a, 0x4d, 0xa7, 0x07, 0xca, 0x0f, 0xc5, 0x97, 0xdf, + 0x8d, 0x02, 0x0f, 0xc3, 0xb2, 0x2b, 0xb7, 0x38, 0xb2, 0xff, 0xb9, 0xdf, + 0x9c, 0x7b, 0x58, 0xa4, 0x50, 0xb2, 0x8d, 0x44, 0xdb, 0x9c, 0xfc, 0x6a, + 0xa1, 0x56, 0x44, 0x97, 0x32, 0x19, 0x2c, 0x46, 0xf1, 0xa8, 0x5e, 0xda, + 0x88, 0x0b, 0x2f, 0xd0, 0x21, 0x3c, 0x96, 0x5f, 0xfe, 0xd3, 0x97, 0xf0, + 0x1b, 0x70, 0x31, 0xc2, 0xcb, 0xff, 0x8a, 0x00, 0x30, 0xc4, 0xf1, 0xd4, + 0x96, 0x5f, 0xd2, 0xd4, 0x49, 0xf4, 0xb2, 0xec, 0x3a, 0xcb, 0xdf, 0x83, + 0x16, 0x5e, 0xf0, 0x9a, 0x59, 0x52, 0x37, 0x7f, 0x1d, 0xbf, 0xe0, 0xe8, + 0xd7, 0x6e, 0x36, 0xf5, 0x97, 0xed, 0x00, 0xed, 0xc5, 0x97, 0xd8, 0x40, + 0xd9, 0xb6, 0x7c, 0x62, 0x1d, 0xdf, 0x3f, 0x65, 0x8b, 0x2f, 0xe6, 0xf3, + 0x67, 0x5f, 0x59, 0x43, 0x4d, 0x87, 0xa5, 0x13, 0xc2, 0x10, 0x8f, 0xbe, + 0x43, 0x4b, 0x2f, 0x81, 0xfc, 0x02, 0xcb, 0xee, 0x71, 0xb7, 0xac, 0xbf, + 0xff, 0x61, 0x1a, 0xfc, 0xf3, 0xb0, 0x0f, 0x1d, 0x49, 0x65, 0x41, 0xfc, + 0xf6, 0x49, 0x7c, 0x72, 0x28, 0x59, 0x7f, 0xcc, 0x3f, 0x44, 0xb3, 0xaf, + 0xac, 0xbf, 0xee, 0xe3, 0x7c, 0x71, 0x81, 0xd2, 0xcb, 0x9c, 0xd8, 0x44, + 0xa8, 0xc8, 0x30, 0xe6, 0xfd, 0xf7, 0xf8, 0x61, 0x65, 0xff, 0xfd, 0xe6, + 0xff, 0x9e, 0x42, 0x0d, 0xe7, 0x1f, 0x98, 0xeb, 0x2f, 0xfc, 0xdf, 0x96, + 0x03, 0x85, 0x80, 0x59, 0x43, 0x5c, 0xed, 0xc2, 0x73, 0x52, 0xfa, 0x45, + 0x68, 0xe3, 0xa6, 0x50, 0xd0, 0x5f, 0xa1, 0x36, 0x50, 0xb7, 0xe1, 0xd0, + 0x49, 0xf7, 0xae, 0xde, 0xdb, 0xea, 0x16, 0x5f, 0xef, 0x14, 0x74, 0xd1, + 0xe5, 0x97, 0xf3, 0xfc, 0x02, 0x14, 0x96, 0x57, 0x67, 0xc1, 0xe3, 0x2a, + 0xda, 0xdb, 0x83, 0xa8, 0x97, 0xc5, 0x28, 0xd3, 0x86, 0x5b, 0x92, 0xb9, + 0xcd, 0x53, 0x68, 0xda, 0xb5, 0x0f, 0x83, 0xaa, 0xbc, 0xb0, 0x52, 0x96, + 0x53, 0xc5, 0x30, 0xce, 0x87, 0x6d, 0xc2, 0xe8, 0x48, 0x40, 0x5f, 0xf9, + 0xd8, 0x61, 0xff, 0x27, 0xc3, 0x16, 0x5d, 0xb5, 0x12, 0xcb, 0xf7, 0x30, + 0xd8, 0xe2, 0xcb, 0xf6, 0xde, 0x13, 0x9a, 0xb2, 0xfd, 0xd1, 0xdc, 0x80, + 0xb2, 0xb6, 0x1e, 0x94, 0x15, 0x5f, 0xdb, 0x9c, 0x62, 0xea, 0x4b, 0x2f, + 0xfc, 0xfa, 0xdb, 0x6f, 0x63, 0xf4, 0x05, 0x97, 0xf0, 0x04, 0x2f, 0x67, + 0x4b, 0x2f, 0xff, 0xcd, 0xf8, 0x3e, 0x75, 0xf8, 0x38, 0x9a, 0x70, 0x2c, + 0xbe, 0x62, 0x71, 0xac, 0xbf, 0xee, 0x46, 0xbf, 0x02, 0xc6, 0xcb, 0x2a, + 0x48, 0xb0, 0x1a, 0xb7, 0x08, 0x2f, 0xff, 0xec, 0xf6, 0xcc, 0x3b, 0x7a, + 0x36, 0x73, 0x98, 0x40, 0x59, 0x7f, 0xf3, 0x6a, 0x25, 0xe8, 0x98, 0x82, + 0x6a, 0xca, 0xf2, 0x28, 0xb8, 0xbb, 0x7f, 0xe9, 0xe2, 0x62, 0x8e, 0x64, + 0x49, 0x65, 0xdd, 0xed, 0xac, 0xbf, 0x8d, 0xfc, 0x7a, 0x38, 0xb2, 0xff, + 0xb8, 0x59, 0xfe, 0x46, 0xa7, 0x59, 0x7f, 0x79, 0xba, 0xe3, 0xf4, 0xb2, + 0xff, 0x60, 0xf3, 0x52, 0x8d, 0x2c, 0xbd, 0xe6, 0xfa, 0xca, 0x84, 0xcf, + 0x64, 0x7c, 0xc3, 0x73, 0x17, 0x00, 0xe7, 0x85, 0xe2, 0x19, 0x5f, 0x9f, + 0xd9, 0xd7, 0xd6, 0x5f, 0xf9, 0xff, 0xc8, 0xc2, 0x1f, 0xa1, 0x65, 0xf7, + 0x7e, 0x80, 0xac, 0xaf, 0x1e, 0xff, 0xcf, 0x2f, 0xfc, 0xe5, 0x39, 0x98, + 0x43, 0xf4, 0x2c, 0xb9, 0xa7, 0x59, 0x58, 0x7a, 0xa4, 0x7d, 0x7f, 0x83, + 0xd4, 0xb8, 0x24, 0x6e, 0x2c, 0xbd, 0xdc, 0x6e, 0x2c, 0xbf, 0xd3, 0x79, + 0xf5, 0xa6, 0x1a, 0xca, 0xc3, 0xd4, 0x72, 0x0b, 0xfc, 0xfd, 0x09, 0xa6, + 0x3e, 0x2c, 0xbf, 0x9c, 0xa7, 0x3b, 0xfd, 0x65, 0x11, 0xf0, 0xf0, 0xd2, + 0xf9, 0xbc, 0xe7, 0x59, 0x7f, 0xc4, 0x59, 0x3f, 0xff, 0x07, 0x59, 0x52, + 0x55, 0x4d, 0x90, 0x87, 0x99, 0xdf, 0x44, 0x05, 0x08, 0xde, 0x42, 0x07, + 0xe4, 0x22, 0x10, 0xdf, 0xb5, 0x9c, 0x63, 0x16, 0x5f, 0x1e, 0x35, 0xc5, + 0x97, 0xff, 0xa0, 0x7e, 0x09, 0xa2, 0x40, 0xfc, 0x1e, 0x2c, 0xb6, 0xe0, + 0xcf, 0xbc, 0x42, 0x2b, 0xb2, 0x75, 0x95, 0x07, 0x87, 0x85, 0x97, 0xfe, + 0x20, 0xc8, 0x1e, 0x86, 0x29, 0xd6, 0x5c, 0x2a, 0x3a, 0xcb, 0xff, 0xff, + 0xef, 0xc1, 0x77, 0x85, 0x06, 0x7c, 0xd7, 0xe0, 0xe1, 0xf5, 0xe3, 0x1c, + 0x6b, 0x2f, 0xb0, 0xf1, 0xb8, 0xb2, 0xff, 0xfc, 0xe3, 0x09, 0xa1, 0x10, + 0x2e, 0x24, 0xdb, 0x01, 0xf5, 0x95, 0x09, 0x8d, 0x30, 0xdf, 0x1f, 0x82, + 0x49, 0x7f, 0x09, 0x01, 0xec, 0x27, 0x59, 0x73, 0x12, 0xcb, 0xe9, 0x41, + 0x76, 0xb2, 0x86, 0x6d, 0xf0, 0x56, 0xd3, 0x2c, 0xbe, 0x14, 0xbc, 0x74, + 0xb2, 0xd0, 0x46, 0xe3, 0xe2, 0x55, 0xb0, 0xff, 0x59, 0x62, 0xfa, 0x01, + 0x84, 0xb2, 0xa4, 0xcb, 0x62, 0x1b, 0xd6, 0x11, 0xf6, 0x63, 0xd2, 0x0b, + 0x43, 0x7e, 0x68, 0x69, 0x6a, 0x36, 0x03, 0xcb, 0x0b, 0x78, 0x41, 0x02, + 0x1b, 0x44, 0x41, 0xc8, 0xd6, 0x02, 0x78, 0x64, 0x39, 0x36, 0xc8, 0xef, + 0x8f, 0xb4, 0xc5, 0x4d, 0xa1, 0x65, 0xdf, 0xe2, 0xca, 0x63, 0xca, 0x98, + 0xce, 0xf8, 0x48, 0x33, 0x8b, 0x2e, 0x07, 0xd6, 0x5c, 0x0f, 0x2c, 0xbe, + 0xd6, 0xb3, 0x8b, 0x2e, 0xc9, 0x96, 0x5a, 0x5b, 0x11, 0x17, 0x39, 0x21, + 0xc5, 0xdc, 0x5c, 0x42, 0x2b, 0xef, 0xb9, 0x62, 0xcb, 0xed, 0xd8, 0x29, + 0x2c, 0xa6, 0x3c, 0x41, 0x08, 0x2f, 0x89, 0xff, 0xc5, 0x97, 0xed, 0x0f, + 0x30, 0x96, 0x5f, 0x1b, 0xa7, 0x31, 0x65, 0xff, 0x9b, 0x3d, 0x1b, 0xf9, + 0xe8, 0xe9, 0x65, 0x61, 0xf2, 0x6e, 0x12, 0x5f, 0xdd, 0x68, 0x3d, 0x7e, + 0x4b, 0x2f, 0xf9, 0xfa, 0x33, 0x08, 0x7e, 0x85, 0x97, 0x44, 0xeb, 0x2b, + 0x13, 0x50, 0x72, 0x1e, 0x42, 0x28, 0x24, 0x86, 0x18, 0x88, 0x73, 0x7e, + 0x33, 0xff, 0xc9, 0xd6, 0x5f, 0xcf, 0x00, 0xce, 0xa4, 0xb2, 0x96, 0x5f, + 0xe2, 0xd6, 0x73, 0x1b, 0xcb, 0x28, 0x52, 0x6f, 0x30, 0x2e, 0xff, 0xfa, + 0x5f, 0x2c, 0x7f, 0x96, 0x7f, 0xf8, 0x62, 0xcb, 0xfb, 0x4d, 0xff, 0x64, + 0x96, 0x5e, 0xf4, 0x6f, 0x59, 0x5a, 0x3c, 0xbf, 0x96, 0xdc, 0xfb, 0xab, + 0x2f, 0xf7, 0xf3, 0x53, 0xc7, 0xf8, 0xb2, 0xa4, 0x79, 0xae, 0x33, 0x7f, + 0xfd, 0x83, 0x6f, 0xe1, 0xfd, 0x11, 0xd9, 0xdd, 0x65, 0xd9, 0xbd, 0x65, + 0xff, 0x77, 0xec, 0x19, 0xdb, 0x58, 0xb2, 0xfe, 0x8e, 0x7a, 0x08, 0xd5, + 0x95, 0x08, 0xcc, 0x9d, 0x3b, 0x06, 0x34, 0x73, 0x7b, 0x6f, 0x0d, 0x59, + 0x7f, 0x44, 0x6b, 0xd1, 0xbd, 0x65, 0xf3, 0x14, 0xdb, 0x8b, 0x2f, 0x8a, + 0x3a, 0x92, 0xca, 0x01, 0xe3, 0xfc, 0x96, 0xfe, 0x8d, 0xf9, 0xef, 0x42, + 0xcb, 0xef, 0xf3, 0x26, 0x59, 0xe3, 0x5d, 0x7f, 0x78, 0x6d, 0xbe, 0x06, + 0xb2, 0xb0, 0xf8, 0x9c, 0xce, 0xfb, 0x4c, 0xf3, 0xac, 0xbc, 0xd8, 0x05, + 0x95, 0x86, 0xf7, 0x84, 0x57, 0xf9, 0x83, 0xaf, 0x66, 0xfe, 0x2c, 0xbf, + 0xff, 0xd9, 0xf6, 0xea, 0x45, 0x1b, 0x3e, 0xd9, 0xba, 0x3f, 0x62, 0xcb, + 0xec, 0xfb, 0x71, 0x65, 0xfd, 0xb5, 0x4c, 0x5b, 0x44, 0xe1, 0x59, 0x5b, + 0x88, 0xf4, 0x98, 0xd7, 0x8c, 0x9f, 0x21, 0xbf, 0xf0, 0x5c, 0xfc, 0x62, + 0x7d, 0x1a, 0xb2, 0xa4, 0xbf, 0xdc, 0x38, 0xdc, 0xb1, 0x74, 0xd2, 0xae, + 0xda, 0x7a, 0x24, 0x68, 0x4c, 0xcc, 0xdf, 0xa8, 0x76, 0x9c, 0xf3, 0xc4, + 0x00, 0x75, 0x28, 0x59, 0x71, 0x77, 0xf1, 0x8a, 0x18, 0x83, 0x7d, 0xff, + 0xb4, 0x96, 0x5f, 0xd8, 0x61, 0x6f, 0xd4, 0x96, 0x5f, 0xff, 0xbe, 0xdc, + 0x9f, 0x0c, 0xe3, 0x4e, 0x4f, 0xd7, 0xd6, 0x5f, 0xf4, 0xb3, 0xf8, 0x36, + 0x20, 0x2c, 0xbc, 0x66, 0x79, 0x65, 0xfd, 0x9a, 0xd0, 0x4d, 0xd2, 0xcb, + 0xf8, 0xa4, 0x63, 0xfb, 0x8b, 0x2f, 0xc6, 0xf9, 0xc9, 0x96, 0x5b, 0x98, + 0x7a, 0xac, 0x5d, 0x7d, 0xa1, 0x20, 0xc5, 0x97, 0xc3, 0x27, 0x35, 0x65, + 0xff, 0xcd, 0x27, 0xd6, 0x6f, 0xeb, 0xb6, 0xe9, 0x65, 0x42, 0x23, 0xa7, + 0x24, 0xf9, 0x15, 0xf3, 0x73, 0x07, 0x0a, 0x99, 0xa7, 0x22, 0xc3, 0x0e, + 0x96, 0x1c, 0xdc, 0x87, 0x7f, 0x08, 0x41, 0x21, 0x69, 0x7f, 0x80, 0x1e, + 0x31, 0x75, 0x25, 0x97, 0xf0, 0x1b, 0x4d, 0xd0, 0x16, 0x59, 0xf7, 0x0f, + 0x8a, 0x63, 0x4b, 0x01, 0x65, 0xfe, 0x1e, 0x13, 0x19, 0xe0, 0xac, 0xbf, + 0xfe, 0xf3, 0x47, 0xd8, 0x11, 0x21, 0x66, 0x18, 0x62, 0x4b, 0xff, 0x9a, + 0x3e, 0x08, 0x90, 0xb3, 0x0c, 0x31, 0x25, 0x62, 0x27, 0x7c, 0xa9, 0x53, + 0xa3, 0xcb, 0xf0, 0xd0, 0xbf, 0xde, 0x0b, 0x9c, 0x6e, 0x75, 0x94, 0x47, + 0xb9, 0xf2, 0x9b, 0xd9, 0x86, 0xa4, 0xbe, 0xe6, 0x40, 0x16, 0x50, 0xcd, + 0xef, 0xc7, 0x2f, 0x01, 0xfe, 0xb2, 0xfb, 0xfc, 0x0e, 0xe2, 0xca, 0x73, + 0xc2, 0x08, 0xe5, 0xff, 0x69, 0xfb, 0xd9, 0xe8, 0x10, 0x96, 0x5e, 0x0c, + 0x69, 0x65, 0xdf, 0xe0, 0xcf, 0x62, 0x63, 0xcb, 0xe3, 0x42, 0x0e, 0x2c, + 0xb8, 0x82, 0xa8, 0x86, 0x57, 0xf4, 0x1e, 0x39, 0xac, 0x59, 0x52, 0x3c, + 0xf9, 0x88, 0xef, 0x7a, 0x27, 0x59, 0x7e, 0xfc, 0x48, 0xd3, 0xac, 0xbf, + 0xc1, 0x2e, 0xfd, 0x1d, 0x6e, 0xac, 0xbc, 0x61, 0x86, 0x24, 0xbd, 0x85, + 0xda, 0x41, 0x66, 0x82, 0xff, 0xd9, 0x3e, 0x0d, 0xe4, 0x51, 0x3a, 0xca, + 0x84, 0x76, 0xb1, 0x48, 0x16, 0x08, 0xba, 0xff, 0xf6, 0x6b, 0xff, 0xce, + 0x14, 0x66, 0xa4, 0xb2, 0xfc, 0xde, 0xf6, 0x7d, 0x65, 0xa3, 0x61, 0xf7, + 0xf1, 0x22, 0xfb, 0xce, 0x46, 0xac, 0xa1, 0x9e, 0x5f, 0xca, 0x6f, 0xee, + 0xa5, 0xc2, 0x7e, 0xd6, 0x5f, 0x3e, 0xe7, 0xf8, 0xb2, 0xf1, 0x0a, 0xa1, + 0x42, 0xca, 0xc3, 0xfa, 0xe8, 0xbd, 0xc9, 0x6e, 0x15, 0x42, 0xa9, 0x65, + 0xfa, 0x5d, 0xe7, 0x5f, 0x59, 0x7e, 0xcf, 0xfc, 0x33, 0xac, 0xbf, 0xf3, + 0x4f, 0xe6, 0x79, 0x7d, 0xa7, 0x59, 0x69, 0x0a, 0xa4, 0x5a, 0xc8, 0x8c, + 0x8a, 0xbe, 0x53, 0x7e, 0xe6, 0x0d, 0xfc, 0xb2, 0xf8, 0x7e, 0xce, 0xd6, + 0x5e, 0x7d, 0xc8, 0x59, 0x7e, 0xc1, 0xf9, 0xf7, 0x16, 0x5f, 0x8b, 0x07, + 0x07, 0x59, 0x5b, 0x42, 0xfe, 0xdc, 0x46, 0xbf, 0x3a, 0xf0, 0xd8, 0xf1, + 0xe4, 0xd2, 0xfe, 0x9c, 0xe6, 0x23, 0xd4, 0x61, 0x47, 0x87, 0xa7, 0xa1, + 0x38, 0xf0, 0xe3, 0x02, 0x41, 0x13, 0x84, 0x8f, 0x78, 0xf1, 0x85, 0x57, + 0xf1, 0xf1, 0xb5, 0x34, 0x96, 0x5f, 0xff, 0x1a, 0x23, 0x97, 0x9e, 0x5c, + 0xc3, 0xc6, 0xe2, 0xca, 0x84, 0x40, 0xb1, 0x75, 0xf4, 0x7c, 0x22, 0x2c, + 0xbd, 0xf6, 0x85, 0x97, 0x61, 0x2c, 0xa6, 0x36, 0x01, 0x1b, 0xbf, 0x14, + 0x75, 0x1c, 0x59, 0x7f, 0xec, 0x62, 0x7f, 0xf0, 0xc8, 0x25, 0x97, 0xbc, + 0xfa, 0x83, 0xe3, 0xe1, 0x3d, 0xf3, 0x6a, 0x3e, 0xb2, 0xfb, 0x99, 0x12, + 0x59, 0x43, 0x3c, 0x22, 0x21, 0xbd, 0xec, 0xe9, 0x65, 0xf8, 0x7a, 0x68, + 0x3a, 0xcb, 0x44, 0x8f, 0x10, 0x87, 0x6f, 0xa4, 0xd1, 0xda, 0xcb, 0xba, + 0x02, 0xcb, 0xf8, 0xf1, 0xc0, 0x37, 0x6b, 0x2f, 0x72, 0x0d, 0x01, 0xe3, + 0x70, 0x62, 0xfe, 0x2c, 0xdd, 0x68, 0x99, 0x65, 0xfd, 0x9a, 0x00, 0x18, + 0x96, 0x53, 0x9e, 0xd8, 0x4b, 0xef, 0xe2, 0xfb, 0x4e, 0x50, 0xb2, 0xdc, + 0x59, 0x76, 0xd1, 0x3a, 0xca, 0x83, 0xda, 0x91, 0x63, 0x88, 0xdf, 0xe6, + 0x1e, 0xb0, 0x6e, 0x75, 0x97, 0xd3, 0x72, 0x38, 0xb2, 0xd8, 0x73, 0xd5, + 0x01, 0x95, 0xf6, 0x1c, 0x41, 0xac, 0xbf, 0x1b, 0x34, 0x17, 0xd6, 0x57, + 0x8f, 0xcc, 0x89, 0xc2, 0x47, 0x7f, 0xff, 0xdb, 0xe0, 0x6c, 0x4f, 0xa3, + 0x49, 0xd8, 0xb0, 0x01, 0xe2, 0xcb, 0xff, 0x78, 0x4e, 0x66, 0xbb, 0x77, + 0xed, 0x51, 0x06, 0x2f, 0xfe, 0x9e, 0x0d, 0xcd, 0x7f, 0xf1, 0x9c, 0x59, + 0x43, 0x44, 0x99, 0x27, 0x54, 0x26, 0x34, 0xd0, 0xf8, 0xbf, 0xf7, 0x82, + 0xe6, 0xe7, 0xff, 0x9e, 0x59, 0x7f, 0xb7, 0xc1, 0x60, 0x98, 0x75, 0x97, + 0xfb, 0xd0, 0x5f, 0x03, 0xfd, 0x65, 0xff, 0xe9, 0x6a, 0x25, 0xdf, 0x9b, + 0xc4, 0xe7, 0x59, 0x5c, 0x3f, 0xc0, 0x99, 0x5f, 0xff, 0xc7, 0x82, 0xed, + 0xc8, 0x18, 0x3e, 0x10, 0x5e, 0x4b, 0x2f, 0xfb, 0xb6, 0x39, 0xdb, 0x67, + 0x02, 0xb2, 0xff, 0xdc, 0x03, 0xf5, 0xc1, 0x35, 0xe7, 0x59, 0x7f, 0x3f, + 0xb0, 0x8f, 0x8b, 0x2f, 0x83, 0xec, 0xed, 0x65, 0x49, 0x52, 0xe0, 0xc9, + 0xd8, 0xff, 0x50, 0xb0, 0x39, 0x11, 0x2c, 0xfc, 0xf3, 0x7a, 0x0e, 0xd9, + 0x5d, 0xff, 0xdf, 0xe4, 0xf0, 0x21, 0x47, 0x9a, 0x75, 0x97, 0xfb, 0x91, + 0xa9, 0x76, 0xd3, 0xac, 0xbe, 0xf3, 0x38, 0x16, 0x51, 0x22, 0x73, 0x88, + 0xdf, 0x35, 0xbf, 0xff, 0xed, 0x69, 0xe5, 0xc1, 0xfb, 0x3b, 0xcd, 0x73, + 0xaf, 0x88, 0x75, 0x97, 0xf0, 0x4d, 0x2c, 0x9c, 0x2b, 0x2a, 0x11, 0x93, + 0x85, 0xfe, 0x6b, 0xbf, 0xff, 0x17, 0xc3, 0xe1, 0x3e, 0xc4, 0xfd, 0x7c, + 0x30, 0xb2, 0xf7, 0x83, 0xb8, 0xb2, 0xff, 0xcc, 0x5f, 0xe3, 0x0c, 0x1d, + 0x01, 0x65, 0xff, 0xcf, 0xbf, 0x0b, 0xbf, 0x30, 0x04, 0xfa, 0xca, 0x9d, + 0x10, 0xda, 0x3f, 0xa8, 0x56, 0x77, 0x28, 0xfb, 0x58, 0xb8, 0x56, 0xac, + 0x18, 0x53, 0x5e, 0xc2, 0x35, 0x65, 0xfe, 0x71, 0xfb, 0x33, 0xaf, 0xac, + 0xac, 0x3c, 0xf3, 0x47, 0x2b, 0xa6, 0x4d, 0x47, 0xa1, 0x1e, 0x4f, 0x7c, + 0x87, 0xaf, 0xe7, 0xb7, 0xf7, 0x61, 0x51, 0x78, 0xa0, 0xc5, 0x97, 0xcd, + 0xdb, 0x0d, 0x65, 0x61, 0xbe, 0xf8, 0xe5, 0xff, 0xee, 0xbf, 0x0c, 0x5f, + 0xd4, 0x7d, 0xfe, 0xb2, 0xfa, 0x3e, 0xd3, 0x2c, 0xbf, 0x82, 0xe2, 0x05, + 0xc4, 0x59, 0x53, 0x1e, 0x8e, 0x88, 0xae, 0xdf, 0x8b, 0x2b, 0x0d, 0xdb, + 0x91, 0xdf, 0xfc, 0xf2, 0xd9, 0x9f, 0xcf, 0x46, 0x80, 0xb2, 0xe0, 0x01, + 0x65, 0xff, 0x77, 0xe6, 0xd1, 0x37, 0xf8, 0xb2, 0xa4, 0x89, 0x53, 0xa2, + 0x80, 0x5e, 0xff, 0x01, 0xbd, 0xec, 0x03, 0xac, 0xbf, 0xdc, 0x6c, 0x2c, + 0xe8, 0xc5, 0x97, 0xff, 0xfb, 0x3f, 0xf7, 0xd1, 0x47, 0x52, 0x13, 0x40, + 0x3b, 0x71, 0x65, 0x6e, 0x22, 0x54, 0xe6, 0x77, 0xe0, 0xf5, 0xde, 0x1d, + 0x65, 0xfe, 0x63, 0x30, 0x87, 0xe8, 0x59, 0x7c, 0xfd, 0x10, 0xd6, 0x51, + 0xcf, 0x50, 0x06, 0x57, 0xff, 0xa3, 0xfc, 0x0f, 0x7b, 0x3c, 0xe5, 0x10, + 0xb2, 0xef, 0x05, 0x65, 0xff, 0xfa, 0x4c, 0x43, 0xf6, 0x74, 0x23, 0x97, + 0xc8, 0x6b, 0x2f, 0xff, 0xe6, 0x33, 0xcf, 0xdc, 0x10, 0xf3, 0xaf, 0xf9, + 0xc6, 0xb2, 0xff, 0xa7, 0xfc, 0xb3, 0x71, 0xc8, 0x0b, 0x2f, 0xf9, 0xf7, + 0x3c, 0x26, 0xa5, 0x1b, 0x8b, 0x2f, 0xa6, 0xf3, 0xfd, 0x65, 0x62, 0x27, + 0xfa, 0x3c, 0x64, 0x0b, 0xfd, 0x83, 0xf6, 0x75, 0x9c, 0x59, 0x79, 0x8c, + 0xdc, 0x59, 0x7f, 0xb3, 0x7f, 0x3f, 0xf8, 0x3a, 0xca, 0xd1, 0xea, 0xf8, + 0x82, 0xa1, 0x5a, 0x88, 0xc9, 0xb1, 0xf8, 0xd2, 0x26, 0x4b, 0x98, 0x5f, + 0x4a, 0xbe, 0x87, 0xd9, 0x17, 0xf2, 0x11, 0x17, 0xfe, 0x93, 0x14, 0x84, + 0xf7, 0xa0, 0x6b, 0x2e, 0x31, 0x96, 0x5f, 0x8f, 0xde, 0x17, 0x6b, 0x2a, + 0x0f, 0x01, 0x85, 0xef, 0xfb, 0x06, 0x6b, 0xcd, 0xe8, 0x9d, 0x65, 0xf8, + 0x3f, 0x9f, 0x86, 0xac, 0xbf, 0xf9, 0xe7, 0xe3, 0x8e, 0x27, 0x89, 0x42, + 0xcb, 0xfb, 0x39, 0xb7, 0x9a, 0x85, 0x95, 0xd2, 0x6f, 0x1a, 0x7f, 0xf1, + 0x01, 0x1d, 0xf0, 0xaf, 0x6d, 0x12, 0xf9, 0xa0, 0xa6, 0x59, 0x53, 0xb6, + 0xa2, 0x52, 0x53, 0x1c, 0x20, 0xf1, 0xd3, 0xb6, 0x5e, 0x89, 0x9a, 0x94, + 0x21, 0x34, 0x2c, 0xf4, 0x40, 0x78, 0x6a, 0xbc, 0x2d, 0x00, 0x61, 0xc9, + 0xc1, 0x8f, 0xca, 0x0d, 0x31, 0x6e, 0xff, 0x73, 0x98, 0x40, 0xdb, 0xc5, + 0x97, 0xc4, 0xdb, 0xb0, 0xb2, 0xe0, 0x42, 0xcb, 0xc5, 0x9c, 0x59, 0x44, + 0x6c, 0x44, 0x16, 0xb4, 0xcb, 0x2f, 0xee, 0x61, 0x03, 0x6f, 0x16, 0x56, + 0xc4, 0x75, 0xe1, 0xab, 0xaa, 0x00, 0x87, 0x82, 0x57, 0xdf, 0x77, 0x25, + 0x95, 0xbc, 0xfa, 0x8c, 0x4a, 0xbf, 0xc0, 0x70, 0x46, 0xe4, 0x49, 0x65, + 0xff, 0xd2, 0x6c, 0xf3, 0xfb, 0xd1, 0xd7, 0x16, 0x5f, 0xef, 0x60, 0xca, + 0x30, 0x96, 0x54, 0x91, 0x53, 0xd1, 0xa8, 0x11, 0x2f, 0x0f, 0x09, 0x65, + 0xf8, 0x27, 0x8c, 0xfa, 0xcb, 0xec, 0x04, 0x01, 0x65, 0x00, 0xf2, 0x08, + 0x9e, 0xa7, 0x44, 0x27, 0xd8, 0xe9, 0xd1, 0xb2, 0x18, 0x5a, 0xdf, 0xfe, + 0x29, 0xf6, 0x4c, 0xc5, 0x83, 0xc2, 0x35, 0x65, 0xff, 0x04, 0x22, 0x13, + 0x6c, 0x07, 0xd6, 0x5f, 0xfb, 0x37, 0xc7, 0x5b, 0x71, 0xac, 0x25, 0x97, + 0xf3, 0x75, 0xbb, 0xe8, 0xfa, 0xcb, 0xf0, 0x78, 0xcd, 0xd2, 0xcb, 0xf1, + 0x67, 0xfc, 0xcb, 0x2f, 0x09, 0x90, 0xb2, 0xe0, 0x9a, 0xb2, 0xfd, 0x04, + 0x41, 0x3a, 0xca, 0xf1, 0xbe, 0x10, 0x62, 0xf7, 0xe0, 0x45, 0x97, 0xfb, + 0x07, 0xa7, 0xef, 0xe0, 0x59, 0x7e, 0xc2, 0x1f, 0xa1, 0x65, 0x61, 0xfb, + 0xf8, 0x74, 0xc3, 0x4b, 0xd2, 0xce, 0x2c, 0xa8, 0x55, 0x0f, 0x3a, 0x61, + 0xa7, 0x9b, 0x88, 0x53, 0x18, 0xe8, 0xa1, 0xc9, 0x89, 0x6b, 0x90, 0x99, + 0xf9, 0x7d, 0xf0, 0xf4, 0xf2, 0x59, 0x7f, 0xff, 0xb0, 0x9f, 0xfc, 0xcd, + 0x00, 0x11, 0x9d, 0x7f, 0x8c, 0xb2, 0xe9, 0x42, 0xcb, 0x6d, 0xac, 0xad, + 0x86, 0xab, 0x05, 0xa8, 0x68, 0xab, 0xfc, 0x22, 0x6a, 0x11, 0xea, 0xf0, + 0xcd, 0xbd, 0x1a, 0x99, 0x65, 0xe1, 0xc1, 0x2c, 0xad, 0x8f, 0x83, 0xdf, + 0xb5, 0xa0, 0x45, 0x2d, 0xf6, 0x78, 0xd5, 0x87, 0x0a, 0xdc, 0xa4, 0x42, + 0xf7, 0x2d, 0x7f, 0xa8, 0x7a, 0x35, 0x20, 0x1b, 0xd1, 0xc6, 0xbd, 0x6a, + 0x66, 0x09, 0x4a, 0x85, 0x1d, 0x38, 0x65, 0x57, 0x19, 0x1c, 0x56, 0xd9, + 0x30, 0x83, 0xb7, 0xba, 0x9f, 0x7a, 0xcb, 0xfd, 0xdf, 0x9c, 0xa0, 0x3d, + 0x2c, 0xbf, 0x77, 0xe8, 0xeb, 0x75, 0x65, 0xc1, 0x15, 0xac, 0xbf, 0x79, + 0xf4, 0x76, 0x59, 0x78, 0x48, 0xdc, 0x59, 0x7f, 0x09, 0xdf, 0xa3, 0xad, + 0xd5, 0x95, 0xb1, 0x18, 0x72, 0x2d, 0xec, 0x6f, 0x84, 0xe1, 0x20, 0xbc, + 0xc5, 0x8b, 0x2f, 0xef, 0x30, 0xaf, 0xd1, 0x3a, 0xcb, 0x0e, 0x47, 0x99, + 0xd8, 0xd5, 0xc0, 0x31, 0x65, 0xfd, 0xe8, 0x6d, 0xc3, 0xb2, 0xca, 0xd8, + 0x78, 0xfd, 0x8c, 0x50, 0xd5, 0x12, 0xf5, 0x0f, 0x76, 0x84, 0xcf, 0xdc, + 0x2f, 0xec, 0x33, 0x30, 0x8d, 0x59, 0x73, 0x4e, 0xb2, 0xe8, 0x11, 0x65, + 0xe7, 0xce, 0x2c, 0xbf, 0x3c, 0xec, 0x19, 0x2c, 0xbc, 0x00, 0x42, 0xca, + 0x91, 0xfb, 0x1c, 0x5f, 0xc3, 0x64, 0x51, 0x7b, 0x08, 0xd5, 0x94, 0xc9, + 0x88, 0x9c, 0xb5, 0xe1, 0x1b, 0xba, 0x77, 0x7f, 0xee, 0x6a, 0x3e, 0x4e, + 0x73, 0xb2, 0xcb, 0xff, 0xd1, 0xce, 0x41, 0xf3, 0xed, 0xcf, 0x3a, 0xcb, + 0xcc, 0x5f, 0x59, 0x5d, 0x9f, 0x1f, 0x92, 0x2f, 0xfd, 0xe6, 0xf4, 0x66, + 0xa5, 0xa9, 0x2c, 0xbf, 0xf8, 0xf1, 0xfe, 0x3e, 0x68, 0x07, 0xc5, 0x97, + 0xf1, 0x44, 0x8f, 0x0c, 0xb2, 0x80, 0x7d, 0xc4, 0x87, 0x7e, 0xf4, 0x4f, + 0x1e, 0x59, 0x7e, 0xd3, 0x9e, 0x3b, 0x59, 0x7e, 0xcd, 0xe5, 0x9c, 0x59, + 0x7f, 0xbe, 0xdb, 0xdb, 0xf2, 0x84, 0x96, 0x3a, 0xcb, 0xfb, 0x08, 0xdd, + 0x40, 0xb6, 0x3c, 0x51, 0x0d, 0x2e, 0xc3, 0x56, 0x56, 0xc5, 0x55, 0x59, + 0x0a, 0x0e, 0xc8, 0xda, 0x15, 0x93, 0x10, 0xb9, 0x41, 0x14, 0x71, 0xb7, + 0x6d, 0x1a, 0xff, 0xf3, 0xef, 0x8c, 0x1b, 0xcb, 0x3c, 0xc6, 0x2c, 0xbc, + 0x1e, 0xa4, 0xb2, 0xf6, 0x9f, 0x7a, 0xcb, 0xf0, 0xf5, 0xac, 0xe2, 0xca, + 0x91, 0xe3, 0x38, 0xf5, 0x49, 0x19, 0xfa, 0x4a, 0x26, 0x4b, 0xfc, 0x52, + 0x2c, 0x3c, 0x76, 0xb2, 0xf4, 0xcf, 0xf5, 0x97, 0x8a, 0x0e, 0xb2, 0xa0, + 0xdc, 0x4c, 0x3b, 0x7e, 0x6f, 0x14, 0x49, 0x65, 0xf6, 0x9d, 0xa7, 0x59, + 0x77, 0x19, 0x65, 0x31, 0xb8, 0x72, 0x2b, 0x62, 0xcb, 0xd9, 0x86, 0xac, + 0xb1, 0xc6, 0x6b, 0x37, 0x44, 0x2f, 0xfd, 0xc1, 0x35, 0xf9, 0x31, 0x7f, + 0x8b, 0x2a, 0x13, 0xcd, 0xc2, 0xf6, 0x6a, 0xd1, 0x0f, 0x97, 0x9d, 0x2c, + 0x25, 0x57, 0xfc, 0xdb, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0xc3, 0x57, 0xb6, + 0xc3, 0xf5, 0x97, 0x36, 0xf5, 0x97, 0xfe, 0xef, 0xd0, 0x4f, 0xfe, 0x64, + 0xeb, 0x2f, 0x69, 0xc4, 0x59, 0x58, 0x7b, 0x8e, 0x7f, 0x76, 0x1a, 0xb2, + 0xff, 0xe8, 0x3b, 0x0f, 0x08, 0xdf, 0x41, 0xd6, 0x57, 0x8f, 0x6b, 0xe2, + 0xf7, 0xd8, 0x78, 0x11, 0x65, 0x0d, 0x39, 0xae, 0xd2, 0x0e, 0x41, 0xc7, + 0x4f, 0xbd, 0x6f, 0x22, 0xb8, 0x4f, 0x2c, 0xbf, 0x13, 0x98, 0x21, 0xd6, + 0x5f, 0x3f, 0x5f, 0xc5, 0x96, 0x69, 0x8f, 0x2f, 0x85, 0x34, 0x6a, 0x22, + 0xfc, 0xc7, 0x7f, 0xfc, 0xdf, 0xf4, 0x72, 0x3d, 0x0d, 0x3c, 0x1a, 0xb2, + 0xff, 0x7a, 0x26, 0x93, 0x6a, 0x4b, 0x2f, 0xc5, 0x31, 0x41, 0xd6, 0x5f, + 0xef, 0xb1, 0x93, 0x13, 0x98, 0xb2, 0xef, 0x32, 0xcb, 0xfe, 0xcd, 0xf0, + 0x3f, 0x63, 0x7d, 0x65, 0xee, 0x38, 0x16, 0x51, 0x1e, 0xaf, 0xce, 0x6b, + 0x71, 0x11, 0x9f, 0x6b, 0xbf, 0x82, 0x20, 0x01, 0x1d, 0x2c, 0xbe, 0x3f, + 0xf3, 0xb5, 0x97, 0xd3, 0xc7, 0x50, 0xb2, 0xa0, 0xf1, 0x98, 0x8e, 0xe3, + 0x3e, 0xb2, 0xfd, 0x12, 0x01, 0x62, 0xcb, 0x9a, 0x75, 0x95, 0x0a, 0x9f, + 0x06, 0x9f, 0x86, 0x9d, 0x13, 0xb4, 0x30, 0x66, 0x26, 0xf3, 0xb3, 0x90, + 0x10, 0xc7, 0xc9, 0xaf, 0xcf, 0xfd, 0x46, 0xf5, 0x97, 0xd1, 0xd0, 0x77, + 0x16, 0x5f, 0xff, 0xbb, 0x0f, 0x8d, 0x62, 0x8f, 0x41, 0x90, 0x58, 0xb2, + 0xa6, 0x3f, 0xb2, 0x26, 0xbe, 0x61, 0xee, 0xb2, 0xca, 0x84, 0x75, 0x3c, + 0x29, 0x0c, 0x22, 0xbf, 0xef, 0x44, 0x98, 0xb0, 0xf0, 0xb2, 0xf9, 0xc7, + 0x29, 0xd6, 0x5f, 0xf6, 0x7f, 0xd8, 0x72, 0x7f, 0xac, 0xbf, 0xb7, 0xb6, + 0xba, 0x8d, 0xc5, 0x94, 0x33, 0xea, 0xc3, 0x7a, 0xf2, 0x2b, 0x8a, 0x11, + 0xb7, 0x10, 0x16, 0x5f, 0x8f, 0x1d, 0xce, 0x35, 0x97, 0xd2, 0x83, 0xba, + 0xcb, 0xf6, 0x80, 0x76, 0xe2, 0xcb, 0xbf, 0xc1, 0x4a, 0x22, 0x70, 0x59, + 0xca, 0x84, 0x21, 0xa8, 0x47, 0xe0, 0x61, 0x61, 0x6e, 0x2c, 0xbf, 0xa2, + 0x7c, 0x26, 0x35, 0x65, 0x68, 0xdf, 0x70, 0x46, 0xff, 0xc4, 0xfe, 0x80, + 0x0b, 0xd7, 0x38, 0x92, 0xf7, 0xb0, 0x6b, 0x2a, 0x0f, 0x71, 0x90, 0x2f, + 0xa3, 0xf2, 0x75, 0x97, 0xf0, 0x04, 0x29, 0x7b, 0x16, 0x5d, 0x3c, 0xeb, + 0x2f, 0x67, 0x70, 0xb2, 0xa7, 0x56, 0xcc, 0x38, 0xf8, 0x31, 0x94, 0xef, + 0xbe, 0x20, 0xf9, 0x08, 0x4b, 0xb7, 0x8c, 0xde, 0x3c, 0x76, 0xb2, 0xfc, + 0xf3, 0x36, 0x71, 0x65, 0xf7, 0x23, 0x52, 0x59, 0x61, 0xec, 0x3c, 0x9e, + 0x13, 0xd4, 0x22, 0x41, 0xd9, 0xaf, 0xf8, 0x87, 0xe8, 0xff, 0xe0, 0xeb, + 0x2e, 0x0c, 0xeb, 0x2f, 0xa0, 0x4d, 0xd1, 0xac, 0xbe, 0xe3, 0x7e, 0x16, + 0x5d, 0xd4, 0xa7, 0x3c, 0x7e, 0x89, 0xaf, 0x37, 0x5c, 0x59, 0x58, 0x79, + 0xcc, 0x63, 0x58, 0x98, 0x2b, 0x1c, 0x7a, 0x15, 0xb7, 0x67, 0x6b, 0x2d, + 0xc5, 0x9f, 0x2d, 0xef, 0xc3, 0x83, 0xb8, 0xd6, 0x56, 0x1e, 0x3b, 0x10, + 0x5e, 0xfe, 0x79, 0x65, 0xf4, 0xff, 0x63, 0x56, 0x56, 0x8f, 0x80, 0x24, + 0x02, 0x0e, 0x5f, 0xfe, 0xd8, 0xed, 0x9c, 0x89, 0xf0, 0x98, 0xd5, 0x97, + 0x6f, 0x85, 0x94, 0x33, 0xe2, 0x3a, 0x55, 0xfe, 0xd1, 0xe3, 0xaf, 0xbf, + 0x6b, 0x2f, 0xff, 0xe2, 0xcf, 0xfb, 0x25, 0x9d, 0xc7, 0x7f, 0x27, 0x3a, + 0xca, 0xc4, 0x58, 0xb1, 0x17, 0x0d, 0x6f, 0xf9, 0xa4, 0xdc, 0xea, 0x4c, + 0x4b, 0x2f, 0xf0, 0x1a, 0x5a, 0xd3, 0x18, 0xb2, 0xb4, 0x7d, 0x84, 0x71, + 0x7c, 0xc7, 0x89, 0x96, 0x5f, 0xfd, 0xc6, 0xe8, 0xb2, 0x6d, 0x47, 0xf8, + 0xb2, 0xfb, 0x27, 0x0c, 0x96, 0x5f, 0x36, 0xa2, 0x75, 0x94, 0xc8, 0xcd, + 0x98, 0x84, 0x04, 0x46, 0x22, 0x88, 0x47, 0x7f, 0x4d, 0xcf, 0x66, 0xfe, + 0x2c, 0xbd, 0x3b, 0x9d, 0x65, 0xee, 0x44, 0xa0, 0xf3, 0x9c, 0xc6, 0xf9, + 0xf4, 0xfd, 0x2c, 0xbf, 0x81, 0x3b, 0xca, 0x37, 0x16, 0x5f, 0xb6, 0x44, + 0xd0, 0x62, 0xcb, 0xc3, 0x1c, 0x2c, 0xb9, 0x89, 0x65, 0x1a, 0x8a, 0xfe, + 0x88, 0x8e, 0x62, 0x12, 0xb1, 0x07, 0x2a, 0x13, 0xc7, 0x68, 0x4d, 0x3c, + 0x38, 0x2f, 0xb5, 0x18, 0x75, 0x97, 0x61, 0x8b, 0x29, 0x38, 0x86, 0x17, + 0xf7, 0x04, 0x8d, 0x41, 0xd3, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, + 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x24, 0x5c, 0xb0, 0xc8, + 0x0f, 0x02, 0x33, 0xb6, 0x33, 0xba, 0x33, 0x77, 0xb1, 0x38, 0x86, 0x17, + 0xf3, 0xbf, 0xe6, 0x83, 0xa7, 0x10, 0xc3, 0x61, 0xa4, 0xb0, 0xad, 0x38, + 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x48, 0xd9, 0x30, 0xcd, + 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, + 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x3a, 0x25, 0x86, 0x32, 0xc3, + 0x20, 0x19, 0xe0, 0xce, 0xf1, 0x9a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, + 0xa4, 0x6c, 0xb8, 0x33, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, + 0x0c, 0x29, 0x38, 0x86, 0x15, 0x23, 0xe4, 0x00, 0xcf, 0xc6, 0x77, 0x46, + 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, + 0xc2, 0xa7, 0x3e, 0x43, 0x46, 0x74, 0x33, 0xe1, 0x9b, 0x1a, 0x9c, 0x43, + 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, + 0x30, 0xa1, 0x9f, 0x27, 0x43, 0x20, 0x19, 0x08, 0xcd, 0x27, 0x10, 0xc2, + 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xbf, 0x7a, 0x01, 0xcc, 0x4e, 0x21, + 0x85, 0x27, 0x10, 0xc2, 0xa4, 0x89, 0x9e, 0xc6, 0x7c, 0x32, 0xe3, 0x20, + 0x35, 0xb7, 0x69, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, + 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x91, 0xf2, 0x74, 0x32, 0xc3, 0x3b, + 0xc6, 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, + 0x10, 0xc2, 0xa4, 0x7c, 0x83, 0x19, 0xf0, 0xc9, 0x0c, 0xdb, 0xc9, 0xc4, + 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2d, 0x24, 0xe2, 0x18, 0x52, + 0x71, 0x0c, 0x3a, 0x2f, 0xe9, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, + 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa7, 0x46, 0xf4, 0x86, 0x4d, 0x38, 0xec, + 0xa6, 0x61, 0x90, 0x0c, 0xfc, 0x66, 0xd8, 0x9c, 0x43, 0x0a, 0x4e, 0x21, + 0x85, 0x27, 0x10, 0xc2, 0xd2, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc3, 0xa2, + 0xfe, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa8, 0x45, 0x64, 0x86, 0x58, + 0xe3, 0x45, 0x27, 0x19, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, + 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x41, 0xfe, 0xf4, 0x33, + 0xa1, 0x93, 0x8c, 0x90, 0xcd, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, + 0xc4, 0x30, 0xad, 0x1e, 0x5f, 0x06, 0x7e, 0x33, 0x49, 0xc4, 0x30, 0xa4, + 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x28, 0xe7, 0x96, 0x43, 0x3f, 0x19, 0xb1, + 0xd3, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x50, 0x0d, 0x90, + 0x46, 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, + 0x10, 0xc2, 0xa0, 0xf9, 0x26, 0x19, 0xf0, 0xc8, 0x46, 0x6a, 0x19, 0x81, + 0xf3, 0xc2, 0x02, 0x49, 0xa3, 0x55, 0xc8, 0x5b, 0x77, 0x08, 0xbe, 0xa1, + 0x0a, 0xd0, 0xa3, 0xdc, 0x3e, 0x9a, 0x10, 0x9a, 0x86, 0xb1, 0xd2, 0xbd, + 0x08, 0x47, 0x85, 0x10, 0x0e, 0xca, 0x1f, 0xbc, 0x68, 0xfc, 0x32, 0x83, + 0x0c, 0x5d, 0xf0, 0x93, 0x31, 0xeb, 0x6c, 0xb8, 0x45, 0x1d, 0xd8, 0x42, + 0xdf, 0xa4, 0x51, 0x9c, 0x4e, 0x21, 0x80, 0xb4, 0xe5, 0xef, 0x34, 0x1d, + 0x38, 0x86, 0x17, 0xcd, 0xdb, 0xe9, 0x78, 0x86, 0x2f, 0x30, 0xf1, 0x78, + 0x86, 0x2c, 0x2f, 0xa4, 0x64, 0xe9, 0x27, 0xc5, 0x3f, 0x2f, 0xb4, 0x6f, + 0x67, 0xc2, 0x89, 0x4f, 0x3f, 0xbc, 0xc5, 0x3a, 0xcb, 0xf9, 0x8c, 0x1e, + 0xa2, 0x75, 0x95, 0x23, 0xcb, 0xf0, 0xe5, 0xdb, 0xe1, 0x65, 0xcf, 0xd2, + 0xcb, 0xe9, 0x37, 0x82, 0xb2, 0xfa, 0x36, 0xe3, 0xeb, 0x2f, 0x36, 0xf1, + 0x5a, 0xcb, 0x9b, 0x75, 0x65, 0x76, 0xd8, 0x7d, 0xf5, 0x4f, 0xa6, 0x9a, + 0x10, 0x67, 0x22, 0xf0, 0xc3, 0x8b, 0x91, 0x17, 0xc9, 0x37, 0x48, 0xaf, + 0x78, 0x72, 0x59, 0x7a, 0x67, 0x11, 0x65, 0x0c, 0xdd, 0xe0, 0xed, 0xf9, + 0x88, 0x2f, 0xf5, 0x97, 0xff, 0xfe, 0xcc, 0x20, 0xfd, 0xbc, 0x41, 0x34, + 0xb3, 0xaf, 0xc6, 0x69, 0x65, 0x62, 0x2c, 0x38, 0x41, 0xb6, 0x4d, 0x7b, + 0xc1, 0xed, 0x65, 0xf7, 0xb3, 0x7e, 0x2c, 0xaf, 0x1e, 0x0f, 0xc7, 0xaf, + 0x00, 0x3c, 0x59, 0x7f, 0x9c, 0x84, 0x9a, 0x4c, 0x4b, 0x2e, 0x04, 0x2c, + 0xbf, 0xb4, 0xe4, 0x24, 0x01, 0x65, 0xcf, 0xa5, 0x96, 0x65, 0x9d, 0x96, + 0xd6, 0xed, 0x65, 0x8e, 0xb2, 0xc2, 0xd9, 0x13, 0x9a, 0x16, 0xf2, 0x1b, + 0x90, 0x08, 0x25, 0x7f, 0x75, 0x2f, 0x41, 0x4e, 0xb2, 0x8e, 0x9a, 0x7e, + 0xdc, 0x33, 0xf7, 0x54, 0x6f, 0xff, 0xfd, 0x92, 0xf4, 0x79, 0x8d, 0x76, + 0x28, 0xf3, 0xb4, 0x98, 0x6b, 0x2e, 0x96, 0x2c, 0xbf, 0x88, 0x3f, 0xf6, + 0x6f, 0x59, 0x7b, 0x4d, 0x3a, 0xcb, 0xfd, 0x07, 0xc9, 0xa0, 0xa7, 0x59, + 0x4b, 0x2e, 0x1e, 0xf5, 0x95, 0x88, 0xa3, 0xd1, 0x7f, 0x87, 0x40, 0x66, + 0x41, 0x77, 0xec, 0x3f, 0xa0, 0x0b, 0x2f, 0xfe, 0xd8, 0xfd, 0x8f, 0xd0, + 0x0c, 0x20, 0x2c, 0xb8, 0x10, 0xb2, 0xb0, 0xf7, 0x00, 0x8d, 0x50, 0xaf, + 0x5e, 0x44, 0x59, 0x1b, 0x63, 0x1e, 0x4c, 0xd0, 0x08, 0x5c, 0xfd, 0x20, + 0x30, 0x83, 0xbe, 0x89, 0x72, 0x16, 0x5f, 0xfc, 0x45, 0x13, 0x96, 0x36, + 0xf8, 0xdb, 0x59, 0x7a, 0x3a, 0xe2, 0xca, 0x3a, 0x21, 0x1c, 0x87, 0x88, + 0xd7, 0x9f, 0x50, 0xb2, 0xfc, 0xdb, 0x6e, 0x40, 0x59, 0x7e, 0x6e, 0xb8, + 0xfd, 0x2c, 0xa9, 0x1f, 0x69, 0xc6, 0xf8, 0x53, 0x7d, 0xbc, 0xf0, 0xcb, + 0x2f, 0xd3, 0x31, 0xde, 0x65, 0x97, 0xfc, 0x23, 0x8f, 0x98, 0x78, 0xdc, + 0x59, 0x7b, 0x3a, 0x31, 0x65, 0x68, 0xf6, 0x88, 0xf2, 0xff, 0x66, 0x14, + 0x84, 0x21, 0xac, 0xb0, 0x30, 0xf4, 0xe6, 0x21, 0xbf, 0xfc, 0xdb, 0x81, + 0x35, 0xba, 0xe6, 0x4d, 0x1f, 0x59, 0x6d, 0xc5, 0x95, 0xd2, 0x22, 0xce, + 0x50, 0xe9, 0xf7, 0x06, 0x16, 0x5e, 0xcd, 0x49, 0x65, 0x0c, 0xd9, 0x6f, + 0x16, 0xbc, 0x37, 0x25, 0x94, 0xc6, 0xf9, 0xc8, 0xef, 0xbb, 0x72, 0x35, + 0x65, 0xff, 0xff, 0xb5, 0xfc, 0x28, 0xec, 0xa0, 0xfc, 0xe6, 0x4b, 0xcc, + 0x40, 0x59, 0x50, 0x88, 0xd7, 0x23, 0xbf, 0xf9, 0xf5, 0xa7, 0x04, 0x0b, + 0x30, 0xc3, 0x16, 0x5e, 0x93, 0x01, 0x65, 0xff, 0x8d, 0xce, 0xbe, 0xdf, + 0xd0, 0x4e, 0xb2, 0xb6, 0x22, 0x99, 0xd2, 0x7e, 0x39, 0x74, 0x49, 0x65, + 0x41, 0xe3, 0x80, 0xc6, 0xa1, 0x70, 0xbb, 0x0b, 0xd8, 0x8d, 0xe3, 0x61, + 0xe4, 0x28, 0x3f, 0x0a, 0xc0, 0xc6, 0x1d, 0x7c, 0xe3, 0xcf, 0xac, 0xbf, + 0xf8, 0xb1, 0xbd, 0x1d, 0x03, 0x3f, 0xc5, 0x97, 0xff, 0x04, 0x49, 0xb6, + 0x40, 0x8f, 0xdc, 0x79, 0x65, 0xc4, 0x6a, 0xcb, 0xff, 0x80, 0xf2, 0xe6, + 0x4b, 0xd0, 0x46, 0xac, 0xbf, 0x8f, 0xcc, 0x3c, 0x6e, 0x2c, 0xa8, 0x3f, + 0x46, 0x44, 0xbf, 0xcc, 0x6f, 0x18, 0xba, 0x92, 0xcb, 0x46, 0x8f, 0x53, + 0xc4, 0x14, 0xc9, 0x83, 0x6e, 0xc3, 0x7e, 0x85, 0x2e, 0xec, 0x0e, 0x25, + 0x23, 0x4f, 0x1a, 0xd4, 0xa5, 0x77, 0x0e, 0x59, 0x4e, 0x47, 0xf6, 0x6c, + 0x39, 0xbb, 0x95, 0x41, 0xd4, 0x6f, 0x2d, 0x2e, 0x6b, 0x72, 0x30, 0xb9, + 0xa3, 0x26, 0xd4, 0x3c, 0x8f, 0x1a, 0x1f, 0xa5, 0x97, 0x3d, 0x62, 0x66, + 0x08, 0xe0, 0x0a, 0x71, 0x2b, 0x91, 0x82, 0xfe, 0x73, 0x2b, 0x7b, 0xce, + 0xd9, 0x08, 0x88, 0x7b, 0xb1, 0xa8, 0x5e, 0x04, 0xf8, 0xb2, 0xf1, 0xf9, + 0xda, 0xcb, 0xc5, 0xdc, 0x2c, 0xbe, 0xcf, 0xbf, 0x4b, 0x2b, 0x61, 0xee, + 0x30, 0xf6, 0x87, 0x2f, 0xfb, 0x86, 0xb9, 0x46, 0x4f, 0x0b, 0x2f, 0xa5, + 0x9a, 0x85, 0x97, 0xf1, 0x8f, 0xad, 0x3f, 0x4b, 0x2f, 0xff, 0xdc, 0xd6, + 0x9a, 0x6e, 0x6a, 0x3e, 0xdd, 0xb0, 0xd6, 0x51, 0xd3, 0x0f, 0x73, 0x00, + 0x1c, 0x11, 0x09, 0x85, 0xf7, 0xbf, 0x1c, 0x59, 0x62, 0x59, 0x7e, 0x1e, + 0x60, 0x38, 0xb2, 0xc0, 0xdb, 0x36, 0xe2, 0x08, 0x51, 0xcf, 0xf8, 0x94, + 0xef, 0x4e, 0xc3, 0x59, 0x60, 0xac, 0xb0, 0x18, 0xd7, 0x10, 0xed, 0x85, + 0x2b, 0x2f, 0xb4, 0xc4, 0x6a, 0xcb, 0xf0, 0x7b, 0xf3, 0x69, 0x65, 0xd8, + 0x6a, 0xcb, 0x7e, 0x0f, 0x03, 0x85, 0x37, 0xf6, 0x77, 0xe8, 0xea, 0x4b, + 0x2f, 0xe3, 0xf1, 0x8d, 0xf9, 0x8b, 0x2f, 0xd1, 0xd7, 0xa2, 0x4b, 0x28, + 0x50, 0x99, 0x2e, 0x85, 0x49, 0x8b, 0xe4, 0xe2, 0x17, 0xee, 0x98, 0x5f, + 0xb3, 0xff, 0xc9, 0xd6, 0x5f, 0xf4, 0x73, 0x99, 0xfe, 0x64, 0xeb, 0x2d, + 0xd1, 0x1f, 0x08, 0x85, 0x17, 0xf4, 0x75, 0x2c, 0xdd, 0x92, 0xca, 0xc3, + 0xda, 0x39, 0x4d, 0xdd, 0x7d, 0x65, 0xfb, 0x0a, 0x76, 0xd2, 0xcb, 0xf7, + 0xdc, 0x83, 0x8b, 0x2f, 0xf7, 0x30, 0xed, 0xff, 0x3a, 0xca, 0xc4, 0x4b, + 0xe8, 0x60, 0x89, 0xfe, 0x4d, 0x7f, 0x40, 0x7f, 0xe7, 0x02, 0xcb, 0xde, + 0x81, 0xac, 0xad, 0x1e, 0x4f, 0x0b, 0x6f, 0xa5, 0xa2, 0x0a, 0xca, 0x91, + 0xe2, 0x74, 0x45, 0x50, 0x8e, 0xb7, 0x86, 0x45, 0xed, 0x87, 0x65, 0x97, + 0xf6, 0x4d, 0xa8, 0xff, 0x16, 0x5c, 0x47, 0x59, 0x52, 0x3e, 0x22, 0x1e, + 0xe1, 0x75, 0xed, 0xdd, 0x42, 0xcb, 0xff, 0x14, 0x3c, 0xfc, 0xcd, 0xf0, + 0x62, 0xcb, 0xfe, 0xf3, 0x6b, 0xce, 0x29, 0x30, 0xc5, 0x97, 0xfd, 0xfd, + 0x46, 0x74, 0x2a, 0x85, 0x02, 0x95, 0x97, 0xff, 0x89, 0xcc, 0xe1, 0x67, + 0x52, 0xf8, 0x67, 0x59, 0x7f, 0xb4, 0xd3, 0x16, 0x6f, 0x75, 0x97, 0xfb, + 0x0a, 0x59, 0xc7, 0xf2, 0xcb, 0xff, 0xda, 0x34, 0xc7, 0x9c, 0xb3, 0x7e, + 0x9b, 0x8b, 0x2d, 0xcd, 0x8a, 0x84, 0xe0, 0xb8, 0x63, 0xf8, 0x81, 0xd1, + 0xfc, 0xc9, 0x1a, 0x4c, 0xf9, 0xa0, 0x86, 0x37, 0xfb, 0x45, 0x83, 0xf6, + 0x12, 0xcb, 0xe7, 0x20, 0xe2, 0xcb, 0xf0, 0xf9, 0xc8, 0x3a, 0xca, 0xe9, + 0x30, 0x27, 0x84, 0x48, 0x0c, 0x48, 0x82, 0xff, 0x8a, 0x1e, 0x7f, 0x46, + 0x80, 0xb2, 0xff, 0x36, 0x8b, 0xff, 0xc9, 0xd6, 0x5f, 0x7e, 0x7c, 0x31, + 0x65, 0xcf, 0xbd, 0x65, 0xfd, 0x22, 0x69, 0x7b, 0x16, 0x5f, 0xa7, 0x6d, + 0x44, 0x96, 0x51, 0xa8, 0xc3, 0xe8, 0xce, 0x62, 0x4d, 0x0c, 0x11, 0x65, + 0xef, 0xb1, 0xab, 0x2f, 0xc1, 0xfe, 0xde, 0x7d, 0x65, 0xe1, 0xb1, 0xab, + 0x2a, 0x0f, 0x23, 0x0a, 0xef, 0xe7, 0xf0, 0x9a, 0x70, 0x2c, 0xbd, 0xa0, + 0x08, 0xb2, 0xff, 0xe6, 0xfc, 0x7f, 0x9e, 0x76, 0xf0, 0x56, 0x54, 0x1f, + 0x0b, 0x8f, 0x5f, 0x11, 0x06, 0x4b, 0x2f, 0x71, 0x8c, 0x59, 0x7f, 0x88, + 0x3c, 0xc3, 0xc7, 0x6b, 0x2f, 0xfd, 0xe8, 0xd0, 0x0b, 0x0c, 0x70, 0x2c, + 0xbd, 0x99, 0x32, 0xca, 0x35, 0x11, 0xbe, 0x33, 0x01, 0xf5, 0xf7, 0xc1, + 0x12, 0x59, 0x58, 0x7a, 0x61, 0x31, 0xbd, 0x1d, 0x18, 0xb2, 0xfd, 0xa0, + 0x9d, 0xc9, 0x65, 0x7c, 0xf1, 0x42, 0x3d, 0x7c, 0x78, 0xc9, 0xd6, 0x5f, + 0xb3, 0x79, 0x47, 0x4b, 0x29, 0x8f, 0x2f, 0x84, 0x57, 0xd0, 0x5f, 0xed, + 0x65, 0xfb, 0x46, 0xce, 0xfb, 0x8b, 0x28, 0x6b, 0x9b, 0x99, 0x0f, 0xb6, + 0x4c, 0xd3, 0x29, 0xc8, 0x3d, 0x08, 0xf7, 0x20, 0x01, 0x09, 0x43, 0xf7, + 0x8c, 0xdf, 0x6d, 0xdb, 0x21, 0x10, 0x8a, 0xfd, 0xb7, 0xec, 0x03, 0xac, + 0xbf, 0xc0, 0x13, 0x08, 0x7e, 0x85, 0x95, 0x09, 0x90, 0x9e, 0x18, 0x8e, + 0x55, 0x7f, 0x73, 0x0e, 0xde, 0x85, 0x97, 0xba, 0x97, 0x16, 0x57, 0x47, + 0x95, 0xa2, 0xcb, 0xdc, 0x01, 0x8b, 0x2f, 0xba, 0xe4, 0x74, 0xb2, 0xfd, + 0x2f, 0xf2, 0x0d, 0x59, 0x7f, 0xf4, 0x6a, 0x26, 0x27, 0x33, 0xf9, 0xe5, + 0x94, 0xe7, 0xda, 0x45, 0x36, 0x93, 0x22, 0xc4, 0xf0, 0x91, 0xa8, 0x4c, + 0x7f, 0x08, 0xde, 0x19, 0xf7, 0xfc, 0x61, 0x66, 0xb9, 0xec, 0xed, 0x65, + 0xff, 0xc5, 0x9c, 0xc1, 0xcd, 0x28, 0xd4, 0xeb, 0x29, 0x8f, 0xff, 0xe7, + 0x57, 0xf1, 0xbf, 0x28, 0x3f, 0x16, 0x5f, 0x60, 0xd8, 0x96, 0x5f, 0x05, + 0xf5, 0x25, 0x97, 0xd0, 0x11, 0x5f, 0x12, 0x5f, 0xa4, 0x2c, 0xc3, 0x0c, + 0x59, 0x44, 0x7a, 0x81, 0x26, 0xbf, 0x6d, 0xbc, 0xfe, 0x65, 0x97, 0xff, + 0xde, 0x63, 0x4d, 0x8f, 0xf2, 0x08, 0xb3, 0xeb, 0x2f, 0x8b, 0x0f, 0x0b, + 0x2f, 0xf4, 0x7d, 0xc0, 0xf9, 0xa5, 0x97, 0x67, 0xd6, 0x5f, 0xff, 0xdf, + 0x2c, 0x03, 0x90, 0x3e, 0x4e, 0x03, 0x33, 0xcb, 0x2e, 0x2e, 0xf6, 0x26, + 0x75, 0xd9, 0x5b, 0x27, 0x9c, 0x83, 0xc6, 0x22, 0x0b, 0x5e, 0xf9, 0xfe, + 0xb2, 0xfc, 0x16, 0x26, 0xe2, 0xca, 0x73, 0xc3, 0xe0, 0xed, 0xfb, 0x9a, + 0x87, 0xed, 0x65, 0xfa, 0x0b, 0xb8, 0xde, 0xb2, 0xb0, 0xf4, 0x7c, 0x51, + 0x5b, 0x15, 0x97, 0x0c, 0x83, 0x1d, 0x9e, 0x35, 0xb0, 0x42, 0xab, 0xee, + 0x57, 0xf8, 0x05, 0x9b, 0xf4, 0xdc, 0x59, 0x7f, 0x84, 0x22, 0x73, 0x1f, + 0xcb, 0x28, 0x52, 0xdb, 0x8c, 0xc4, 0x71, 0x19, 0x0c, 0x8e, 0x93, 0xda, + 0x34, 0xad, 0x46, 0x34, 0x78, 0xe8, 0xde, 0x5c, 0xe8, 0x27, 0x8f, 0xca, + 0x39, 0xde, 0x42, 0xcb, 0xe4, 0x21, 0x96, 0xb9, 0xbd, 0x90, 0xc3, 0x4b, + 0xe0, 0x09, 0x00, 0x59, 0x7b, 0x6b, 0x15, 0x05, 0x2b, 0x2f, 0x48, 0x9d, + 0x65, 0xfe, 0xfc, 0x1f, 0xa9, 0x67, 0xd6, 0x5f, 0xfd, 0x3b, 0xee, 0x77, + 0xe6, 0xee, 0x3f, 0xc5, 0x95, 0xb5, 0xa3, 0x12, 0x0a, 0xf0, 0x6f, 0x86, + 0x95, 0x09, 0x93, 0xf5, 0x0e, 0x7b, 0xf6, 0xec, 0x4b, 0x50, 0xb2, 0xf7, + 0x98, 0xeb, 0x2e, 0x70, 0x2c, 0xa7, 0x36, 0x5f, 0x1c, 0xbf, 0x6a, 0x78, + 0xd4, 0xeb, 0x2f, 0xec, 0xff, 0x02, 0x5f, 0x59, 0x7e, 0x62, 0xf8, 0x87, + 0x59, 0x79, 0xf5, 0xc5, 0x95, 0x08, 0x9b, 0xc2, 0xa0, 0x16, 0xfc, 0xa2, + 0xff, 0xd0, 0x5f, 0xf0, 0x5e, 0x52, 0x85, 0x97, 0xb4, 0x1d, 0xc5, 0x97, + 0x34, 0xcb, 0x29, 0x8d, 0xb9, 0x10, 0x5a, 0x75, 0x97, 0xed, 0x47, 0x98, + 0xd5, 0x97, 0xfd, 0x21, 0x3e, 0xc5, 0x1d, 0x49, 0x65, 0x4e, 0x89, 0x33, + 0x47, 0xfb, 0x12, 0xd1, 0x45, 0xf8, 0x20, 0xc2, 0xed, 0x65, 0xed, 0x44, + 0xcb, 0x2f, 0x13, 0xcc, 0xb2, 0xfd, 0xc3, 0x1f, 0xae, 0x2c, 0xa6, 0x3c, + 0x67, 0x1c, 0xbe, 0xe7, 0xe0, 0xeb, 0x2f, 0xfc, 0x50, 0x6f, 0x9f, 0xe2, + 0x60, 0x16, 0x5e, 0xe6, 0xb1, 0x65, 0xe2, 0xc9, 0x2c, 0xbf, 0x68, 0x04, + 0x10, 0x2c, 0xa8, 0x3c, 0x3c, 0x1b, 0xa6, 0x3f, 0xfe, 0x2f, 0xdb, 0x71, + 0x65, 0xfd, 0x82, 0x44, 0xcd, 0xc5, 0x94, 0x47, 0x85, 0xf1, 0x4a, 0x85, + 0xca, 0x89, 0xd7, 0x25, 0x0b, 0xb1, 0x9d, 0xe4, 0x60, 0xfa, 0x40, 0x39, + 0x47, 0x98, 0xc0, 0x40, 0x44, 0x5f, 0x85, 0xf6, 0xf6, 0x3b, 0xfe, 0x86, + 0xf4, 0x1e, 0x7c, 0x31, 0x65, 0xff, 0xb9, 0x0c, 0x32, 0x89, 0x30, 0x16, + 0x5f, 0xbc, 0xd3, 0xb9, 0x2c, 0xb8, 0x6c, 0xb2, 0xfc, 0x13, 0x5c, 0x80, + 0xb2, 0xef, 0x32, 0xca, 0x83, 0xfb, 0xc2, 0x7f, 0x0b, 0x6e, 0x94, 0x5f, + 0xf4, 0xe5, 0x92, 0xf6, 0x03, 0x8b, 0x2f, 0xe3, 0x78, 0xc5, 0xd4, 0x96, + 0x5f, 0xf4, 0x17, 0x7b, 0x06, 0x4e, 0x62, 0xcb, 0xff, 0x61, 0x75, 0x2e, + 0x68, 0x30, 0x05, 0x97, 0xb9, 0x86, 0xac, 0xb9, 0xce, 0xb2, 0xbe, 0x6c, + 0xf7, 0x8e, 0xdf, 0xfb, 0xe1, 0xfc, 0xc1, 0x9c, 0xed, 0xf5, 0x95, 0x87, + 0xca, 0xc4, 0x77, 0xdd, 0x9c, 0x10, 0xb2, 0xfe, 0x96, 0x73, 0x8c, 0x35, + 0x96, 0x96, 0xc3, 0xd0, 0xf9, 0x1d, 0x42, 0x7b, 0x73, 0x97, 0xb1, 0xd9, + 0xe1, 0xae, 0x23, 0x85, 0xff, 0xb5, 0xe3, 0x1c, 0x7b, 0xff, 0x9d, 0xac, + 0xbe, 0xc3, 0xc7, 0x6b, 0x2f, 0x7b, 0x37, 0x56, 0x5f, 0xef, 0x36, 0x8b, + 0x3f, 0xc5, 0x97, 0xd2, 0x7f, 0xf1, 0x65, 0xbf, 0xb0, 0xfc, 0xfb, 0x1f, + 0x98, 0xca, 0x9d, 0x31, 0x10, 0x21, 0x94, 0x25, 0x6f, 0x0e, 0x37, 0xac, + 0xbf, 0x61, 0xb8, 0x52, 0x59, 0x74, 0x4c, 0xb2, 0xff, 0xe2, 0x83, 0x06, + 0x51, 0xd4, 0x98, 0x96, 0x56, 0x8f, 0x68, 0x85, 0xef, 0xc7, 0xcf, 0x3e, + 0xea, 0xca, 0xc3, 0xcb, 0x62, 0x1b, 0xf7, 0x5d, 0xb7, 0xf8, 0xb2, 0xff, + 0xd3, 0x4a, 0x35, 0x3e, 0xc3, 0x33, 0xcb, 0x2f, 0xf7, 0x9b, 0xc5, 0x19, + 0xa5, 0x97, 0xe8, 0xdf, 0xa1, 0x38, 0xb2, 0xb6, 0x22, 0x83, 0xb4, 0x4f, + 0x18, 0xd4, 0x23, 0xf5, 0xe1, 0x95, 0x50, 0xa9, 0x84, 0x66, 0x9a, 0x1e, + 0xf4, 0x33, 0x0a, 0x31, 0xdb, 0xfd, 0xec, 0xfe, 0x07, 0x53, 0xac, 0xbe, + 0x20, 0xbf, 0xd6, 0x5f, 0x75, 0xdb, 0x74, 0xb2, 0x8e, 0x7f, 0x40, 0x34, + 0xe1, 0x0d, 0xfe, 0x28, 0x94, 0xde, 0x89, 0xd6, 0x5d, 0xdb, 0x2c, 0xbf, + 0xe6, 0x29, 0xa3, 0xbd, 0x67, 0x4b, 0x29, 0xcf, 0x47, 0x82, 0xf4, 0x34, + 0x53, 0x7e, 0x10, 0xb7, 0xe1, 0x9a, 0x68, 0x7a, 0x59, 0x63, 0x5c, 0xf5, + 0x02, 0x51, 0x7f, 0xd1, 0xfc, 0xd7, 0x6e, 0xfd, 0xaa, 0x2f, 0x85, 0xfc, + 0xec, 0x38, 0xff, 0x16, 0x5f, 0xff, 0xef, 0xb6, 0x74, 0x3f, 0x07, 0x99, + 0xde, 0xcf, 0x36, 0x1d, 0x65, 0xfb, 0x35, 0x1d, 0x49, 0x65, 0xd0, 0x7e, + 0xd1, 0xfd, 0xe4, 0x6e, 0x16, 0x7d, 0x92, 0xff, 0x9c, 0xde, 0x37, 0x1b, + 0xaf, 0xac, 0xaf, 0x22, 0x0c, 0x92, 0x6f, 0xff, 0xc5, 0xde, 0xcf, 0x43, + 0x69, 0x8e, 0xdb, 0x70, 0x75, 0x97, 0x9f, 0x53, 0xaa, 0x2f, 0xf5, 0xff, + 0xd8, 0x40, 0x33, 0x3a, 0xff, 0xe0, 0xeb, 0x2f, 0xfc, 0x5f, 0xd6, 0x47, + 0x52, 0x63, 0xac, 0xbd, 0x93, 0xee, 0xac, 0xa8, 0x4d, 0x23, 0x08, 0xbb, + 0x59, 0xf1, 0x53, 0xa2, 0x91, 0xf5, 0xef, 0xb1, 0x8b, 0x2f, 0xe7, 0x9c, + 0x41, 0xbe, 0xe2, 0xca, 0xf9, 0xe7, 0x84, 0x76, 0xff, 0x6b, 0x59, 0x31, + 0xe3, 0x8b, 0x2f, 0xf9, 0xff, 0xc6, 0x2e, 0xa4, 0x75, 0x97, 0xfc, 0xda, + 0x9c, 0x20, 0x04, 0x7d, 0x65, 0xff, 0x46, 0x6b, 0x64, 0x9b, 0xa9, 0x2c, + 0xa9, 0x26, 0x09, 0x84, 0x40, 0x34, 0xe1, 0xcf, 0xce, 0xaf, 0xff, 0xf7, + 0x9f, 0x8d, 0x1c, 0xd9, 0xff, 0x61, 0xf3, 0xb7, 0xd2, 0xcb, 0xa3, 0x75, + 0x65, 0xf7, 0x38, 0xe7, 0x59, 0x5e, 0x44, 0xe8, 0x18, 0xbe, 0x33, 0x7f, + 0xba, 0xf8, 0x9e, 0xf6, 0x6e, 0x2c, 0xbf, 0x63, 0x4f, 0x06, 0xac, 0xac, + 0x3e, 0x1f, 0x1c, 0xdf, 0x81, 0xcd, 0xb8, 0xfa, 0xcb, 0xec, 0xd0, 0x93, + 0x2c, 0xa9, 0xcf, 0xc3, 0x08, 0x74, 0x57, 0x7d, 0x38, 0xda, 0x65, 0x97, + 0xdd, 0x4b, 0xee, 0xb2, 0xff, 0xf7, 0x7e, 0x62, 0xcd, 0xef, 0x2e, 0x30, + 0xd6, 0x5f, 0xe9, 0x16, 0x1c, 0xef, 0x25, 0x97, 0xcd, 0xdb, 0x0d, 0x65, + 0xda, 0x86, 0x3d, 0x4f, 0x99, 0x50, 0xd1, 0x97, 0xa8, 0x4f, 0xdf, 0xdc, + 0xf9, 0x46, 0x74, 0xb2, 0xa1, 0x36, 0x7c, 0x24, 0x78, 0x77, 0x04, 0xa2, + 0xff, 0xf6, 0x73, 0xce, 0xdf, 0x83, 0x93, 0x9a, 0xb2, 0xfc, 0x0e, 0x7f, + 0x3c, 0xb2, 0xf8, 0x7e, 0x8e, 0x96, 0x5f, 0x67, 0xa5, 0x8b, 0x2c, 0x63, + 0x1e, 0x27, 0xc8, 0xed, 0x8b, 0x2a, 0x11, 0x48, 0xed, 0x9f, 0x28, 0xa8, + 0x55, 0xe1, 0x28, 0xe5, 0xb1, 0x00, 0xa1, 0xd9, 0x7f, 0xe0, 0x1d, 0xb3, + 0xaf, 0x8e, 0x06, 0xb2, 0xfe, 0xd8, 0x3c, 0xc0, 0x71, 0x65, 0xff, 0xfb, + 0xf9, 0xa9, 0xdb, 0x8d, 0xbf, 0xcd, 0x9d, 0x7d, 0x65, 0x1d, 0x10, 0xe4, + 0x5f, 0x7f, 0x8b, 0xfc, 0x08, 0xfc, 0xcb, 0x2a, 0x0f, 0x57, 0x08, 0xae, + 0x7e, 0x96, 0x5f, 0x6c, 0x30, 0xbe, 0xb2, 0xee, 0x61, 0xcd, 0xe1, 0x0b, + 0xde, 0x3e, 0xa7, 0x59, 0x58, 0x79, 0x2c, 0x57, 0x7f, 0xef, 0xc7, 0x39, + 0x0d, 0x3b, 0xfd, 0x65, 0xff, 0x36, 0x10, 0xcd, 0x6c, 0xd2, 0xca, 0x85, + 0x4a, 0xad, 0x18, 0xde, 0xa1, 0x4b, 0xf2, 0x0d, 0xd3, 0xeb, 0xfe, 0xe6, + 0x4f, 0xc6, 0x27, 0x9d, 0x65, 0xff, 0xb3, 0xa9, 0x31, 0x1e, 0x07, 0x0b, + 0x2e, 0xce, 0x96, 0x56, 0x22, 0x35, 0x8e, 0x7e, 0x7b, 0x7f, 0x3e, 0xba, + 0x96, 0x7d, 0x65, 0xff, 0xbf, 0xc6, 0xd7, 0xc8, 0x2f, 0x25, 0x97, 0xff, + 0xe6, 0xe6, 0x0f, 0xd9, 0xf6, 0xce, 0x4f, 0x86, 0x2c, 0xbf, 0xfe, 0x2f, + 0xf7, 0xe6, 0x33, 0x85, 0x80, 0x0f, 0x16, 0x5f, 0xb1, 0xb6, 0xd8, 0x6b, + 0x2f, 0xfe, 0x8d, 0xbc, 0x09, 0x66, 0x6f, 0x8e, 0x96, 0x54, 0x23, 0x04, + 0x6a, 0x27, 0x29, 0xbf, 0xf4, 0x66, 0xb3, 0x40, 0x3b, 0x71, 0x65, 0xf7, + 0xf8, 0x0e, 0xd6, 0x5e, 0x7e, 0xb7, 0x56, 0x5f, 0xcf, 0xfe, 0x46, 0x4e, + 0xb2, 0xa1, 0x52, 0xfe, 0x17, 0x76, 0x7c, 0xd1, 0x8b, 0x11, 0x78, 0x4f, + 0x77, 0x92, 0x18, 0x41, 0x7e, 0x03, 0xf5, 0x2c, 0x59, 0x7f, 0x75, 0xc6, + 0x2e, 0xa4, 0xb2, 0xfe, 0x2f, 0xe4, 0xd1, 0xb8, 0xb2, 0xa0, 0xf7, 0xf0, + 0xbe, 0xff, 0xec, 0x00, 0xdd, 0xfb, 0xf1, 0xe0, 0x6b, 0x2a, 0x11, 0xd6, + 0x78, 0x43, 0x80, 0x82, 0xff, 0x83, 0x07, 0xe6, 0x1e, 0x37, 0x16, 0x5f, + 0xfb, 0x53, 0xe0, 0xf3, 0xde, 0xcd, 0xc5, 0x96, 0x35, 0x65, 0xfe, 0xff, + 0x04, 0xdf, 0x19, 0xd2, 0xca, 0x83, 0xc9, 0x21, 0x2b, 0xff, 0x6b, 0x87, + 0x13, 0x34, 0xd1, 0x32, 0xca, 0xc3, 0xe0, 0x09, 0x05, 0xf9, 0xca, 0x7e, + 0x0d, 0x65, 0x62, 0x66, 0x9c, 0x87, 0x59, 0x84, 0x37, 0xdf, 0xf6, 0x12, + 0xcb, 0xfb, 0x8f, 0x22, 0x83, 0xac, 0xbc, 0x51, 0xb8, 0xb2, 0xff, 0xfa, + 0x51, 0xa9, 0xfe, 0xc6, 0xf3, 0x8e, 0x52, 0x59, 0x7f, 0x4f, 0xcc, 0x3c, + 0x6e, 0x2c, 0xa9, 0x91, 0x04, 0x22, 0x8d, 0x62, 0x62, 0x5a, 0x21, 0xe1, + 0x61, 0x90, 0xa0, 0xbc, 0xde, 0x65, 0x97, 0xef, 0x0f, 0xf9, 0xbd, 0x65, + 0xc3, 0x92, 0xcb, 0xfd, 0x83, 0x0f, 0xf9, 0x21, 0x5a, 0xcb, 0xb2, 0x4b, + 0x2b, 0xc7, 0x9c, 0x47, 0x16, 0x94, 0x22, 0xc3, 0x45, 0x5f, 0x65, 0xbe, + 0x3f, 0xda, 0x75, 0x95, 0x87, 0xb0, 0xc6, 0xb7, 0xff, 0x6f, 0xf9, 0xb0, + 0x52, 0xcf, 0x31, 0xd6, 0x5d, 0x3f, 0xd6, 0x5f, 0xed, 0xfe, 0x79, 0x46, + 0x12, 0xca, 0x83, 0xcb, 0xc1, 0x8b, 0xe9, 0x3e, 0xa4, 0xb2, 0xff, 0xf4, + 0x69, 0xfe, 0x1f, 0xb7, 0xf9, 0xe6, 0x59, 0x69, 0x4c, 0x7d, 0x7e, 0x22, + 0xbf, 0xb0, 0xc1, 0x3c, 0xff, 0x59, 0x7f, 0x48, 0xff, 0x20, 0xcc, 0xb2, + 0xff, 0xf8, 0x49, 0x46, 0xf6, 0x20, 0x69, 0xa0, 0xf8, 0x92, 0xb4, 0x7f, + 0xff, 0x2f, 0xbe, 0xf0, 0x9d, 0x7d, 0x65, 0xfb, 0x0f, 0x8d, 0xbd, 0x65, + 0xe9, 0xe6, 0xdc, 0x59, 0x63, 0x16, 0x54, 0x26, 0xf5, 0x39, 0x4e, 0x42, + 0xbb, 0xb2, 0x26, 0x25, 0x09, 0x46, 0xd9, 0x15, 0xdf, 0xc5, 0x97, 0xed, + 0x34, 0xee, 0x75, 0x4c, 0x26, 0xbe, 0xf8, 0x61, 0xd5, 0x30, 0x9a, 0xe0, + 0x42, 0xa8, 0x13, 0x5f, 0xe2, 0x73, 0x7f, 0x1a, 0x02, 0xa8, 0x13, 0x5f, + 0xee, 0x67, 0x9b, 0x81, 0x9d, 0x53, 0x09, 0xae, 0xc1, 0xaa, 0x61, 0x35, + 0xc6, 0x18, 0xb9, 0x84, 0xd5, 0x89, 0xa8, 0x74, 0x6a, 0xc5, 0xc7, 0x23, + 0xe2, 0x06, 0xf4, 0x13, 0x08, 0xed, 0xf4, 0xcc, 0x26, 0x0b, 0x3e, 0x7a, + 0xe9, 0x3f, 0xf3, 0x23, 0xcd, 0xbe, 0xc1, 0x84, 0x96, 0x53, 0x1e, 0x6b, + 0x96, 0x5f, 0xff, 0x80, 0x77, 0x97, 0x3d, 0x1b, 0xf0, 0x41, 0xbc, 0x96, + 0x54, 0x2f, 0xa6, 0x32, 0x1f, 0xa3, 0x23, 0x72, 0x02, 0x84, 0x8f, 0x25, + 0x02, 0xfe, 0x55, 0xc0, 0x48, 0x2f, 0xff, 0xb0, 0xcf, 0x3b, 0x7e, 0x3e, + 0x10, 0x61, 0x2c, 0xbf, 0xf4, 0x89, 0xcd, 0x9a, 0x4d, 0xa9, 0x2c, 0xbf, + 0xe7, 0x34, 0xb2, 0x69, 0x47, 0x4b, 0x2b, 0x47, 0xf4, 0x48, 0x17, 0xff, + 0xf1, 0x0f, 0x0a, 0x0c, 0xf9, 0xaf, 0xcc, 0xc2, 0x35, 0x65, 0xf3, 0xef, + 0xc3, 0x16, 0x5b, 0x6a, 0x59, 0x7f, 0xfc, 0xf2, 0xf4, 0x43, 0x7f, 0x8c, + 0x5d, 0x49, 0x65, 0x48, 0xf9, 0x3c, 0x2d, 0x7a, 0x68, 0xe2, 0xcb, 0xc4, + 0x03, 0xac, 0xbf, 0xe8, 0x0f, 0xc9, 0xb7, 0x88, 0x75, 0x97, 0xfd, 0x9f, + 0x6c, 0xe4, 0xf8, 0x62, 0xcb, 0xa0, 0xeb, 0x2e, 0xce, 0x42, 0x30, 0xf0, + 0x77, 0x43, 0x9e, 0x3b, 0xdb, 0x39, 0xbf, 0xfc, 0xf2, 0xf4, 0x6f, 0x10, + 0xee, 0xfa, 0xed, 0x65, 0x42, 0xb5, 0x3c, 0x86, 0x43, 0x10, 0xe9, 0x69, + 0xe1, 0x10, 0x50, 0xe5, 0x0a, 0xb5, 0xfe, 0x6d, 0xfb, 0x3c, 0xfc, 0xdc, + 0x59, 0x7f, 0x7c, 0x2f, 0xce, 0x7d, 0x65, 0xfb, 0x91, 0x80, 0x85, 0x97, + 0xc0, 0xf1, 0x67, 0x47, 0xa9, 0xf2, 0xeb, 0xfe, 0xf4, 0x08, 0x7c, 0xde, + 0xdd, 0xac, 0xac, 0x4c, 0x0d, 0xe1, 0x1d, 0xc3, 0x9b, 0xcd, 0xa3, 0x56, + 0x5d, 0xa0, 0x2c, 0xac, 0x36, 0x8c, 0x3b, 0x74, 0xfa, 0x59, 0x70, 0x26, + 0x59, 0x7f, 0xf1, 0xe6, 0x93, 0x94, 0xe3, 0x82, 0x9d, 0x65, 0x41, 0xfb, + 0x0c, 0x63, 0x06, 0x2f, 0x67, 0x24, 0xb2, 0xf9, 0xbc, 0xe7, 0x59, 0x7d, + 0xa8, 0xe4, 0xeb, 0x2b, 0x47, 0xc1, 0xf1, 0xc1, 0x08, 0x6a, 0x1d, 0x4f, + 0x8c, 0xf2, 0x85, 0x07, 0x2f, 0x0b, 0x21, 0x9e, 0x6c, 0x65, 0x3d, 0xca, + 0xf1, 0xea, 0x3a, 0x86, 0x87, 0x3c, 0xd2, 0xfc, 0x75, 0x2a, 0x70, 0xf0, + 0xe5, 0xf4, 0xa8, 0xd0, 0x46, 0xc8, 0x46, 0x9c, 0x8d, 0xbf, 0xf4, 0x89, + 0x4d, 0xf2, 0xf7, 0x0c, 0x8d, 0xcf, 0x6d, 0xa0, 0x48, 0x4a, 0xee, 0xc2, + 0x36, 0xfa, 0x73, 0xff, 0x8b, 0x2e, 0xc2, 0x59, 0x77, 0xf8, 0xb2, 0xa0, + 0xd6, 0x10, 0xad, 0xff, 0xd9, 0xec, 0xff, 0x5d, 0xb6, 0xbd, 0x8b, 0x2e, + 0xce, 0x2c, 0xa9, 0x1f, 0xd0, 0xc7, 0xc0, 0x8b, 0x7f, 0x4a, 0x69, 0x41, + 0x7d, 0x65, 0xfd, 0x92, 0x20, 0xbf, 0x16, 0x5f, 0x75, 0xc6, 0x85, 0x97, + 0xfb, 0x0b, 0x77, 0xec, 0x46, 0xac, 0xae, 0x91, 0x63, 0xa2, 0xef, 0x16, + 0x00, 0x8a, 0xfb, 0x34, 0xc6, 0xac, 0xbc, 0x64, 0xe7, 0x59, 0x7f, 0xfd, + 0xbf, 0x59, 0x3e, 0xc0, 0xc6, 0x7e, 0x3a, 0x92, 0xcb, 0xfe, 0xf4, 0x1c, + 0x9e, 0x59, 0xe5, 0x95, 0x09, 0x85, 0x8c, 0xfb, 0x08, 0x9c, 0x7f, 0x8a, + 0xb7, 0xf7, 0xa0, 0x42, 0xe8, 0x0b, 0x2e, 0xcd, 0xd5, 0x97, 0x09, 0xc5, + 0x97, 0xef, 0x99, 0x85, 0x3a, 0xcb, 0x47, 0x8f, 0x04, 0x86, 0x2b, 0x68, + 0x44, 0x04, 0x96, 0xaf, 0x66, 0x18, 0xb2, 0xe6, 0x35, 0x65, 0x4e, 0x6c, + 0xd8, 0x72, 0xfd, 0xfc, 0x99, 0x8e, 0xb2, 0xfd, 0x1d, 0x00, 0x10, 0xb2, + 0xa0, 0xf4, 0x08, 0xa2, 0xfd, 0x1b, 0xe0, 0xbe, 0xb2, 0xfc, 0xdb, 0xfe, + 0xd3, 0xac, 0xbf, 0x7f, 0xd1, 0xa9, 0x2c, 0xbf, 0xf6, 0x1e, 0x0a, 0x00, + 0x77, 0x92, 0xcb, 0xff, 0x1c, 0x98, 0xd8, 0xff, 0x1b, 0x4b, 0x2f, 0xa5, + 0xfc, 0xed, 0x65, 0x61, 0xf0, 0xb9, 0xf5, 0xc5, 0x0b, 0x2f, 0xfb, 0xcf, + 0x28, 0x98, 0xa0, 0xeb, 0x2f, 0xe1, 0xbf, 0xfc, 0xc6, 0x2c, 0xbf, 0x16, + 0x09, 0x93, 0x2c, 0xbf, 0xff, 0x67, 0x60, 0x83, 0xe7, 0xdb, 0x99, 0x84, + 0x6a, 0xcb, 0xf8, 0xed, 0x07, 0x72, 0x59, 0x5e, 0x3f, 0xf0, 0x2a, 0x5f, + 0xfc, 0xc7, 0x18, 0x5f, 0x52, 0xce, 0xbe, 0xb2, 0xc5, 0x87, 0xcf, 0xd9, + 0x15, 0xff, 0x9c, 0x81, 0xd7, 0xf5, 0x18, 0x62, 0xcb, 0xff, 0x73, 0xcd, + 0xb3, 0xa9, 0x46, 0x4e, 0xb2, 0xff, 0x60, 0xf5, 0xa6, 0x9b, 0x8b, 0x2e, + 0xd9, 0xba, 0xb2, 0xd9, 0xb8, 0x8d, 0x10, 0x1f, 0xfd, 0x0b, 0x79, 0xa5, + 0xec, 0x1e, 0xda, 0xcb, 0xfe, 0xf3, 0x9f, 0xcd, 0x1d, 0x49, 0x65, 0xfe, + 0xc3, 0x8d, 0x80, 0x19, 0x2c, 0xbe, 0xf3, 0xb9, 0xd6, 0x5f, 0x3f, 0xbc, + 0xcb, 0x28, 0x8f, 0x0b, 0x79, 0x0d, 0xf8, 0xa5, 0xb6, 0xf3, 0xac, 0xa8, + 0x3c, 0xe1, 0x08, 0xea, 0x15, 0x3e, 0x4a, 0x1f, 0x06, 0xa3, 0xb0, 0xff, + 0x8e, 0x41, 0x0c, 0x3b, 0xff, 0xfc, 0xdb, 0xc8, 0x3c, 0xd8, 0x21, 0x40, + 0xfc, 0xf2, 0xce, 0x2c, 0xb8, 0xd6, 0x59, 0x53, 0xaf, 0x1c, 0x8c, 0x83, + 0xb2, 0x8e, 0x8a, 0xb7, 0x0a, 0x35, 0x09, 0xd3, 0x90, 0x78, 0x55, 0xce, + 0x08, 0xbb, 0xf2, 0xe2, 0xb7, 0xb1, 0x6d, 0xb2, 0x5f, 0xef, 0x75, 0x2e, + 0x7b, 0x27, 0x59, 0x7f, 0xcf, 0xe9, 0x98, 0xbd, 0x9d, 0x2c, 0xa8, 0x3e, + 0xfc, 0x36, 0xbc, 0x1e, 0xa7, 0x59, 0x7e, 0x9a, 0x51, 0xfe, 0x2c, 0xbb, + 0x80, 0x59, 0x5e, 0x3d, 0xf0, 0x0f, 0xed, 0x94, 0xdf, 0xff, 0xff, 0x7b, + 0x08, 0x18, 0x5f, 0xf6, 0x7a, 0x32, 0x66, 0xd4, 0xde, 0x6e, 0xbe, 0xb2, + 0xfe, 0xd3, 0x77, 0xec, 0x99, 0x65, 0xff, 0xf1, 0x64, 0xce, 0x0c, 0xfc, + 0x6f, 0x62, 0x02, 0xca, 0x39, 0xff, 0x7c, 0xbe, 0xb1, 0x31, 0xd7, 0x87, + 0xdd, 0xf1, 0x46, 0x18, 0xb2, 0xf7, 0x5c, 0x75, 0x97, 0xdc, 0x8d, 0x42, + 0xca, 0x83, 0x7d, 0xf1, 0xda, 0x87, 0x77, 0xa1, 0x3c, 0x2e, 0x24, 0x72, + 0x38, 0x5b, 0xe5, 0xaa, 0x2e, 0xee, 0x39, 0xce, 0xa1, 0x94, 0xd1, 0xf5, + 0xee, 0x24, 0x4d, 0x0a, 0xfd, 0x2d, 0xbc, 0xf5, 0x51, 0x46, 0x73, 0xf7, + 0xf0, 0xc6, 0x9f, 0xbc, 0x9c, 0x45, 0xfb, 0xdc, 0xe7, 0x16, 0x5f, 0xff, + 0x31, 0x61, 0xe0, 0x42, 0x0c, 0x8b, 0x0e, 0xb2, 0xfc, 0x41, 0x96, 0x71, + 0x65, 0xff, 0x60, 0xfd, 0x1f, 0xf4, 0x71, 0x65, 0xc3, 0x6c, 0x3d, 0xf2, + 0x27, 0xbf, 0xfc, 0xd1, 0xff, 0x05, 0xcf, 0x34, 0xa2, 0x75, 0x97, 0xf1, + 0x66, 0xb5, 0x9d, 0x2c, 0xaf, 0x1f, 0xc7, 0x12, 0xef, 0xfb, 0x5a, 0x8e, + 0xfd, 0xd3, 0xee, 0x2c, 0xbc, 0x51, 0xc5, 0x97, 0xd8, 0x58, 0x75, 0x94, + 0xb2, 0xa0, 0xf1, 0xa4, 0x36, 0x12, 0x0b, 0xfb, 0xb0, 0xb8, 0xcf, 0x0b, + 0x2f, 0xfb, 0xcd, 0x2f, 0x3c, 0x98, 0xeb, 0x2f, 0x8a, 0x05, 0x56, 0xd2, + 0x59, 0x7f, 0xee, 0x31, 0x75, 0x2f, 0xb7, 0x19, 0x65, 0x62, 0x28, 0xdc, + 0xe3, 0xe5, 0xb7, 0xcc, 0x4d, 0x32, 0xcb, 0xf7, 0xfd, 0x01, 0x15, 0xac, + 0xbb, 0xce, 0xb2, 0x9c, 0xf0, 0xbe, 0x59, 0x7f, 0xe6, 0x3e, 0x0f, 0xcd, + 0xc2, 0xc5, 0x97, 0xc7, 0x81, 0xc2, 0xca, 0x23, 0xdd, 0xe1, 0xe5, 0x49, + 0x70, 0x93, 0x21, 0x59, 0xdc, 0x28, 0xd8, 0x8a, 0x68, 0x42, 0x68, 0xb8, + 0xf0, 0xd1, 0xf1, 0x71, 0x31, 0xfd, 0xfa, 0xfb, 0xd8, 0x07, 0x59, 0x7c, + 0x51, 0xa9, 0x2c, 0xbf, 0xef, 0x44, 0x98, 0x88, 0x3d, 0x2c, 0xbf, 0xe8, + 0x93, 0x7e, 0x50, 0x40, 0x59, 0x7f, 0xd1, 0x9f, 0x10, 0x00, 0x8e, 0x96, + 0x5e, 0xc2, 0x35, 0x65, 0xb5, 0x08, 0xe6, 0xc2, 0x1d, 0x1c, 0x1c, 0xdc, + 0x56, 0x75, 0x62, 0x59, 0x7f, 0xd1, 0xb8, 0x4f, 0xf9, 0x36, 0xf5, 0x97, + 0xbd, 0x03, 0x59, 0x7f, 0x14, 0x77, 0xa8, 0x92, 0xcb, 0xff, 0xce, 0xdf, + 0x90, 0x4b, 0xfc, 0xf3, 0xc9, 0x60, 0x86, 0xb6, 0xe8, 0xf2, 0xca, 0x64, + 0x5c, 0xf9, 0x27, 0x7a, 0xd5, 0xff, 0xb8, 0x27, 0xd8, 0x83, 0x2c, 0xe2, + 0xcb, 0x87, 0xc5, 0x95, 0x24, 0xdf, 0x37, 0x21, 0xeb, 0xe3, 0x12, 0x3f, + 0xbf, 0xff, 0xb3, 0xac, 0xe3, 0x97, 0x9a, 0x3f, 0xe0, 0xb9, 0xd6, 0x56, + 0xc5, 0x70, 0x71, 0x18, 0x3b, 0x29, 0x3c, 0x71, 0x84, 0x8b, 0x78, 0xed, + 0x8b, 0x2f, 0x71, 0xfb, 0x59, 0x6c, 0x59, 0x7e, 0x09, 0xdb, 0xd0, 0xb2, + 0xfd, 0x9a, 0xee, 0x31, 0x65, 0x4e, 0x7b, 0xc4, 0x20, 0x21, 0x3d, 0xff, + 0x61, 0xf3, 0x4d, 0x3b, 0x9d, 0x65, 0xff, 0x41, 0x77, 0xb1, 0xb5, 0x9d, + 0xac, 0xbf, 0xfd, 0xb3, 0xfe, 0xc3, 0xe7, 0x71, 0xe8, 0x3a, 0xcb, 0xce, + 0x7e, 0x2c, 0xac, 0x3e, 0x87, 0x4c, 0xa0, 0x23, 0x0f, 0xf0, 0xa3, 0xbb, + 0x27, 0x59, 0x7f, 0xf4, 0x78, 0x41, 0xeb, 0x59, 0xff, 0x32, 0xcb, 0xfe, + 0x28, 0xeb, 0x6c, 0xdf, 0xe7, 0x96, 0x5d, 0xfd, 0xb5, 0x96, 0x73, 0x9e, + 0xb9, 0x1e, 0xde, 0xdb, 0x60, 0x2c, 0xbf, 0xfe, 0x2f, 0xbb, 0xf8, 0xa3, + 0xfc, 0x33, 0x3c, 0xb2, 0x98, 0xfb, 0x5c, 0x7e, 0xff, 0xd8, 0x7c, 0xdd, + 0xcc, 0x08, 0xaf, 0x8b, 0x2f, 0xe1, 0x06, 0xfa, 0xc3, 0xac, 0xbe, 0xdf, + 0x05, 0x25, 0x96, 0xd6, 0xc3, 0xd1, 0xc2, 0xea, 0xfa, 0x2f, 0x84, 0x84, + 0xad, 0xff, 0xc7, 0xe3, 0xcb, 0x51, 0xc8, 0x29, 0xd6, 0x5f, 0xf4, 0x7f, + 0xd8, 0x7c, 0xd6, 0x2c, 0xbf, 0x7f, 0xcd, 0x1c, 0x59, 0x7a, 0x77, 0x2d, + 0x1e, 0xf7, 0x0d, 0xef, 0xff, 0xe6, 0xfc, 0x7f, 0x85, 0x9e, 0x68, 0xff, + 0x9e, 0x4b, 0x2f, 0xfa, 0x01, 0xc1, 0x85, 0xf5, 0x25, 0x97, 0xb5, 0xce, + 0x2e, 0x20, 0x35, 0xf7, 0x6e, 0xfd, 0xaa, 0x20, 0x30, 0xb3, 0x55, 0x6c, + 0x92, 0x29, 0x74, 0xc7, 0x7f, 0xc7, 0x7e, 0x9e, 0x5c, 0x69, 0x2c, 0xbf, + 0xe8, 0xf7, 0x6d, 0xc7, 0x69, 0xd6, 0x5a, 0x36, 0x22, 0x6b, 0x0a, 0x34, + 0x73, 0x78, 0xef, 0x25, 0x95, 0xe3, 0xd2, 0x01, 0xb5, 0xc5, 0x8b, 0x2e, + 0x70, 0x2c, 0xa8, 0x3c, 0xd2, 0x22, 0xf8, 0xad, 0xbb, 0x59, 0x5a, 0x37, + 0xe4, 0x5b, 0x58, 0xad, 0xa9, 0xe1, 0x45, 0xc3, 0x31, 0x25, 0x3a, 0xd0, + 0xd7, 0xc9, 0x3a, 0x87, 0xde, 0x8a, 0x0e, 0x2f, 0xe8, 0x4e, 0x02, 0x12, + 0x65, 0x0d, 0xef, 0xcb, 0x93, 0xbe, 0x1f, 0xa3, 0x6d, 0x65, 0xff, 0xe3, + 0xbf, 0xf8, 0x19, 0x79, 0xd8, 0x9d, 0x65, 0xff, 0xfc, 0xc3, 0x2c, 0xe4, + 0x6b, 0x67, 0x3c, 0xe3, 0x81, 0xac, 0xbd, 0xbe, 0x3c, 0xb2, 0xa1, 0x92, + 0xbf, 0x21, 0xbc, 0x7b, 0x69, 0xf5, 0x47, 0x84, 0x78, 0x09, 0x78, 0x90, + 0x22, 0xdd, 0xf9, 0xbe, 0xfb, 0x78, 0xb2, 0xfd, 0x9a, 0x90, 0x92, 0x59, + 0x7f, 0xa7, 0xe4, 0x1d, 0xfa, 0xfa, 0xca, 0x9c, 0xf7, 0x88, 0xa6, 0xe7, + 0xe9, 0x65, 0xfc, 0xdb, 0xdd, 0xcb, 0xb5, 0x97, 0xbc, 0xfb, 0x8b, 0x2f, + 0xa0, 0x1b, 0x78, 0xb2, 0xf8, 0xe7, 0x7f, 0xac, 0xa9, 0x26, 0xa7, 0x90, + 0x87, 0x39, 0x17, 0x85, 0xc0, 0x5d, 0xf1, 0xf1, 0x09, 0x2f, 0xec, 0xdd, + 0x77, 0xf7, 0x16, 0x5f, 0xfd, 0x9c, 0xfb, 0xf4, 0x26, 0xec, 0x14, 0x96, + 0x5b, 0x16, 0x5f, 0xfd, 0x84, 0xf2, 0xf3, 0x9c, 0xef, 0x25, 0x96, 0x9b, + 0x68, 0x3d, 0x21, 0x40, 0x85, 0xff, 0xfe, 0x60, 0xcf, 0x33, 0xbc, 0xff, + 0xc9, 0x8a, 0x0f, 0xe7, 0x59, 0x7f, 0x4e, 0x36, 0xd4, 0x6f, 0x59, 0x7f, + 0xfe, 0xe6, 0xcc, 0x1e, 0xce, 0x66, 0x80, 0x7c, 0xdb, 0xc5, 0x94, 0x48, + 0x8c, 0xf9, 0x85, 0xfe, 0x23, 0x5f, 0xbf, 0x34, 0xeb, 0x2f, 0x7c, 0x01, + 0x59, 0x4c, 0x7a, 0x44, 0x6b, 0x7e, 0x3e, 0xd7, 0xb5, 0xed, 0x7b, 0x52, + 0xcb, 0xff, 0xfa, 0x59, 0xc6, 0xd6, 0x98, 0xe2, 0x7f, 0xd8, 0x67, 0xd6, + 0x54, 0x26, 0x5d, 0x8e, 0x8c, 0x40, 0xe7, 0xb7, 0xff, 0xde, 0x76, 0xfc, + 0x34, 0xb0, 0x80, 0x08, 0x59, 0x79, 0xfd, 0x0b, 0x2e, 0xc0, 0x2c, 0xb4, + 0xfe, 0x36, 0x26, 0x0d, 0xdf, 0xf7, 0xa3, 0x9f, 0xe6, 0x04, 0x56, 0xb2, + 0xff, 0xd0, 0xde, 0xf6, 0x7f, 0xd9, 0x25, 0x97, 0xfb, 0x0a, 0x59, 0xc1, + 0x0e, 0xb2, 0xec, 0x21, 0xa2, 0xb7, 0x47, 0xbf, 0x3d, 0xa9, 0x93, 0x8d, + 0x77, 0xd3, 0x21, 0xad, 0x7f, 0xfa, 0x59, 0xd4, 0x84, 0x80, 0x0b, 0x30, + 0xc3, 0x12, 0x5f, 0x8e, 0x66, 0x36, 0xf5, 0x97, 0x61, 0x4c, 0x7f, 0x82, + 0x29, 0x5f, 0xff, 0x73, 0x9e, 0x0f, 0x71, 0x26, 0xd0, 0x30, 0x96, 0x54, + 0x8f, 0xf8, 0xc2, 0xea, 0x84, 0xd5, 0x1e, 0x33, 0x1b, 0xff, 0xed, 0x48, + 0x7e, 0x8e, 0x16, 0x18, 0xfa, 0x35, 0x65, 0xe0, 0x07, 0x8b, 0x2f, 0xd9, + 0x85, 0x12, 0x59, 0x6e, 0x41, 0xe1, 0x10, 0xed, 0x3a, 0x2e, 0x7f, 0x09, + 0x3a, 0x85, 0xfa, 0x41, 0xb5, 0x61, 0x7b, 0x42, 0x6b, 0x46, 0x5e, 0x94, + 0x38, 0x52, 0xc6, 0xc3, 0x0e, 0x1b, 0xfe, 0x62, 0x97, 0x05, 0x56, 0xd5, + 0xb5, 0xed, 0x4b, 0x2f, 0x09, 0xa3, 0x56, 0x5f, 0x4d, 0xcc, 0x99, 0x65, + 0xf8, 0x11, 0xfc, 0xdc, 0x59, 0x7f, 0xc3, 0xdb, 0x63, 0x4d, 0x82, 0xfa, + 0xcb, 0xfb, 0x9a, 0xd3, 0x4d, 0xc5, 0x97, 0xfa, 0x33, 0x5d, 0xbb, 0xf6, + 0xa8, 0x82, 0x57, 0xfd, 0x1f, 0xcd, 0x76, 0xef, 0xda, 0xa2, 0xf9, 0x5f, + 0x9c, 0x7e, 0x83, 0x56, 0x5f, 0xff, 0xf6, 0x36, 0xb0, 0x7e, 0x8e, 0xa5, + 0xa8, 0xff, 0x04, 0x29, 0x2c, 0xbf, 0xf1, 0x67, 0xfe, 0xdc, 0xfe, 0x01, + 0x65, 0xd9, 0xc1, 0x4a, 0x70, 0x23, 0x2f, 0xed, 0x00, 0xe8, 0xc4, 0x51, + 0xc6, 0x7a, 0xc5, 0x44, 0xa5, 0x1d, 0xf5, 0x12, 0xa7, 0x8d, 0xf2, 0x93, + 0xef, 0xfe, 0x8f, 0x31, 0xb9, 0xa9, 0xce, 0x1e, 0x96, 0x5f, 0xf0, 0xf5, + 0x87, 0xc9, 0x38, 0xd6, 0x5f, 0xff, 0x82, 0xfc, 0xc2, 0xef, 0xcc, 0x3f, + 0x67, 0x5b, 0xab, 0x2a, 0x15, 0xe0, 0x60, 0xfb, 0x4a, 0x9c, 0xf1, 0x6b, + 0xa3, 0x91, 0xc5, 0xfa, 0x35, 0x83, 0x85, 0x97, 0xe9, 0x60, 0x04, 0xfa, + 0xcb, 0xfb, 0xdb, 0x7e, 0x6e, 0xfc, 0xb2, 0x99, 0x10, 0x2e, 0x4c, 0x12, + 0x9b, 0xf0, 0x22, 0x5c, 0xc5, 0x97, 0xff, 0xdd, 0xfa, 0x35, 0x9c, 0x20, + 0xbc, 0x8d, 0x75, 0x97, 0xff, 0xe7, 0xdf, 0xb3, 0x9e, 0x76, 0xfc, 0x7f, + 0xd9, 0xf5, 0x94, 0x14, 0x54, 0x08, 0xa1, 0x7f, 0xe7, 0x9f, 0xd1, 0x3e, + 0x7f, 0x98, 0xb2, 0xa0, 0xf8, 0xc8, 0x92, 0xff, 0xbf, 0x07, 0xf6, 0x6f, + 0xce, 0x2c, 0xbf, 0xe8, 0x3f, 0x21, 0xa7, 0x7f, 0xac, 0xa9, 0x1f, 0x97, + 0xce, 0xaf, 0xfd, 0x3b, 0xf5, 0xb7, 0x9f, 0x27, 0xde, 0xb2, 0xff, 0xfb, + 0x3f, 0x05, 0xfe, 0x66, 0x1a, 0x6b, 0xc9, 0x65, 0xfc, 0x6e, 0x7f, 0xf8, + 0x35, 0x97, 0xfe, 0xc1, 0xc4, 0xa3, 0xd8, 0x07, 0x59, 0x7f, 0x3c, 0x83, + 0x27, 0x1a, 0xcb, 0xff, 0xfe, 0xf0, 0x5e, 0x7d, 0x47, 0x9d, 0xb9, 0xcc, + 0x35, 0xc8, 0x0b, 0x2f, 0xcd, 0x3f, 0x38, 0xeb, 0x28, 0x68, 0x8e, 0xf3, + 0x35, 0xff, 0xf7, 0xf9, 0xc8, 0xc2, 0x1f, 0xa3, 0xd1, 0xc5, 0x97, 0x8c, + 0x30, 0xc4, 0x97, 0xef, 0x67, 0x6f, 0xa4, 0x82, 0xcd, 0x05, 0xff, 0xfe, + 0x9b, 0x51, 0xbf, 0x61, 0xaf, 0xb0, 0x49, 0xb9, 0xb3, 0x3a, 0xfa, 0xca, + 0x84, 0xce, 0x9c, 0x8f, 0xed, 0xc2, 0x1d, 0x5f, 0xf7, 0x98, 0xcf, 0xcd, + 0xa8, 0xfa, 0xcb, 0xff, 0x37, 0xc3, 0x9f, 0x73, 0xe1, 0x2c, 0xa9, 0x1f, + 0xbe, 0x8e, 0xef, 0xfa, 0x01, 0xfc, 0x29, 0x67, 0x16, 0x5f, 0xf6, 0x01, + 0xc8, 0x12, 0x36, 0x4b, 0x29, 0x91, 0x25, 0xe2, 0x22, 0x37, 0xa9, 0xd7, + 0x19, 0xbb, 0x44, 0xd2, 0x79, 0xcb, 0x80, 0x78, 0x51, 0xfa, 0xfe, 0x34, + 0x6b, 0x9f, 0xeb, 0x2f, 0x73, 0x27, 0x59, 0x71, 0x4e, 0x03, 0x67, 0xf1, + 0x6a, 0x59, 0x50, 0x6e, 0x0e, 0x5b, 0x4b, 0x29, 0x65, 0xb8, 0x61, 0x6d, + 0xba, 0x17, 0x7e, 0x76, 0x9c, 0x9d, 0x65, 0xff, 0xf3, 0x76, 0xc3, 0xe4, + 0x79, 0xc8, 0x39, 0xe5, 0x95, 0x24, 0x4f, 0x70, 0xab, 0xe4, 0xd7, 0xfe, + 0x3c, 0x75, 0xc2, 0xc9, 0xc4, 0x92, 0xcb, 0xff, 0xfc, 0xde, 0x72, 0xea, + 0x42, 0x4a, 0x0a, 0x4e, 0x7c, 0x1a, 0xcb, 0xff, 0xd9, 0x9e, 0x1f, 0xa3, + 0x99, 0xe6, 0x02, 0xcb, 0xf4, 0xd2, 0x8d, 0x71, 0x65, 0xfe, 0xc2, 0x0c, + 0xb9, 0x3b, 0xac, 0xb1, 0xbb, 0x0f, 0x70, 0x65, 0x37, 0xfe, 0x6f, 0xce, + 0x1e, 0x6c, 0xd6, 0xa1, 0x65, 0x42, 0x7c, 0x53, 0x98, 0x49, 0x04, 0x6c, + 0x0d, 0x0a, 0x4f, 0x95, 0xdf, 0x6c, 0x6f, 0x05, 0x65, 0xfb, 0x25, 0xe8, + 0xd2, 0xcb, 0xe3, 0x76, 0x79, 0x96, 0x57, 0x67, 0xe1, 0xb8, 0x49, 0xa2, + 0x7b, 0xf3, 0x78, 0xd8, 0xe9, 0x65, 0xfb, 0x06, 0x51, 0xd2, 0xcb, 0x7e, + 0x0f, 0x40, 0x8a, 0x6f, 0xff, 0xff, 0xdd, 0x7c, 0xa0, 0xfc, 0x1f, 0xa3, + 0x99, 0x26, 0x34, 0xd7, 0xf9, 0x41, 0xf8, 0xb2, 0xff, 0x02, 0x4d, 0xfe, + 0x08, 0x75, 0x97, 0xfe, 0xe3, 0xcb, 0x99, 0xdc, 0x1d, 0x96, 0x56, 0x8f, + 0xcf, 0xe6, 0xb7, 0xfd, 0xdf, 0x98, 0x00, 0x8d, 0x49, 0x65, 0xf6, 0xa7, + 0x69, 0xd6, 0x5d, 0xd1, 0x6c, 0x3d, 0xec, 0x3a, 0xa8, 0x54, 0x9e, 0xd0, + 0x83, 0x72, 0x60, 0xc3, 0xdc, 0x48, 0x40, 0x5f, 0xf7, 0x50, 0xc7, 0xc2, + 0xcd, 0xc5, 0x97, 0xbe, 0xfd, 0xac, 0xbf, 0xfd, 0x2e, 0x60, 0xf3, 0xcc, + 0xff, 0xf4, 0x2c, 0xa9, 0xd1, 0x3f, 0xd9, 0xd7, 0x43, 0xb7, 0xe9, 0xfd, + 0x01, 0xc5, 0x97, 0xff, 0xd2, 0x83, 0xea, 0x1a, 0x4f, 0xc7, 0x20, 0x2c, + 0xbf, 0x9b, 0x98, 0x31, 0x31, 0x65, 0xfb, 0x75, 0x8b, 0x37, 0xac, 0xbf, + 0xb0, 0x6c, 0x1e, 0xfd, 0xd9, 0xec, 0x39, 0x6d, 0xfd, 0xc9, 0x31, 0xde, + 0x4b, 0x2a, 0x13, 0x3f, 0xe8, 0xa3, 0x50, 0xa5, 0x02, 0x2d, 0xfe, 0xe1, + 0x66, 0xff, 0x3c, 0x96, 0x5e, 0xe4, 0xb7, 0xac, 0xa6, 0x3d, 0x3d, 0xc3, + 0x4b, 0xff, 0xd1, 0x38, 0x9e, 0x8e, 0xbf, 0x93, 0x90, 0xd6, 0x56, 0x2a, + 0x79, 0x68, 0xdc, 0x9e, 0x12, 0xc4, 0x49, 0x7f, 0x80, 0x77, 0x01, 0xdc, + 0x0b, 0x2f, 0xfe, 0x79, 0x60, 0xc9, 0x9f, 0xd0, 0x75, 0x97, 0x3f, 0x96, + 0x57, 0x8f, 0x5f, 0xe8, 0x37, 0x19, 0xda, 0xcb, 0xfe, 0x1b, 0x89, 0xa2, + 0x68, 0x35, 0x65, 0xf4, 0x61, 0x7c, 0x52, 0x7a, 0x43, 0x19, 0xbf, 0xde, + 0xcd, 0xfb, 0x39, 0x2e, 0xd6, 0x57, 0x0f, 0xd3, 0xe7, 0x75, 0xf4, 0xc2, + 0x83, 0x0e, 0x8b, 0xff, 0xc5, 0x9f, 0x69, 0x39, 0x67, 0xfc, 0xcb, 0x2f, + 0xe2, 0x7e, 0xa4, 0xd8, 0xb2, 0xff, 0x10, 0x0b, 0x3f, 0xec, 0xd8, 0x7e, + 0x5e, 0x46, 0xbf, 0x8b, 0x60, 0x9a, 0xf3, 0xac, 0xbf, 0xf0, 0x5e, 0x5b, + 0x21, 0x87, 0x87, 0x59, 0x4c, 0x8b, 0x97, 0x4a, 0x23, 0x0b, 0xff, 0x69, + 0x81, 0x3f, 0xa3, 0x81, 0xe2, 0xcb, 0xf6, 0x69, 0xfa, 0x31, 0x65, 0xa4, + 0xb2, 0xff, 0xfc, 0x61, 0x60, 0xf4, 0xc1, 0x9c, 0x7e, 0x82, 0x9d, 0x65, + 0xa7, 0x83, 0xe8, 0xc1, 0x1a, 0x9d, 0x17, 0x1c, 0x84, 0x8d, 0xfe, 0x98, + 0x9c, 0xcf, 0xe7, 0x96, 0x5e, 0xf6, 0x76, 0xb2, 0xf1, 0x86, 0x18, 0x92, + 0xfe, 0x04, 0x16, 0x75, 0xf4, 0x82, 0xcd, 0x05, 0x6c, 0x45, 0x86, 0xd9, + 0xa0, 0x87, 0xb7, 0xff, 0xf0, 0xaf, 0x67, 0x7e, 0x61, 0x8f, 0x0c, 0xd9, + 0xfe, 0x64, 0xeb, 0x2b, 0xc8, 0x9d, 0x09, 0xb5, 0x42, 0xa9, 0x16, 0x87, + 0xc3, 0xc6, 0xed, 0x7f, 0xd9, 0xbf, 0x18, 0x6e, 0xe6, 0xac, 0xbf, 0xff, + 0x37, 0xfd, 0x1c, 0xc6, 0xff, 0x18, 0xba, 0x92, 0xca, 0xf2, 0x23, 0x45, + 0x67, 0x37, 0xe8, 0xf7, 0x23, 0x4b, 0x2f, 0xf8, 0x48, 0xe6, 0x18, 0x21, + 0x7d, 0x65, 0x4e, 0xde, 0x60, 0xca, 0x70, 0x38, 0x70, 0xdc, 0xc2, 0xee, + 0xe3, 0x32, 0xea, 0x12, 0x4d, 0x39, 0x11, 0x34, 0x37, 0xf5, 0x2a, 0xd8, + 0xf2, 0xc6, 0xfd, 0x2d, 0xc5, 0xd1, 0x8a, 0x39, 0x4e, 0x46, 0xa9, 0xf9, + 0x57, 0xc1, 0x86, 0x3e, 0xf2, 0x71, 0x09, 0xef, 0xf9, 0x8a, 0x77, 0x2f, + 0xe1, 0xd6, 0x5d, 0x00, 0x59, 0x58, 0x79, 0xbf, 0x37, 0xbf, 0xf8, 0xd1, + 0x3e, 0xdc, 0x2c, 0xde, 0xc3, 0x59, 0x7f, 0x16, 0x0f, 0xce, 0x62, 0xca, + 0xd1, 0xfa, 0x1d, 0x1e, 0xff, 0xff, 0xc5, 0x8c, 0x0d, 0x9e, 0x7f, 0xfc, + 0x33, 0xec, 0x13, 0x5a, 0xc9, 0xd6, 0x5e, 0x27, 0x3a, 0xcb, 0xff, 0x71, + 0xb4, 0xfe, 0x6e, 0x44, 0x96, 0x5f, 0xc3, 0xf6, 0x7f, 0x6f, 0x16, 0x59, + 0xa4, 0x8f, 0xbf, 0x39, 0xfc, 0x6c, 0xc3, 0xda, 0x84, 0xd8, 0x3d, 0x18, + 0xed, 0xfe, 0x23, 0x78, 0xda, 0x79, 0x2c, 0xbe, 0x27, 0xeb, 0xeb, 0x2f, + 0x61, 0x01, 0x65, 0xfd, 0xdc, 0x74, 0x50, 0x62, 0xcb, 0xfd, 0x21, 0xf8, + 0x27, 0x1e, 0x2c, 0xbc, 0x26, 0xde, 0x2c, 0xac, 0x3d, 0x40, 0x1a, 0x5f, + 0x67, 0xe6, 0x92, 0xcb, 0xff, 0xb7, 0x4a, 0x37, 0x78, 0xe4, 0x20, 0x38, + 0xb2, 0xbc, 0x7d, 0xae, 0x47, 0x7f, 0xec, 0xfc, 0x6b, 0x9e, 0x82, 0xfa, + 0xe2, 0x08, 0x5f, 0xd9, 0xae, 0xdd, 0xfb, 0x54, 0x41, 0x01, 0x67, 0x95, + 0x7a, 0x06, 0xcb, 0x2a, 0x0f, 0xa7, 0x89, 0xd7, 0xfe, 0x22, 0xc3, 0x5f, + 0x0e, 0xe4, 0xb2, 0xed, 0xe3, 0x59, 0x7b, 0x7c, 0x1d, 0x65, 0xf7, 0x5c, + 0xcd, 0x2c, 0xbf, 0x4f, 0x9a, 0x89, 0x2c, 0xbe, 0xd6, 0x98, 0xc5, 0x94, + 0x73, 0xcb, 0xf1, 0x45, 0x42, 0x24, 0x1d, 0xba, 0xfe, 0xdc, 0x19, 0x8e, + 0x52, 0x59, 0x50, 0x9a, 0xa4, 0xe7, 0x78, 0x32, 0x50, 0xae, 0x09, 0x0d, + 0xff, 0xff, 0xe8, 0x2e, 0xf9, 0x05, 0xfe, 0x60, 0x4e, 0x27, 0x1f, 0x51, + 0xde, 0x12, 0xcb, 0xff, 0xd3, 0x49, 0x8b, 0xf0, 0x09, 0x89, 0xa6, 0x59, + 0x71, 0x4c, 0xb2, 0xd0, 0x33, 0xe2, 0xc4, 0xba, 0x85, 0xd1, 0x79, 0xcc, + 0xcd, 0x22, 0xec, 0x6f, 0x50, 0x83, 0xf4, 0x23, 0x81, 0x0d, 0x42, 0x8d, + 0xd7, 0xe9, 0xdb, 0xe1, 0xb3, 0x69, 0x2c, 0xbd, 0x1a, 0x02, 0xcb, 0x78, + 0x66, 0xb5, 0x84, 0x6f, 0xef, 0x36, 0x8b, 0x27, 0x59, 0x77, 0x3c, 0xb2, + 0xb4, 0x78, 0x80, 0x2d, 0xbf, 0x6a, 0x3b, 0xc2, 0x59, 0x58, 0x79, 0x2e, + 0x45, 0x7f, 0x7b, 0x3f, 0xf6, 0x3a, 0xcb, 0xff, 0xb8, 0x32, 0x69, 0xc4, + 0xd1, 0x46, 0x2c, 0xbf, 0xbe, 0x26, 0x79, 0xfa, 0x59, 0x5d, 0x22, 0x83, + 0xc5, 0xa4, 0x89, 0x7f, 0xc5, 0x3e, 0x68, 0x04, 0x10, 0x2c, 0xbf, 0xb3, + 0xaf, 0xeb, 0x50, 0xb2, 0xff, 0xee, 0x13, 0xfd, 0xce, 0x24, 0x4f, 0x8b, + 0x28, 0x67, 0xe5, 0xc2, 0xea, 0x84, 0x7e, 0xb1, 0x80, 0x61, 0x57, 0x7f, + 0xce, 0xdf, 0x73, 0xb9, 0x01, 0x65, 0xed, 0xfe, 0xc5, 0x96, 0xef, 0xc7, + 0xa8, 0x21, 0xb5, 0xf0, 0x7f, 0x04, 0xb2, 0xb0, 0xf2, 0xf8, 0x55, 0x7e, + 0xde, 0x3f, 0x47, 0x16, 0x58, 0xeb, 0x2f, 0xf4, 0x7c, 0x7e, 0x0b, 0xf1, + 0x60, 0x85, 0x8d, 0xff, 0x4e, 0xf2, 0x82, 0xfe, 0xde, 0x2c, 0xbf, 0xfb, + 0x3b, 0xf4, 0x7b, 0x35, 0xa8, 0x35, 0x65, 0xc0, 0x85, 0x97, 0x10, 0xf4, + 0x7b, 0x60, 0x45, 0xbe, 0x28, 0xe8, 0x0b, 0x2a, 0x11, 0xca, 0xd0, 0x96, + 0x10, 0xb6, 0xe8, 0x35, 0x65, 0xfe, 0xcd, 0x30, 0x0e, 0xf2, 0x59, 0x73, + 0x12, 0xcb, 0xfe, 0x82, 0x34, 0x6d, 0x20, 0xe9, 0x65, 0x8c, 0x59, 0x43, + 0x3e, 0x03, 0x8a, 0x88, 0x73, 0x78, 0x83, 0x3a, 0xcb, 0xd3, 0x94, 0x2c, + 0xbf, 0x79, 0xe5, 0x84, 0xb2, 0xfe, 0x6f, 0x96, 0x79, 0x96, 0x5c, 0xd3, + 0x2c, 0xbe, 0xdd, 0x8d, 0x1a, 0xb2, 0xde, 0xd8, 0x88, 0xe8, 0x26, 0x72, + 0xbd, 0xd1, 0x7b, 0xfe, 0x8e, 0x79, 0xb5, 0xa7, 0x92, 0xca, 0xc3, 0xfe, + 0x24, 0x6b, 0x9c, 0xcd, 0x8a, 0x8f, 0x86, 0x2f, 0x90, 0x92, 0xf1, 0x83, + 0x8e, 0xfe, 0x32, 0x8b, 0xfa, 0x27, 0xff, 0x33, 0xeb, 0x2a, 0x17, 0xc8, + 0xe5, 0x1d, 0xee, 0x43, 0x49, 0x88, 0x74, 0x77, 0xe8, 0xca, 0x0a, 0x53, + 0x91, 0x8e, 0x17, 0xf7, 0x18, 0x63, 0xc2, 0x59, 0x7f, 0xff, 0xf6, 0x7e, + 0x0e, 0x3c, 0xfc, 0x61, 0x48, 0xb3, 0xa9, 0x46, 0x7d, 0x65, 0xff, 0xfb, + 0xd9, 0xce, 0x66, 0x07, 0x53, 0xe0, 0x4b, 0xeb, 0x28, 0x91, 0x87, 0xf6, + 0xeb, 0xfe, 0xf4, 0x6b, 0xe5, 0x19, 0xd2, 0xcb, 0xff, 0xfe, 0x69, 0xe2, + 0x5c, 0xd6, 0x9b, 0xa9, 0xa4, 0xfa, 0x3e, 0x74, 0xb2, 0xff, 0x43, 0xce, + 0xfa, 0x71, 0x16, 0x5e, 0xf6, 0x10, 0xd1, 0xab, 0xe3, 0x8f, 0xb5, 0x56, + 0x2a, 0x26, 0x68, 0x77, 0xfe, 0x1e, 0xf7, 0xe8, 0xd4, 0xdc, 0x9d, 0x65, + 0xff, 0x7a, 0x33, 0x52, 0xe0, 0x4e, 0xb2, 0xa7, 0x3e, 0x3e, 0xca, 0xae, + 0x6e, 0x2c, 0xbf, 0xec, 0x9d, 0xfe, 0x01, 0x0a, 0x4b, 0x2f, 0x44, 0x8d, + 0x59, 0x7e, 0xce, 0x4f, 0x86, 0x2c, 0xb9, 0xbb, 0x59, 0x6f, 0xec, 0x3d, + 0xd9, 0x0e, 0xed, 0x94, 0xdf, 0xfb, 0xfe, 0x79, 0x30, 0xfd, 0x12, 0x59, + 0x4e, 0x7f, 0x04, 0x75, 0x7f, 0x08, 0x7e, 0x18, 0xfd, 0x2c, 0xa8, 0x54, + 0x6f, 0x90, 0x9d, 0x34, 0x93, 0x42, 0xcf, 0x18, 0x7f, 0xc8, 0x2f, 0xf8, + 0x4f, 0xb7, 0xb0, 0xb3, 0x8b, 0x2f, 0x4a, 0x58, 0xb2, 0xe8, 0x11, 0x65, + 0x74, 0x6c, 0xdc, 0x72, 0xff, 0x44, 0x84, 0xe0, 0x04, 0xed, 0x65, 0x31, + 0xec, 0x7c, 0x86, 0xec, 0x29, 0x23, 0x90, 0x70, 0xc3, 0xbd, 0xac, 0xf2, + 0xcb, 0xdc, 0x63, 0xac, 0xad, 0x1b, 0x8f, 0x8e, 0x5d, 0x9d, 0x2c, 0xb9, + 0xa7, 0x59, 0x50, 0x79, 0xe2, 0x10, 0xee, 0x8b, 0xdf, 0xee, 0x16, 0x1c, + 0xed, 0xf5, 0x96, 0x14, 0xac, 0xbf, 0xf3, 0x41, 0x6c, 0x72, 0x93, 0x1d, + 0x65, 0x61, 0xe9, 0x78, 0x56, 0xf9, 0xa6, 0x63, 0x16, 0x5f, 0xf9, 0xfa, + 0x13, 0xed, 0xa8, 0x08, 0xad, 0x65, 0xc2, 0x4e, 0xb2, 0x8e, 0x7b, 0xbf, + 0x44, 0xbf, 0x3f, 0x0a, 0x26, 0x59, 0x76, 0xfd, 0x2c, 0xbf, 0xff, 0x06, + 0x72, 0x8c, 0xf0, 0xb8, 0xfe, 0x78, 0x3a, 0x59, 0x7b, 0x82, 0x73, 0x62, + 0x6b, 0x43, 0x21, 0xc8, 0x40, 0x1a, 0x44, 0x44, 0xe2, 0x0c, 0xd7, 0x6a, + 0x94, 0x3f, 0x1e, 0xf5, 0xc4, 0x62, 0xcb, 0xf7, 0x0f, 0x9f, 0xe2, 0xcb, + 0xf8, 0x1a, 0x8e, 0xf0, 0x96, 0x5f, 0xf8, 0xdc, 0xfb, 0x7b, 0x3f, 0x1a, + 0x59, 0x50, 0x7d, 0x6c, 0x5b, 0x7e, 0x79, 0x13, 0x42, 0xcb, 0xf3, 0x97, + 0xf0, 0x96, 0x5f, 0xd8, 0x7c, 0xc2, 0x35, 0x65, 0xfe, 0x7f, 0xf3, 0x37, + 0xf9, 0x96, 0x58, 0xd1, 0x9f, 0x01, 0x16, 0x54, 0x22, 0xb5, 0xe1, 0x0b, + 0x7f, 0xc4, 0xe6, 0x4d, 0x27, 0xd4, 0x96, 0x5f, 0xcd, 0xac, 0xdf, 0x1b, + 0x8b, 0x2a, 0x63, 0xeb, 0xf1, 0xd5, 0xfc, 0xda, 0xd4, 0x61, 0x2c, 0xbf, + 0xe8, 0x97, 0x33, 0xb2, 0x8d, 0x2c, 0xa3, 0x4f, 0x8f, 0x45, 0x76, 0x65, + 0x97, 0xf7, 0x1b, 0x5d, 0xfb, 0x16, 0x5e, 0x27, 0x37, 0x0f, 0x87, 0xb2, + 0x3e, 0x84, 0x2a, 0x17, 0xaf, 0x25, 0x0b, 0x9c, 0x95, 0x05, 0xd9, 0x63, + 0x0b, 0xea, 0x12, 0x67, 0x20, 0x28, 0x69, 0x72, 0x12, 0x21, 0x87, 0x3d, + 0xff, 0xf4, 0xf9, 0xa9, 0xdb, 0xf2, 0xcd, 0x69, 0xe4, 0xb2, 0xf7, 0x6c, + 0x35, 0x97, 0xff, 0x6b, 0x0e, 0xfd, 0x6e, 0xc7, 0x67, 0x3a, 0xcb, 0xff, + 0xfd, 0xc6, 0xe7, 0x23, 0x9d, 0x93, 0xcf, 0x05, 0x13, 0x71, 0x65, 0x62, + 0x63, 0x1d, 0x28, 0xb8, 0xef, 0xd2, 0x6f, 0xde, 0x6d, 0xb6, 0x35, 0x65, + 0xf6, 0x01, 0xb7, 0xac, 0xbe, 0x00, 0x02, 0x05, 0x95, 0xd9, 0xf8, 0x91, + 0x58, 0x84, 0x77, 0xc1, 0xd7, 0xd9, 0x65, 0xf8, 0xa5, 0xc9, 0xc0, 0xb2, + 0xff, 0xfe, 0x97, 0xda, 0x6e, 0xfc, 0xdd, 0x7c, 0x42, 0xcd, 0xf8, 0xb2, + 0xff, 0xe0, 0x47, 0x0f, 0x0d, 0xad, 0x31, 0x8b, 0x2f, 0x3b, 0xc9, 0x65, + 0xfe, 0x6f, 0xb4, 0xb3, 0xaf, 0xac, 0xa1, 0xa6, 0x7b, 0x84, 0x5d, 0x14, + 0xb3, 0x00, 0x11, 0x37, 0x46, 0xef, 0xc7, 0x6f, 0xfe, 0x16, 0x5e, 0x6c, + 0x31, 0x65, 0xf3, 0x73, 0x06, 0xc7, 0x86, 0x44, 0xf7, 0xf1, 0x73, 0x0f, + 0x1b, 0x8b, 0x2f, 0xfe, 0xce, 0xa5, 0x9e, 0x6d, 0x13, 0x42, 0xcb, 0xfe, + 0x88, 0xe7, 0x1b, 0x58, 0x75, 0x95, 0x23, 0xf9, 0x1a, 0x15, 0xf6, 0xe7, + 0xb2, 0x75, 0x97, 0xfa, 0x07, 0x9f, 0x6f, 0x05, 0x65, 0x41, 0xec, 0x0c, + 0x9a, 0xff, 0xd2, 0xfb, 0x4f, 0xa8, 0x93, 0xe9, 0x65, 0xf1, 0xad, 0xd7, + 0x16, 0x54, 0x27, 0x4d, 0x34, 0x2a, 0x0e, 0xf4, 0xe4, 0x3f, 0x3f, 0xbf, + 0xf7, 0xc4, 0x04, 0x09, 0x00, 0x80, 0x2c, 0xbf, 0xe6, 0xd4, 0xe1, 0x06, + 0xc8, 0xdc, 0x59, 0x7f, 0xfc, 0x4c, 0x69, 0xb0, 0x27, 0xdb, 0xcc, 0x5f, + 0x59, 0x52, 0x44, 0x79, 0xcf, 0xef, 0xff, 0xc0, 0xe7, 0x9b, 0x0e, 0xfd, + 0x73, 0xfe, 0x0f, 0x4b, 0x2f, 0xe7, 0xe3, 0x14, 0x71, 0x65, 0xde, 0x75, + 0x97, 0xc3, 0x72, 0x07, 0x8f, 0x04, 0x56, 0x57, 0x58, 0x8d, 0x50, 0xc2, + 0x66, 0xff, 0xff, 0xc7, 0x72, 0x04, 0x9b, 0x81, 0x3f, 0x9a, 0x3f, 0xe0, + 0xb9, 0xd6, 0x5f, 0x72, 0x53, 0xe2, 0xcb, 0xff, 0xb0, 0xcd, 0x43, 0x16, + 0x00, 0xec, 0xb2, 0xe2, 0x85, 0x97, 0xff, 0x83, 0xf9, 0x30, 0x3c, 0xed, + 0xf7, 0x3a, 0xca, 0xf1, 0xef, 0x10, 0xad, 0xdb, 0x37, 0x16, 0x5f, 0xff, + 0x9d, 0xbe, 0xc3, 0xc1, 0xe7, 0xd8, 0xed, 0xa5, 0x97, 0xd2, 0xe4, 0x1d, + 0x65, 0xff, 0xe8, 0xec, 0x78, 0x27, 0xdb, 0x50, 0x11, 0x5a, 0xcb, 0xc1, + 0xc1, 0xac, 0xbd, 0xa7, 0xe6, 0xc4, 0xf7, 0xe7, 0x23, 0xc8, 0x50, 0x68, + 0x87, 0xc3, 0x8e, 0xa4, 0x44, 0x5b, 0x69, 0xf6, 0xfc, 0x2b, 0xf4, 0x94, + 0x3e, 0x1c, 0x9c, 0x32, 0x92, 0xaf, 0xfd, 0x1c, 0xef, 0xcc, 0x38, 0xcd, + 0x2c, 0xae, 0x97, 0x54, 0x1a, 0x73, 0x0f, 0x49, 0xf7, 0x4a, 0x16, 0x5f, + 0xfb, 0xd1, 0xec, 0xe8, 0x19, 0xfe, 0x2c, 0xbd, 0x33, 0x1d, 0x65, 0xa7, + 0x19, 0xee, 0x61, 0xfd, 0x3a, 0x26, 0x82, 0xe5, 0x7f, 0xff, 0xfb, 0xbd, + 0x93, 0x7a, 0x35, 0x3e, 0xce, 0x01, 0xc8, 0x1b, 0x33, 0xb8, 0xff, 0x16, + 0x54, 0x32, 0xeb, 0x07, 0x0a, 0xec, 0x8d, 0xb7, 0xb8, 0x4e, 0xb4, 0x7b, + 0x8f, 0x3b, 0x3e, 0x50, 0xd5, 0x09, 0x15, 0xed, 0x6a, 0x16, 0x5f, 0xf4, + 0xed, 0x3f, 0x30, 0xef, 0xe5, 0x97, 0xfd, 0x28, 0x1b, 0x0f, 0x1f, 0xcb, + 0x2c, 0xda, 0x3f, 0x1f, 0x9d, 0x5f, 0xda, 0x89, 0xd8, 0xbe, 0xb2, 0xe1, + 0x0e, 0xb2, 0xed, 0xaf, 0x6a, 0x59, 0x43, 0x37, 0x3c, 0x18, 0xbd, 0xb4, + 0x85, 0x56, 0xd4, 0xb2, 0xfc, 0x50, 0x3c, 0x99, 0x65, 0xf7, 0x03, 0xa3, + 0x56, 0x5f, 0xa3, 0xdf, 0x89, 0x2c, 0xbe, 0x18, 0x7f, 0xcd, 0xad, 0x14, + 0x10, 0x5d, 0xd1, 0x38, 0x09, 0x2f, 0x78, 0x4d, 0x2c, 0xbf, 0xd0, 0x4f, + 0xe0, 0x94, 0xeb, 0x2f, 0xff, 0xde, 0x6d, 0x79, 0xe0, 0x8d, 0x79, 0x9d, + 0xe7, 0x59, 0x7d, 0x8c, 0x0e, 0x2c, 0xbe, 0x6e, 0x44, 0xb0, 0xfd, 0xb4, + 0xab, 0x7a, 0x71, 0xc2, 0xcb, 0xda, 0x7e, 0xd6, 0x5e, 0x3c, 0x79, 0x65, + 0xe8, 0x90, 0xa5, 0x65, 0x80, 0x33, 0xd9, 0xc1, 0xd2, 0x1c, 0xbf, 0xe8, + 0xe4, 0x7f, 0x98, 0x52, 0x59, 0x7f, 0xff, 0xfb, 0x27, 0xe4, 0x1a, 0xfc, + 0xfc, 0xb0, 0xd3, 0x73, 0xaf, 0xea, 0x33, 0xa5, 0x97, 0xb4, 0x52, 0x59, + 0x7f, 0xc4, 0x0f, 0xb0, 0xf0, 0xa4, 0xb2, 0xd1, 0xb0, 0xf4, 0xdc, 0x72, + 0xbc, 0x99, 0x77, 0x0d, 0xc3, 0x0c, 0xfb, 0xc2, 0xbf, 0x62, 0xca, 0x14, + 0x2e, 0xaf, 0xca, 0x11, 0xa3, 0x27, 0xc6, 0x66, 0x86, 0x0c, 0xcb, 0x47, + 0x1e, 0xf4, 0x2a, 0x1c, 0xdc, 0x9d, 0xbf, 0x1b, 0x08, 0x4d, 0xae, 0x13, + 0x8b, 0x2f, 0xfd, 0xfe, 0x64, 0xce, 0x0e, 0x64, 0xeb, 0x2b, 0x47, 0xb0, + 0x43, 0x17, 0xec, 0x33, 0xe2, 0x1d, 0x65, 0xff, 0xff, 0x70, 0x48, 0x00, + 0xfd, 0x1a, 0xc2, 0x67, 0x97, 0x33, 0xeb, 0x2e, 0xe4, 0xeb, 0x2f, 0xe2, + 0x83, 0x35, 0x07, 0x59, 0x43, 0x3c, 0x5c, 0x18, 0xad, 0x23, 0x2f, 0xf0, + 0xaa, 0xbf, 0xdc, 0x0e, 0x81, 0x9e, 0x75, 0x97, 0xdc, 0x3b, 0xb2, 0xca, + 0x91, 0xea, 0x7c, 0xce, 0xff, 0xf4, 0xb6, 0x6a, 0x38, 0xd0, 0x40, 0x04, + 0x2c, 0xa8, 0x3e, 0xc7, 0x22, 0xbe, 0x73, 0xe0, 0xd6, 0x5f, 0xd8, 0x37, + 0x27, 0xde, 0xb2, 0xbe, 0x79, 0xdb, 0xc8, 0x6f, 0xfb, 0xd1, 0xd7, 0xe3, + 0xcf, 0xb8, 0xb2, 0x96, 0x5b, 0x7a, 0xca, 0xd8, 0x7b, 0x5b, 0x48, 0xf3, + 0x6c, 0x2e, 0xdd, 0x2c, 0xbb, 0x0c, 0x59, 0x77, 0xfe, 0xc6, 0xa7, 0xe2, + 0x55, 0x08, 0x8f, 0x66, 0x3b, 0xff, 0x39, 0x77, 0x9a, 0xed, 0xdf, 0xb5, + 0x44, 0x22, 0xb4, 0xeb, 0x2f, 0x8d, 0x72, 0x02, 0xcb, 0xce, 0xdb, 0xab, + 0x2a, 0x47, 0xa4, 0xc2, 0x5e, 0x22, 0xa8, 0x5c, 0x66, 0xc2, 0x16, 0x87, + 0xa9, 0xe1, 0xd0, 0xed, 0xc0, 0x8c, 0x34, 0x24, 0x3b, 0xe1, 0x3d, 0x7b, + 0x80, 0x75, 0x97, 0xf7, 0xbb, 0x6e, 0x60, 0xd6, 0x54, 0xe7, 0x95, 0xd8, + 0xe5, 0xff, 0x69, 0xc7, 0x8d, 0xbd, 0xce, 0xb2, 0xff, 0xff, 0xfc, 0xc7, + 0xce, 0x61, 0x07, 0xfe, 0xcd, 0xe3, 0x8f, 0x34, 0x7f, 0xc1, 0x73, 0xac, + 0xbf, 0xb8, 0xfd, 0xf9, 0xa7, 0x59, 0x58, 0x98, 0x76, 0x89, 0x3c, 0x73, + 0xf8, 0x41, 0x5f, 0x9b, 0x52, 0xdb, 0xfa, 0xcb, 0xff, 0x9f, 0x93, 0xc7, + 0xb3, 0xb1, 0x36, 0xdd, 0x65, 0x1c, 0xfd, 0x08, 0xae, 0xff, 0xff, 0xf7, + 0xb0, 0x3a, 0x37, 0xcd, 0xd4, 0x7c, 0x3e, 0x2c, 0xeb, 0xe1, 0x7e, 0x2c, + 0xbf, 0xfb, 0x3a, 0x13, 0xec, 0x41, 0x96, 0x71, 0x65, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0a, 0x72, 0x71, 0xc1, 0x4f, 0x1a, 0x1e, 0x16, 0x7f, + 0x8d, 0xde, 0x10, 0x93, 0xe6, 0xa3, 0x84, 0xe6, 0xf3, 0x18, 0x00, 0x08, + 0x09, 0xc7, 0x05, 0x3c, 0x69, 0x65, 0xf9, 0xf7, 0x73, 0xaf, 0xac, 0xbf, + 0xa4, 0x59, 0x81, 0x15, 0xac, 0xbf, 0xcf, 0xf9, 0x66, 0xb3, 0x8b, 0x2a, + 0x13, 0xda, 0xc4, 0x5f, 0x46, 0x10, 0xe5, 0x64, 0x61, 0x7e, 0xef, 0xe6, + 0xb7, 0x6b, 0x2f, 0xff, 0x7a, 0x0b, 0xfb, 0x3c, 0xe3, 0xf3, 0xe9, 0x65, + 0x39, 0xfb, 0x70, 0xae, 0xff, 0xce, 0x58, 0xda, 0x28, 0xea, 0x4b, 0x2f, + 0xff, 0xfb, 0xe1, 0x9f, 0x3c, 0xdf, 0xf6, 0x1f, 0x35, 0x2c, 0xeb, 0xeb, + 0x2f, 0xef, 0x37, 0xbd, 0x07, 0x59, 0x7e, 0x91, 0x46, 0x71, 0x65, 0xe7, + 0x29, 0xfb, 0x3d, 0x3e, 0x8b, 0x6a, 0x48, 0xf0, 0xfc, 0x2e, 0xef, 0xff, + 0xd0, 0x09, 0xa5, 0x13, 0x93, 0x9b, 0xc2, 0x89, 0x2c, 0xbf, 0xf0, 0x99, + 0xe7, 0x38, 0xb3, 0x0c, 0x31, 0x65, 0xff, 0xfb, 0x3b, 0xf4, 0x10, 0xc9, + 0xa7, 0xc2, 0x63, 0x56, 0x54, 0xe8, 0x99, 0x92, 0x2d, 0xff, 0xd3, 0x81, + 0xba, 0xe7, 0x78, 0xc5, 0xda, 0xca, 0x73, 0xeb, 0x22, 0x4a, 0x92, 0x6f, + 0x4f, 0x1a, 0xd5, 0xff, 0xfd, 0x31, 0x40, 0x39, 0xdf, 0x9b, 0x53, 0x14, + 0x03, 0x8b, 0x2f, 0xff, 0xef, 0xf2, 0x0d, 0x93, 0x79, 0xcb, 0xf2, 0xcd, + 0x62, 0xcb, 0xff, 0x37, 0x30, 0x7b, 0x1c, 0x1b, 0x78, 0xb2, 0xe0, 0xef, + 0x59, 0x7f, 0xa0, 0xfd, 0x7e, 0x33, 0xa5, 0x97, 0xfe, 0xf3, 0x6f, 0xf3, + 0xcb, 0x50, 0x6a, 0xca, 0xc4, 0xca, 0xbb, 0x5a, 0xd2, 0x17, 0x86, 0x7e, + 0x69, 0x7f, 0xfe, 0xd7, 0x5f, 0x63, 0x39, 0xe6, 0xe8, 0x1a, 0x71, 0xac, + 0xbf, 0x7d, 0x82, 0x46, 0xac, 0xa8, 0x44, 0x08, 0x56, 0x6f, 0xec, 0x33, + 0x08, 0x20, 0x59, 0x7e, 0x96, 0x7e, 0x00, 0xb2, 0xe8, 0x3c, 0xe7, 0xa9, + 0xd1, 0x6d, 0xff, 0xcd, 0xc2, 0x8f, 0xf3, 0x37, 0xb1, 0xab, 0x2f, 0xff, + 0xfe, 0x01, 0xde, 0x5e, 0x76, 0xfb, 0x0f, 0x07, 0x9f, 0x63, 0xb6, 0x96, + 0x57, 0x11, 0xc7, 0xf2, 0xf0, 0xa2, 0xdf, 0xfb, 0xcf, 0xbb, 0xdf, 0x98, + 0xf1, 0xda, 0xcb, 0xc5, 0x06, 0x2c, 0xbc, 0x59, 0xcc, 0x3d, 0xf3, 0xa1, + 0xdf, 0xa7, 0x3c, 0x0e, 0x16, 0x54, 0xec, 0xae, 0x49, 0x10, 0x8e, 0x52, + 0xa1, 0xb0, 0xc3, 0xec, 0x87, 0xa8, 0xcb, 0x26, 0x8e, 0x8b, 0x45, 0x3e, + 0x8e, 0x1f, 0x90, 0xcc, 0xfc, 0x6b, 0x3b, 0xe1, 0x1e, 0x21, 0x8d, 0xff, + 0xa0, 0xd3, 0x60, 0xb3, 0xfe, 0x65, 0x97, 0xfa, 0x39, 0xc8, 0x9f, 0x0c, + 0x59, 0x7f, 0xfc, 0x3f, 0x85, 0xfa, 0xf8, 0x30, 0x7b, 0x3c, 0xcb, 0x2f, + 0xff, 0xb7, 0xbf, 0xbc, 0xc3, 0xcf, 0xf0, 0x25, 0xf5, 0x97, 0xdf, 0x20, + 0xfd, 0x65, 0xc1, 0x25, 0x97, 0xb0, 0xf9, 0xa3, 0x71, 0xe2, 0x2a, 0x84, + 0x5d, 0x7a, 0x11, 0x34, 0x34, 0xda, 0x1c, 0xd3, 0xf1, 0x86, 0xdf, 0x66, + 0x8d, 0x65, 0x95, 0x0c, 0xe8, 0x4c, 0xa5, 0xcd, 0x34, 0x3b, 0x1e, 0x3a, + 0x60, 0x9b, 0x5e, 0x30, 0xc3, 0x12, 0x5f, 0xf6, 0x01, 0xf5, 0x9b, 0xf0, + 0x69, 0x05, 0x9a, 0x0b, 0x8c, 0x31, 0x25, 0xe3, 0x0c, 0x31, 0x25, 0xfc, + 0xf3, 0x8f, 0xd1, 0xc4, 0x82, 0xcd, 0x05, 0x12, 0x31, 0x0c, 0x4b, 0xdb, + 0x39, 0xbf, 0x76, 0xc3, 0x10, 0xe9, 0x05, 0x9b, 0x3b, 0xc6, 0x18, 0x62, + 0x4b, 0xdc, 0x8d, 0x24, 0x16, 0x68, 0x2f, 0x9c, 0xba, 0xfa, 0xcb, 0x01, + 0x91, 0x59, 0xf5, 0xc3, 0x0b, 0xae, 0xdb, 0xda, 0x96, 0x5f, 0xf3, 0x17, + 0x65, 0x86, 0x38, 0x16, 0x5f, 0x8a, 0x24, 0xfd, 0xac, 0xbd, 0x93, 0x32, + 0xca, 0x19, 0xe1, 0x88, 0x4f, 0x7e, 0xe0, 0x67, 0xdb, 0x25, 0x97, 0xe1, + 0xb6, 0xf8, 0x1a, 0xcb, 0xec, 0x2c, 0xdc, 0x59, 0x5a, 0x3c, 0xc3, 0x94, + 0xd3, 0x22, 0x68, 0x47, 0x8b, 0xff, 0xbc, 0xf2, 0x27, 0x36, 0x62, 0x69, + 0x96, 0x5f, 0xc2, 0xac, 0xb0, 0xc7, 0x02, 0xcb, 0xfe, 0x9e, 0x3a, 0xe3, + 0x16, 0x01, 0x65, 0xf3, 0xc9, 0x80, 0xb2, 0xb4, 0x7b, 0x5e, 0x39, 0xbf, + 0x64, 0xe7, 0xc3, 0xac, 0xbf, 0xa2, 0x71, 0xfa, 0x38, 0xb2, 0xff, 0x46, + 0x77, 0x9b, 0xd8, 0x6b, 0x2d, 0x9d, 0x9f, 0x11, 0x17, 0x50, 0xab, 0x4d, + 0x83, 0x21, 0x1a, 0x44, 0x5b, 0x70, 0x8a, 0xbf, 0xbd, 0x9b, 0xf3, 0xfc, + 0x59, 0x5d, 0xaa, 0x23, 0x04, 0x74, 0xbf, 0x4f, 0xa9, 0x2b, 0xd6, 0x18, + 0xfe, 0x9e, 0xfd, 0x0b, 0xd2, 0x94, 0x8d, 0x7f, 0xbf, 0x2c, 0xf7, 0x9e, + 0x4b, 0x2f, 0x99, 0xc8, 0x6b, 0x2e, 0x08, 0x16, 0x50, 0xcd, 0xb8, 0x08, + 0x2f, 0xd1, 0x93, 0x36, 0x96, 0x54, 0xe7, 0x90, 0x44, 0x37, 0x4f, 0xf5, + 0x95, 0x0b, 0xa9, 0xf9, 0x38, 0x18, 0x6a, 0xbb, 0xc2, 0xc8, 0x88, 0xaf, + 0xb6, 0xfd, 0x9d, 0xac, 0xbe, 0x03, 0x17, 0xd6, 0x54, 0xe7, 0x8f, 0xc2, + 0x6b, 0x85, 0x56, 0xd4, 0xb2, 0xf7, 0x23, 0xeb, 0x2e, 0x01, 0x8b, 0x2f, + 0xdc, 0x09, 0x08, 0x75, 0x96, 0xe4, 0xc7, 0xba, 0xe3, 0x9f, 0x18, 0xac, + 0x46, 0xbf, 0x44, 0x7f, 0x7f, 0xbf, 0x77, 0x1e, 0x83, 0xac, 0xb9, 0xfe, + 0xb2, 0xfb, 0x71, 0xc8, 0x18, 0x6f, 0x88, 0xa2, 0xff, 0x61, 0xa6, 0xbc, + 0xa4, 0x35, 0x97, 0xf3, 0xb8, 0xfe, 0x17, 0x59, 0x7c, 0x37, 0x20, 0x61, + 0xf0, 0x91, 0xad, 0x62, 0x33, 0xc3, 0x09, 0x9b, 0xff, 0x81, 0xff, 0x44, + 0xa4, 0xdc, 0xc1, 0xac, 0xbf, 0xf7, 0xf3, 0x51, 0xbf, 0xe4, 0xe0, 0x59, + 0x74, 0xd2, 0x84, 0x41, 0xb2, 0x25, 0xff, 0x41, 0x48, 0x87, 0xe8, 0x9d, + 0x65, 0xfc, 0x3c, 0xd6, 0xd9, 0xc6, 0xb2, 0xf7, 0x9a, 0x64, 0x95, 0xa3, + 0xce, 0xe1, 0x8d, 0xff, 0x3f, 0x5f, 0xc9, 0x83, 0xa3, 0x56, 0x5b, 0xb6, + 0x3d, 0xe0, 0x91, 0x5f, 0xe2, 0xce, 0xa5, 0xc6, 0x35, 0x65, 0xed, 0x06, + 0x75, 0x97, 0x9f, 0x46, 0xac, 0xad, 0x1b, 0xb7, 0x1e, 0xb1, 0xab, 0x2f, + 0xfe, 0xce, 0xfd, 0x1e, 0xcd, 0x6a, 0x0d, 0x59, 0x79, 0x81, 0xc8, 0x3d, + 0x7d, 0x09, 0x56, 0xc4, 0xc6, 0x27, 0x6f, 0x27, 0x7b, 0xfe, 0xcc, 0xec, + 0x11, 0x9d, 0x49, 0x65, 0xff, 0x83, 0xcc, 0x28, 0xf0, 0xc4, 0x3a, 0xcb, + 0xff, 0xbf, 0xa0, 0xf3, 0xcf, 0x20, 0x30, 0xd6, 0x5f, 0x43, 0x9f, 0x7a, + 0x4b, 0xda, 0xc1, 0x42, 0xcb, 0xff, 0xbc, 0xce, 0x00, 0x40, 0x23, 0xdc, + 0x59, 0x7f, 0x7b, 0x0e, 0x77, 0x92, 0xcb, 0xc6, 0x18, 0x62, 0x4b, 0xfc, + 0x5f, 0xf3, 0x41, 0x4e, 0x90, 0x59, 0xa0, 0xbe, 0x8d, 0x3f, 0x96, 0x5e, + 0x80, 0x64, 0x91, 0x65, 0x89, 0xbf, 0x44, 0xac, 0x4d, 0x53, 0xe4, 0x02, + 0x43, 0xd6, 0xfe, 0xcd, 0x9f, 0x70, 0x71, 0x65, 0x76, 0x9e, 0xe1, 0xe3, + 0x77, 0xde, 0x6d, 0x7f, 0xce, 0x02, 0xc9, 0xa5, 0x1d, 0x2c, 0xa8, 0x55, + 0x29, 0x92, 0x88, 0x58, 0xea, 0xff, 0x9c, 0x8b, 0x35, 0xa6, 0x99, 0x65, + 0xfc, 0x42, 0x68, 0x83, 0x25, 0x95, 0x39, 0xf2, 0xb9, 0xbd, 0xff, 0xfd, + 0x2f, 0x3c, 0xbb, 0xf3, 0x7e, 0x59, 0xef, 0x3c, 0x96, 0x5f, 0xa0, 0x11, + 0xee, 0x2c, 0xac, 0x44, 0x18, 0x17, 0x2f, 0xfe, 0x10, 0xa1, 0x87, 0xec, + 0x97, 0x99, 0x65, 0xff, 0x84, 0x8d, 0x03, 0xfe, 0x71, 0xb2, 0xcb, 0xff, + 0xe7, 0xf8, 0x61, 0xa3, 0xae, 0xfd, 0x9d, 0x71, 0x65, 0xfb, 0x5a, 0x6f, + 0xf1, 0x65, 0x6c, 0x47, 0xd8, 0xd0, 0xc0, 0x7e, 0x22, 0x8d, 0xff, 0xf0, + 0x36, 0xf2, 0x39, 0xe8, 0xeb, 0xe6, 0x87, 0x4b, 0x2f, 0xfe, 0x9a, 0x41, + 0x2f, 0xcb, 0x35, 0x9c, 0x59, 0x7f, 0xfe, 0x2e, 0xfc, 0xd3, 0x4a, 0x0b, + 0xfa, 0xd4, 0x49, 0x67, 0x0f, 0x16, 0xff, 0xfe, 0x6e, 0x69, 0x9f, 0x50, + 0xdf, 0xf6, 0x73, 0x98, 0xb2, 0xff, 0x64, 0x49, 0xbe, 0x50, 0xb2, 0xc0, + 0xc4, 0x77, 0x9d, 0x9f, 0x6d, 0x62, 0xa1, 0x50, 0x0e, 0x20, 0x3c, 0x71, + 0x37, 0xff, 0xf3, 0x80, 0xb0, 0xe4, 0xff, 0xe0, 0x9a, 0x68, 0x1a, 0xcb, + 0xa5, 0xc5, 0x97, 0x44, 0x86, 0x7e, 0x0c, 0xb3, 0x50, 0xcc, 0xa7, 0x94, + 0x67, 0xb9, 0x0a, 0xa3, 0x4b, 0xba, 0x87, 0x23, 0x46, 0x81, 0x31, 0x9e, + 0x8e, 0x7d, 0x2b, 0x4d, 0xe1, 0x36, 0x08, 0x52, 0x94, 0xb1, 0xee, 0x42, + 0x96, 0xff, 0xfe, 0xfb, 0x1f, 0x0b, 0xfc, 0x83, 0x78, 0x11, 0xf9, 0x96, + 0x5f, 0x81, 0x8d, 0xe3, 0x56, 0x5f, 0xff, 0x67, 0x70, 0x4f, 0xfe, 0x0c, + 0x2f, 0xa9, 0x2c, 0xae, 0x8f, 0xdc, 0xe5, 0x17, 0xdc, 0xf6, 0x71, 0x65, + 0xf3, 0x7e, 0x3e, 0xb2, 0x98, 0xf0, 0xf4, 0x45, 0x7f, 0x41, 0x77, 0xb5, + 0x8a, 0x9b, 0x42, 0xcb, 0xee, 0xbe, 0xd3, 0xac, 0xbf, 0x41, 0xf5, 0x1b, + 0xd6, 0x5f, 0xfe, 0xfb, 0x19, 0xc2, 0x8f, 0xf3, 0x5a, 0x85, 0x97, 0xa5, + 0x04, 0xb2, 0xf0, 0xe0, 0xd5, 0x97, 0xff, 0x47, 0x7f, 0x28, 0x33, 0x3f, + 0xce, 0x2c, 0xbf, 0xf3, 0xfb, 0x51, 0xf6, 0xed, 0x86, 0xb2, 0xff, 0xbf, + 0xec, 0x6d, 0x48, 0x43, 0xac, 0xbb, 0x00, 0xb2, 0xbc, 0x88, 0xee, 0x1f, + 0x7c, 0xea, 0x99, 0x32, 0x0d, 0x0e, 0x82, 0x1a, 0x77, 0xff, 0xff, 0x13, + 0x9e, 0x35, 0xd8, 0xfd, 0x1c, 0x0b, 0xb4, 0xb9, 0xe7, 0x92, 0xcb, 0xc1, + 0xff, 0x16, 0x5f, 0x8c, 0x7f, 0x41, 0xd6, 0x5e, 0xee, 0x38, 0xb2, 0xff, + 0xe1, 0x25, 0x9e, 0x7f, 0x36, 0xb5, 0x0b, 0x2a, 0x11, 0x13, 0x85, 0x00, + 0x1d, 0xbe, 0x93, 0x90, 0x16, 0x5f, 0xfe, 0x6f, 0x87, 0x4f, 0xc9, 0x37, + 0x22, 0x75, 0x96, 0xf6, 0x1f, 0x5b, 0x90, 0xde, 0xe6, 0xfc, 0x59, 0x74, + 0x69, 0x65, 0x7c, 0xda, 0x6d, 0x8f, 0x5f, 0xd9, 0x3f, 0x37, 0x1b, 0xb5, + 0x95, 0x07, 0xac, 0x44, 0x97, 0xe0, 0xe8, 0xdf, 0x32, 0xca, 0xd8, 0xbc, + 0x8d, 0x10, 0xd2, 0x9d, 0x98, 0x64, 0x38, 0x7b, 0xd9, 0x27, 0x45, 0x2c, + 0x95, 0xa8, 0xce, 0xdc, 0xd4, 0x0e, 0x25, 0x0a, 0x6e, 0x42, 0x67, 0xf0, + 0xb0, 0xdb, 0x20, 0xb1, 0x8b, 0x2f, 0xf8, 0x82, 0xe6, 0x80, 0xf1, 0x25, + 0x95, 0xa3, 0xcb, 0x00, 0x95, 0xfe, 0x27, 0x33, 0x09, 0xcd, 0x59, 0x7f, + 0xf6, 0x7f, 0x82, 0x70, 0xe5, 0x1a, 0x85, 0x97, 0xb7, 0xe1, 0x0c, 0xfd, + 0x8e, 0x65, 0x7f, 0xee, 0xe3, 0xfe, 0x6d, 0xf9, 0xd7, 0xd6, 0x5f, 0xfa, + 0x34, 0x4f, 0x3c, 0x6a, 0x24, 0xb2, 0xb0, 0xff, 0xcc, 0x42, 0xa6, 0x46, + 0xaf, 0xa1, 0x67, 0x7f, 0xff, 0xbc, 0xc6, 0x66, 0xeb, 0x1d, 0xff, 0xc0, + 0xcb, 0x3a, 0xfa, 0xcb, 0xff, 0xb4, 0xc0, 0x13, 0xd0, 0x77, 0x7f, 0xac, + 0xbf, 0xff, 0xa7, 0x1f, 0xa3, 0x99, 0xd7, 0x23, 0x5f, 0xe6, 0x4e, 0xb2, + 0x86, 0x98, 0x3e, 0x99, 0x49, 0x12, 0xe8, 0x65, 0x95, 0x0a, 0xb8, 0x32, + 0x36, 0xd7, 0x8c, 0xb8, 0x06, 0x17, 0xfd, 0x37, 0x7e, 0x63, 0xc6, 0x8d, + 0x59, 0x7f, 0x9b, 0x53, 0x67, 0xe2, 0x65, 0x97, 0xf4, 0x7a, 0x3f, 0x1e, + 0x59, 0x7d, 0xba, 0xc5, 0xda, 0xca, 0xc3, 0xd1, 0xdd, 0x2c, 0xbf, 0x4f, + 0xb0, 0x31, 0x32, 0xcb, 0x49, 0x65, 0xfa, 0x5f, 0x6d, 0x76, 0xb2, 0xf0, + 0x85, 0x32, 0xca, 0x91, 0xec, 0x74, 0x22, 0x02, 0x9a, 0xc4, 0xe6, 0x7b, + 0x3c, 0xd4, 0x21, 0x5c, 0x93, 0x90, 0x84, 0xad, 0xa2, 0x14, 0x70, 0x91, + 0x38, 0x83, 0x3c, 0xe1, 0x24, 0xa9, 0x36, 0xa3, 0xa4, 0xbb, 0x65, 0x7a, + 0x92, 0x6c, 0x73, 0x5d, 0xc7, 0xea, 0xd3, 0xa8, 0x1b, 0x90, 0xd8, 0x9a, + 0x7f, 0x5b, 0x53, 0x9c, 0xc7, 0xa4, 0x01, 0x7a, 0x9a, 0xde, 0xf3, 0xbe, + 0x60, 0x9d, 0x7c, 0x2a, 0xc1, 0x8f, 0x93, 0xee, 0x1f, 0xa7, 0x0e, 0x06, + 0x7c, 0xb4, 0xc9, 0xc1, 0x71, 0x23, 0xe1, 0xba, 0x0e, 0xb2, 0xf7, 0xb3, + 0x8b, 0x2f, 0xbe, 0x01, 0x3b, 0x59, 0x7f, 0x98, 0xdf, 0xf5, 0xdb, 0x79, + 0x65, 0x74, 0x7b, 0x64, 0x4b, 0x43, 0x44, 0xce, 0x3b, 0xde, 0xdd, 0x6d, + 0xeb, 0x2e, 0x6f, 0x2c, 0xbe, 0xcc, 0x2f, 0xac, 0xba, 0x09, 0x65, 0x78, + 0xf2, 0xf8, 0x2d, 0xbc, 0x82, 0xff, 0xfb, 0x08, 0x5f, 0xcd, 0x6e, 0xb9, + 0xec, 0x03, 0xac, 0xbf, 0xfe, 0x1c, 0x3e, 0xbc, 0x63, 0x8f, 0x6d, 0xe7, + 0xdb, 0x59, 0x52, 0x46, 0xd0, 0xcc, 0x7e, 0xa5, 0x79, 0xdc, 0xc5, 0x97, + 0x02, 0x16, 0x5f, 0xbb, 0xcf, 0xf9, 0x96, 0x59, 0xc6, 0x7b, 0x4c, 0x38, + 0x42, 0xd7, 0xdd, 0xf9, 0x85, 0x6b, 0x2f, 0xdb, 0x3a, 0x96, 0x7d, 0x65, + 0xe6, 0xd4, 0x2c, 0xbf, 0x48, 0x4e, 0x46, 0x2c, 0xbb, 0x9e, 0xc3, 0xc3, + 0x71, 0xbb, 0xf1, 0x9f, 0xe3, 0x9d, 0x65, 0xff, 0xff, 0x67, 0x9c, 0x4e, + 0x61, 0xae, 0x40, 0x82, 0x89, 0xbd, 0x0b, 0x2d, 0x0b, 0x2f, 0xff, 0xd1, + 0xaf, 0x41, 0xf7, 0x43, 0x05, 0x13, 0x7a, 0x16, 0x5f, 0x9b, 0x53, 0x47, + 0xb4, 0x8c, 0xc0, 0x32, 0x90, 0x85, 0x49, 0x70, 0x9b, 0x08, 0xba, 0x8d, + 0x18, 0xf0, 0x8a, 0x01, 0x91, 0x13, 0xfd, 0xb8, 0x25, 0x82, 0x43, 0xd6, + 0xfd, 0x37, 0xa2, 0x7c, 0x59, 0x6f, 0x2c, 0xa9, 0x1b, 0xa1, 0x94, 0xdb, + 0x69, 0x2c, 0xbf, 0xf7, 0xfc, 0xf2, 0xfc, 0xc5, 0x07, 0x59, 0x79, 0x87, + 0x8b, 0x2f, 0xfc, 0xe4, 0x0d, 0x83, 0x0b, 0xea, 0x4b, 0x2f, 0x98, 0xa7, + 0x85, 0x97, 0x67, 0x16, 0x5d, 0xa8, 0x59, 0x5e, 0x35, 0x9f, 0x16, 0xbf, + 0xe2, 0x83, 0xb1, 0x61, 0xe1, 0x65, 0xff, 0xb5, 0xa6, 0x9b, 0x98, 0x6b, + 0x69, 0x65, 0xef, 0x34, 0x96, 0x5c, 0xd0, 0xb2, 0xe6, 0x1e, 0x23, 0x1e, + 0x62, 0x1e, 0x1a, 0xfd, 0x00, 0xc1, 0xca, 0xdc, 0x4e, 0xab, 0x48, 0x05, + 0x18, 0xa5, 0xfc, 0x31, 0xc4, 0xdf, 0xc5, 0x97, 0xff, 0x17, 0xf9, 0xe7, + 0x96, 0xcc, 0xeb, 0xeb, 0x28, 0x54, 0x55, 0x93, 0x02, 0xf2, 0x3f, 0xc8, + 0xf1, 0x58, 0xe4, 0x25, 0xd7, 0xfc, 0xfb, 0x93, 0x72, 0x3c, 0xfb, 0x8b, + 0x2f, 0xf8, 0x48, 0x98, 0x48, 0xd3, 0xcc, 0xb2, 0xfd, 0xcc, 0xcf, 0xe2, + 0xcb, 0xd0, 0x53, 0xac, 0xbe, 0x6f, 0x31, 0xd6, 0x53, 0x1b, 0xd9, 0x87, + 0x2f, 0xfd, 0xfe, 0x0a, 0x44, 0x83, 0x3c, 0x12, 0x59, 0x5d, 0x23, 0x27, + 0xcc, 0x64, 0x43, 0x7b, 0x9f, 0x65, 0x97, 0x4c, 0x15, 0x97, 0x47, 0x70, + 0x6d, 0x08, 0x72, 0xff, 0xa3, 0xfe, 0x70, 0x3f, 0x5c, 0x59, 0x43, 0x3e, + 0x42, 0x2b, 0xbf, 0xfb, 0x27, 0x79, 0xb6, 0x7a, 0x39, 0xc7, 0x59, 0x7f, + 0xf0, 0x5d, 0xa5, 0x05, 0xde, 0x75, 0xf5, 0x97, 0xc4, 0x17, 0xef, 0x62, + 0x22, 0xf8, 0x8f, 0x71, 0xd9, 0x65, 0xff, 0x03, 0x67, 0x9b, 0xb0, 0xe8, + 0x0b, 0x2f, 0xef, 0xf9, 0xb6, 0x17, 0x4b, 0x2f, 0x6e, 0xc6, 0xe2, 0xca, + 0xd2, 0x23, 0xc8, 0xf7, 0x74, 0xc2, 0xed, 0xf0, 0xb2, 0xf4, 0xc1, 0xd2, + 0xcb, 0xd8, 0xdf, 0x59, 0x7f, 0xcd, 0xac, 0xe8, 0x59, 0x86, 0x18, 0xb2, + 0xbc, 0x7b, 0x4e, 0x37, 0x42, 0x94, 0xe2, 0x22, 0x14, 0xac, 0x64, 0xe3, + 0x1c, 0x78, 0xbf, 0xfe, 0x28, 0x96, 0xc1, 0x3e, 0xc4, 0x19, 0x67, 0x16, + 0x5f, 0xff, 0xbc, 0x1e, 0x1e, 0x3a, 0xef, 0xcc, 0x72, 0x69, 0xd6, 0x5f, + 0xff, 0xf9, 0xf7, 0x0b, 0x18, 0x8b, 0x01, 0x9f, 0x83, 0xb7, 0xfc, 0xcb, + 0x28, 0x6b, 0xb4, 0x19, 0x18, 0x2f, 0x70, 0xc8, 0x3c, 0x2b, 0x3d, 0x1e, + 0x20, 0x14, 0x78, 0xa2, 0x15, 0x8b, 0xb8, 0x15, 0x97, 0xf7, 0x98, 0xfd, + 0xb0, 0xd6, 0x5e, 0x03, 0x9d, 0x65, 0xd8, 0x05, 0x95, 0x06, 0xcb, 0x07, + 0x2f, 0x3e, 0x1d, 0x65, 0x4e, 0x8b, 0x1c, 0x17, 0x26, 0x0d, 0xd1, 0xfb, + 0xff, 0x9c, 0x4f, 0x44, 0xb9, 0xad, 0x67, 0x4b, 0x2c, 0x52, 0x44, 0x2f, + 0x8f, 0xef, 0xa3, 0xc1, 0xd2, 0xcb, 0xfb, 0x85, 0x83, 0x27, 0x59, 0x44, + 0x79, 0xa6, 0x11, 0x5d, 0xdb, 0x2c, 0xbf, 0x14, 0x4f, 0x1d, 0x2c, 0xbf, + 0x9f, 0x47, 0x0e, 0x80, 0xb2, 0xed, 0x01, 0x65, 0x48, 0xf1, 0x58, 0xba, + 0xdc, 0xed, 0x14, 0xac, 0x2e, 0xed, 0xb5, 0x09, 0xb8, 0xb3, 0xab, 0xc3, + 0x1e, 0xfb, 0x85, 0x13, 0xac, 0xbf, 0xe9, 0xdf, 0xce, 0x32, 0x7e, 0xd6, + 0x56, 0x8f, 0x6c, 0x88, 0xaf, 0xff, 0x8c, 0xce, 0xf9, 0x9f, 0x9b, 0x0d, + 0x2c, 0x02, 0xca, 0xc3, 0xf3, 0x62, 0x1b, 0xfe, 0x23, 0x7c, 0xed, 0xf7, + 0x3a, 0xcb, 0xfe, 0xc3, 0x33, 0x5d, 0xbb, 0xf6, 0xa8, 0xc3, 0x97, 0xff, + 0x07, 0x83, 0xf3, 0x9f, 0xa9, 0x31, 0x2c, 0xbf, 0x7f, 0xce, 0x40, 0x59, + 0x53, 0xa2, 0xcf, 0xc8, 0xee, 0x8b, 0x7f, 0xe7, 0xfe, 0x4c, 0xf0, 0x51, + 0x32, 0xcb, 0xff, 0x79, 0xb0, 0x4c, 0x98, 0xc8, 0xe9, 0x65, 0x9b, 0x13, + 0x99, 0xd4, 0x3a, 0xfc, 0x61, 0xc3, 0xdb, 0xbb, 0xed, 0x51, 0x82, 0x2a, + 0x4a, 0x89, 0xbb, 0x8e, 0xe4, 0x08, 0xf7, 0xf1, 0x47, 0xf8, 0xdb, 0xd6, + 0x5f, 0xed, 0xab, 0x83, 0x2c, 0xf0, 0xa5, 0x65, 0xd8, 0x4b, 0x29, 0x65, + 0xff, 0xd0, 0x5d, 0xe7, 0xfc, 0xda, 0x07, 0x6b, 0x28, 0x8f, 0x43, 0xe1, + 0x77, 0xcd, 0xcf, 0x32, 0xcb, 0xd9, 0xd7, 0xd6, 0x50, 0xcd, 0xf1, 0xc8, + 0x6f, 0xe6, 0x2c, 0xff, 0x99, 0x65, 0xa3, 0x0f, 0x33, 0x84, 0x34, 0x34, + 0xcd, 0xb1, 0x94, 0x30, 0xab, 0xbf, 0xfd, 0xe6, 0x9b, 0xcd, 0xd7, 0xcb, + 0x37, 0xba, 0xcb, 0xc3, 0x79, 0x96, 0x5f, 0xf3, 0x6f, 0xf6, 0x6b, 0x4d, + 0xbd, 0x65, 0x41, 0xec, 0xf8, 0x76, 0xe8, 0x02, 0xcb, 0xfe, 0xe4, 0x1b, + 0xc0, 0x8f, 0xcc, 0xb2, 0xec, 0x29, 0x8f, 0x43, 0xe2, 0xd7, 0xf1, 0xf9, + 0xc7, 0x29, 0xd6, 0x5c, 0x73, 0xac, 0xa8, 0x3c, 0x57, 0x2e, 0xbf, 0x37, + 0x9d, 0xa7, 0x59, 0x74, 0x6e, 0x2c, 0xb8, 0x1c, 0x91, 0xe0, 0x31, 0x3d, + 0xf7, 0x30, 0xbe, 0xb2, 0xf6, 0xec, 0x69, 0x65, 0x31, 0xf6, 0xb9, 0x68, + 0x48, 0x6f, 0x79, 0xfe, 0xb2, 0xf7, 0xdf, 0x71, 0x65, 0xfe, 0xff, 0x98, + 0x58, 0x1d, 0x96, 0x5f, 0xe3, 0x7d, 0x12, 0x0b, 0xe9, 0x65, 0x89, 0x65, + 0x31, 0xe2, 0x04, 0xd2, 0xe1, 0x31, 0x65, 0x42, 0xea, 0x14, 0xe5, 0xc3, + 0x8d, 0xcb, 0xb3, 0x59, 0xa1, 0x4a, 0x77, 0x1f, 0x39, 0x14, 0x33, 0x78, + 0x5b, 0xf1, 0xc0, 0x8f, 0xed, 0xbc, 0x08, 0x43, 0x7a, 0x6c, 0xdc, 0x59, + 0x7e, 0x34, 0x0d, 0x37, 0x16, 0x5f, 0x79, 0x9e, 0x4b, 0x2f, 0x0d, 0xe4, + 0xb2, 0xa0, 0xde, 0xe1, 0x0d, 0xfe, 0xf3, 0xcd, 0xb3, 0xb8, 0x1a, 0xcb, + 0x06, 0x11, 0x7a, 0x06, 0x7e, 0x0f, 0xdf, 0xde, 0x89, 0x78, 0x23, 0x59, + 0x7f, 0xfb, 0x61, 0x3f, 0xe3, 0x41, 0x96, 0xa2, 0x4b, 0x2f, 0xd1, 0xff, + 0x44, 0xcb, 0x2e, 0xff, 0x16, 0x5f, 0x9c, 0xd3, 0x23, 0x4b, 0x2a, 0x48, + 0xe1, 0x62, 0xef, 0x25, 0xb9, 0x41, 0x0b, 0xdf, 0xe6, 0x2f, 0xcb, 0x35, + 0x8b, 0x2f, 0xfe, 0x6e, 0xcb, 0x0f, 0x13, 0x0e, 0x27, 0x59, 0x7f, 0xf4, + 0x8b, 0x0e, 0xe5, 0x9e, 0x73, 0xac, 0xbf, 0xd9, 0xf8, 0xde, 0xc4, 0x05, + 0x97, 0xff, 0xc0, 0x3b, 0xca, 0x58, 0x01, 0x3f, 0x3f, 0x02, 0xb2, 0xbb, + 0x44, 0x36, 0x8c, 0xef, 0xfc, 0x27, 0x5b, 0x23, 0x64, 0xc5, 0x07, 0x59, + 0x7f, 0xb5, 0x0c, 0x32, 0x79, 0x2c, 0xbf, 0xf6, 0x98, 0xbb, 0x2c, 0x9f, + 0x0c, 0x59, 0x7f, 0xd9, 0xbe, 0x33, 0xae, 0xbe, 0x2a, 0x96, 0x5f, 0xa3, + 0xfc, 0xc2, 0xd8, 0x8b, 0x2d, 0x18, 0xf8, 0xfe, 0x86, 0x9a, 0x20, 0x61, + 0xef, 0x7e, 0xef, 0xdd, 0x3e, 0xe2, 0xcb, 0xfd, 0xc8, 0x91, 0xa6, 0xe6, + 0xe2, 0xcb, 0xff, 0x0c, 0x83, 0xfe, 0x41, 0x47, 0x16, 0x54, 0x1f, 0xab, + 0x1c, 0x58, 0x56, 0xb2, 0xa4, 0xae, 0x97, 0xb3, 0x1e, 0x91, 0x5a, 0x18, + 0xe5, 0x1b, 0x40, 0x4a, 0x77, 0xc2, 0x88, 0xc2, 0x0b, 0xde, 0x63, 0x56, + 0x5f, 0xfe, 0x68, 0xf9, 0x67, 0xfd, 0x8d, 0x2d, 0xeb, 0x2f, 0xfb, 0xae, + 0x01, 0xc8, 0x73, 0x05, 0x65, 0xff, 0x6b, 0x37, 0xe0, 0xf4, 0x46, 0x2c, + 0xa6, 0x3f, 0x67, 0x3b, 0xbf, 0xff, 0x04, 0xa5, 0x85, 0xf6, 0xdb, 0xcf, + 0x93, 0xc9, 0x65, 0xfe, 0x80, 0x47, 0xb3, 0xa9, 0x2c, 0xa6, 0x44, 0x41, + 0x2a, 0xd7, 0x93, 0x88, 0x04, 0x2f, 0xff, 0x0a, 0x8b, 0xe9, 0x9e, 0x67, + 0x59, 0x7c, 0xff, 0x0c, 0x96, 0x5d, 0x1c, 0x59, 0x5b, 0x0f, 0x6c, 0x88, + 0xfe, 0x45, 0x7f, 0xde, 0x72, 0xc9, 0xa5, 0x1d, 0x2c, 0xbf, 0xfb, 0xcd, + 0xac, 0xe1, 0x66, 0xff, 0x32, 0xcb, 0xf1, 0x67, 0x03, 0xb3, 0x0f, 0xf6, + 0x63, 0x9b, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x03, 0x2f, 0xe7, 0x9c, 0x0e, + 0x43, 0x45, 0x60, 0xf5, 0xec, 0xe0, 0x70, 0xfc, 0x76, 0xcd, 0xaf, 0x79, + 0xe5, 0xb1, 0x1c, 0xc5, 0x0b, 0x1b, 0xfe, 0xf3, 0x61, 0x67, 0x63, 0xc5, + 0x95, 0xda, 0xe1, 0xf9, 0xe3, 0xa5, 0x28, 0x4b, 0x7e, 0x39, 0x3d, 0xe7, + 0x57, 0xbe, 0x18, 0x59, 0x7f, 0xfb, 0xcd, 0xfc, 0xc3, 0xf2, 0x30, 0x6c, + 0xb2, 0xee, 0x71, 0x65, 0xf0, 0xfc, 0xe7, 0x59, 0x7f, 0xd9, 0x38, 0x92, + 0x68, 0xeb, 0xeb, 0x2c, 0x0e, 0xd1, 0x77, 0xa4, 0x77, 0x17, 0x22, 0x2b, + 0xfc, 0x0f, 0xb4, 0xe7, 0x8e, 0xd6, 0x57, 0x49, 0xa7, 0x3c, 0x35, 0xc9, + 0x0a, 0xfc, 0x3d, 0xa1, 0xc7, 0xb4, 0x2c, 0xbf, 0xbb, 0xeb, 0xdd, 0x3e, + 0xe2, 0xcb, 0xf3, 0xeb, 0xf9, 0xda, 0xcb, 0xe1, 0xb4, 0x4e, 0xb2, 0xd1, + 0xa3, 0xca, 0x09, 0x45, 0xff, 0xcc, 0x3d, 0x99, 0x9d, 0x01, 0xcb, 0xeb, + 0x2d, 0x29, 0x1f, 0x67, 0x09, 0xea, 0x13, 0x12, 0x78, 0x75, 0x54, 0x32, + 0x04, 0xf2, 0x73, 0x15, 0xa3, 0xae, 0x73, 0x50, 0xc6, 0x89, 0x73, 0x49, + 0x65, 0xfd, 0xd7, 0xc7, 0x98, 0x6a, 0xcb, 0xfb, 0xcd, 0xfe, 0x67, 0xd6, + 0x5f, 0x64, 0xcc, 0x75, 0x94, 0x34, 0x4a, 0x60, 0xb7, 0x65, 0xe2, 0x16, + 0xda, 0x16, 0x5f, 0x41, 0x30, 0x16, 0x5b, 0x3c, 0x6c, 0x3e, 0x21, 0x7f, + 0xb4, 0x4e, 0x60, 0x9d, 0x18, 0xb2, 0xe0, 0x6f, 0x59, 0x7e, 0xff, 0x83, + 0x38, 0x56, 0x50, 0xcf, 0xeb, 0xc6, 0xe1, 0x19, 0xbf, 0xfc, 0xc0, 0xef, + 0xcd, 0xe2, 0x8c, 0xd6, 0x2c, 0xbf, 0xc3, 0xea, 0x59, 0x85, 0x3a, 0xcb, + 0xff, 0x4a, 0x37, 0x33, 0x5f, 0xe4, 0x49, 0x65, 0xff, 0x74, 0x38, 0xe3, + 0x0f, 0xd0, 0xb2, 0xff, 0x37, 0xf8, 0xfd, 0x00, 0xc5, 0x97, 0x6a, 0x75, + 0x46, 0x0a, 0xaf, 0x1e, 0xd3, 0x9a, 0xdf, 0xf9, 0xf5, 0x84, 0x0e, 0x7f, + 0x9d, 0x2c, 0xbf, 0xff, 0xff, 0xb3, 0xfe, 0x72, 0x37, 0x67, 0x34, 0xef, + 0xfd, 0xf8, 0x3d, 0x98, 0x77, 0x2e, 0xa4, 0xb8, 0x82, 0xd7, 0xfe, 0x77, + 0x37, 0xb7, 0x1e, 0xc3, 0x4c, 0x5c, 0x41, 0x6b, 0xff, 0xbc, 0xde, 0x68, + 0x2f, 0xec, 0x34, 0xc5, 0xc4, 0x16, 0xbf, 0xd0, 0xc5, 0xfd, 0x86, 0x98, + 0xb8, 0x82, 0xd7, 0xf1, 0xf0, 0x7b, 0x0d, 0x31, 0x71, 0x05, 0xaf, 0xff, + 0xf9, 0xc8, 0x98, 0xfb, 0x39, 0xdf, 0x9b, 0x4c, 0x6c, 0xf8, 0x62, 0xe2, + 0x0b, 0x5d, 0xd6, 0xc1, 0xa7, 0x3d, 0xda, 0x8e, 0x95, 0x1d, 0x0c, 0x8f, + 0xea, 0x15, 0x68, 0xf8, 0xfc, 0xa5, 0x1c, 0xdf, 0xe6, 0x83, 0x79, 0xfe, + 0x74, 0xb2, 0xf9, 0xf4, 0x07, 0x59, 0x7f, 0xf7, 0x9b, 0xcd, 0x05, 0xfd, + 0x86, 0x98, 0xb8, 0x82, 0xd7, 0xfd, 0x37, 0x3b, 0x69, 0xf6, 0x1a, 0x62, + 0xe2, 0x0b, 0x5f, 0xbf, 0xc8, 0x3e, 0xce, 0xd1, 0x44, 0x22, 0xa5, 0xff, + 0xed, 0x9d, 0xf9, 0xbb, 0x8f, 0xf3, 0x61, 0xa6, 0x2e, 0x20, 0xb5, 0xff, + 0xff, 0xc4, 0x4c, 0x7d, 0x81, 0xcd, 0x9c, 0xef, 0xcd, 0xa6, 0x36, 0x7c, + 0x31, 0x71, 0x05, 0xab, 0x13, 0x29, 0xe9, 0x11, 0xd8, 0x2f, 0xfb, 0xcd, + 0xa6, 0x36, 0x7c, 0x31, 0x71, 0x05, 0xaf, 0xff, 0x9d, 0xfa, 0x97, 0x3c, + 0xc3, 0x1c, 0x6a, 0x12, 0x5f, 0xfb, 0x25, 0x20, 0xf3, 0x45, 0x3e, 0xda, + 0xe2, 0x0b, 0x57, 0x68, 0xe7, 0xd2, 0x47, 0x13, 0xef, 0xfd, 0xdb, 0x6b, + 0xee, 0x0e, 0x6c, 0x31, 0x71, 0x05, 0xaf, 0xef, 0x37, 0xbc, 0xc0, 0x54, + 0x01, 0x6b, 0xf6, 0x03, 0x61, 0xa6, 0x2e, 0x20, 0xb5, 0xd9, 0xfe, 0xcf, + 0xcf, 0xc7, 0x55, 0xd2, 0x3c, 0x79, 0x0c, 0x3b, 0xf8, 0xf8, 0x3d, 0x86, + 0x98, 0xb8, 0x82, 0xd7, 0xfe, 0xef, 0xcd, 0xa6, 0x36, 0x7c, 0x31, 0x71, + 0x05, 0xae, 0xcd, 0x8e, 0x88, 0xee, 0x1f, 0xdf, 0xe0, 0xb1, 0xdc, 0xba, + 0x92, 0xe2, 0x0b, 0x5f, 0xfb, 0x1b, 0x7e, 0x16, 0x0d, 0xe4, 0xb8, 0x82, + 0xc7, 0x3c, 0x0a, 0x1a, 0xf0, 0x96, 0x8d, 0xc0, 0x6a, 0x51, 0xf6, 0x72, + 0x31, 0x7f, 0xc6, 0x44, 0x18, 0x5b, 0x98, 0xdf, 0x70, 0x21, 0x51, 0x05, + 0x85, 0xa2, 0x2e, 0xe7, 0xed, 0x65, 0x0d, 0x94, 0xe1, 0xdc, 0x24, 0xc1, + 0x49, 0x8f, 0xf9, 0xbd, 0x63, 0x2c, 0xd6, 0x63, 0x4e, 0x52, 0xac, 0x6e, + 0x96, 0xea, 0xcb, 0xd1, 0x2d, 0xd5, 0x95, 0x06, 0xe4, 0x86, 0xaa, 0x76, + 0x6a, 0x78, 0xdb, 0xba, 0x85, 0x06, 0x8b, 0xc1, 0x4b, 0x7d, 0x27, 0x6b, + 0xff, 0x48, 0xb3, 0xfe, 0x6c, 0xeb, 0xeb, 0x2f, 0xe2, 0x97, 0x3f, 0xe8, + 0x59, 0x58, 0x7d, 0x6c, 0x7d, 0x7f, 0xa3, 0xcc, 0x67, 0x52, 0xe2, 0xcb, + 0xf4, 0x7f, 0x9e, 0x65, 0x97, 0xfe, 0xd6, 0x1b, 0xec, 0x38, 0x75, 0x3a, + 0xcb, 0xfe, 0xe8, 0xb1, 0x8f, 0x84, 0x05, 0x97, 0xff, 0xff, 0xe7, 0x98, + 0x9c, 0xcc, 0xde, 0xdc, 0xf6, 0x03, 0x6f, 0x3f, 0xc7, 0x3e, 0x75, 0xf5, + 0x97, 0xe9, 0x7f, 0x98, 0x4b, 0x2f, 0xff, 0x3f, 0x70, 0x43, 0x2c, 0xdf, + 0xa6, 0xe2, 0xcb, 0xff, 0x72, 0x69, 0x04, 0x73, 0x48, 0x23, 0x59, 0x53, + 0xaa, 0x10, 0x91, 0xa8, 0xc9, 0xf1, 0x04, 0xd3, 0x7e, 0xa1, 0x11, 0xe2, + 0x7f, 0xa5, 0x5f, 0xf6, 0x7c, 0xcc, 0x21, 0xfa, 0x16, 0x5f, 0xfd, 0x1d, + 0x48, 0x43, 0xf3, 0xf1, 0xd1, 0x8b, 0x2f, 0xd2, 0xdd, 0xdd, 0x0c, 0xeb, + 0x2d, 0xe6, 0x3f, 0x97, 0x49, 0xbe, 0xf9, 0x41, 0xd6, 0x5f, 0xb5, 0x1d, + 0x4b, 0x8b, 0x2a, 0x74, 0xc8, 0x65, 0x0b, 0x16, 0x26, 0xd1, 0x0d, 0xff, + 0x41, 0xbe, 0xc2, 0x2c, 0xe9, 0x65, 0xe3, 0xbf, 0xd6, 0x5c, 0xfc, 0x59, + 0x7a, 0x4d, 0xf5, 0x97, 0xff, 0xbe, 0xc4, 0x19, 0x67, 0x01, 0xff, 0xf4, + 0xb2, 0xc5, 0x31, 0xf3, 0x88, 0x39, 0x7f, 0xdc, 0x7e, 0xb6, 0xc3, 0xe6, + 0xd2, 0xcb, 0xfb, 0x34, 0x03, 0xb7, 0x16, 0x5c, 0x1e, 0x7c, 0xfa, 0xb6, + 0xcf, 0x6f, 0x66, 0x8d, 0x59, 0x7f, 0xf6, 0xfd, 0xf1, 0xc7, 0xf7, 0x52, + 0xcf, 0xac, 0xac, 0x4c, 0xa8, 0x10, 0x93, 0xdb, 0x31, 0x10, 0x76, 0xfe, + 0x0c, 0xd0, 0x5c, 0x65, 0x97, 0xf8, 0x84, 0xcd, 0x14, 0x1d, 0x65, 0xfc, + 0x1f, 0x94, 0x7f, 0x8b, 0x2b, 0x0f, 0x7c, 0x06, 0x55, 0x25, 0x56, 0xc6, + 0x8e, 0x02, 0x3a, 0x72, 0x46, 0xe4, 0x23, 0x2a, 0x17, 0x48, 0xf2, 0x39, + 0xbe, 0x90, 0xde, 0x57, 0x75, 0xe3, 0xb7, 0x16, 0x5f, 0xa5, 0x1b, 0xdf, + 0xcb, 0x2a, 0x73, 0xc5, 0x71, 0xcb, 0xff, 0xb3, 0xaf, 0xf1, 0x8a, 0x00, + 0xe7, 0x59, 0x7d, 0xbb, 0x99, 0x3a, 0xcb, 0xff, 0xf6, 0x7f, 0xcd, 0xb0, + 0xd7, 0xd8, 0x58, 0x63, 0x81, 0x65, 0xf1, 0xc7, 0x87, 0x59, 0x7f, 0xfb, + 0xc3, 0x13, 0xed, 0xe2, 0xcf, 0xc0, 0x16, 0x5f, 0xf6, 0xf6, 0x21, 0x87, + 0xd8, 0x75, 0x97, 0xf3, 0xf9, 0xb9, 0x12, 0x59, 0x5b, 0x11, 0xa5, 0x04, + 0x58, 0x95, 0xc3, 0xab, 0xff, 0x0a, 0xf0, 0x8b, 0x04, 0x82, 0x02, 0xcb, + 0xfd, 0x9e, 0x6e, 0x30, 0x64, 0xb2, 0xa7, 0x54, 0x85, 0xe4, 0x32, 0x25, + 0xfc, 0x65, 0x61, 0x3d, 0xdd, 0x40, 0xbe, 0xeb, 0x91, 0xd2, 0xcb, 0xff, + 0x4b, 0x3a, 0x96, 0xa3, 0xef, 0xf5, 0x97, 0x8f, 0x12, 0x59, 0x7e, 0xc1, + 0xf8, 0x26, 0x2c, 0xad, 0x88, 0xa8, 0x98, 0x91, 0xcf, 0xc8, 0x72, 0xff, + 0xbb, 0xf3, 0x0f, 0xd1, 0xfe, 0x2c, 0xbc, 0x37, 0xfa, 0xcb, 0xff, 0xf7, + 0xff, 0x93, 0x4b, 0x27, 0xd9, 0xd4, 0x14, 0x71, 0x65, 0xff, 0xef, 0xe4, + 0xd2, 0xc9, 0xfa, 0x82, 0x8e, 0x2c, 0xbc, 0x51, 0xd6, 0xc4, 0x52, 0x7d, + 0x66, 0xff, 0xdc, 0x82, 0x89, 0x7f, 0xd8, 0x4b, 0x2b, 0x49, 0xd5, 0x1c, + 0xf9, 0xce, 0x81, 0x0c, 0x0e, 0x1b, 0x5e, 0x6d, 0xbc, 0x59, 0x79, 0xba, + 0xfa, 0xcb, 0xde, 0x9d, 0x96, 0x5d, 0x86, 0x70, 0xdd, 0x04, 0x76, 0xff, + 0xda, 0x27, 0x31, 0xf5, 0xac, 0xe9, 0x65, 0xe2, 0x63, 0x56, 0x5f, 0xdc, + 0x61, 0xe1, 0x9c, 0x59, 0x7f, 0x3e, 0x9c, 0x6d, 0x8b, 0x2e, 0xd0, 0x16, + 0x5d, 0x86, 0x2c, 0xa7, 0x35, 0xdf, 0x17, 0xa8, 0x4e, 0x1e, 0x75, 0x81, + 0x96, 0xe1, 0xff, 0x43, 0x9e, 0x2e, 0xfa, 0xcd, 0xe3, 0xbb, 0x2c, 0xae, + 0x91, 0x00, 0x06, 0x5b, 0xe3, 0x33, 0xce, 0xb2, 0xf8, 0xdd, 0x31, 0x8b, + 0x2f, 0xd3, 0xbf, 0xa3, 0x71, 0x65, 0xff, 0x1b, 0x85, 0x12, 0xfe, 0x76, + 0xb2, 0xfd, 0x3f, 0xf6, 0xf3, 0xeb, 0x2b, 0x6a, 0x45, 0xa6, 0x12, 0x31, + 0x58, 0x4e, 0x6f, 0xe3, 0x7d, 0x1d, 0x7f, 0x16, 0x5f, 0xe2, 0xc1, 0xfa, + 0x0c, 0x25, 0x95, 0x07, 0xc3, 0xa2, 0xfb, 0xff, 0xfd, 0xa8, 0xf4, 0x6b, + 0x51, 0x3f, 0xdd, 0xcd, 0xce, 0xbe, 0xb2, 0xa1, 0x93, 0x19, 0x92, 0x99, + 0x1a, 0x55, 0xa3, 0xca, 0x56, 0x01, 0x21, 0x43, 0x58, 0x30, 0xa1, 0x10, + 0x86, 0xf8, 0xa6, 0xe6, 0x2c, 0xbf, 0x4b, 0x27, 0xfc, 0x2c, 0xbf, 0xff, + 0xa3, 0xe2, 0x4e, 0x3c, 0xfc, 0x6f, 0x6f, 0x82, 0x24, 0xb2, 0xff, 0xd1, + 0x39, 0xfc, 0xda, 0xd3, 0xc9, 0x65, 0x4e, 0x89, 0xd2, 0x5e, 0xa5, 0x94, + 0xc9, 0x8a, 0xcc, 0x44, 0x50, 0xc5, 0xdb, 0x23, 0xbf, 0xd3, 0xcf, 0x05, + 0xd6, 0x7d, 0x65, 0xf8, 0x79, 0x85, 0xda, 0xcb, 0xf7, 0x5f, 0x27, 0xf2, + 0xcb, 0xa2, 0x65, 0x95, 0x39, 0xf3, 0x48, 0x9c, 0x05, 0x15, 0x89, 0x88, + 0x32, 0x28, 0x61, 0x37, 0x7f, 0xf6, 0x88, 0x3d, 0x7c, 0xb2, 0x77, 0x25, + 0x97, 0xff, 0xf0, 0xfc, 0x19, 0xdb, 0x35, 0xac, 0x8e, 0xa4, 0xc7, 0x59, + 0x7f, 0x9e, 0x62, 0x0f, 0xca, 0x16, 0x5f, 0xc3, 0x13, 0xff, 0x63, 0x16, + 0x5c, 0x53, 0x2c, 0xa7, 0x3c, 0x70, 0x98, 0x5d, 0xe3, 0x56, 0x5f, 0xf7, + 0xa3, 0xa2, 0xc1, 0xbc, 0x96, 0x5e, 0x7d, 0x4e, 0xb2, 0xe0, 0x42, 0xcb, + 0xe6, 0x83, 0xe2, 0xca, 0x59, 0x7f, 0x39, 0xbf, 0x8d, 0x01, 0x65, 0x0c, + 0xdc, 0x90, 0x5d, 0xff, 0xfe, 0x86, 0x19, 0x40, 0x7b, 0xfe, 0x76, 0x38, + 0xec, 0x43, 0xac, 0xb8, 0x10, 0xb2, 0xe8, 0x35, 0x65, 0xff, 0x67, 0xf9, + 0x07, 0x13, 0x26, 0x59, 0x7f, 0xb9, 0x9e, 0x6e, 0x06, 0x75, 0x97, 0x18, + 0x62, 0x4b, 0xfe, 0x2c, 0xde, 0xf2, 0xe3, 0x0d, 0x65, 0x76, 0x9f, 0xe3, + 0x0e, 0xe8, 0x58, 0xeb, 0x3e, 0x20, 0x03, 0x18, 0xac, 0x58, 0x85, 0xf8, + 0x74, 0x61, 0xa0, 0x83, 0x37, 0x8c, 0x30, 0xc4, 0x96, 0x3a, 0x41, 0x66, + 0x82, 0xf3, 0xbe, 0x92, 0x0b, 0x47, 0x08, 0x90, 0xbe, 0xa1, 0xab, 0x6f, + 0xec, 0x62, 0x69, 0x62, 0xb5, 0x3a, 0xe7, 0x27, 0x68, 0x9d, 0x2e, 0x79, + 0xe5, 0xe5, 0xc8, 0x5f, 0xdf, 0x8c, 0xf6, 0x4e, 0xb2, 0xec, 0x3a, 0xca, + 0xe8, 0xf0, 0xf8, 0x5b, 0x7f, 0xef, 0x79, 0xdb, 0xf1, 0x85, 0x32, 0xcb, + 0x71, 0x65, 0x61, 0xe7, 0x31, 0xed, 0x0a, 0x5f, 0x4b, 0x56, 0x27, 0x35, + 0x67, 0x86, 0x5c, 0xa5, 0x75, 0x0d, 0x87, 0x27, 0x77, 0xcd, 0x96, 0x63, + 0xd4, 0xb2, 0x76, 0x9d, 0x7b, 0x9a, 0x19, 0x5a, 0x86, 0xe9, 0xe3, 0x16, + 0xf5, 0x2f, 0xfd, 0xe9, 0xc8, 0x20, 0x86, 0xa9, 0x4f, 0xa9, 0xf2, 0x94, + 0x39, 0xf9, 0x56, 0xa1, 0x9d, 0x18, 0xdf, 0x09, 0x9d, 0xb7, 0x1b, 0x84, + 0xfa, 0xcb, 0xfb, 0x00, 0x06, 0xd4, 0x96, 0x5e, 0xf0, 0x4d, 0x59, 0x77, + 0x78, 0xb2, 0x86, 0x7c, 0x4c, 0x5a, 0xe3, 0xd7, 0xfe, 0x83, 0xed, 0xbc, + 0xf8, 0x36, 0x31, 0x65, 0xd8, 0x62, 0xcb, 0xa3, 0xeb, 0x2a, 0x73, 0x5b, + 0xd8, 0xbd, 0x8e, 0xb2, 0xa4, 0x8a, 0x3c, 0x6f, 0xf9, 0x1d, 0xfe, 0x93, + 0x16, 0x1c, 0x3e, 0x59, 0x7e, 0xf3, 0xb1, 0x3a, 0xcb, 0xff, 0x67, 0xf9, + 0xe6, 0x3b, 0xe6, 0x96, 0x5d, 0x83, 0x59, 0x50, 0x8a, 0xa3, 0x4c, 0x88, + 0x97, 0x79, 0xed, 0xfb, 0x36, 0x60, 0x3e, 0xb2, 0xfb, 0x67, 0xe3, 0x7a, + 0xcb, 0xf6, 0x77, 0x07, 0x65, 0x97, 0xd8, 0x7c, 0xfa, 0xcb, 0xfb, 0xd0, + 0x23, 0x44, 0xeb, 0x2f, 0xf9, 0xb7, 0xeb, 0x26, 0xce, 0xbe, 0xb2, 0xbb, + 0x3e, 0xaf, 0x17, 0x5c, 0xe6, 0xac, 0xad, 0x1b, 0xaf, 0x91, 0xdf, 0x39, + 0xde, 0x65, 0x97, 0xff, 0xa6, 0x69, 0xb6, 0x37, 0x5c, 0x71, 0x18, 0xeb, + 0x2f, 0xcd, 0x06, 0x44, 0xcb, 0x2f, 0xf6, 0xcf, 0x38, 0x00, 0xde, 0x59, + 0x7c, 0xff, 0xeb, 0x8b, 0x2a, 0x11, 0x9e, 0xc9, 0xee, 0x50, 0x46, 0xb7, + 0xff, 0xfe, 0x79, 0x83, 0x20, 0xf7, 0xb3, 0xcd, 0xff, 0xc7, 0x51, 0x3c, + 0x71, 0x65, 0xf8, 0x9f, 0x72, 0x79, 0x96, 0x5f, 0x4d, 0xc8, 0xfa, 0xca, + 0xed, 0x18, 0x33, 0x39, 0x04, 0xb2, 0xc6, 0x2c, 0xbf, 0xff, 0xc4, 0xef, + 0xbe, 0x25, 0xe8, 0xd4, 0xf1, 0xfe, 0x3c, 0x96, 0x5f, 0xd1, 0xdf, 0xf8, + 0xfd, 0x2c, 0xbe, 0xf6, 0x3c, 0xeb, 0x2f, 0xb0, 0xef, 0xd2, 0xca, 0xdc, + 0x46, 0xa1, 0x30, 0xf0, 0xbc, 0x42, 0x2b, 0xcd, 0xd4, 0xcb, 0x2f, 0x82, + 0x2b, 0x3b, 0x2c, 0xbf, 0x66, 0x4e, 0x1e, 0x2c, 0xbe, 0xd1, 0x30, 0x16, + 0x5f, 0x37, 0x6f, 0xa5, 0x97, 0x40, 0x16, 0x5f, 0x06, 0x70, 0x8b, 0xf1, + 0xb8, 0x10, 0x8a, 0x99, 0x12, 0xde, 0x59, 0xb0, 0x16, 0x5d, 0x9d, 0xac, + 0xbf, 0x66, 0xb4, 0xda, 0x59, 0x5b, 0x87, 0x9f, 0xe1, 0x10, 0x0b, 0xdf, + 0x47, 0x59, 0xda, 0xcb, 0xf0, 0x8d, 0x1c, 0x75, 0x94, 0xe7, 0x94, 0x12, + 0x3b, 0xfe, 0xf3, 0xf3, 0xcd, 0x3b, 0x92, 0xcb, 0xe7, 0x9c, 0x49, 0x2c, + 0xa1, 0x4b, 0x25, 0xb0, 0x50, 0xf5, 0x10, 0xd0, 0x94, 0x36, 0x46, 0x7d, + 0x85, 0x26, 0x93, 0x74, 0x4e, 0xd0, 0xc5, 0xdc, 0x21, 0x9a, 0x1e, 0x3a, + 0x87, 0xd7, 0x8c, 0x9e, 0x1c, 0xc0, 0x40, 0x15, 0x8f, 0x70, 0x9b, 0xf0, + 0xbe, 0x0b, 0x89, 0x8f, 0x82, 0x10, 0xee, 0x9c, 0x5f, 0xec, 0x26, 0x07, + 0x3c, 0xcb, 0x2d, 0xb8, 0xb2, 0xf8, 0x67, 0x79, 0x2c, 0xa6, 0x36, 0xc1, + 0x14, 0xad, 0x88, 0x87, 0x26, 0x7b, 0xcd, 0x38, 0x56, 0x5c, 0xf0, 0xb2, + 0xfd, 0x00, 0x6e, 0xb1, 0x65, 0xc7, 0x0a, 0xcb, 0xf3, 0xff, 0xc1, 0x25, + 0x97, 0x1f, 0x7a, 0xcb, 0xfe, 0x0b, 0xb1, 0x3f, 0xdf, 0xcb, 0x2b, 0x62, + 0x32, 0x60, 0x55, 0x89, 0xfc, 0x2e, 0x44, 0xfc, 0x19, 0xbf, 0xfa, 0x38, + 0xc0, 0x8d, 0x37, 0xa0, 0x6b, 0x2f, 0x38, 0x45, 0x6b, 0x2f, 0xfd, 0x9d, + 0x96, 0x73, 0x6f, 0x35, 0x0b, 0x28, 0x68, 0xf8, 0x25, 0x6f, 0xa1, 0x08, + 0x41, 0x7f, 0xfa, 0x45, 0x1b, 0x0e, 0x50, 0x6f, 0xda, 0x75, 0x97, 0xd8, + 0x1d, 0x4e, 0xb2, 0xfc, 0xe7, 0xcf, 0x1d, 0x65, 0x74, 0x89, 0x6d, 0x26, + 0x7c, 0x8e, 0xc6, 0x2c, 0xbd, 0xfd, 0x42, 0xcb, 0xdc, 0x7f, 0xac, 0xbe, + 0xc9, 0xc4, 0x92, 0xcb, 0xc2, 0x10, 0x16, 0x57, 0x47, 0xba, 0x43, 0x9f, + 0x24, 0xbf, 0xbf, 0xbf, 0x0b, 0x06, 0xb2, 0xa6, 0x3d, 0xde, 0x17, 0xdf, + 0xb9, 0x92, 0x6d, 0x2c, 0xbf, 0x4d, 0x27, 0xeb, 0x8b, 0x2b, 0x0f, 0x47, + 0x84, 0xf7, 0x83, 0xb9, 0xba, 0xb2, 0xdb, 0xd6, 0x5f, 0xf6, 0xbc, 0xe2, + 0x3f, 0x98, 0x0b, 0x2a, 0x0f, 0x31, 0x84, 0xef, 0xe6, 0x29, 0xfc, 0x1e, + 0x2c, 0xaf, 0x1e, 0x77, 0xc8, 0x2e, 0xdc, 0xdd, 0x59, 0x7b, 0x92, 0x9d, + 0x65, 0x4e, 0x98, 0xd6, 0x42, 0xf4, 0x24, 0x42, 0x0e, 0xd4, 0x2e, 0xf0, + 0xc8, 0x93, 0x23, 0xde, 0x68, 0x69, 0xcc, 0x62, 0x71, 0x27, 0x86, 0xb1, + 0x3a, 0x7e, 0x33, 0xbb, 0xcf, 0xb0, 0x45, 0x97, 0xa6, 0x6f, 0x2c, 0xbf, + 0xa3, 0x4f, 0x33, 0x79, 0x65, 0xfb, 0x83, 0x82, 0x9d, 0xcf, 0x2b, 0x83, + 0xb7, 0xff, 0xbf, 0xf8, 0x28, 0x34, 0xd8, 0x96, 0xe1, 0xd6, 0x5f, 0xd9, + 0x3c, 0x7b, 0xd0, 0xb2, 0xfd, 0x93, 0x7b, 0x09, 0x65, 0xfb, 0x04, 0x20, + 0x81, 0x65, 0xf8, 0x0e, 0xf2, 0x3a, 0xca, 0x83, 0xcf, 0xc2, 0x8a, 0x64, + 0xc4, 0x74, 0x9d, 0xe2, 0xd2, 0x76, 0xbc, 0x78, 0x3a, 0xca, 0xe9, 0x3a, + 0x7d, 0x46, 0x9e, 0x73, 0xcb, 0xe3, 0xeb, 0x50, 0xb2, 0xfe, 0x6d, 0x70, + 0x48, 0x02, 0xcb, 0xff, 0xb3, 0xfe, 0x6f, 0xfb, 0x0a, 0x00, 0xb2, 0xdb, + 0xc0, 0x7e, 0x04, 0x5d, 0x7f, 0xfa, 0x5b, 0x30, 0x6d, 0xce, 0xbe, 0x17, + 0xe2, 0xcb, 0xfe, 0xe6, 0x7e, 0x0e, 0xda, 0x92, 0xca, 0x64, 0x57, 0x11, + 0x4f, 0xd3, 0x6f, 0xde, 0x09, 0x46, 0xf5, 0x97, 0xf1, 0x3f, 0xe5, 0x06, + 0xac, 0xa8, 0x3d, 0x61, 0x0a, 0x6e, 0x3f, 0x16, 0x5f, 0x4f, 0xb3, 0x77, + 0xb5, 0x97, 0xf7, 0x98, 0xcc, 0xeb, 0xeb, 0x2f, 0xff, 0x72, 0x35, 0xdf, + 0xf8, 0xdf, 0xf6, 0x0d, 0x65, 0xf6, 0x67, 0x52, 0x59, 0x7b, 0x8d, 0x32, + 0xca, 0x23, 0x7f, 0xc2, 0x2b, 0xf3, 0x6f, 0xd6, 0x1d, 0x65, 0x1a, 0x79, + 0x3e, 0x20, 0xb7, 0x16, 0x5f, 0xce, 0xfa, 0x33, 0x3c, 0xb2, 0xff, 0x34, + 0x7f, 0x37, 0xb8, 0xd6, 0x5f, 0xef, 0x46, 0x9b, 0xb6, 0xde, 0xb2, 0xa6, + 0x44, 0xae, 0x8b, 0x7e, 0x67, 0x7f, 0xe9, 0xca, 0x3a, 0x61, 0x94, 0x4e, + 0xb2, 0xff, 0x03, 0x9f, 0x28, 0x3f, 0x16, 0x5f, 0xe3, 0xc7, 0x9f, 0x91, + 0xb8, 0xb2, 0xa0, 0xfa, 0x1c, 0xce, 0x9d, 0x18, 0xe5, 0x0a, 0x7a, 0x1a, + 0xae, 0x9e, 0xcb, 0xf5, 0x0d, 0x33, 0x91, 0xfa, 0x14, 0xc5, 0x0f, 0x8b, + 0xe3, 0x4c, 0x19, 0xd6, 0x5f, 0xb6, 0x7a, 0x35, 0x25, 0x95, 0xb1, 0x90, + 0x1f, 0x12, 0x84, 0x27, 0x38, 0xc8, 0xd0, 0x3b, 0x84, 0x24, 0xc4, 0x47, + 0x17, 0x79, 0x62, 0x7f, 0x68, 0x30, 0x96, 0xf1, 0xf9, 0x0b, 0x2f, 0xe9, + 0xe6, 0x90, 0xa3, 0x53, 0xac, 0xbe, 0x3e, 0x3f, 0x96, 0x5a, 0x75, 0x97, + 0xef, 0xf9, 0x8f, 0xa5, 0x95, 0x23, 0x75, 0xa1, 0x2b, 0xde, 0x1b, 0x2c, + 0xbf, 0x7b, 0x1a, 0x5c, 0x59, 0x7f, 0xfd, 0xe8, 0x10, 0x5f, 0xc9, 0xc1, + 0xce, 0x40, 0x12, 0x5f, 0xb3, 0xee, 0x11, 0x5a, 0xcb, 0x6e, 0x2c, 0xbf, + 0x6b, 0xb7, 0x7e, 0xd7, 0x10, 0x22, 0xf7, 0x23, 0xa5, 0x97, 0xcd, 0xcd, + 0x49, 0x65, 0x81, 0x08, 0x89, 0xc1, 0x4e, 0x8d, 0x8e, 0x3b, 0x7c, 0x58, + 0x66, 0xea, 0xcb, 0x9a, 0x75, 0x94, 0xc6, 0xf3, 0xe4, 0xb7, 0x82, 0x5d, + 0xac, 0xbe, 0x9c, 0x9c, 0xeb, 0x2e, 0x72, 0x59, 0x50, 0x6d, 0xe7, 0x22, + 0xa9, 0x2a, 0x40, 0x19, 0x3f, 0x4a, 0x5a, 0x85, 0xa1, 0xdf, 0xbc, 0x41, + 0xf5, 0x4b, 0xf9, 0xf5, 0x9b, 0xf0, 0x6b, 0x2f, 0xdd, 0xb9, 0xbe, 0x65, + 0x94, 0x03, 0xd7, 0x22, 0xeb, 0xed, 0x0d, 0x8e, 0xb2, 0xf0, 0xde, 0x4b, + 0x2d, 0x25, 0x95, 0x06, 0xb7, 0x74, 0x72, 0xfb, 0xf3, 0xb9, 0x2c, 0xbc, + 0x78, 0xed, 0x65, 0xce, 0x6a, 0xca, 0xc3, 0x68, 0x43, 0xb6, 0x92, 0xcb, + 0xfb, 0x27, 0x0f, 0xf7, 0xfd, 0x65, 0x41, 0xe1, 0x1a, 0x23, 0x7f, 0xcf, + 0x2d, 0x44, 0xef, 0xae, 0xd6, 0x59, 0x96, 0x5f, 0xff, 0x9f, 0xa0, 0x77, + 0xe6, 0x98, 0x9c, 0xcf, 0xe7, 0x96, 0x5e, 0x35, 0xbe, 0xb2, 0xf7, 0x1f, + 0xeb, 0x2a, 0x11, 0x43, 0x82, 0x06, 0xac, 0x74, 0x3b, 0x76, 0xcf, 0x2c, + 0xbf, 0x7d, 0x86, 0x18, 0x59, 0x7c, 0xf2, 0xc1, 0xac, 0xa3, 0x9e, 0x41, + 0x13, 0xde, 0x3f, 0xfb, 0x59, 0x6f, 0xc1, 0xbf, 0xc2, 0x1b, 0xfa, 0x0f, + 0x86, 0xc7, 0x16, 0x54, 0xea, 0xc1, 0xb0, 0x8f, 0xb5, 0x6d, 0x30, 0x9c, + 0x8b, 0xd0, 0xdb, 0x01, 0xe9, 0x42, 0x83, 0xe4, 0xb7, 0x98, 0xf0, 0xb2, + 0xe8, 0x3a, 0xcb, 0xd9, 0xac, 0x59, 0x5d, 0x9b, 0x13, 0x8b, 0x5f, 0xf0, + 0x3d, 0x9d, 0x4b, 0xed, 0x32, 0xca, 0xc3, 0xdd, 0x09, 0x15, 0xd9, 0x3a, + 0xcb, 0x05, 0x65, 0x0c, 0xd4, 0x68, 0x5e, 0xff, 0x46, 0x17, 0xf9, 0xb7, + 0xbd, 0x65, 0xfd, 0x1b, 0x9e, 0x67, 0x92, 0xcb, 0xd1, 0xcd, 0x87, 0x3e, + 0x62, 0x37, 0xbf, 0x9c, 0xce, 0x72, 0x00, 0xb2, 0xbc, 0x7c, 0x44, 0x69, + 0x7a, 0x1f, 0x4b, 0x2f, 0xfd, 0xe7, 0x2f, 0xf0, 0x82, 0xe2, 0x2c, 0xbf, + 0xed, 0x69, 0xba, 0x97, 0xdf, 0xa5, 0x97, 0xb6, 0xdc, 0xd5, 0x97, 0xfd, + 0x07, 0x96, 0x4f, 0x81, 0x15, 0xac, 0xbf, 0xe8, 0x03, 0x4b, 0xcc, 0x40, + 0x59, 0x69, 0xd6, 0x5c, 0xff, 0xd1, 0xe4, 0x8a, 0xcd, 0xeb, 0x11, 0xae, + 0xc4, 0x0f, 0x08, 0x6b, 0xc6, 0x40, 0x8b, 0x2f, 0xfe, 0x7e, 0x09, 0xf6, + 0x20, 0xcb, 0x38, 0xb2, 0xe2, 0x1a, 0xea, 0xfa, 0x54, 0x1f, 0x3b, 0xa2, + 0x5c, 0x07, 0x59, 0x7d, 0x20, 0xc1, 0xab, 0x2c, 0x05, 0x95, 0x86, 0xd1, + 0xc8, 0xea, 0x15, 0xda, 0x8e, 0x1d, 0x26, 0x90, 0xf6, 0x36, 0xc7, 0xda, + 0x8c, 0x4b, 0xc6, 0x40, 0x84, 0x29, 0x10, 0x7d, 0x2a, 0xff, 0x0f, 0xce, + 0x71, 0x20, 0x96, 0x5f, 0xde, 0xc9, 0x79, 0xb7, 0xac, 0xad, 0xc3, 0xe2, + 0xf9, 0x9d, 0x89, 0x65, 0xed, 0x06, 0x75, 0x95, 0x23, 0x5c, 0x71, 0x0b, + 0xff, 0xe2, 0x63, 0x45, 0xf3, 0xfe, 0x0b, 0xca, 0x50, 0xb2, 0xa0, 0xfc, + 0xf0, 0x86, 0xfd, 0xec, 0xff, 0x21, 0x65, 0xf8, 0xbe, 0x1c, 0xf2, 0xcb, + 0x05, 0x65, 0x2c, 0xad, 0x85, 0xe0, 0x44, 0x6a, 0x0f, 0x96, 0x74, 0x3b, + 0xb7, 0x59, 0x65, 0xdb, 0xe1, 0x65, 0x82, 0xb2, 0xec, 0xd2, 0xcb, 0x70, + 0x06, 0x9f, 0xe2, 0x35, 0x3a, 0xb1, 0x19, 0x43, 0xf8, 0xd8, 0x63, 0x76, + 0x41, 0xa8, 0x46, 0x39, 0x17, 0x06, 0x7e, 0x7f, 0x78, 0x6f, 0x25, 0x97, + 0x36, 0x96, 0x56, 0x1b, 0x2f, 0x0e, 0x5f, 0x9c, 0x89, 0x8e, 0xb2, 0xf6, + 0x6f, 0x11, 0x65, 0xcd, 0xe5, 0x97, 0x86, 0xf2, 0x59, 0x7c, 0xe7, 0xc3, + 0xac, 0xbe, 0x63, 0xc6, 0xe2, 0xcb, 0x9b, 0x5b, 0x0f, 0x17, 0x08, 0x68, + 0x68, 0xa5, 0xc1, 0x6f, 0x30, 0xdf, 0x98, 0xee, 0x58, 0xb2, 0xf3, 0x44, + 0x96, 0x56, 0xc6, 0xc7, 0x4f, 0x6b, 0x1c, 0x83, 0x69, 0x2d, 0x8c, 0x87, + 0x25, 0x2e, 0x1b, 0x0c, 0x3e, 0xc8, 0x5a, 0x5a, 0xae, 0xa1, 0x15, 0xe8, + 0x54, 0xbc, 0xf8, 0x78, 0x21, 0x6c, 0x44, 0x1c, 0x25, 0x0c, 0x31, 0x36, + 0xcb, 0xf7, 0x49, 0x6f, 0xfe, 0xfc, 0x37, 0x9f, 0x50, 0x6e, 0x4c, 0xb2, + 0xfc, 0x38, 0xf4, 0x08, 0xb2, 0x9c, 0xfb, 0x02, 0x89, 0x7f, 0xcf, 0xc2, + 0xcd, 0xed, 0xe0, 0xac, 0xbf, 0xb3, 0xd9, 0xd8, 0x71, 0x65, 0xff, 0x16, + 0x7e, 0x37, 0xb1, 0x01, 0x65, 0xfe, 0xfc, 0x6f, 0x6f, 0xca, 0x16, 0x5f, + 0xff, 0xd8, 0x24, 0x68, 0x0d, 0xfd, 0x04, 0xfc, 0xfe, 0x69, 0x65, 0x62, + 0x24, 0x08, 0xd2, 0xfc, 0x37, 0x2c, 0xdc, 0x59, 0x58, 0x98, 0x90, 0x21, + 0x91, 0xc2, 0x1b, 0xb4, 0x75, 0x97, 0xcd, 0xf8, 0x92, 0xcb, 0xfc, 0x17, + 0x69, 0x41, 0x76, 0xb2, 0xb0, 0xfa, 0xbc, 0x2f, 0xc2, 0x1b, 0xde, 0xc0, + 0x2c, 0xbf, 0xf3, 0x6b, 0xcf, 0xc3, 0x75, 0xfe, 0xd6, 0x5f, 0x9b, 0xf1, + 0xfe, 0x24, 0xbe, 0xee, 0x3f, 0xc4, 0x97, 0x18, 0x62, 0x4a, 0x91, 0xf1, + 0xe1, 0x39, 0x84, 0x74, 0x90, 0x59, 0xaf, 0xa9, 0x26, 0x19, 0xe1, 0xc3, + 0x21, 0xa7, 0x79, 0xc8, 0x0b, 0x2f, 0x3f, 0x9d, 0x65, 0xf8, 0xcf, 0x89, + 0x00, 0x59, 0x58, 0x89, 0x73, 0x4d, 0xfc, 0x36, 0xe3, 0x77, 0x89, 0xcc, + 0x59, 0x7e, 0xf3, 0x46, 0x80, 0xb2, 0xa6, 0x3c, 0x3f, 0x8e, 0x5e, 0x9b, + 0xcc, 0xb2, 0xff, 0xb0, 0xbf, 0xe6, 0x82, 0x9d, 0x65, 0xff, 0xfe, 0xf6, + 0x1c, 0x48, 0x06, 0xa3, 0x85, 0x9b, 0xdb, 0xc1, 0x59, 0x7b, 0xf1, 0xde, + 0x22, 0x67, 0xe6, 0xf7, 0xff, 0x8c, 0x7e, 0x7d, 0xbc, 0xd8, 0x6b, 0x69, + 0x65, 0x2c, 0xac, 0x44, 0x4f, 0x8d, 0x38, 0x95, 0x43, 0x5e, 0x19, 0xec, + 0x86, 0x63, 0x9d, 0x46, 0x7e, 0x78, 0x4f, 0x82, 0x3d, 0x12, 0x7f, 0xe1, + 0x19, 0x91, 0x9f, 0xdf, 0xe0, 0x97, 0xe6, 0xdc, 0x20, 0x2c, 0xbf, 0x8a, + 0x25, 0xad, 0x42, 0xcb, 0xd1, 0xa0, 0x2c, 0xbe, 0x28, 0xe8, 0x18, 0x79, + 0x1e, 0x2c, 0xbf, 0xf7, 0xf9, 0x9d, 0xf9, 0xcb, 0xfc, 0x59, 0x79, 0x88, + 0x0b, 0x36, 0x1b, 0xfa, 0x3a, 0x29, 0x37, 0xbb, 0xdd, 0xcf, 0xac, 0xbf, + 0xf1, 0xdb, 0x0f, 0xfe, 0x04, 0xbe, 0xb2, 0xff, 0xfe, 0xd0, 0x79, 0xe7, + 0x97, 0x7e, 0x6e, 0xa5, 0x0f, 0x25, 0x96, 0x83, 0x51, 0x37, 0xf3, 0xea, + 0x84, 0xc0, 0x30, 0x97, 0xd0, 0xb2, 0xb4, 0xeb, 0x2f, 0xee, 0x41, 0x9f, + 0xce, 0xd6, 0x5f, 0xf6, 0x6f, 0x7d, 0x3c, 0x9e, 0x4b, 0x2e, 0x81, 0xf6, + 0x7f, 0x5d, 0x09, 0x70, 0xbe, 0xfe, 0x8f, 0x47, 0xa2, 0x75, 0x97, 0xbf, + 0x03, 0x59, 0x7f, 0xe6, 0x7e, 0xa5, 0xfe, 0x13, 0x1a, 0xb2, 0xfe, 0xcd, + 0xb0, 0xf9, 0xb4, 0xb2, 0xa4, 0x7d, 0xe2, 0x1f, 0xd4, 0x22, 0xbb, 0x21, + 0x17, 0x53, 0xa6, 0x03, 0x28, 0x6d, 0xdb, 0x8b, 0x29, 0x65, 0x39, 0x78, + 0x60, 0x8d, 0x41, 0xf3, 0x3a, 0x35, 0xff, 0x6b, 0x0e, 0xe5, 0xfe, 0x42, + 0xca, 0x1a, 0x7f, 0x5e, 0x8e, 0x8d, 0xc8, 0x2f, 0xd2, 0xf0, 0x63, 0x4b, + 0x2f, 0xf4, 0x6f, 0x6d, 0xe4, 0x1e, 0x2c, 0xbf, 0x9b, 0x8f, 0xd4, 0xb1, + 0x65, 0xce, 0x7d, 0x1f, 0x1e, 0xd9, 0xb5, 0xfe, 0x68, 0xf9, 0x41, 0xf8, + 0xb2, 0xba, 0x47, 0x67, 0xa1, 0x16, 0x46, 0x17, 0xec, 0x09, 0xe3, 0x8b, + 0x29, 0x65, 0xd9, 0x36, 0x8d, 0x97, 0x09, 0xef, 0xf9, 0x82, 0x2b, 0xf4, + 0x08, 0x53, 0xac, 0xbf, 0xe8, 0x9e, 0x3a, 0xf9, 0x64, 0xeb, 0x2f, 0x6e, + 0xb1, 0x8b, 0x2b, 0x11, 0x8b, 0xd9, 0x6b, 0x1f, 0x6e, 0x9d, 0x5f, 0xfc, + 0x27, 0x1b, 0x93, 0x30, 0xf0, 0x80, 0xb2, 0xf4, 0x89, 0xd6, 0x5f, 0x3f, + 0xf2, 0x75, 0x97, 0x47, 0x4b, 0x2e, 0x28, 0x59, 0x63, 0xc1, 0xf4, 0xf8, + 0x6c, 0x88, 0xbe, 0x2f, 0x7f, 0x64, 0xde, 0x81, 0x09, 0x65, 0xff, 0xf3, + 0xee, 0x08, 0x51, 0xe7, 0x6f, 0xc7, 0xf8, 0xb2, 0xa0, 0xff, 0xc2, 0x5d, + 0x43, 0x4e, 0x39, 0xe1, 0x5c, 0x50, 0xbf, 0xbe, 0xed, 0xb5, 0x8b, 0x2f, + 0xfe, 0x2c, 0xdc, 0x9c, 0x3a, 0x96, 0x75, 0xf5, 0x97, 0xf6, 0x9b, 0x99, + 0x9a, 0x59, 0x53, 0x2b, 0xc9, 0xd4, 0x65, 0x9e, 0x8f, 0x34, 0x8e, 0x78, + 0x45, 0xbd, 0x26, 0xf7, 0xb2, 0x75, 0x96, 0xdb, 0x59, 0x58, 0x6c, 0x5c, + 0x76, 0xf4, 0x9f, 0x4b, 0x2f, 0xe0, 0x1d, 0xe5, 0x83, 0x59, 0x60, 0xac, + 0xbc, 0xcf, 0x25, 0x97, 0xde, 0x82, 0xfa, 0xca, 0xd8, 0x6f, 0x38, 0x37, + 0x6c, 0xe1, 0xf8, 0x6f, 0x4d, 0xbe, 0xcf, 0xe0, 0xd2, 0x5f, 0xf3, 0x91, + 0xb8, 0x4f, 0xfe, 0x2c, 0xbe, 0x73, 0x40, 0x62, 0xca, 0x91, 0xfe, 0x78, + 0x84, 0x8d, 0xef, 0xa0, 0x8a, 0x16, 0x54, 0xc9, 0xd5, 0xe8, 0x70, 0xa1, + 0x3b, 0xf8, 0x52, 0x88, 0x5d, 0x7f, 0x39, 0x8f, 0xf7, 0x35, 0x65, 0xee, + 0x1f, 0x4b, 0x2e, 0x6e, 0xd6, 0x50, 0x0d, 0xa7, 0x07, 0x68, 0xd5, 0x54, + 0x6d, 0x1e, 0x56, 0x95, 0xbe, 0xc5, 0x7f, 0xff, 0x75, 0x2c, 0xf8, 0xa4, + 0x51, 0x83, 0x0f, 0xdb, 0xf1, 0xa5, 0x97, 0xf7, 0xdb, 0x50, 0x11, 0x5a, + 0xcb, 0xb4, 0xfe, 0x44, 0xa8, 0x8c, 0x97, 0xbd, 0x93, 0xac, 0xbd, 0x29, + 0x42, 0xcb, 0xd9, 0xec, 0xd8, 0x6e, 0x42, 0x3b, 0x4e, 0x89, 0xb2, 0x68, + 0xbf, 0xfb, 0xed, 0x3f, 0xf8, 0x1d, 0xcf, 0xbf, 0x96, 0x5f, 0xff, 0x16, + 0x7d, 0xb0, 0xbd, 0x9f, 0xf3, 0x76, 0xb2, 0xff, 0xbe, 0xc7, 0xe7, 0xa0, + 0x42, 0x59, 0x7f, 0x89, 0xb9, 0xc8, 0xf4, 0x2c, 0xbf, 0xe8, 0x2e, 0xdf, + 0xef, 0xd0, 0x36, 0x22, 0xdf, 0xa4, 0xd6, 0x39, 0xbf, 0xe8, 0xce, 0xb2, + 0x73, 0x1f, 0xa5, 0x97, 0xfc, 0xe6, 0x6b, 0x1b, 0xd0, 0x35, 0x95, 0xa3, + 0xf3, 0x23, 0xba, 0x92, 0x7e, 0x80, 0x8c, 0x03, 0xf0, 0xd3, 0xbf, 0x82, + 0x2b, 0x6d, 0x6b, 0x16, 0x5f, 0xff, 0xb3, 0xa9, 0x7d, 0xa7, 0xcd, 0x7f, + 0xed, 0xa8, 0x59, 0x7f, 0xbd, 0x86, 0xbc, 0x36, 0xda, 0xcb, 0xfd, 0x9c, + 0xcd, 0xcf, 0x40, 0xd6, 0x5d, 0x13, 0xac, 0xbd, 0xe8, 0x99, 0x65, 0xfe, + 0x86, 0x2c, 0x9c, 0x49, 0x2c, 0xb7, 0x43, 0x3e, 0x7c, 0x17, 0xf0, 0xed, + 0xf9, 0xe6, 0x26, 0x99, 0x65, 0x76, 0x99, 0x77, 0x8d, 0x43, 0x09, 0xcd, + 0xe6, 0xb5, 0x89, 0xe5, 0x72, 0x38, 0x4b, 0xef, 0x9b, 0x9e, 0x59, 0x76, + 0xa4, 0xb2, 0xff, 0xc5, 0x9f, 0xf8, 0x67, 0xfe, 0x76, 0xb2, 0xfc, 0x30, + 0xbe, 0xa4, 0xb2, 0xfe, 0x7e, 0xb9, 0x9d, 0x7d, 0x65, 0xd8, 0x62, 0xca, + 0x01, 0xe3, 0x11, 0x7d, 0xf1, 0xf8, 0x21, 0xd6, 0x54, 0x1e, 0x2e, 0x10, + 0xdb, 0x8b, 0x2c, 0x62, 0xcb, 0x98, 0x0b, 0x2f, 0x8c, 0x72, 0x92, 0xcb, + 0x86, 0xcb, 0x2e, 0xf3, 0x2c, 0xbe, 0x97, 0x3d, 0x8b, 0x2f, 0x98, 0x22, + 0xbc, 0x59, 0x6e, 0x6c, 0x45, 0x58, 0xc5, 0xbb, 0x22, 0x98, 0x59, 0xc5, + 0x80, 0x45, 0x4c, 0x98, 0xe8, 0x61, 0x7b, 0x4e, 0x9a, 0xb0, 0x23, 0x2e, + 0xb8, 0x10, 0xb2, 0xe0, 0x42, 0xcb, 0xf0, 0x65, 0x84, 0x2d, 0x8d, 0x60, + 0x05, 0xaf, 0xff, 0xfb, 0xd8, 0x1d, 0x1b, 0xd4, 0xbd, 0x84, 0x6f, 0x8a, + 0x33, 0x4b, 0x2a, 0x15, 0xcf, 0x0c, 0x8c, 0xd1, 0x76, 0x40, 0xd4, 0x2c, + 0xc1, 0x1b, 0xb1, 0x2a, 0xfc, 0xfa, 0xfe, 0xd0, 0x9f, 0xe4, 0x85, 0x6b, + 0x2f, 0xf0, 0x72, 0x68, 0x3c, 0x85, 0x6b, 0x2f, 0xd8, 0x38, 0x94, 0x61, + 0xf6, 0x00, 0xd2, 0xff, 0xf1, 0x3f, 0x5c, 0x34, 0xd7, 0xd9, 0xd9, 0xc0, + 0xb2, 0xfa, 0x35, 0x1e, 0x59, 0x58, 0x7e, 0x2e, 0xa1, 0x7f, 0xd8, 0xdd, + 0x7f, 0x51, 0x9d, 0x2c, 0xbf, 0xfc, 0x4d, 0xd7, 0x26, 0x2c, 0x9f, 0x3a, + 0xfa, 0xcb, 0xff, 0x7b, 0x0e, 0x24, 0x03, 0x3a, 0xfa, 0xca, 0xc4, 0x46, + 0x7d, 0x32, 0xff, 0x75, 0xdb, 0x68, 0x48, 0x1a, 0xcb, 0xe0, 0x1d, 0xe5, + 0xb1, 0x33, 0xd2, 0x20, 0xe4, 0x31, 0x7e, 0x45, 0x70, 0x7e, 0xb2, 0xed, + 0xb8, 0x59, 0x7f, 0x00, 0xe2, 0x70, 0x49, 0xd6, 0x5f, 0xdc, 0x62, 0x28, + 0xe9, 0x65, 0xd9, 0xd2, 0xca, 0xe8, 0xfd, 0x7e, 0x65, 0xb6, 0x59, 0x7f, + 0xf8, 0x48, 0x32, 0x26, 0x93, 0x96, 0x75, 0xf5, 0x97, 0xc0, 0xd3, 0x69, + 0x65, 0x42, 0x74, 0x32, 0x5b, 0xc1, 0x77, 0x84, 0x77, 0x0c, 0xcc, 0x4c, + 0xbf, 0x8b, 0x3a, 0x03, 0x49, 0x65, 0xfd, 0xce, 0x44, 0xa3, 0x4b, 0x2f, + 0xfb, 0x50, 0x76, 0x9a, 0x1f, 0x71, 0x65, 0x61, 0xf4, 0x76, 0x5b, 0x78, + 0x3d, 0x7d, 0x65, 0x9d, 0x65, 0xd3, 0x71, 0x65, 0x4e, 0x8f, 0xd2, 0x84, + 0xaf, 0x08, 0xbe, 0x3c, 0x20, 0x85, 0xd8, 0x62, 0xcb, 0xfe, 0x09, 0x77, + 0xec, 0x9f, 0x8c, 0xb2, 0xff, 0xa3, 0xac, 0x04, 0x6f, 0xc9, 0xd6, 0x5f, + 0xc5, 0x9f, 0xe3, 0x81, 0x65, 0x69, 0x17, 0x07, 0x17, 0x01, 0xd7, 0x0e, + 0xef, 0xf1, 0x4e, 0xda, 0xeb, 0xd3, 0xac, 0xbf, 0xd3, 0xf3, 0x59, 0xdc, + 0x4e, 0xb2, 0xfa, 0x3a, 0xfe, 0xe2, 0xca, 0x83, 0xdc, 0x91, 0xb5, 0xff, + 0xef, 0xbe, 0x9c, 0x70, 0x4f, 0xa7, 0x92, 0xcb, 0xfe, 0x15, 0xea, 0x3e, + 0xdd, 0xb0, 0xd6, 0x5f, 0xec, 0x29, 0xf0, 0x6f, 0xe5, 0x95, 0x32, 0x35, + 0xfe, 0x42, 0x14, 0x73, 0x0f, 0x6f, 0xec, 0x3e, 0x0d, 0x8c, 0x59, 0x71, + 0xe1, 0x65, 0xff, 0xa5, 0x06, 0xf5, 0xfd, 0x46, 0x18, 0xb2, 0x8e, 0x88, + 0x47, 0x2d, 0xf8, 0xb5, 0xdf, 0xe2, 0xcb, 0xfe, 0x79, 0x6c, 0x1b, 0x6f, + 0x81, 0xac, 0xbf, 0x64, 0xde, 0x6f, 0xac, 0xbf, 0xff, 0x13, 0x9b, 0x34, + 0x67, 0xe0, 0xf1, 0xe8, 0x02, 0xcb, 0xff, 0xf7, 0xca, 0x37, 0x5b, 0x59, + 0xd4, 0xbf, 0x85, 0xda, 0xcb, 0xff, 0xf8, 0x7e, 0x61, 0x40, 0x9f, 0x6e, + 0x16, 0x6f, 0x6f, 0x05, 0x65, 0x62, 0x61, 0xac, 0xa8, 0x15, 0x8a, 0x24, + 0xd9, 0x39, 0x19, 0xad, 0xf6, 0x67, 0xb8, 0xb2, 0xa1, 0x71, 0x73, 0x23, + 0x69, 0x78, 0x61, 0x8a, 0xcb, 0xc8, 0x5f, 0xf1, 0xd0, 0x6e, 0x94, 0xde, + 0x30, 0xc3, 0x12, 0x5f, 0xb0, 0xd2, 0x0f, 0x12, 0x0b, 0x34, 0x17, 0x8e, + 0xff, 0x59, 0x7c, 0x2c, 0xc3, 0x0c, 0x59, 0x76, 0x01, 0x65, 0x61, 0xbe, + 0xf9, 0x45, 0xe8, 0x07, 0x16, 0x54, 0x23, 0x40, 0xe7, 0x5f, 0x5a, 0x10, + 0x82, 0xff, 0xf9, 0xa4, 0xfc, 0x39, 0xde, 0x4e, 0x6f, 0x99, 0x65, 0xfd, + 0x07, 0x7f, 0x86, 0x16, 0x5f, 0x36, 0x81, 0xc5, 0x97, 0xfe, 0x08, 0xaf, + 0x36, 0xcb, 0x0c, 0x70, 0x2c, 0xbf, 0xf4, 0x02, 0x25, 0x1a, 0xd6, 0x18, + 0xb2, 0xff, 0xfa, 0x38, 0x3f, 0x31, 0x9e, 0x38, 0x7e, 0x18, 0x59, 0x53, + 0xa2, 0x3f, 0xb3, 0xea, 0x84, 0x7c, 0xb4, 0x35, 0x2f, 0xfb, 0x9a, 0x80, + 0xfc, 0x9b, 0x7a, 0xcb, 0xff, 0x16, 0x73, 0xbf, 0x37, 0x70, 0x4b, 0x2f, + 0xff, 0xf1, 0xa6, 0x3e, 0x8d, 0x17, 0xcc, 0x91, 0x05, 0xf9, 0x84, 0xb2, + 0xff, 0xf7, 0xfc, 0xce, 0x0c, 0x2f, 0xfb, 0x24, 0xb2, 0xff, 0xef, 0x36, + 0xbc, 0xfa, 0xce, 0xdf, 0xeb, 0x2f, 0x8e, 0x77, 0x96, 0xc4, 0x46, 0x62, + 0x45, 0x42, 0x74, 0x78, 0x74, 0xc7, 0xc1, 0x87, 0x85, 0xfd, 0xa0, 0xf7, + 0xe6, 0xe2, 0xcb, 0xe3, 0x1c, 0xa4, 0xb2, 0xff, 0xbf, 0x1d, 0x01, 0xfd, + 0xe6, 0x59, 0x6f, 0x2c, 0xac, 0x3c, 0xae, 0xce, 0x6f, 0x69, 0xfb, 0x59, + 0x7f, 0x4e, 0xdd, 0xfa, 0x3e, 0xb2, 0xfa, 0x27, 0x20, 0xac, 0xad, 0x1e, + 0x8f, 0x8b, 0xef, 0xb8, 0xc7, 0x85, 0x97, 0xfe, 0x8c, 0x29, 0xf0, 0x9f, + 0xae, 0x2c, 0xbf, 0x16, 0x7e, 0x34, 0xb2, 0xf1, 0x86, 0x18, 0x92, 0xfc, + 0xe6, 0xf9, 0xbe, 0x90, 0x59, 0xa0, 0xa8, 0x44, 0x03, 0x23, 0x5f, 0x1f, + 0x91, 0xf5, 0x97, 0xb7, 0xc1, 0xd6, 0x5e, 0xfb, 0x18, 0xb2, 0xf7, 0x1f, + 0x4b, 0x2b, 0xa3, 0x73, 0xf1, 0xdb, 0xa0, 0x6b, 0x2f, 0xf6, 0xb5, 0x13, + 0x8f, 0x09, 0x65, 0x78, 0xf2, 0x5c, 0x5a, 0xa1, 0x30, 0x5c, 0x22, 0x65, + 0x77, 0x6b, 0xbe, 0x06, 0x64, 0xcb, 0x2f, 0xb9, 0x85, 0xf5, 0x95, 0x87, + 0x86, 0xe4, 0x56, 0xe6, 0xc5, 0x6a, 0x63, 0x22, 0xc6, 0xee, 0x88, 0xa6, + 0x21, 0xd4, 0x2f, 0x7d, 0x19, 0x31, 0x3e, 0xde, 0xdb, 0xce, 0x96, 0x5a, + 0x43, 0x5c, 0x65, 0xc9, 0x77, 0xed, 0x08, 0x6a, 0x14, 0x2e, 0x6b, 0x86, + 0x72, 0x52, 0xfe, 0x83, 0xc7, 0xa0, 0x0b, 0x2f, 0x44, 0xe1, 0x59, 0x61, + 0x5e, 0x1e, 0x4f, 0x8b, 0x2f, 0xfe, 0x6f, 0xc6, 0xb0, 0xbe, 0xee, 0x4b, + 0x2a, 0x4c, 0x90, 0xd9, 0x8b, 0x35, 0x18, 0xdf, 0xa3, 0xc9, 0x29, 0xd1, + 0x70, 0xbd, 0xef, 0x2b, 0xbf, 0xfa, 0x30, 0xb0, 0x6f, 0x22, 0x89, 0xd6, + 0x5f, 0x77, 0xa8, 0x92, 0xcb, 0xb7, 0xc2, 0xcb, 0xff, 0x36, 0xbb, 0xf3, + 0x77, 0xe6, 0x25, 0x97, 0xff, 0xff, 0x9c, 0x81, 0xff, 0x61, 0xff, 0xcc, + 0xdf, 0xe6, 0xef, 0xcc, 0x20, 0x67, 0x59, 0x53, 0xa2, 0xec, 0x07, 0xf5, + 0x08, 0xf7, 0xc8, 0x69, 0xdf, 0xf6, 0x6e, 0x41, 0xfa, 0x96, 0x7d, 0x65, + 0x63, 0x2e, 0x5d, 0xa9, 0x2b, 0x9a, 0x7e, 0x74, 0x12, 0x8c, 0x6b, 0x84, + 0xd7, 0xf7, 0x72, 0xce, 0x7d, 0x96, 0x5e, 0x28, 0xde, 0xb2, 0xff, 0xed, + 0x47, 0x7e, 0x27, 0xf9, 0x41, 0x8b, 0x2e, 0x15, 0xb2, 0xca, 0x59, 0x6f, + 0x2c, 0xa9, 0x17, 0x8c, 0x17, 0x53, 0x9e, 0xae, 0x8d, 0xaa, 0x11, 0x78, + 0xf0, 0x99, 0xbd, 0x33, 0xce, 0xb2, 0xf7, 0x03, 0xb8, 0xb2, 0xb0, 0xdf, + 0x7c, 0x7a, 0xff, 0x41, 0x48, 0x9a, 0x3a, 0x59, 0x50, 0xec, 0x78, 0x27, + 0x84, 0xd4, 0xa5, 0x11, 0x8e, 0x55, 0x46, 0x4e, 0x75, 0x9b, 0x2c, 0xef, + 0xb8, 0xdd, 0x7a, 0x94, 0x2a, 0xc7, 0x93, 0x47, 0xf7, 0xa9, 0x78, 0xe7, + 0x87, 0x47, 0xa5, 0xc5, 0xbc, 0x6b, 0x00, 0x8c, 0x20, 0xa7, 0x26, 0x79, + 0x1b, 0x5f, 0xe9, 0x7a, 0x81, 0x66, 0xde, 0x5d, 0xb7, 0x0d, 0x91, 0x19, + 0x37, 0x48, 0x2f, 0xcd, 0x34, 0x98, 0x96, 0x5d, 0xb5, 0x32, 0xcb, 0xfe, + 0x9b, 0xfb, 0xbc, 0x89, 0x83, 0xa5, 0x97, 0xf8, 0x70, 0x47, 0x81, 0xc2, + 0xca, 0x83, 0xf0, 0x73, 0xfb, 0xfe, 0xf4, 0x4f, 0xa8, 0x93, 0xe9, 0x65, + 0xff, 0xef, 0x47, 0x8b, 0x0d, 0x1e, 0x14, 0x6e, 0x2c, 0xbf, 0x11, 0xa2, + 0x40, 0x16, 0x5f, 0xf8, 0x9f, 0xaf, 0xfa, 0x3b, 0xc9, 0x96, 0x5f, 0x98, + 0x7e, 0x63, 0x56, 0x5e, 0x11, 0xc9, 0x65, 0x0d, 0x1f, 0x18, 0x96, 0x45, + 0x3f, 0x40, 0xdd, 0x28, 0xbf, 0x41, 0x31, 0xf1, 0x65, 0xf1, 0x9f, 0xcd, + 0xc5, 0x95, 0x39, 0xe5, 0xf4, 0x4b, 0x7f, 0xfe, 0x27, 0x33, 0x4d, 0x1e, + 0x13, 0xed, 0xe8, 0xde, 0xb2, 0xff, 0xcd, 0xe8, 0x1f, 0x83, 0x1d, 0x71, + 0x65, 0xe2, 0x2c, 0x59, 0x58, 0x7b, 0x2e, 0x7f, 0x78, 0x66, 0x81, 0x65, + 0xf8, 0xfa, 0xd3, 0xfd, 0x65, 0xed, 0x9b, 0xbd, 0xac, 0xbb, 0x3e, 0xb2, + 0xa7, 0x37, 0x3e, 0x23, 0xbf, 0xf1, 0xc7, 0x05, 0x9b, 0xcb, 0x38, 0xb2, + 0xf7, 0x88, 0xeb, 0x2b, 0x62, 0x3e, 0xe0, 0x7b, 0x18, 0x58, 0x89, 0xcf, + 0xaf, 0xfe, 0x99, 0xfb, 0xf4, 0x4b, 0xe5, 0x87, 0x59, 0x7f, 0x6b, 0x08, + 0x9e, 0x75, 0x97, 0xfe, 0x12, 0x0f, 0x9a, 0x3b, 0x91, 0xab, 0x2b, 0xb4, + 0x58, 0x32, 0x2f, 0xcb, 0x2f, 0xfc, 0x67, 0x52, 0xe6, 0xcc, 0xf6, 0x12, + 0xcb, 0xff, 0x4d, 0x1d, 0x73, 0x4d, 0xbf, 0x06, 0xb2, 0xa1, 0x10, 0x98, + 0x85, 0x7f, 0xf8, 0xfd, 0x4b, 0x9b, 0x30, 0x8b, 0x18, 0x0b, 0x2f, 0xe7, + 0xd0, 0x63, 0xa9, 0x2c, 0xa6, 0x3f, 0x97, 0x4b, 0xbf, 0xfa, 0x06, 0x7c, + 0xee, 0x39, 0xec, 0x3a, 0xcb, 0xf3, 0xe0, 0xdb, 0x7a, 0xca, 0xd1, 0xf6, + 0x1d, 0x12, 0xf3, 0x78, 0x2b, 0x2f, 0xbe, 0xde, 0x0a, 0xcb, 0xfb, 0x35, + 0xd4, 0xbf, 0x0b, 0x2d, 0xb8, 0x2a, 0x8f, 0x40, 0x42, 0x2b, 0xf1, 0x99, + 0xdc, 0x01, 0x65, 0xf7, 0x7e, 0xcd, 0x2c, 0xa8, 0x3f, 0xe6, 0x32, 0xdd, + 0x29, 0xad, 0x8c, 0x89, 0x6d, 0xac, 0x9e, 0x50, 0x8b, 0x19, 0x06, 0x46, + 0x62, 0xd0, 0x96, 0x98, 0x93, 0x50, 0xb0, 0xf4, 0x63, 0x6f, 0x0f, 0x82, + 0x85, 0xa7, 0xe1, 0x34, 0x18, 0x46, 0x6f, 0x22, 0xdd, 0x87, 0x55, 0x85, + 0xed, 0x73, 0x82, 0xf7, 0x5b, 0x54, 0xa4, 0xe1, 0x4c, 0xa7, 0x9d, 0xa2, + 0x52, 0x08, 0xa2, 0x39, 0xdd, 0xa5, 0x29, 0x28, 0x54, 0x94, 0x26, 0x2a, + 0xa3, 0x0b, 0xda, 0x71, 0x95, 0x0a, 0xb8, 0x61, 0xc5, 0xae, 0x2d, 0x9e, + 0x96, 0x89, 0x2a, 0xd8, 0x9c, 0x76, 0x93, 0x0f, 0x31, 0x07, 0x5e, 0x6c, + 0xff, 0x7f, 0x76, 0x8b, 0x4f, 0xaa, 0xe0, 0xc9, 0xab, 0xb2, 0xcd, 0xc9, + 0x5b, 0x53, 0x5a, 0x39, 0xed, 0x5a, 0xa4, 0xf3, 0xd7, 0x2a, 0xde, 0xbc, + 0x30, 0x47, 0xb7, 0x8a, 0xc0, 0xae, 0x3d, 0x05, 0x72, 0x8e, 0x4a, 0xf0, + 0x28, 0x79, 0x8a, 0x4b, 0x4f, 0xde, 0xa5, 0xa8, 0x69, 0x62, 0x7b, 0xe7, + 0xf2, 0x4c, 0xa4, 0x51, 0x6d, 0xd6, 0x4f, 0xc2, 0x5b, 0x99, 0x6d, 0xda, + 0x52, 0x4d, 0x0b, 0x9c, 0x1c, 0xef, 0x96, 0xe0, 0xcb, 0xbd, 0xe3, 0xe7, + 0xd6, 0x5f, 0xe7, 0x3c, 0x7d, 0xb8, 0xcb, 0x2f, 0xd9, 0xa1, 0x3f, 0xc5, + 0x97, 0x7a, 0x16, 0x58, 0x58, 0x11, 0x18, 0x43, 0x9c, 0x31, 0x10, 0xa6, + 0xfb, 0xb2, 0x8c, 0x59, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x2e, 0x35, 0x85, + 0xc1, 0xeb, 0xe1, 0x0d, 0xfe, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0xd6, + 0xbf, 0xf8, 0x5b, 0xc8, 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x12, 0x8a, 0xa2, + 0x70, 0xa1, 0x0e, 0x72, 0x99, 0x43, 0x4c, 0x65, 0x46, 0xc3, 0x27, 0xb2, + 0x96, 0x9d, 0x90, 0xdc, 0x8c, 0x9d, 0xf7, 0x07, 0x52, 0xc1, 0x0c, 0xce, + 0x42, 0x73, 0xe5, 0x1b, 0xa8, 0x77, 0xff, 0x85, 0x9d, 0xe4, 0x2f, 0x35, + 0xdb, 0xbf, 0x6a, 0x89, 0x69, 0x7f, 0xc2, 0xaf, 0xcd, 0xb8, 0xf1, 0xd6, + 0xea, 0xcb, 0xff, 0xe3, 0x3b, 0xda, 0x85, 0x20, 0x15, 0xeb, 0x68, 0xd9, + 0xb3, 0xdb, 0x6b, 0x2f, 0xff, 0xfd, 0xbb, 0xf1, 0x40, 0xce, 0x28, 0x26, + 0x15, 0x5f, 0x15, 0xeb, 0x68, 0xd9, 0xb3, 0xdb, 0x6b, 0x2b, 0xc8, 0xfe, + 0x31, 0xba, 0xfc, 0x2b, 0x90, 0xa0, 0x49, 0xd6, 0x5e, 0xdc, 0x3b, 0x2c, + 0xbf, 0xec, 0x21, 0xfa, 0x34, 0xe4, 0xb2, 0xa0, 0xf5, 0x70, 0x7e, 0xf3, + 0xbf, 0x6a, 0x88, 0xdd, 0x7e, 0xea, 0x62, 0x81, 0xac, 0xae, 0xcf, 0x49, + 0xca, 0x6f, 0xc3, 0xf4, 0x66, 0x96, 0x56, 0x8f, 0x24, 0x88, 0xaf, 0xf6, + 0x98, 0x57, 0xdf, 0xa0, 0xc5, 0x97, 0x83, 0xb6, 0x62, 0xcb, 0xed, 0x06, + 0x00, 0xb2, 0x98, 0xff, 0x26, 0x39, 0x10, 0x86, 0xff, 0xff, 0xfb, 0x79, + 0x67, 0x38, 0x38, 0xcd, 0x76, 0xef, 0xd8, 0xb9, 0x37, 0xe3, 0xfc, 0x54, + 0x61, 0xeb, 0x7a, 0x11, 0x7c, 0xc6, 0x17, 0xf7, 0x05, 0x99, 0xcd, 0xc1, + 0x16, 0x5f, 0xdb, 0x8d, 0x3f, 0x9b, 0x6d, 0x65, 0xfb, 0x74, 0x5e, 0x85, + 0x66, 0x2c, 0xbe, 0x19, 0x60, 0x16, 0x5f, 0x41, 0x87, 0x1a, 0xcb, 0xee, + 0xfd, 0x06, 0x2c, 0xbd, 0xe8, 0x35, 0x65, 0x62, 0x21, 0x74, 0x42, 0x2b, + 0x23, 0x10, 0x92, 0xff, 0xcf, 0x21, 0x79, 0xae, 0xdd, 0xfb, 0x54, 0x4b, + 0xeb, 0x62, 0xcb, 0xde, 0x7f, 0xac, 0xb7, 0xf8, 0x6b, 0x04, 0x10, 0xbf, + 0x89, 0xa0, 0xc0, 0xee, 0x2c, 0xbf, 0x84, 0x6e, 0xb7, 0x74, 0x62, 0xca, + 0x84, 0x46, 0x61, 0x43, 0x18, 0x5f, 0xd0, 0xdb, 0x99, 0xd4, 0x96, 0x5f, + 0xb4, 0x6f, 0x83, 0xc5, 0x95, 0xe3, 0xda, 0x10, 0xc2, 0xf4, 0x6a, 0x16, + 0x56, 0x1b, 0xe6, 0x23, 0xb9, 0xfc, 0xb2, 0xf8, 0x03, 0xe4, 0x2c, 0xbe, + 0x7d, 0x4f, 0x3a, 0xcb, 0x61, 0x1e, 0x36, 0xf2, 0x2a, 0x92, 0x21, 0x38, + 0xb9, 0x78, 0x10, 0x62, 0xcb, 0xfd, 0x8d, 0xa9, 0x79, 0x8c, 0x59, 0x5b, + 0x87, 0xa1, 0xe1, 0xdb, 0xf6, 0xeb, 0xce, 0x24, 0x96, 0x5f, 0x07, 0xcd, + 0xa5, 0x97, 0xdc, 0xf4, 0x79, 0x65, 0xfe, 0x89, 0xe0, 0xa7, 0xcd, 0xd5, + 0x97, 0x73, 0x4b, 0x2a, 0x0f, 0xbe, 0x72, 0x29, 0x8d, 0xac, 0x2c, 0x55, + 0x32, 0x60, 0xe2, 0x34, 0x39, 0xc9, 0x07, 0x08, 0x8c, 0x85, 0xdf, 0x71, + 0xad, 0xf4, 0x4e, 0xc6, 0xdb, 0x86, 0x9a, 0x85, 0xc1, 0xd0, 0x7d, 0x18, + 0x31, 0x43, 0x17, 0x90, 0xa3, 0xfb, 0x98, 0x49, 0x76, 0xcb, 0x44, 0x84, + 0x8d, 0xff, 0xf8, 0xa3, 0xb1, 0x7f, 0xeb, 0xb6, 0xe1, 0x66, 0xf7, 0x59, + 0x7f, 0xf4, 0xbe, 0xd3, 0x0b, 0x1b, 0x6f, 0x81, 0xac, 0xbf, 0x18, 0x2d, + 0x8d, 0x9d, 0x65, 0xfe, 0x16, 0x07, 0xe8, 0x0d, 0xd2, 0xca, 0x1a, 0x60, + 0xfd, 0x2d, 0x32, 0x49, 0x16, 0xdf, 0xb5, 0xdb, 0xbf, 0x6a, 0x8a, 0xad, + 0x7e, 0xce, 0x7a, 0x3a, 0x59, 0x61, 0x78, 0x7b, 0xde, 0x36, 0xbe, 0x0e, + 0xe8, 0xe1, 0x65, 0xb6, 0xb5, 0x95, 0xe3, 0x77, 0xb6, 0x4b, 0x73, 0x6e, + 0xac, 0xbb, 0x34, 0xb2, 0xf6, 0x75, 0xf5, 0x97, 0xcc, 0x77, 0xde, 0xb2, + 0x8d, 0x3e, 0xf7, 0x19, 0x00, 0xb7, 0xc7, 0x6f, 0x16, 0xe9, 0x8b, 0x2f, + 0xef, 0x46, 0xf0, 0x8f, 0x16, 0x5f, 0xcf, 0xe9, 0x8a, 0x06, 0xb2, 0xff, + 0xfb, 0xe0, 0x38, 0x47, 0x99, 0xf0, 0x1c, 0x3d, 0x2c, 0xbf, 0xfb, 0xfe, + 0x8e, 0x13, 0x84, 0x56, 0xda, 0x59, 0x7a, 0x25, 0x8b, 0x2f, 0xe6, 0x0f, + 0x65, 0x13, 0x2c, 0xa9, 0x26, 0x7c, 0x32, 0xfc, 0x2d, 0xe9, 0x4a, 0x64, + 0x7f, 0x0d, 0xdf, 0xf1, 0xb8, 0x59, 0xd7, 0xdc, 0xeb, 0x2d, 0xba, 0xb2, + 0xc6, 0x2c, 0xae, 0x8d, 0x37, 0xc5, 0x2f, 0x6e, 0xc7, 0xd6, 0x5f, 0xd0, + 0x71, 0x20, 0xbb, 0x59, 0x74, 0x69, 0x65, 0x68, 0xf1, 0x38, 0x5d, 0x73, + 0xf4, 0xb2, 0xf0, 0x90, 0x05, 0x95, 0xd1, 0xb4, 0xf8, 0xbd, 0xf4, 0xc4, + 0x1e, 0xd6, 0x5f, 0xd8, 0x79, 0x9d, 0xe7, 0x59, 0x7e, 0xe3, 0x79, 0x8d, + 0x59, 0x73, 0xf4, 0xb2, 0x88, 0xdf, 0xfc, 0xa2, 0xff, 0xfa, 0x5e, 0x79, + 0x1a, 0xfc, 0xc0, 0xf3, 0x8c, 0xb2, 0x96, 0x56, 0x1e, 0xde, 0xea, 0x85, + 0x42, 0x66, 0x0c, 0x48, 0xed, 0xa4, 0xf7, 0x70, 0xd9, 0x65, 0xff, 0x14, + 0x4b, 0xec, 0x71, 0xc2, 0xcb, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x20, 0x2f, + 0xb5, 0x85, 0xf5, 0x97, 0xc3, 0xda, 0xc5, 0x4d, 0xa1, 0x65, 0x0d, 0x18, + 0x18, 0x6f, 0xa3, 0x6e, 0x10, 0xd6, 0xc4, 0xc4, 0x85, 0xc3, 0x5a, 0xfd, + 0xc7, 0x27, 0xe9, 0x65, 0xff, 0x7d, 0xb8, 0xc1, 0x15, 0x8e, 0x16, 0x5d, + 0x84, 0xb2, 0xe0, 0xc2, 0xca, 0x92, 0x2e, 0xfa, 0x2d, 0x62, 0x7d, 0xc3, + 0xcd, 0x0a, 0xdf, 0xd1, 0xa9, 0xe3, 0x53, 0xac, 0xbe, 0x63, 0xc7, 0x16, + 0x54, 0x8f, 0x40, 0xd2, 0xfb, 0xfd, 0xa9, 0xcf, 0x05, 0x2e, 0x2c, 0xa8, + 0x3d, 0x7c, 0x23, 0xbf, 0xfe, 0x3b, 0x10, 0x04, 0xfb, 0x10, 0x65, 0x9c, + 0x59, 0x7f, 0xf3, 0x41, 0xdc, 0x62, 0x6e, 0xc1, 0x49, 0x65, 0xff, 0xff, + 0x37, 0xcb, 0x37, 0x96, 0x72, 0x7c, 0x33, 0x6c, 0x3e, 0x6d, 0x2c, 0xac, + 0x4c, 0x03, 0xc9, 0xe0, 0x46, 0xbf, 0x01, 0xc0, 0x47, 0x59, 0x7a, 0x77, + 0x1a, 0xcb, 0xfd, 0xdb, 0x61, 0x81, 0x2f, 0xac, 0xa8, 0x3f, 0x8c, 0x27, + 0xe8, 0x76, 0xfe, 0x10, 0x51, 0xa6, 0x83, 0xac, 0xbb, 0x92, 0x59, 0x4e, + 0x79, 0x3c, 0x32, 0xbf, 0xff, 0xa3, 0xbf, 0xb6, 0xb5, 0x80, 0xe7, 0xdf, + 0xce, 0x35, 0x97, 0x0a, 0x7c, 0xb2, 0xff, 0xe9, 0xbc, 0xe7, 0xff, 0xa3, + 0xe1, 0x3a, 0xcb, 0xff, 0xb0, 0x71, 0x28, 0xc1, 0xc1, 0x7d, 0x65, 0x62, + 0x21, 0xce, 0x8d, 0x7b, 0x76, 0x3e, 0xb2, 0xa1, 0x97, 0x57, 0x3c, 0x24, + 0xc6, 0x79, 0x91, 0xaf, 0x1a, 0xb3, 0xd2, 0xfe, 0xe1, 0x14, 0xcc, 0x67, + 0x56, 0xf4, 0x6a, 0x4f, 0x28, 0x1c, 0xa1, 0xe9, 0xc8, 0xc8, 0x3f, 0x0a, + 0x80, 0xbb, 0xef, 0x21, 0xdb, 0x5b, 0x12, 0x14, 0x5b, 0xa4, 0x57, 0xfe, + 0x94, 0x60, 0x3d, 0x98, 0x5d, 0xac, 0xbf, 0x41, 0x16, 0x7d, 0x65, 0xf6, + 0xb4, 0xdd, 0xac, 0xbe, 0x2c, 0x9c, 0x5e, 0x22, 0x17, 0x6c, 0xf4, 0x42, + 0x5b, 0xf8, 0x5f, 0x0d, 0x97, 0xb1, 0x65, 0xfe, 0x17, 0xe7, 0x3e, 0x40, + 0xd6, 0x50, 0xb5, 0x4e, 0x7a, 0x8f, 0x08, 0xc4, 0xcd, 0xb3, 0x1b, 0xfc, + 0x2f, 0x35, 0xdb, 0xbf, 0x6a, 0x8b, 0x21, 0x7f, 0xff, 0xbc, 0xfa, 0x17, + 0xe7, 0xf9, 0x06, 0x7e, 0x61, 0xe3, 0x71, 0x65, 0xfc, 0xdb, 0xc5, 0xf2, + 0x3a, 0x59, 0x7f, 0xff, 0x82, 0x3c, 0x16, 0x26, 0x78, 0x82, 0xfb, 0x98, + 0x6c, 0x71, 0x65, 0xff, 0xfb, 0xb6, 0xe6, 0x0f, 0x0a, 0x0c, 0xf9, 0xaf, + 0xc5, 0x97, 0xfd, 0xe6, 0x70, 0x60, 0x75, 0x3a, 0xcb, 0xf7, 0x82, 0xe6, + 0x8b, 0xf2, 0x23, 0xfe, 0xad, 0x68, 0x92, 0x67, 0x03, 0x87, 0xad, 0x71, + 0x39, 0x8f, 0xc6, 0xd5, 0x43, 0x54, 0x50, 0xd1, 0xff, 0x5f, 0xe1, 0x79, + 0xae, 0xdd, 0xfb, 0x54, 0x5a, 0xeb, 0xf4, 0xdf, 0x1c, 0x12, 0xcb, 0xfc, + 0x59, 0x3e, 0xb4, 0xc6, 0x2c, 0xbe, 0xf3, 0x44, 0xcb, 0x2f, 0xd8, 0x24, + 0x4e, 0x2f, 0x0f, 0xfb, 0xb2, 0x8d, 0xd3, 0x4b, 0xfc, 0x2f, 0x35, 0xdb, + 0xbf, 0x6a, 0x8b, 0x91, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x2e, 0xc5, 0xff, + 0x9e, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0xa3, 0x96, 0x17, 0x88, 0x84, + 0x39, 0xb5, 0xf1, 0x44, 0x8e, 0xb2, 0xfd, 0x26, 0x20, 0x32, 0xcb, 0xff, + 0x0a, 0x05, 0x27, 0x8d, 0x4b, 0x1b, 0x7a, 0xcb, 0x49, 0x65, 0xfb, 0x5d, + 0xbb, 0xf6, 0xa8, 0xa5, 0x57, 0xfd, 0xdf, 0x9a, 0x6f, 0x44, 0xf8, 0xb2, + 0xff, 0xf7, 0xa2, 0x78, 0xf3, 0x6f, 0x71, 0xf9, 0x96, 0x0b, 0x37, 0x77, + 0x48, 0x5e, 0x23, 0x3a, 0x67, 0x1a, 0xe9, 0x31, 0x07, 0x86, 0xfd, 0xff, + 0x9d, 0xbf, 0x20, 0x8d, 0xc8, 0x0b, 0x2e, 0xf0, 0x56, 0x58, 0x58, 0xd5, + 0x0e, 0x61, 0x0f, 0x44, 0xc7, 0x8d, 0x63, 0xc5, 0x3c, 0x3d, 0xbf, 0xff, + 0xf9, 0xff, 0x80, 0x89, 0x0b, 0x10, 0xf8, 0x38, 0x94, 0x0d, 0xdc, 0xd5, + 0x95, 0x3b, 0xa3, 0x18, 0x95, 0x27, 0x7f, 0x25, 0x21, 0x75, 0x09, 0xb6, + 0xa7, 0x41, 0x1d, 0x2d, 0xe5, 0x35, 0x80, 0xa8, 0xa1, 0x83, 0xc5, 0x2f, + 0xc3, 0x1f, 0x7c, 0xa4, 0x63, 0x19, 0xef, 0xfa, 0x42, 0xf3, 0x5d, 0xbb, + 0xf6, 0xa8, 0x8e, 0x17, 0xfc, 0xc2, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0xad, + 0x56, 0x16, 0xe8, 0x91, 0xfa, 0x4d, 0xff, 0xe1, 0x67, 0x79, 0x0b, 0xcd, + 0x76, 0xef, 0xda, 0xa2, 0x5b, 0x5b, 0xb5, 0x97, 0x83, 0xa0, 0x2c, 0xbb, + 0x3a, 0x59, 0x7e, 0x39, 0xe1, 0xb8, 0xb2, 0xfe, 0x8d, 0x01, 0xfa, 0xe2, + 0xcb, 0x0f, 0x0f, 0x57, 0xc4, 0xf7, 0xef, 0xc7, 0x84, 0xe2, 0xcb, 0xdb, + 0xc3, 0x25, 0x94, 0x29, 0x4c, 0x2b, 0xb1, 0x2e, 0x87, 0x59, 0xb0, 0x89, + 0xf7, 0x94, 0xdc, 0x39, 0x2c, 0xbf, 0xfe, 0xc3, 0x32, 0x7f, 0xff, 0x0c, + 0x7f, 0xb9, 0xab, 0x2b, 0xc7, 0xd2, 0x42, 0xf7, 0xe6, 0xdd, 0x1c, 0x74, + 0xb2, 0xff, 0xb3, 0xa2, 0xc0, 0x01, 0xe4, 0xb2, 0xe3, 0xf6, 0xb2, 0xfe, + 0x6e, 0xb8, 0x3c, 0x25, 0x97, 0xf7, 0x59, 0x28, 0xd0, 0x16, 0x56, 0x1e, + 0xdb, 0x96, 0xdf, 0xff, 0x41, 0x4f, 0xc0, 0xbb, 0x4b, 0x9e, 0x79, 0x2c, + 0xa8, 0x4c, 0x6a, 0x47, 0x1a, 0x73, 0xf1, 0x05, 0xe7, 0xf0, 0x8b, 0x2f, + 0x8a, 0x3a, 0x92, 0xcb, 0xff, 0x31, 0x7f, 0x83, 0x0b, 0xea, 0x4b, 0x2f, + 0xe9, 0xe3, 0xb7, 0xd0, 0x16, 0x5f, 0xfb, 0x5e, 0x7c, 0x20, 0xcb, 0x38, + 0xb2, 0xff, 0xfb, 0xa0, 0x0f, 0xcf, 0x2c, 0xe1, 0x05, 0xc4, 0x59, 0x4c, + 0x88, 0xe7, 0x3d, 0xbe, 0x06, 0x6a, 0x65, 0x97, 0xe6, 0xf4, 0x09, 0x32, + 0xcb, 0xdf, 0x83, 0xac, 0xa1, 0xa7, 0x87, 0xd8, 0xec, 0xc4, 0x5a, 0x3e, + 0xf4, 0x2f, 0x40, 0x43, 0xf2, 0x3d, 0xd2, 0x9b, 0xff, 0x8d, 0x82, 0xfe, + 0x69, 0xa7, 0x73, 0xac, 0xbe, 0x79, 0x1a, 0xcb, 0x2c, 0x6a, 0xcf, 0x1a, + 0x2b, 0xf9, 0xb4, 0x4d, 0xfe, 0x2c, 0xbf, 0x69, 0xcb, 0x21, 0x65, 0x2a, + 0x21, 0xb3, 0x1f, 0x9f, 0x88, 0x9c, 0xb2, 0xe8, 0x25, 0x97, 0xb1, 0x86, + 0xb2, 0xf0, 0xf0, 0xeb, 0x2e, 0x62, 0x19, 0xb7, 0x61, 0xba, 0x83, 0xf6, + 0x92, 0x65, 0xf7, 0x03, 0x07, 0x59, 0x7e, 0xf3, 0x6a, 0x06, 0xb2, 0xff, + 0xcf, 0x38, 0x85, 0x9c, 0x20, 0xf9, 0x65, 0x76, 0x7c, 0xce, 0x4f, 0x7d, + 0x93, 0x4b, 0x16, 0x5c, 0xf2, 0x59, 0x7f, 0xd2, 0x17, 0x9a, 0xed, 0xdf, + 0xb5, 0x44, 0xc0, 0xa8, 0x3d, 0xf7, 0x16, 0xbf, 0x05, 0xfe, 0xdf, 0x59, + 0x7f, 0xa7, 0x7f, 0x80, 0x42, 0x92, 0xcb, 0x42, 0xcb, 0xa7, 0x65, 0x95, + 0x86, 0x9c, 0x84, 0x2e, 0xe4, 0x2c, 0xa8, 0x45, 0xc3, 0x13, 0xba, 0xe0, + 0x47, 0xef, 0x18, 0xc0, 0x59, 0x76, 0xde, 0x2c, 0xbe, 0xe3, 0x90, 0x16, + 0x5e, 0x28, 0x9d, 0x65, 0x4c, 0x7e, 0x7e, 0x1d, 0x00, 0xc8, 0xac, 0x86, + 0xff, 0x07, 0xad, 0x34, 0x1f, 0x16, 0x5f, 0xbc, 0xd0, 0x53, 0xac, 0xbf, + 0xe8, 0x9f, 0xe5, 0x01, 0xff, 0x16, 0x57, 0x91, 0x27, 0xc3, 0x3d, 0xb2, + 0x7b, 0xe2, 0xce, 0x42, 0xca, 0xf9, 0xe9, 0xef, 0x33, 0xbd, 0x26, 0x02, + 0xcb, 0xf1, 0x16, 0x7d, 0x96, 0x5f, 0x75, 0xdb, 0x1a, 0xb2, 0xfc, 0xe6, + 0xe7, 0x9d, 0x65, 0x62, 0x2c, 0x66, 0x24, 0x71, 0xcf, 0x92, 0x84, 0x96, + 0xff, 0xf4, 0xbd, 0x84, 0x60, 0x9a, 0xf3, 0x41, 0xd6, 0x5f, 0xcd, 0xfc, + 0x3c, 0x79, 0x65, 0xff, 0x30, 0x27, 0xf4, 0x70, 0x3c, 0x59, 0x7f, 0xa4, + 0xff, 0xe3, 0x14, 0x2c, 0xb4, 0x68, 0xfa, 0xc8, 0xea, 0xba, 0x4c, 0x23, + 0x49, 0x7f, 0x84, 0xbd, 0xff, 0xe2, 0x73, 0x33, 0xbf, 0x47, 0x52, 0xdb, + 0xc5, 0x97, 0xf3, 0x4d, 0xcf, 0xb4, 0xeb, 0x2f, 0xfd, 0x87, 0xcd, 0x67, + 0x52, 0xcf, 0xac, 0xbf, 0x9b, 0xcc, 0x7c, 0x35, 0x65, 0x78, 0xfa, 0xf8, + 0x7d, 0x7f, 0xcf, 0xed, 0x43, 0x49, 0xf8, 0xb2, 0xff, 0xf3, 0xcf, 0xe6, + 0x82, 0xc9, 0x9b, 0x4c, 0xb2, 0xb1, 0x3c, 0x09, 0x8d, 0xfc, 0x9d, 0xf8, + 0x4d, 0x04, 0x88, 0xc3, 0x7b, 0x12, 0xcb, 0x6d, 0xac, 0xbe, 0xed, 0xb0, + 0x6b, 0x29, 0x65, 0xbb, 0x59, 0x84, 0xbb, 0x82, 0x04, 0x97, 0x48, 0x6b, + 0x2b, 0x6b, 0x44, 0xf4, 0xe2, 0x1d, 0x0a, 0x31, 0x6e, 0x87, 0xce, 0x2f, + 0x7e, 0x36, 0x25, 0x83, 0x59, 0x7d, 0x9f, 0xf6, 0x2c, 0xb9, 0xcd, 0x59, + 0x76, 0x0c, 0x8d, 0xc6, 0xd9, 0x0d, 0xc2, 0x8e, 0xd7, 0x18, 0x52, 0xef, + 0x81, 0x65, 0xdb, 0xb2, 0x59, 0x7c, 0x6e, 0x75, 0xf5, 0x95, 0x39, 0xea, + 0xe8, 0x5d, 0xc6, 0xaf, 0xc2, 0x6d, 0xb9, 0x01, 0x65, 0xfd, 0x9e, 0x71, + 0x0b, 0xeb, 0x2a, 0x73, 0xd8, 0x19, 0x5d, 0xe7, 0x7e, 0xd6, 0x5f, 0xd9, + 0xff, 0xc6, 0xb8, 0xb2, 0xfe, 0x72, 0x04, 0xe0, 0xfa, 0xca, 0x84, 0x4d, + 0x4e, 0x46, 0x43, 0x9b, 0x65, 0xb6, 0x17, 0x0d, 0x8d, 0xc4, 0xf0, 0xc7, + 0x91, 0x08, 0xe3, 0x45, 0xc9, 0x40, 0x06, 0xbe, 0x77, 0x0d, 0x9e, 0xa1, + 0x6e, 0xc4, 0x33, 0x42, 0x23, 0x44, 0x47, 0x84, 0x0f, 0xa1, 0xb0, 0xf0, + 0xad, 0x28, 0xf6, 0x39, 0x2c, 0x47, 0xf0, 0xfc, 0x0a, 0xee, 0xf6, 0x03, + 0x0b, 0xb6, 0xdf, 0x84, 0x8c, 0x86, 0xf1, 0xc3, 0xa4, 0x97, 0xfe, 0x79, + 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, 0x63, 0x5d, 0x1b, 0xab, 0x2e, 0xd6, + 0x2c, 0xb4, 0x68, 0xd7, 0xf8, 0x66, 0xfc, 0x27, 0xe5, 0x06, 0xac, 0xb0, + 0xb6, 0x47, 0x51, 0xc7, 0x7c, 0xfb, 0xc2, 0x6b, 0xfe, 0x1b, 0x6f, 0x17, + 0xd0, 0x04, 0x92, 0xcb, 0xc6, 0x18, 0x62, 0xcb, 0xf8, 0x53, 0xb5, 0x8a, + 0x92, 0x97, 0x96, 0x5e, 0xda, 0x52, 0x1a, 0xca, 0xda, 0xcf, 0x83, 0x69, + 0x9e, 0xdf, 0xda, 0xd0, 0x4b, 0x3c, 0xb2, 0xfa, 0x09, 0xbc, 0xb2, 0xfa, + 0x27, 0x8d, 0x2c, 0xbf, 0xdc, 0x80, 0x3f, 0xdc, 0xd5, 0x97, 0xbf, 0x13, + 0x2c, 0xbe, 0x89, 0x98, 0xeb, 0x2f, 0xff, 0x31, 0x16, 0x07, 0xb2, 0xc9, + 0xc4, 0x92, 0xca, 0xc3, 0xec, 0xd1, 0x15, 0xf7, 0x23, 0x50, 0xb2, 0xfa, + 0x70, 0x8f, 0x71, 0x65, 0xff, 0x6e, 0xb0, 0x36, 0x64, 0xd0, 0x75, 0x94, + 0x34, 0xe9, 0x58, 0x83, 0x70, 0x8a, 0x63, 0x3d, 0x42, 0x27, 0xe4, 0x22, + 0x10, 0xee, 0x93, 0xda, 0x4b, 0x2f, 0xc7, 0x8c, 0xff, 0x16, 0x5f, 0xb8, + 0xc5, 0xd4, 0x96, 0x5d, 0x93, 0x2c, 0xb1, 0x9b, 0x0d, 0xfe, 0x14, 0x56, + 0xd0, 0x8a, 0x01, 0x88, 0xe3, 0x35, 0xfe, 0xf4, 0x6a, 0x71, 0x02, 0x05, + 0x97, 0xc1, 0x9d, 0xc9, 0x65, 0xff, 0xff, 0x98, 0x3d, 0xeb, 0x37, 0xc1, + 0x7f, 0x41, 0x9f, 0xd1, 0xfe, 0x32, 0xcb, 0x9f, 0x8b, 0x2f, 0xb6, 0x7f, + 0x3c, 0xb2, 0xbc, 0x6e, 0xb8, 0x2d, 0x7f, 0xff, 0x37, 0x5f, 0xe4, 0xfa, + 0xce, 0x6c, 0xce, 0xfc, 0x1d, 0xc5, 0x95, 0x08, 0x85, 0xd1, 0x0d, 0xe8, + 0x29, 0xd6, 0x5f, 0xff, 0xff, 0x4b, 0x9e, 0xc0, 0x99, 0xcf, 0x67, 0x79, + 0xcd, 0x99, 0xd4, 0xb8, 0xc4, 0xcb, 0x2f, 0x3b, 0xf6, 0xa8, 0xac, 0x57, + 0xce, 0x24, 0x1a, 0xb2, 0xbb, 0x3c, 0xcd, 0x14, 0xdf, 0xbc, 0xc7, 0x8d, + 0x2c, 0xbf, 0xfc, 0x17, 0x9f, 0x58, 0x7f, 0x44, 0xe4, 0x15, 0x94, 0xc7, + 0xe4, 0x44, 0xf7, 0xf8, 0x32, 0xce, 0x03, 0xa0, 0x2c, 0xbf, 0xf6, 0xde, + 0x7c, 0xb0, 0x30, 0x5f, 0x59, 0x7f, 0x8b, 0x38, 0x0c, 0xc1, 0xac, 0xa1, + 0xab, 0x93, 0x36, 0x32, 0xee, 0xc8, 0xba, 0x1c, 0xd4, 0x33, 0x7d, 0x09, + 0x52, 0x20, 0xf9, 0xae, 0xf3, 0xfb, 0xff, 0x07, 0xfc, 0x2c, 0xde, 0x59, + 0xc5, 0x97, 0xdf, 0x2c, 0xdd, 0x59, 0x79, 0x82, 0x35, 0x94, 0x69, 0xff, + 0xb1, 0xfe, 0xe1, 0x25, 0xff, 0xc5, 0xf3, 0x43, 0x05, 0x9d, 0xc6, 0x96, + 0x5f, 0xd0, 0xc2, 0xb7, 0x0f, 0x6b, 0x2f, 0xf6, 0xa7, 0xff, 0x1f, 0xae, + 0xd6, 0x54, 0x22, 0xb3, 0xc8, 0x8e, 0x63, 0x7f, 0xb3, 0xf8, 0x50, 0x66, + 0xda, 0xcb, 0xfd, 0x1a, 0x93, 0x4c, 0xc6, 0x2c, 0xbf, 0xf9, 0x8f, 0xcd, + 0x9e, 0x6f, 0x94, 0x1d, 0x65, 0x49, 0x15, 0xdc, 0x35, 0xf9, 0xa5, 0xf3, + 0xfd, 0xfb, 0x59, 0x7f, 0xd1, 0xbd, 0xf5, 0xdf, 0x9f, 0x75, 0x65, 0xfe, + 0x68, 0xec, 0xb1, 0xa7, 0x59, 0x47, 0x44, 0x97, 0x88, 0xb7, 0x4f, 0xaf, + 0xf4, 0x17, 0xfd, 0x80, 0x75, 0x97, 0xd0, 0x77, 0xfa, 0xca, 0x91, 0xe9, + 0x70, 0xc6, 0xfd, 0xbb, 0xfc, 0xea, 0x65, 0x97, 0xdc, 0x99, 0x8d, 0x59, + 0x78, 0xf1, 0xa5, 0x97, 0xff, 0xff, 0xf9, 0xff, 0xfc, 0xf7, 0x1e, 0x4c, + 0x5f, 0x96, 0x6b, 0x39, 0x9e, 0x79, 0xca, 0x24, 0xb2, 0xf7, 0xe2, 0x65, + 0x95, 0x09, 0x8a, 0xe1, 0x68, 0x09, 0x38, 0x38, 0x24, 0x22, 0xef, 0xe0, + 0xed, 0xf7, 0xe6, 0x15, 0xac, 0xbe, 0xea, 0x51, 0xe5, 0x97, 0xfb, 0x83, + 0xf6, 0x76, 0x1d, 0xc5, 0x96, 0xce, 0x1e, 0xd8, 0x48, 0xee, 0x8d, 0xeb, + 0x2b, 0xc6, 0xfc, 0x89, 0xef, 0xef, 0x30, 0xcb, 0x02, 0xb2, 0xff, 0x4c, + 0xf8, 0xd2, 0x10, 0xeb, 0x28, 0x68, 0x80, 0xec, 0x81, 0x8b, 0x2f, 0xf7, + 0x52, 0x9a, 0x4f, 0xa9, 0xd6, 0x5f, 0x4b, 0xed, 0x3a, 0xca, 0x83, 0xda, + 0x73, 0x7b, 0xff, 0xfd, 0x07, 0x34, 0xd7, 0xeb, 0xd0, 0xdf, 0xe3, 0x17, + 0x52, 0x59, 0x7f, 0xfe, 0x6f, 0xc7, 0x6d, 0xf6, 0x3e, 0xce, 0x38, 0xc6, + 0xb2, 0xa1, 0x55, 0xa6, 0x46, 0xa0, 0xd0, 0x8a, 0xf1, 0x03, 0xb1, 0xdd, + 0x2f, 0xac, 0xbf, 0xa0, 0x07, 0x8e, 0x12, 0xcb, 0xfb, 0x27, 0xc2, 0xc9, + 0x2c, 0xa8, 0x3e, 0xf6, 0x17, 0xd1, 0x65, 0xff, 0xdc, 0xf6, 0x6e, 0xb7, + 0xda, 0x5c, 0x0a, 0xcb, 0xf8, 0xff, 0x0b, 0xcf, 0x0b, 0x2c, 0xdd, 0x1f, + 0xa8, 0x88, 0xf7, 0x83, 0xd6, 0x2c, 0xbf, 0xda, 0x60, 0xce, 0x0e, 0x49, + 0x65, 0xe6, 0x89, 0xd6, 0x5f, 0xfc, 0x38, 0xe4, 0x37, 0x5f, 0xfc, 0x1d, + 0x65, 0xfd, 0x06, 0x4c, 0x50, 0x35, 0x95, 0x3a, 0x38, 0x06, 0x3b, 0x31, + 0xae, 0x87, 0x3e, 0x89, 0x7e, 0xef, 0xd0, 0x46, 0xac, 0xac, 0x3f, 0x57, + 0x4c, 0xbe, 0x3b, 0xf5, 0xf5, 0x97, 0xff, 0x4f, 0x1f, 0xd8, 0x27, 0x62, + 0x6e, 0x89, 0xc5, 0x97, 0xff, 0x3e, 0xe6, 0x13, 0x8d, 0xf3, 0xaf, 0xac, + 0xbf, 0xed, 0x47, 0x1f, 0x45, 0x12, 0x59, 0x5a, 0x46, 0x67, 0x94, 0x37, + 0xa2, 0xde, 0x93, 0xce, 0xb2, 0xf6, 0xc9, 0xce, 0xb2, 0xff, 0x9f, 0xa9, + 0x37, 0xbc, 0xfb, 0x8b, 0x2f, 0xe2, 0x89, 0xca, 0x27, 0x59, 0x6f, 0xac, + 0xbf, 0xf1, 0xbc, 0xe6, 0x79, 0xb8, 0x19, 0xd6, 0x50, 0xcf, 0x48, 0x22, + 0x34, 0x28, 0x54, 0x77, 0x90, 0xef, 0xe8, 0xc9, 0x87, 0x74, 0x40, 0xe7, + 0x84, 0xff, 0x7d, 0x13, 0x44, 0xeb, 0x2f, 0xfc, 0x4e, 0x3f, 0x46, 0xff, + 0x39, 0x2c, 0xbf, 0xfd, 0x2c, 0x2f, 0x87, 0xcd, 0xbb, 0xbb, 0x1b, 0x8b, + 0x2f, 0xff, 0xff, 0x61, 0xf3, 0x40, 0x00, 0x79, 0xe6, 0xfc, 0xb3, 0xce, + 0x06, 0x1c, 0x2c, 0xba, 0x37, 0x16, 0x5f, 0xff, 0xf8, 0x33, 0xe7, 0x7b, + 0x08, 0x3b, 0xbb, 0x33, 0xa9, 0x60, 0x48, 0x1c, 0x59, 0x7f, 0xfa, 0x7c, + 0xeb, 0xfc, 0x62, 0x80, 0x39, 0xd6, 0x5f, 0xee, 0x8b, 0x07, 0xe7, 0x31, + 0x65, 0x61, 0xff, 0x3a, 0x55, 0x4e, 0xa9, 0x58, 0x64, 0x7d, 0x1f, 0x79, + 0x49, 0xdd, 0x88, 0x67, 0x90, 0xf4, 0xbe, 0xfc, 0xa1, 0x96, 0x5f, 0xf6, + 0x0e, 0x7c, 0x33, 0x3c, 0xeb, 0x2f, 0xe9, 0xe6, 0x90, 0xa3, 0x53, 0xac, + 0xbe, 0x22, 0xcf, 0xac, 0xbf, 0x36, 0xe6, 0xb4, 0xcb, 0x2b, 0x6b, 0x44, + 0x04, 0x1b, 0x78, 0x82, 0xfe, 0x9c, 0x4d, 0xb7, 0x20, 0x2c, 0xbe, 0xdc, + 0x8e, 0x12, 0xcb, 0xff, 0x79, 0xcf, 0xff, 0x47, 0xc2, 0x75, 0x95, 0x87, + 0xc7, 0x31, 0x25, 0xff, 0xd9, 0x86, 0x9e, 0x1b, 0x5a, 0x63, 0x16, 0x5e, + 0x77, 0xd2, 0xcb, 0xfe, 0x69, 0x37, 0x82, 0x73, 0xb2, 0xcb, 0xb3, 0xeb, + 0x2a, 0x13, 0x64, 0xc8, 0x4a, 0xe8, 0x8b, 0xc8, 0x9f, 0x1b, 0xdb, 0x38, + 0xb9, 0xf7, 0x56, 0x5f, 0xfe, 0x8d, 0xc3, 0xc0, 0xcb, 0x3f, 0xf7, 0x25, + 0x94, 0x47, 0xc7, 0xba, 0x33, 0x7b, 0xcc, 0x2f, 0x68, 0x6e, 0xf2, 0xf6, + 0x94, 0x20, 0x05, 0x51, 0x6c, 0x47, 0xa5, 0x3c, 0x63, 0xd2, 0x34, 0x19, + 0xb6, 0x4b, 0xb5, 0x36, 0x31, 0x3e, 0xe1, 0xbd, 0xd4, 0x37, 0x1a, 0x18, + 0x53, 0x42, 0x17, 0x51, 0x9b, 0xfa, 0x58, 0x1b, 0xc3, 0x08, 0x10, 0xa2, + 0x28, 0xdf, 0xb9, 0x29, 0x6f, 0xf2, 0xb0, 0x82, 0xd7, 0xbc, 0x87, 0x6e, + 0x17, 0x22, 0x47, 0x31, 0xbb, 0x0c, 0x1b, 0xc2, 0xaf, 0x6f, 0x6b, 0x59, + 0x7d, 0xfd, 0xbc, 0xf2, 0xcb, 0x12, 0xca, 0x14, 0x9b, 0x59, 0x12, 0xdc, + 0x28, 0x15, 0x16, 0x5e, 0xda, 0xf6, 0x96, 0xda, 0xcb, 0xdf, 0x8f, 0x2c, + 0xbe, 0x81, 0xe1, 0xd6, 0x5b, 0x50, 0x6f, 0x74, 0x39, 0x6d, 0xc5, 0x97, + 0x36, 0xea, 0xcb, 0xe9, 0xf5, 0x13, 0xac, 0xb8, 0x40, 0x2c, 0xbb, 0x3c, + 0xb2, 0xf7, 0xb2, 0x65, 0x97, 0xbc, 0xc7, 0x59, 0x69, 0x96, 0x54, 0xe7, + 0xc2, 0x31, 0x67, 0x1d, 0x08, 0xe5, 0xf9, 0xca, 0x70, 0xf1, 0x65, 0xfb, + 0x07, 0xa7, 0xed, 0x65, 0xf3, 0xcf, 0x1a, 0x59, 0x74, 0x0f, 0xc7, 0x94, + 0x45, 0x16, 0x1a, 0xca, 0x64, 0xf6, 0xe6, 0x26, 0x38, 0xa3, 0x8c, 0x80, + 0x90, 0x9e, 0x78, 0x79, 0xf7, 0x2d, 0xb2, 0xcb, 0x79, 0x65, 0xee, 0x09, + 0xc5, 0x97, 0xdd, 0x4f, 0x06, 0xac, 0xa9, 0xcf, 0x50, 0x62, 0x21, 0x1e, + 0xbf, 0x75, 0x2f, 0xbf, 0x4b, 0x2d, 0x0b, 0x29, 0xcd, 0xd7, 0xca, 0xaf, + 0xf7, 0x5a, 0x86, 0x93, 0xf1, 0x65, 0xf6, 0x14, 0x49, 0x65, 0x61, 0xe9, + 0x9c, 0xce, 0xdb, 0x6b, 0x2f, 0xdc, 0xcf, 0xb6, 0x96, 0x5e, 0xce, 0xbe, + 0xb2, 0xd8, 0x03, 0xc4, 0xe1, 0x3d, 0xce, 0x35, 0x97, 0xbf, 0x9c, 0x59, + 0x71, 0x42, 0xca, 0x91, 0xe3, 0x84, 0x5b, 0x78, 0xe5, 0xff, 0x30, 0x67, + 0x8e, 0x81, 0xa8, 0x59, 0x7a, 0x51, 0xd2, 0xcb, 0x6e, 0x2c, 0xa9, 0x8d, + 0x89, 0x0e, 0xde, 0xd3, 0x92, 0xca, 0x59, 0x6d, 0xb5, 0x97, 0xf1, 0x66, + 0xfd, 0x37, 0x16, 0x54, 0xe7, 0x84, 0x60, 0xa5, 0xba, 0x59, 0x50, 0x89, + 0xec, 0x1b, 0x64, 0xd0, 0x92, 0x5f, 0xb3, 0x52, 0x83, 0xac, 0xbe, 0xf3, + 0xe6, 0x96, 0x5f, 0xa7, 0xc2, 0x63, 0x56, 0x54, 0x1e, 0x4b, 0x10, 0xdf, + 0xe7, 0xd4, 0x80, 0xdd, 0x71, 0x65, 0xf7, 0x39, 0x00, 0x59, 0x50, 0xad, + 0x88, 0x64, 0x38, 0xb0, 0xcd, 0xda, 0x31, 0x3b, 0x5f, 0xa1, 0x7e, 0xe7, + 0x44, 0xe0, 0x12, 0x03, 0x0d, 0x2f, 0xfd, 0x85, 0x86, 0x96, 0x7f, 0xcc, + 0xb2, 0xfe, 0x73, 0x70, 0x6f, 0x25, 0x95, 0xe3, 0xe9, 0x23, 0xcb, 0xf9, + 0x88, 0xb3, 0x7b, 0xac, 0xbd, 0x21, 0x3e, 0xb2, 0xf6, 0xb4, 0xeb, 0x2f, + 0xa4, 0x00, 0xc9, 0x65, 0xf6, 0x84, 0x80, 0x2c, 0xbd, 0x1e, 0x85, 0x95, + 0x07, 0xc2, 0xc4, 0x7e, 0x23, 0xbf, 0xcd, 0x3b, 0x9c, 0x00, 0x85, 0x97, + 0x30, 0xd6, 0x5c, 0xfd, 0x2c, 0xbf, 0xbd, 0x93, 0x14, 0x0d, 0x65, 0xff, + 0x4a, 0x0f, 0xcc, 0xd4, 0x71, 0x65, 0x76, 0x7c, 0xbd, 0x16, 0xdf, 0x8d, + 0x98, 0x9c, 0xc5, 0x94, 0x34, 0x65, 0x33, 0xe3, 0x92, 0x5e, 0xfb, 0x01, + 0x65, 0xf0, 0x20, 0xbb, 0x59, 0x61, 0x5a, 0xca, 0x34, 0xf4, 0xfa, 0x1c, + 0x09, 0x15, 0xf4, 0xbf, 0x82, 0x2c, 0xbd, 0xdc, 0x01, 0x65, 0xed, 0x41, + 0xd6, 0x53, 0x22, 0x35, 0xcc, 0x42, 0x46, 0x60, 0xed, 0xfb, 0x3a, 0xfb, + 0x9d, 0x65, 0xd9, 0x32, 0xcb, 0x4e, 0x46, 0xfc, 0x42, 0x8b, 0xd1, 0xa9, + 0xd6, 0x54, 0x1e, 0x2b, 0x14, 0x52, 0xcb, 0xdd, 0xc0, 0x16, 0x58, 0xa4, + 0x6a, 0x30, 0x2e, 0xfe, 0xf3, 0x1f, 0x3c, 0xeb, 0x2a, 0x0f, 0x44, 0x24, + 0xb7, 0xd1, 0x28, 0x3a, 0xcb, 0xc4, 0xdb, 0xab, 0x28, 0x56, 0x6f, 0xfe, + 0x43, 0x70, 0x78, 0xb2, 0xfc, 0x19, 0x73, 0xc3, 0x59, 0x50, 0x78, 0x04, + 0x2f, 0x7e, 0xc9, 0xa4, 0xfc, 0x59, 0x52, 0x5d, 0x9c, 0x19, 0x0f, 0x45, + 0x8c, 0x3d, 0x33, 0xee, 0x8b, 0x4e, 0x67, 0xe8, 0x70, 0x14, 0x61, 0xdc, + 0x86, 0x07, 0xe1, 0x32, 0x16, 0x0d, 0xec, 0xa2, 0x10, 0x5f, 0xcf, 0x2d, + 0xdd, 0xd0, 0xce, 0xb2, 0xc4, 0xb2, 0xe9, 0x6e, 0x2c, 0xaf, 0x1e, 0xff, + 0x0d, 0x7e, 0x21, 0x7f, 0xbf, 0xc7, 0xeb, 0xed, 0x3a, 0xca, 0x59, 0x4c, + 0x78, 0x1b, 0x66, 0xb7, 0xf6, 0x4e, 0x3f, 0x36, 0x96, 0x57, 0x8f, 0x48, + 0x89, 0x2f, 0xfd, 0x19, 0xcd, 0x90, 0xc3, 0x12, 0x4b, 0x2f, 0xe6, 0x33, + 0x93, 0xe1, 0x8b, 0x28, 0x8f, 0xc3, 0xe8, 0x17, 0x14, 0x2c, 0xbc, 0x00, + 0x42, 0xcb, 0xb3, 0xb5, 0x97, 0x40, 0xf8, 0x6c, 0xfe, 0x39, 0x7a, 0x0b, + 0xb5, 0x97, 0xff, 0xf3, 0x98, 0x37, 0x7d, 0x4f, 0xe7, 0xff, 0x9b, 0x52, + 0x59, 0x7e, 0xef, 0xbf, 0x46, 0x96, 0x57, 0x91, 0x44, 0x43, 0x81, 0x5c, + 0xa9, 0x26, 0xcd, 0xd9, 0x0f, 0x12, 0x3f, 0x0c, 0xeb, 0xe7, 0x27, 0x99, + 0x65, 0xfb, 0x34, 0x27, 0xf8, 0xb2, 0xfc, 0xdf, 0x2c, 0x92, 0xcb, 0xe8, + 0x32, 0x26, 0x59, 0x7f, 0xee, 0x6f, 0x7f, 0x41, 0xb9, 0xfe, 0x2c, 0xb8, + 0x43, 0xac, 0xbf, 0x16, 0x68, 0x38, 0xb2, 0xf3, 0xf4, 0x4b, 0x2f, 0xef, + 0x93, 0x83, 0x09, 0x65, 0xf8, 0x9c, 0x18, 0x4b, 0x2b, 0x61, 0xe8, 0x7c, + 0xae, 0x86, 0x89, 0x00, 0xb6, 0x54, 0xe9, 0xe2, 0xc8, 0x84, 0xd2, 0x96, + 0x26, 0x98, 0x8f, 0xc8, 0x20, 0x18, 0x28, 0x5b, 0x5f, 0x73, 0x0b, 0xb5, + 0x97, 0xf4, 0x17, 0xfb, 0x0c, 0xeb, 0x2d, 0xc5, 0x97, 0xfa, 0x0c, 0x18, + 0x5f, 0x52, 0x59, 0x7b, 0x91, 0x25, 0x97, 0xef, 0x66, 0x9b, 0x8b, 0x2e, + 0x6d, 0x74, 0x78, 0x7f, 0x1c, 0xb6, 0xf5, 0x95, 0x09, 0x8d, 0x48, 0x8a, + 0x62, 0xfd, 0x08, 0xf9, 0xdf, 0x74, 0xba, 0xff, 0xf1, 0x7f, 0xd9, 0x2f, + 0xc6, 0x17, 0x5f, 0x59, 0x78, 0x98, 0xd5, 0x97, 0xd8, 0x36, 0xde, 0xb2, + 0xe8, 0x3e, 0x1b, 0xf7, 0x1c, 0xbf, 0x4b, 0xec, 0x7f, 0xac, 0xbf, 0x9f, + 0xaf, 0x40, 0x84, 0xb2, 0xd9, 0xd1, 0xeb, 0x18, 0x51, 0x78, 0x4e, 0x89, + 0x65, 0xfc, 0xf2, 0x72, 0xcd, 0xd5, 0x97, 0x30, 0xd6, 0x5f, 0x73, 0xcf, + 0x25, 0x96, 0xfa, 0xca, 0x84, 0xf1, 0x9a, 0x11, 0x1a, 0x84, 0x07, 0x8a, + 0x5c, 0x78, 0x05, 0xc1, 0x16, 0x10, 0x8a, 0xf6, 0x14, 0xcb, 0x2d, 0xd2, + 0xcb, 0x81, 0x09, 0x2e, 0x30, 0xc4, 0x94, 0xc6, 0xbc, 0xc1, 0x6b, 0xf1, + 0x67, 0xfc, 0xc9, 0x05, 0x9a, 0x1b, 0xe3, 0x4b, 0x38, 0xb2, 0xa4, 0x7b, + 0x43, 0x38, 0xbb, 0xb0, 0x2c, 0xbf, 0xce, 0x6c, 0x11, 0x67, 0xd6, 0x5e, + 0x60, 0x3a, 0xca, 0x84, 0xd7, 0x86, 0x38, 0xf0, 0xbc, 0x01, 0x11, 0x0c, + 0x04, 0xc6, 0xf7, 0xa0, 0xc5, 0x97, 0x9f, 0xae, 0x2c, 0xb7, 0x16, 0x5f, + 0x09, 0xe7, 0xfa, 0xca, 0x9c, 0xfb, 0x86, 0x3b, 0xd0, 0xef, 0xc4, 0x6f, + 0x41, 0x4c, 0xb2, 0xe2, 0x85, 0x94, 0xb2, 0x96, 0x54, 0xc5, 0xb1, 0xc2, + 0xee, 0xf4, 0xcb, 0x2e, 0x60, 0x2c, 0xa8, 0x35, 0xc0, 0x18, 0xa9, 0x91, + 0x6d, 0xa1, 0xc7, 0x2b, 0x02, 0x7d, 0xff, 0xc6, 0xb1, 0x77, 0xc8, 0x3b, + 0xf5, 0xf5, 0x97, 0x81, 0x9b, 0xab, 0x2f, 0xff, 0x8b, 0x01, 0x87, 0x0c, + 0x6b, 0x4c, 0x1e, 0xd6, 0x5f, 0x14, 0x1e, 0x65, 0x94, 0x6a, 0x35, 0xb4, + 0x8c, 0x43, 0xff, 0x4f, 0xbe, 0x3f, 0x02, 0x75, 0x96, 0x35, 0x65, 0xb6, + 0xd6, 0x5d, 0xa3, 0x56, 0x54, 0x1f, 0x0b, 0x11, 0x84, 0x48, 0x41, 0x4b, + 0xff, 0xef, 0x64, 0xb9, 0x1f, 0x96, 0x6e, 0x39, 0x01, 0x65, 0xff, 0x37, + 0xfd, 0x9d, 0x7c, 0x30, 0xb2, 0xf8, 0x48, 0xd0, 0x16, 0x54, 0x8f, 0x73, + 0xc7, 0x37, 0x67, 0x16, 0x5f, 0xfe, 0xc9, 0x6d, 0xe1, 0xaf, 0x9f, 0x8f, + 0xf1, 0x65, 0x42, 0x21, 0x24, 0x44, 0x01, 0x6a, 0xe2, 0x6c, 0x1f, 0x8c, + 0xc6, 0xe8, 0xe2, 0xcb, 0x01, 0x65, 0xf4, 0x1e, 0x0e, 0xb2, 0xfc, 0xc6, + 0x1d, 0xfe, 0xb2, 0x98, 0xf2, 0x74, 0x43, 0x6c, 0x59, 0x4c, 0x8c, 0xbd, + 0x15, 0x38, 0xb7, 0x16, 0xb6, 0xc8, 0x6c, 0x6a, 0xca, 0x85, 0xd6, 0x8c, + 0x87, 0xa3, 0x46, 0x27, 0xe8, 0x4f, 0x3c, 0xa6, 0x6d, 0xd4, 0xbb, 0xe8, + 0x30, 0x33, 0x2c, 0xbd, 0xc8, 0x99, 0x65, 0xfd, 0x83, 0xcd, 0xed, 0xa5, + 0x94, 0xb2, 0xda, 0x59, 0x63, 0xac, 0xaf, 0x9a, 0xd0, 0x85, 0xef, 0x11, + 0xbe, 0x1b, 0xbf, 0x4b, 0x2f, 0xc0, 0x6d, 0x31, 0xab, 0x2e, 0x73, 0x56, + 0x5d, 0x9d, 0x2c, 0xae, 0xd3, 0x44, 0x98, 0x90, 0xe3, 0xbe, 0x5b, 0x73, + 0x00, 0x11, 0x11, 0x46, 0xd8, 0xbd, 0xd9, 0xe5, 0x97, 0xf1, 0x7f, 0x09, + 0x8c, 0x59, 0x7f, 0x7f, 0x98, 0x76, 0xfa, 0xcb, 0x69, 0x65, 0x41, 0xbe, + 0xc2, 0xda, 0x59, 0x4b, 0x2d, 0x0b, 0x28, 0x56, 0x69, 0x88, 0x2f, 0xe1, + 0x77, 0xb3, 0x7b, 0xac, 0xbe, 0xf7, 0xb0, 0x0b, 0x2d, 0x1e, 0x37, 0xe2, + 0x0e, 0xd4, 0x26, 0xb8, 0xc2, 0xc7, 0x6a, 0x74, 0x50, 0x38, 0x5f, 0xdf, + 0xce, 0xa5, 0x12, 0x59, 0x7e, 0xfe, 0x79, 0xcd, 0x59, 0x5d, 0x1e, 0xb3, + 0x17, 0x5f, 0xba, 0x06, 0xd4, 0x1e, 0x2c, 0xbd, 0xe7, 0x3a, 0xcb, 0xf9, + 0xfe, 0x01, 0x0a, 0x4b, 0x28, 0x67, 0x95, 0xb8, 0x39, 0x7f, 0x7c, 0x6c, + 0x08, 0x25, 0x97, 0xa7, 0xf3, 0x2c, 0xbb, 0xc1, 0xe8, 0xf2, 0x5c, 0xb2, + 0xf1, 0x86, 0x18, 0x92, 0xff, 0x44, 0xe2, 0x67, 0x9f, 0xa4, 0x82, 0xcd, + 0x05, 0xfe, 0x61, 0xb9, 0x75, 0x2e, 0x2c, 0xa1, 0x9f, 0xd7, 0x91, 0xee, + 0xc9, 0xd6, 0x5f, 0x8e, 0x24, 0x68, 0x0b, 0x29, 0x65, 0x2c, 0xb4, 0x1c, + 0xb6, 0x00, 0x5d, 0x41, 0xf2, 0x48, 0xfe, 0xff, 0xdc, 0x89, 0x7b, 0x30, + 0xa5, 0xc5, 0x94, 0x34, 0xf0, 0xfb, 0x86, 0x43, 0x11, 0x4c, 0xf7, 0xf2, + 0x1b, 0xd0, 0x76, 0x59, 0x7a, 0x59, 0xda, 0xcb, 0xe8, 0x1b, 0x1d, 0x65, + 0x6d, 0x0a, 0xd5, 0x21, 0xe7, 0x25, 0x18, 0xf6, 0xa3, 0xd0, 0xdb, 0x0e, + 0xde, 0xd6, 0xe8, 0xd6, 0x5b, 0xcb, 0x29, 0x8d, 0x8e, 0xe9, 0x05, 0xfb, + 0xd1, 0xd3, 0xee, 0x2c, 0xbf, 0xfe, 0x8f, 0xf0, 0x79, 0xf6, 0xf0, 0x73, + 0xaf, 0xac, 0xaf, 0x1f, 0xdf, 0xca, 0xef, 0x16, 0x79, 0x65, 0xb4, 0xb2, + 0xff, 0x66, 0x76, 0x26, 0xff, 0x62, 0xcb, 0xfe, 0x82, 0xf9, 0x67, 0xe0, + 0xc5, 0x97, 0xf1, 0x9c, 0x62, 0xea, 0x4b, 0x2f, 0xa7, 0xfe, 0x79, 0x65, + 0x61, 0xe9, 0x04, 0xbe, 0x96, 0x53, 0x22, 0xd7, 0x50, 0x89, 0x72, 0x1b, + 0xee, 0x7d, 0xd9, 0x65, 0xfd, 0x93, 0x00, 0xf9, 0x32, 0xcb, 0xef, 0xf2, + 0x00, 0xb2, 0xed, 0x05, 0x65, 0x61, 0xb9, 0xf9, 0x15, 0xb8, 0xb2, 0x88, + 0xd8, 0x84, 0x82, 0xff, 0x3e, 0xfc, 0x1c, 0xf8, 0x62, 0xcb, 0xff, 0xd1, + 0x9d, 0x09, 0xf6, 0x20, 0xcb, 0x38, 0xb2, 0xf4, 0x64, 0xeb, 0x2d, 0x83, + 0x3e, 0x6d, 0xe9, 0x57, 0xd9, 0xe1, 0x34, 0xb2, 0xe3, 0x81, 0x65, 0xce, + 0x4b, 0x2b, 0xc6, 0xb1, 0xc5, 0xee, 0x63, 0x56, 0x5f, 0x37, 0xc0, 0xeb, + 0x2f, 0xd1, 0xd4, 0xb0, 0xeb, 0x2a, 0x47, 0xc0, 0x71, 0x7f, 0x10, 0xdf, + 0x72, 0x08, 0xd5, 0x95, 0x3a, 0xe6, 0x4e, 0x42, 0x79, 0x88, 0xb7, 0x06, + 0xe6, 0x11, 0xd4, 0x3a, 0xce, 0x67, 0xe2, 0x17, 0x84, 0xc8, 0x08, 0x0a, + 0x13, 0x9c, 0x29, 0xfa, 0x78, 0x61, 0x00, 0x21, 0x7d, 0xda, 0x35, 0x65, + 0xf4, 0x1d, 0xfc, 0xb2, 0xf7, 0xfe, 0xeb, 0x2f, 0xb4, 0x18, 0xde, 0xb2, + 0xfd, 0x9b, 0x8e, 0x40, 0x19, 0xf0, 0xb9, 0x0f, 0xc7, 0x2f, 0xbd, 0xf6, + 0x9d, 0x65, 0xfe, 0xed, 0xb8, 0x59, 0xbd, 0xd6, 0x5f, 0x44, 0xef, 0x25, + 0x97, 0x00, 0xeb, 0x2f, 0x73, 0xcc, 0xb2, 0xb4, 0x6c, 0xfe, 0x2f, 0x7f, + 0x13, 0xfe, 0x7c, 0x31, 0x65, 0x2c, 0xa2, 0x37, 0x3f, 0x2e, 0xa8, 0x3f, + 0xac, 0x5a, 0xbe, 0x9c, 0xb3, 0xa5, 0x97, 0xf0, 0x39, 0x83, 0x79, 0x2c, + 0xac, 0x3d, 0x07, 0x23, 0xbe, 0xfb, 0x17, 0x16, 0x5f, 0x6c, 0xce, 0xbe, + 0xb2, 0xfe, 0xe4, 0x75, 0x2c, 0xfa, 0xca, 0xec, 0xf4, 0xf8, 0x4b, 0x7d, + 0x9f, 0x6e, 0x2c, 0xa5, 0x95, 0xd1, 0xac, 0x72, 0x1a, 0xc4, 0x72, 0x33, + 0xa3, 0xa7, 0xd4, 0x2b, 0x8c, 0x93, 0xce, 0x26, 0x74, 0x47, 0xa3, 0x4f, + 0x43, 0x3c, 0x9c, 0x39, 0x18, 0x25, 0xe1, 0x02, 0x22, 0xcb, 0xc4, 0xdb, + 0x8b, 0x2f, 0xef, 0x47, 0xf9, 0xe6, 0x59, 0x73, 0x9a, 0xb2, 0xc3, 0xf9, + 0xe2, 0x6d, 0x96, 0xde, 0xeb, 0x83, 0x59, 0x50, 0x8a, 0xbc, 0x62, 0x62, + 0xbb, 0x6d, 0xac, 0xba, 0x06, 0xb2, 0x85, 0x26, 0xab, 0xc2, 0x96, 0xe2, + 0xcb, 0x1d, 0x65, 0xb4, 0xb2, 0x9c, 0xd1, 0x04, 0x46, 0xb4, 0x7a, 0x7e, + 0x33, 0xbf, 0xa7, 0x1e, 0x98, 0x33, 0xac, 0xb0, 0x16, 0x52, 0xc6, 0x3e, + 0x37, 0x22, 0xdb, 0x30, 0xbf, 0xd0, 0x52, 0x73, 0xe0, 0xd6, 0x5f, 0x7c, + 0xe7, 0xd2, 0xcb, 0xff, 0x81, 0x05, 0xdb, 0xfc, 0x02, 0x14, 0x96, 0x5e, + 0x93, 0x79, 0x65, 0xf7, 0xcb, 0x24, 0xb2, 0xf8, 0x22, 0xbe, 0x3a, 0xcb, + 0xf4, 0xe3, 0x77, 0x31, 0x65, 0x61, 0xe7, 0x84, 0x9a, 0xff, 0xee, 0x7b, + 0x06, 0x59, 0xbc, 0xb3, 0x8b, 0x2f, 0x3c, 0xdc, 0x59, 0x4c, 0x7c, 0x3f, + 0x44, 0xa9, 0x27, 0x90, 0x69, 0x8f, 0x44, 0x73, 0x22, 0xe8, 0x70, 0x9c, + 0x3f, 0x08, 0x2b, 0x84, 0xed, 0x65, 0x6d, 0x6e, 0xda, 0xe4, 0x50, 0xc0, + 0x2a, 0x12, 0x8a, 0xb2, 0x08, 0x94, 0x87, 0x3c, 0x35, 0x24, 0xd4, 0x39, + 0x7a, 0xb9, 0x3d, 0x40, 0x6c, 0x67, 0x3d, 0xc3, 0x07, 0xa8, 0xfd, 0xda, + 0x50, 0x4c, 0xd1, 0xc9, 0x6a, 0x51, 0x09, 0xe3, 0xd8, 0xf4, 0xf1, 0x83, + 0xc7, 0x68, 0x08, 0xf4, 0x45, 0x70, 0x9e, 0x29, 0x6e, 0xdc, 0x9d, 0x5e, + 0xfc, 0xe3, 0xb0, 0x5f, 0x37, 0xc3, 0x28, 0xc5, 0x7d, 0xb8, 0x6d, 0x89, + 0x1f, 0xfe, 0xeb, 0x65, 0xff, 0x0b, 0xfb, 0x66, 0xef, 0x03, 0x0b, 0x2f, + 0x00, 0x49, 0x2c, 0xbf, 0xfe, 0xe3, 0x79, 0xdb, 0xf9, 0xa0, 0x1d, 0xe4, + 0xb2, 0xc2, 0xfa, 0x3e, 0xcf, 0x8f, 0x5f, 0xee, 0x0b, 0x8d, 0xf0, 0x1e, + 0xd6, 0x58, 0x30, 0x7c, 0x7f, 0x2b, 0xa1, 0x6a, 0xd8, 0xe7, 0x94, 0x60, + 0x38, 0xc3, 0x2f, 0xda, 0xed, 0xdf, 0xb5, 0x45, 0x6e, 0xbf, 0xf3, 0xc8, + 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x13, 0x82, 0xc2, 0xf1, 0x10, 0x87, 0x36, + 0xb8, 0x50, 0x35, 0x96, 0xf2, 0xcb, 0x71, 0x65, 0x04, 0xd1, 0x6d, 0x88, + 0xdf, 0xb0, 0xce, 0x31, 0x8b, 0x2f, 0x4b, 0x9c, 0x59, 0x7d, 0xdb, 0xbf, + 0x6a, 0x8b, 0x45, 0x7f, 0xfb, 0x07, 0xe7, 0x36, 0x69, 0x9b, 0x81, 0x3a, + 0xcb, 0xfd, 0x13, 0xfb, 0x34, 0x1e, 0xd6, 0x56, 0x91, 0x65, 0xe3, 0x0e, + 0x26, 0xde, 0x62, 0xed, 0x65, 0xe7, 0x20, 0x2c, 0xac, 0x36, 0xfd, 0x8e, + 0x5f, 0x02, 0x0b, 0xb5, 0x97, 0xb7, 0xc4, 0xcb, 0x2f, 0xf6, 0x6e, 0x73, + 0x5a, 0x7f, 0xac, 0xbf, 0xa2, 0x77, 0xf3, 0x9d, 0x65, 0x32, 0x20, 0xa6, + 0x1f, 0xf1, 0xb5, 0xfd, 0x1f, 0xc2, 0xef, 0x16, 0x5b, 0x8b, 0x29, 0x8d, + 0xef, 0x8b, 0x2f, 0xe8, 0x72, 0x08, 0xf1, 0x65, 0xfb, 0x43, 0x0f, 0xf8, + 0xb2, 0xff, 0xa2, 0x7f, 0x67, 0x3d, 0x9b, 0x8b, 0x2f, 0xdd, 0xe3, 0x17, + 0x6b, 0x2f, 0xf6, 0x76, 0x50, 0x0e, 0x42, 0xcb, 0xa3, 0xbd, 0x87, 0xb5, + 0xc2, 0x8b, 0xfe, 0xdf, 0xcc, 0xf6, 0x10, 0x83, 0x59, 0x50, 0x7d, 0x78, + 0x61, 0x5e, 0x4c, 0x84, 0xa3, 0x01, 0xbf, 0xd9, 0xa0, 0x64, 0xc2, 0x71, + 0x65, 0x8d, 0x59, 0x7f, 0xd9, 0x13, 0xe4, 0xda, 0x6e, 0x2c, 0xa6, 0x3c, + 0xb9, 0x84, 0xaf, 0xff, 0xd3, 0xc7, 0xe0, 0x7a, 0x8f, 0x3f, 0x0b, 0x00, + 0xb2, 0xff, 0xd1, 0xd3, 0xee, 0x78, 0x9f, 0x72, 0x75, 0x97, 0xfe, 0x8d, + 0x03, 0x1b, 0x35, 0xf0, 0xac, 0xa8, 0x46, 0xb7, 0x95, 0x38, 0x8b, 0x43, + 0x4f, 0x41, 0x8a, 0x66, 0x84, 0x07, 0x21, 0xf1, 0x7f, 0x46, 0xf2, 0x7f, + 0xf1, 0x65, 0xff, 0xf7, 0xe0, 0x7e, 0x0b, 0x9b, 0xde, 0x31, 0x76, 0xb2, + 0xff, 0xdc, 0xf6, 0x02, 0x6e, 0x13, 0xf9, 0x65, 0xf1, 0xd8, 0xa4, 0xb2, + 0x99, 0x16, 0x3b, 0x8a, 0x3c, 0x3f, 0xa8, 0x5c, 0x73, 0xc9, 0x63, 0x5e, + 0x48, 0x78, 0x6f, 0xdd, 0x1e, 0x59, 0x77, 0x0e, 0xb2, 0xa6, 0x35, 0xbe, + 0x16, 0xa5, 0x97, 0xb5, 0x06, 0xac, 0xbf, 0x37, 0xca, 0x0e, 0xb2, 0xb6, + 0xb3, 0xce, 0x98, 0x2f, 0xc3, 0xb7, 0xfa, 0x0f, 0xad, 0x30, 0x38, 0xb2, + 0xf7, 0x78, 0x62, 0xcb, 0x64, 0xc7, 0xa3, 0xe3, 0x3b, 0xff, 0xe6, 0xff, + 0x1b, 0xb7, 0xd7, 0x78, 0xc5, 0xda, 0xcb, 0x18, 0xb2, 0xff, 0x6a, 0x3f, + 0xd4, 0xb3, 0xeb, 0x2f, 0xff, 0xec, 0x99, 0xca, 0x70, 0x37, 0x5c, 0xef, + 0x18, 0xbb, 0x59, 0x76, 0x0d, 0x65, 0xe9, 0xdc, 0xeb, 0x2f, 0x40, 0x35, + 0x06, 0xcd, 0x85, 0xaf, 0xfe, 0xeb, 0x9f, 0x2c, 0xdf, 0xff, 0xb0, 0xd6, + 0x54, 0x93, 0x9d, 0x65, 0x09, 0x84, 0x88, 0xd3, 0x90, 0x90, 0x09, 0x85, + 0xcd, 0x25, 0x97, 0xf6, 0x6f, 0xf8, 0x63, 0xb5, 0x97, 0xfb, 0xde, 0x09, + 0xa7, 0x8e, 0x2c, 0xbf, 0x6c, 0x97, 0x84, 0xe2, 0xcb, 0x8d, 0x1a, 0xcb, + 0xff, 0xee, 0x16, 0x6f, 0x7f, 0x96, 0x73, 0xcf, 0x32, 0xca, 0xc3, 0xe8, + 0x61, 0x8b, 0xf4, 0x7f, 0x82, 0x79, 0x65, 0x42, 0x6b, 0x03, 0x16, 0xc3, + 0x06, 0x35, 0x9a, 0x12, 0x84, 0x41, 0x7c, 0x4d, 0xd4, 0x96, 0x5e, 0x03, + 0xf9, 0x65, 0xfe, 0x9f, 0x18, 0x6e, 0xe6, 0xac, 0xac, 0x3c, 0xf7, 0x1c, + 0xbf, 0xb5, 0x03, 0x82, 0x99, 0x65, 0xb8, 0xb2, 0xa7, 0x37, 0xde, 0x2d, + 0xb0, 0xb1, 0x4b, 0x37, 0x83, 0x68, 0x3d, 0x9c, 0x90, 0x65, 0x39, 0x0c, + 0xfe, 0xd9, 0xfa, 0x21, 0x9a, 0x14, 0x9a, 0x6d, 0x39, 0x07, 0xa7, 0x27, + 0x9d, 0xd8, 0x0e, 0x05, 0x08, 0x6e, 0x47, 0x8b, 0xf8, 0xed, 0x02, 0xb5, + 0xb6, 0xe2, 0x22, 0xf5, 0xee, 0x1f, 0x8b, 0x2f, 0xf0, 0xa6, 0x1b, 0xf2, + 0xce, 0x2c, 0xbf, 0xfe, 0x6f, 0xb6, 0x9c, 0x11, 0xe6, 0xee, 0x00, 0xb2, + 0xe9, 0x49, 0x65, 0xff, 0xd8, 0x51, 0x86, 0xc4, 0xbf, 0x93, 0xac, 0xbf, + 0xf3, 0xfb, 0x64, 0x67, 0xfc, 0xc7, 0x59, 0x7f, 0xff, 0x9b, 0xf1, 0xe2, + 0xcf, 0xea, 0x3c, 0x59, 0xbc, 0x3d, 0xac, 0xbf, 0xfe, 0x8c, 0xff, 0x9e, + 0x5a, 0x08, 0xe0, 0xa1, 0x65, 0x49, 0x39, 0x5d, 0xc4, 0xef, 0x0b, 0x85, + 0x0f, 0x79, 0xfe, 0xeb, 0x0d, 0xff, 0xe6, 0xf3, 0xb4, 0xff, 0x62, 0x60, + 0x71, 0x65, 0xff, 0x14, 0x4b, 0x39, 0x8d, 0x0b, 0x2d, 0x3a, 0xca, 0x83, + 0xc7, 0x23, 0x5b, 0xff, 0xfe, 0x80, 0x1d, 0xe5, 0xb3, 0xfe, 0xc3, 0xe7, + 0x71, 0xe8, 0x3a, 0xcb, 0xff, 0xe6, 0x2f, 0x87, 0xcd, 0xcd, 0xb7, 0xfe, + 0x0d, 0x65, 0x79, 0x17, 0x3f, 0x68, 0xbf, 0x9a, 0x7d, 0x8e, 0x40, 0x59, + 0x7f, 0xff, 0xde, 0x76, 0xe6, 0x1a, 0xe4, 0x0d, 0x99, 0xb9, 0x04, 0xe6, + 0xac, 0xbc, 0xef, 0xda, 0xa2, 0xda, 0x54, 0x22, 0x4b, 0xb6, 0x9b, 0xff, + 0xfa, 0x1f, 0xf1, 0xe8, 0xe3, 0x34, 0x9b, 0x58, 0x35, 0x97, 0xf7, 0xa0, + 0xf0, 0xc3, 0x59, 0x4c, 0x9c, 0x54, 0xc4, 0x7a, 0x86, 0x0f, 0x08, 0xfe, + 0xaf, 0x7f, 0x3c, 0x87, 0xe6, 0x3a, 0xcb, 0xfd, 0x93, 0x14, 0x1f, 0x67, + 0x6b, 0x2e, 0xf3, 0x0c, 0xf8, 0xfe, 0x5b, 0x7f, 0xfb, 0xd9, 0x27, 0x2f, + 0xbc, 0x98, 0xd8, 0x59, 0x7f, 0xd9, 0x9d, 0xed, 0x87, 0xcd, 0xa5, 0x97, + 0xff, 0x7b, 0x27, 0xe3, 0x6a, 0x37, 0x5c, 0x96, 0x5d, 0x8c, 0xb2, 0xbb, + 0x3d, 0xbd, 0xe8, 0xd7, 0xf4, 0x0a, 0x39, 0x3e, 0x18, 0xb2, 0xa0, 0xf6, + 0x34, 0x4b, 0x6d, 0xa9, 0x65, 0xff, 0xd9, 0xf8, 0x39, 0x39, 0xa5, 0x80, + 0x59, 0x60, 0x2c, 0xa9, 0x8f, 0xa4, 0x85, 0xbe, 0x85, 0x7f, 0xe6, 0x21, + 0xc4, 0x1f, 0x75, 0xe4, 0xb2, 0xff, 0xa0, 0x1e, 0x89, 0xcb, 0x38, 0xb2, + 0xa0, 0xfd, 0xc2, 0x7f, 0x7d, 0xe8, 0xd1, 0xab, 0x2f, 0xff, 0x36, 0xa3, + 0x3c, 0x16, 0xe7, 0xb0, 0x0b, 0x2f, 0xff, 0x86, 0x1f, 0xf0, 0x79, 0x2f, + 0x46, 0xf1, 0xc2, 0xcb, 0x83, 0x8b, 0x2a, 0x48, 0xd3, 0x19, 0x1b, 0x24, + 0x12, 0x95, 0xff, 0x44, 0xa3, 0x53, 0xc6, 0xa7, 0x59, 0x7f, 0xfa, 0x25, + 0xe8, 0x23, 0x4b, 0x27, 0x12, 0x4b, 0x2f, 0xff, 0xf4, 0x31, 0x3f, 0xc3, + 0xfc, 0x1c, 0x1c, 0x7e, 0x8e, 0x96, 0x5f, 0xe6, 0x38, 0xe3, 0x82, 0x71, + 0x65, 0xef, 0xe7, 0x6b, 0x2f, 0xff, 0x89, 0xb7, 0xb7, 0xfd, 0x1f, 0xe4, + 0x6f, 0x85, 0x94, 0xc9, 0xa6, 0x69, 0x2f, 0xcb, 0xff, 0x34, 0x08, 0xed, + 0xfe, 0x1e, 0x14, 0x9b, 0xc1, 0x59, 0x61, 0xac, 0xbf, 0x83, 0xdf, 0xa3, + 0x58, 0xb2, 0xf7, 0x5c, 0xf2, 0xca, 0xc3, 0xcc, 0x72, 0xea, 0x64, 0x57, + 0xb9, 0x97, 0x17, 0x6f, 0xfe, 0xfb, 0xb6, 0x46, 0x9e, 0x4d, 0xe5, 0x97, + 0xe7, 0x1e, 0x10, 0x16, 0x54, 0x8f, 0x9d, 0x90, 0x6f, 0xfa, 0x35, 0xb3, + 0x91, 0xe7, 0x65, 0x97, 0xfb, 0xcc, 0xf2, 0xfb, 0x4e, 0xb2, 0xfa, 0x30, + 0x99, 0x65, 0xf7, 0xe3, 0x06, 0xb2, 0x86, 0x78, 0x1d, 0x0f, 0xde, 0xfe, + 0x4e, 0xb2, 0xb6, 0xa6, 0x6e, 0x88, 0xa4, 0x76, 0x23, 0xcb, 0x93, 0x00, + 0xe1, 0x1f, 0x92, 0x98, 0xfb, 0x85, 0x9b, 0x16, 0xcc, 0x91, 0xa8, 0x77, + 0x9e, 0x11, 0x5e, 0x85, 0x33, 0xc3, 0xd0, 0x8e, 0xf9, 0x1c, 0x37, 0xe1, + 0xf2, 0x18, 0x4a, 0x98, 0x43, 0xb6, 0x72, 0x23, 0x9e, 0xe9, 0x1d, 0xec, + 0xc3, 0x56, 0x5f, 0xd1, 0x2e, 0x3e, 0x76, 0xb2, 0xe8, 0x17, 0xa3, 0xc9, + 0xf0, 0xe5, 0xff, 0x46, 0x9f, 0xe0, 0x10, 0xa4, 0xb2, 0xff, 0xfe, 0xd4, + 0x7d, 0xbb, 0x61, 0xc3, 0x69, 0xa4, 0xdc, 0x59, 0x7f, 0x1a, 0xfa, 0x18, + 0x49, 0x65, 0xfe, 0xfb, 0x76, 0xc3, 0xe8, 0x96, 0x5f, 0xd0, 0x7c, 0x0e, + 0x1d, 0x65, 0x41, 0xf0, 0x31, 0xa5, 0xff, 0xff, 0xff, 0x86, 0x51, 0xdf, + 0x5d, 0xb7, 0x47, 0x72, 0x37, 0x09, 0xfa, 0x33, 0xbf, 0x34, 0xc4, 0xc7, + 0xe2, 0xcb, 0xff, 0x37, 0xe3, 0xed, 0xbe, 0x0b, 0xb5, 0x97, 0x75, 0x25, + 0x95, 0x88, 0xf6, 0x78, 0x4f, 0x84, 0xfe, 0xfe, 0x2d, 0xb6, 0xd6, 0x1a, + 0xb2, 0xef, 0xf9, 0x65, 0xff, 0x67, 0xf8, 0x27, 0x3f, 0x9e, 0x59, 0x53, + 0x9e, 0x89, 0xc5, 0xef, 0xcd, 0x39, 0xe3, 0xb5, 0x97, 0xe7, 0xea, 0x42, + 0x71, 0x65, 0xff, 0x9a, 0x6e, 0x6f, 0x72, 0x9c, 0x23, 0x59, 0x61, 0x73, + 0xab, 0xa2, 0xc3, 0x93, 0x56, 0x75, 0x08, 0xef, 0x46, 0x2c, 0x46, 0x7c, + 0x84, 0x0f, 0xc8, 0xf7, 0x94, 0x88, 0x55, 0x42, 0xd7, 0x8a, 0x72, 0x3b, + 0x00, 0x4b, 0xd1, 0xb8, 0xfe, 0x59, 0x7e, 0xd7, 0x6e, 0xfd, 0xaa, 0x2e, + 0x55, 0xfc, 0xe3, 0xf4, 0x14, 0xeb, 0x2e, 0x37, 0xcb, 0x2c, 0x2c, 0x68, + 0x92, 0xc1, 0x7f, 0x1b, 0x39, 0x6d, 0xcc, 0x6a, 0xcb, 0xf6, 0xbb, 0x77, + 0xed, 0x51, 0x76, 0xaf, 0x4f, 0x86, 0x2c, 0xbc, 0x0d, 0xee, 0xb2, 0xff, + 0x9a, 0x52, 0x62, 0x04, 0x49, 0x65, 0xc7, 0xdb, 0x59, 0x7c, 0xda, 0x70, + 0x2c, 0xbc, 0xf3, 0xc2, 0xcb, 0x0b, 0x1a, 0x62, 0xf8, 0x2e, 0x73, 0x6f, + 0x0f, 0x38, 0xf1, 0x1b, 0xf0, 0x68, 0x24, 0x35, 0x10, 0x94, 0xb8, 0x9c, + 0xaa, 0x55, 0x98, 0xf0, 0xe5, 0x36, 0xe2, 0x21, 0xb5, 0xe0, 0x5b, 0x5b, + 0xc0, 0x9d, 0xc8, 0x63, 0x7a, 0x9c, 0x14, 0x55, 0xa9, 0xbf, 0x21, 0xa7, + 0xf8, 0xd6, 0xaf, 0xf0, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x2a, 0x75, 0xfe, + 0xd7, 0xdb, 0xf3, 0x87, 0x8b, 0x2e, 0xe7, 0x16, 0x5c, 0x42, 0xf0, 0xf3, + 0x34, 0x6b, 0x7f, 0xf3, 0x6f, 0x8f, 0x34, 0x4d, 0x34, 0x76, 0xb2, 0xe9, + 0xf1, 0x65, 0xf7, 0x0b, 0xdf, 0x59, 0x7f, 0xbd, 0x1c, 0x83, 0x86, 0x65, + 0x97, 0xc1, 0x94, 0x4e, 0xb2, 0xff, 0xba, 0x97, 0x36, 0x66, 0xf7, 0xd2, + 0xca, 0x92, 0x2d, 0xc6, 0x45, 0xa3, 0x4f, 0x11, 0xdf, 0xc1, 0xe8, 0xee, + 0xe4, 0xb2, 0xdf, 0x59, 0x7d, 0xd7, 0x20, 0x6b, 0x2c, 0x15, 0x97, 0xa1, + 0xe7, 0xd8, 0x6d, 0x00, 0x47, 0x4c, 0x7f, 0x24, 0x8b, 0x7d, 0xdb, 0xbf, + 0x6a, 0x8a, 0xe5, 0x71, 0xe1, 0x65, 0xfb, 0x5d, 0xbb, 0xf6, 0xa8, 0xb3, + 0x96, 0x17, 0x07, 0x99, 0x82, 0xd7, 0x3c, 0x96, 0x5f, 0xd2, 0xff, 0x5d, + 0xb7, 0x16, 0x53, 0x9e, 0x30, 0x45, 0xaf, 0xe6, 0xe6, 0x13, 0x98, 0xb2, + 0xf0, 0x65, 0x0b, 0x2b, 0x49, 0xa9, 0xf9, 0xf0, 0x9b, 0xbe, 0x43, 0xbc, + 0xb2, 0xff, 0xf7, 0xe3, 0x9b, 0x03, 0xcf, 0xc4, 0xd3, 0x32, 0xcb, 0xff, + 0xf3, 0xfb, 0x0f, 0x07, 0xd9, 0x98, 0x69, 0xaf, 0x25, 0x97, 0xf3, 0x1e, + 0x70, 0xea, 0x4b, 0x2f, 0xc7, 0xc9, 0x9c, 0x0b, 0x2f, 0xa7, 0xf3, 0xfd, + 0x65, 0x39, 0xe5, 0x84, 0xa2, 0xf8, 0xfb, 0x40, 0xa7, 0xeb, 0x2f, 0xd1, + 0x34, 0xd1, 0xda, 0xcb, 0xa3, 0xdb, 0x0f, 0x59, 0x8b, 0x2b, 0x13, 0xc4, + 0x99, 0x3b, 0xca, 0xe4, 0xf5, 0xbd, 0xde, 0xff, 0x8a, 0x0f, 0xc0, 0xc9, + 0xcd, 0x59, 0x7e, 0xd6, 0x7d, 0x8e, 0xb2, 0xe3, 0xef, 0x59, 0x78, 0xa0, + 0x6b, 0x2b, 0x0d, 0xa3, 0x8c, 0xdd, 0xec, 0x59, 0x7e, 0xc9, 0xa6, 0x0c, + 0xeb, 0x2c, 0x6e, 0x1e, 0x0f, 0x85, 0xaf, 0xd3, 0x41, 0xe0, 0x45, 0x97, + 0xff, 0xfd, 0xa6, 0xe0, 0x33, 0x63, 0x6f, 0x8f, 0x34, 0x4d, 0x34, 0x76, + 0xb2, 0xe9, 0x1d, 0x65, 0x42, 0x34, 0xf0, 0xa1, 0xca, 0x49, 0xae, 0xfc, + 0x78, 0x3e, 0x12, 0xcb, 0xfc, 0x23, 0x4d, 0x1c, 0x63, 0xac, 0xbf, 0xfd, + 0xe6, 0xd9, 0xe7, 0x6f, 0xc6, 0x0d, 0x96, 0x5f, 0xf9, 0xb5, 0xb2, 0x0e, + 0xdb, 0x8f, 0x32, 0xcb, 0xee, 0xdd, 0xfb, 0x54, 0x48, 0x4a, 0x34, 0xfc, + 0xf4, 0x87, 0x7f, 0xd9, 0xfe, 0x06, 0x51, 0x3c, 0x2c, 0xbf, 0xff, 0x36, + 0xbb, 0xf6, 0x6c, 0xd6, 0xb0, 0xcd, 0xb8, 0x3a, 0xca, 0x92, 0x25, 0x78, + 0x73, 0x7d, 0xfd, 0x37, 0x4b, 0x2f, 0xe7, 0x7e, 0xa5, 0xc6, 0x59, 0x7f, + 0x81, 0x1b, 0x91, 0xf8, 0x1a, 0xcb, 0xfe, 0x3e, 0x3e, 0xa7, 0xd9, 0xd1, + 0xd6, 0x54, 0x1f, 0x96, 0x1a, 0xdf, 0xee, 0xb9, 0xf2, 0x83, 0xf1, 0x65, + 0xff, 0xe7, 0x2e, 0xf6, 0x0c, 0x9e, 0x5e, 0x79, 0x2c, 0xa6, 0x3f, 0xf0, + 0x9a, 0x5f, 0xd8, 0x4c, 0x0e, 0x42, 0xcb, 0x0b, 0x85, 0x6f, 0x12, 0x34, + 0xc8, 0x5e, 0x75, 0x0b, 0x86, 0x23, 0xd1, 0x1f, 0xa1, 0x3e, 0x08, 0x4f, + 0xf0, 0x86, 0xe6, 0xf2, 0xcb, 0xff, 0x38, 0x93, 0x13, 0x7c, 0xa0, 0x0b, + 0x2a, 0x75, 0xc8, 0xc9, 0x4b, 0x9e, 0xea, 0x13, 0x5f, 0x16, 0xbf, 0xf3, + 0x1f, 0x39, 0xb3, 0xa9, 0x67, 0xd6, 0x5f, 0x70, 0x63, 0x85, 0x95, 0xe3, + 0xe3, 0xfa, 0x0d, 0xf4, 0xbc, 0x27, 0x16, 0x5c, 0x2a, 0x6d, 0x0b, 0x2f, + 0xff, 0xde, 0x69, 0xbc, 0xdd, 0x7f, 0xdd, 0xb7, 0x30, 0x6b, 0x2f, 0xa1, + 0x83, 0xc5, 0x96, 0x17, 0xb4, 0x91, 0x35, 0xd9, 0x0f, 0x96, 0x2a, 0x13, + 0x1f, 0xc2, 0x27, 0x85, 0xf5, 0xf6, 0xd1, 0xe8, 0x3a, 0xcb, 0xf7, 0x39, + 0x9a, 0x9d, 0x65, 0xee, 0x41, 0xab, 0x2b, 0xc7, 0x8d, 0xc2, 0x9b, 0xa0, + 0xc5, 0x97, 0xfc, 0x0c, 0x19, 0x38, 0x23, 0x7a, 0xca, 0xc3, 0xf2, 0x62, + 0x27, 0x17, 0xbc, 0x7d, 0xf2, 0x59, 0x7e, 0x8d, 0x6c, 0x07, 0xd6, 0x58, + 0x45, 0x97, 0xff, 0x40, 0x0e, 0xf2, 0xe7, 0xf3, 0x0e, 0xb2, 0x86, 0x7a, + 0xbe, 0x12, 0xbd, 0x31, 0xe6, 0x59, 0x61, 0x62, 0x86, 0xc1, 0x00, 0x55, + 0x23, 0xc4, 0x33, 0xa7, 0x3d, 0x1c, 0x29, 0xb2, 0x37, 0x36, 0x94, 0x21, + 0x32, 0x66, 0x8e, 0x4e, 0xb7, 0xe8, 0xcc, 0xde, 0x73, 0x14, 0xa3, 0xd0, + 0xe1, 0x9f, 0xe1, 0xbe, 0x12, 0xc3, 0x07, 0xc4, 0x7f, 0xdd, 0x22, 0xbf, + 0xc1, 0x7d, 0x4b, 0xc6, 0x3a, 0xcb, 0xff, 0xff, 0xfa, 0x3e, 0x4e, 0x02, + 0x7d, 0xed, 0xbc, 0x83, 0xc1, 0x0a, 0x07, 0xe7, 0x96, 0x71, 0x65, 0xff, + 0x84, 0x28, 0x1f, 0x9e, 0x59, 0xc5, 0x97, 0xfc, 0x50, 0x3f, 0x3c, 0xb3, + 0x8b, 0x2f, 0xf3, 0xef, 0x6d, 0xe4, 0x1e, 0x6c, 0x3f, 0x51, 0x0f, 0xaf, + 0x67, 0x42, 0xc6, 0x9c, 0x16, 0x8d, 0x0a, 0x1f, 0xd7, 0xff, 0x0b, 0xf3, + 0xf0, 0xb3, 0xff, 0x80, 0x2c, 0xbf, 0xfc, 0x2c, 0xef, 0x21, 0x79, 0xae, + 0xdd, 0xfb, 0x54, 0x4f, 0x8b, 0xff, 0xd2, 0x17, 0x9b, 0xd8, 0xde, 0x72, + 0x0e, 0x15, 0x97, 0xfd, 0x86, 0x66, 0xf6, 0xfc, 0xa1, 0x65, 0xf0, 0x75, + 0x1c, 0x59, 0x7d, 0xbb, 0xb6, 0x28, 0x31, 0x65, 0xf8, 0xd7, 0xfe, 0x18, + 0xb2, 0xff, 0x44, 0xe2, 0x6d, 0xb9, 0x01, 0x65, 0x85, 0xce, 0x8e, 0xa1, + 0x9d, 0x11, 0x10, 0x4b, 0x84, 0x29, 0xa7, 0x4e, 0x33, 0xf1, 0x9c, 0xd7, + 0x6d, 0xb3, 0x3b, 0x42, 0x3f, 0x72, 0xb0, 0x6e, 0xd4, 0xac, 0xb3, 0xa4, + 0xf9, 0x15, 0xe3, 0xe8, 0xbf, 0xc4, 0xff, 0xe1, 0x73, 0xeb, 0x2f, 0xff, + 0xe0, 0x93, 0x9b, 0xb3, 0xe6, 0xc1, 0x4b, 0x3c, 0xc7, 0x59, 0x73, 0x74, + 0xb2, 0xff, 0xfa, 0x53, 0xed, 0x38, 0xda, 0x27, 0xef, 0x5b, 0x36, 0x7b, + 0x6d, 0x65, 0x48, 0xff, 0x80, 0x2f, 0x7f, 0xf8, 0xa7, 0xf4, 0x37, 0xf8, + 0xc5, 0xd4, 0x96, 0x5f, 0xfd, 0x9f, 0x6c, 0x2f, 0x67, 0xe0, 0x6b, 0x2f, + 0xfd, 0xf3, 0x60, 0xa5, 0x9e, 0x63, 0xac, 0xbf, 0xe3, 0x60, 0xa5, 0x9e, + 0x63, 0xac, 0xbe, 0x09, 0x39, 0xbb, 0x0f, 0xdb, 0xe7, 0xd7, 0xed, 0x01, + 0xbd, 0x0b, 0x28, 0xe7, 0xc4, 0x13, 0xbb, 0xf6, 0x6b, 0x32, 0x65, 0x96, + 0x17, 0x8a, 0xb6, 0xce, 0x65, 0xe8, 0x6d, 0xb9, 0x11, 0x25, 0x72, 0x31, + 0x91, 0x08, 0xaf, 0xda, 0xed, 0xdf, 0xb5, 0x45, 0x64, 0xbf, 0xf3, 0xc8, + 0x5e, 0x6b, 0xb7, 0x7e, 0xd5, 0x13, 0x72, 0xc2, 0xf1, 0x10, 0x87, 0x36, + 0xae, 0xd3, 0x25, 0x68, 0x7d, 0xdf, 0x76, 0xef, 0xda, 0xa2, 0x56, 0x5f, + 0xff, 0x6a, 0x72, 0x8d, 0x38, 0xc9, 0xf5, 0x1b, 0xd6, 0x56, 0x91, 0x00, + 0x13, 0x0b, 0xfe, 0x76, 0x93, 0x10, 0x60, 0xeb, 0x2f, 0xa0, 0x6f, 0xe5, + 0x97, 0xb4, 0xdd, 0x2c, 0xa5, 0x97, 0xf9, 0xa4, 0xc4, 0x18, 0x3a, 0xcb, + 0xf1, 0x3b, 0x75, 0xd9, 0xcd, 0xe3, 0x85, 0xd1, 0x22, 0xdf, 0xe4, 0x3b, + 0xab, 0x37, 0xfa, 0x18, 0xa2, 0x51, 0xba, 0xb2, 0xf8, 0x23, 0xc3, 0x56, + 0x5f, 0x1d, 0xe4, 0x2f, 0x13, 0x98, 0xec, 0x8d, 0xa1, 0xdb, 0xc3, 0x2d, + 0xb3, 0x3b, 0xf0, 0xb7, 0x9b, 0x98, 0xb2, 0xfc, 0x2f, 0x25, 0x00, 0x59, + 0x42, 0xd1, 0x7d, 0x3b, 0x5c, 0x8a, 0xaf, 0xfd, 0xfc, 0x17, 0x9a, 0x69, + 0xdc, 0xeb, 0x2f, 0xe1, 0x4b, 0x9f, 0x51, 0xc5, 0x97, 0xff, 0xb6, 0xad, + 0xac, 0x53, 0xcc, 0x79, 0x36, 0x6b, 0x16, 0x5f, 0xf9, 0xb8, 0x13, 0x93, + 0x6f, 0x0b, 0xac, 0xbf, 0xfe, 0xf4, 0x49, 0x81, 0xac, 0xf3, 0x93, 0xc9, + 0x65, 0xfd, 0x04, 0xfd, 0xbe, 0xe2, 0xcb, 0xe0, 0xee, 0x8e, 0x16, 0x5f, + 0xf4, 0x77, 0x1a, 0x6f, 0xc7, 0x6b, 0x2a, 0x49, 0x8c, 0xf4, 0x7e, 0x74, + 0xdf, 0x17, 0xfc, 0x96, 0xda, 0x59, 0x7f, 0xe0, 0x7f, 0x3d, 0x05, 0xfd, + 0xbc, 0x59, 0x43, 0x3d, 0x10, 0x88, 0xdf, 0x76, 0xef, 0xda, 0xa2, 0x5c, + 0x5f, 0xff, 0x7b, 0x07, 0x1e, 0x89, 0x14, 0x69, 0xc6, 0xb2, 0xb4, 0x7f, + 0xbc, 0x30, 0xbf, 0x4b, 0x3f, 0xbb, 0x3a, 0xcb, 0xef, 0xe9, 0xba, 0x59, + 0x7f, 0x9e, 0x5f, 0x28, 0x3f, 0x16, 0x5f, 0xfc, 0xdc, 0x09, 0xbc, 0xc3, + 0xb7, 0xa1, 0x65, 0x31, 0xfb, 0x39, 0x95, 0xfa, 0x5b, 0x6d, 0xe7, 0x59, + 0x76, 0xdc, 0x2c, 0xbf, 0xf8, 0xa4, 0xe3, 0x78, 0x94, 0x13, 0xac, 0xa8, + 0x3d, 0x9c, 0x19, 0xbf, 0x14, 0x76, 0xfa, 0x59, 0x7f, 0xff, 0x60, 0x7b, + 0xf4, 0x14, 0x49, 0xc7, 0x1d, 0x69, 0x96, 0x5f, 0xfb, 0x8c, 0x41, 0xfe, + 0xdb, 0x6f, 0x3a, 0xcb, 0xff, 0xff, 0xe2, 0xcf, 0xf3, 0x06, 0xe3, 0x82, + 0x7e, 0xbd, 0x9c, 0x8e, 0x71, 0xfc, 0xb2, 0xf3, 0x14, 0x2c, 0xa9, 0x27, + 0xf6, 0x38, 0x41, 0xb1, 0x06, 0xe1, 0x39, 0xd6, 0x89, 0x0f, 0x7b, 0xd5, + 0xfe, 0xcf, 0xf9, 0xb4, 0xfc, 0x59, 0x7f, 0xfd, 0xf6, 0x28, 0x96, 0x0f, + 0x25, 0x84, 0x05, 0x97, 0xe6, 0x00, 0x1b, 0xa5, 0x97, 0xfd, 0x1e, 0x76, + 0x93, 0x1b, 0x0b, 0x2f, 0xfe, 0x20, 0xcb, 0xcf, 0x2c, 0xea, 0x50, 0xb2, + 0xff, 0xe0, 0xc8, 0x9a, 0x51, 0xf2, 0x0c, 0x96, 0x5f, 0xa3, 0x80, 0x3f, + 0xd6, 0x53, 0x1f, 0x5f, 0x90, 0xe8, 0x69, 0x83, 0xf0, 0xdf, 0xf0, 0xaf, + 0xb7, 0x6b, 0x2a, 0x13, 0xc3, 0xc4, 0xc7, 0x8c, 0xbc, 0x06, 0xd7, 0xf4, + 0xbd, 0x85, 0x9d, 0xac, 0xbd, 0x2f, 0x7d, 0x65, 0x31, 0xe5, 0x78, 0xb6, + 0xfb, 0xaf, 0x47, 0x6b, 0x2d, 0xe8, 0x3c, 0x57, 0x21, 0xbf, 0xf8, 0x98, + 0x1c, 0xd4, 0x34, 0x9f, 0x8b, 0x2f, 0xe7, 0xe8, 0x0e, 0xfa, 0x59, 0x73, + 0x71, 0x65, 0x62, 0x2a, 0xd8, 0x9b, 0x88, 0x5b, 0x65, 0xb7, 0xf6, 0x98, + 0xe4, 0xf2, 0x59, 0x7f, 0xee, 0xa5, 0x9f, 0xcd, 0x77, 0x18, 0xb2, 0xf3, + 0xc8, 0x5e, 0xd0, 0xca, 0x64, 0x15, 0x0c, 0x62, 0x36, 0xf9, 0x42, 0x77, + 0x21, 0x3f, 0xd1, 0x13, 0x16, 0x7a, 0x13, 0x2f, 0x28, 0x6c, 0x9b, 0x79, + 0x1f, 0xaf, 0xe3, 0x7b, 0x09, 0xf6, 0xe9, 0x65, 0xff, 0x82, 0x71, 0x7c, + 0x82, 0xfe, 0x69, 0x65, 0xff, 0xfb, 0x3c, 0x2f, 0x91, 0xf8, 0xdf, 0x05, + 0xdb, 0xf1, 0x65, 0xff, 0x0f, 0x05, 0xc6, 0x9b, 0xc1, 0x59, 0x7f, 0xf0, + 0xe0, 0x5e, 0xee, 0x75, 0x2f, 0x47, 0x16, 0x58, 0x5b, 0x33, 0x31, 0xcf, + 0x4a, 0xa4, 0xe4, 0x60, 0xff, 0x40, 0x0a, 0xc6, 0xf3, 0xab, 0xff, 0x85, + 0xbc, 0x85, 0xe6, 0xbb, 0x77, 0xed, 0x51, 0x1d, 0xaf, 0xff, 0x83, 0x1d, + 0x49, 0x8e, 0x66, 0x10, 0xfd, 0x0b, 0x2f, 0xff, 0xfe, 0x3c, 0x77, 0xdf, + 0x9a, 0x6f, 0x31, 0x0d, 0xf5, 0x06, 0x9a, 0x19, 0xd6, 0x5c, 0x11, 0x16, + 0x5f, 0x13, 0xbf, 0x4b, 0x2f, 0xba, 0xfb, 0x18, 0xb2, 0xa0, 0xf1, 0x4e, + 0x43, 0x74, 0xe2, 0xc6, 0x9a, 0x2e, 0x28, 0x1d, 0xdc, 0x45, 0xdb, 0xff, + 0xfc, 0xe0, 0x16, 0x24, 0x4f, 0x9f, 0x82, 0x60, 0x67, 0x5f, 0x59, 0x7e, + 0xe3, 0x6f, 0xf6, 0xf5, 0x97, 0x17, 0x16, 0x5f, 0x7b, 0x24, 0x2e, 0x0f, + 0x09, 0xcb, 0x2b, 0x13, 0x2b, 0x99, 0x37, 0xf0, 0xa5, 0xbc, 0x29, 0xd8, + 0x35, 0x97, 0xfc, 0x29, 0xdb, 0xc3, 0x5b, 0xe5, 0x0b, 0x2f, 0xe1, 0x41, + 0x47, 0x78, 0x4b, 0x2e, 0x0f, 0x96, 0x5f, 0xc2, 0x92, 0xcf, 0x3f, 0xd6, + 0x58, 0xc5, 0x97, 0xd8, 0x7d, 0x42, 0xcb, 0xf6, 0x13, 0x00, 0x45, 0x94, + 0x47, 0x91, 0xc2, 0x1b, 0xd9, 0xa8, 0x59, 0x7c, 0x1d, 0xd1, 0xc2, 0xcb, + 0xff, 0xf4, 0x98, 0x7e, 0x6d, 0xfb, 0x30, 0x7a, 0x60, 0xf6, 0xb2, 0xfa, + 0x35, 0x1a, 0x59, 0x42, 0x84, 0xcd, 0x99, 0x6b, 0x44, 0x3e, 0x1b, 0xf9, + 0x28, 0x8b, 0x57, 0xa6, 0x89, 0xd6, 0x5f, 0x41, 0x7f, 0x8b, 0x2e, 0xc3, + 0x20, 0xdf, 0xf0, 0x7a, 0xff, 0xdc, 0xfe, 0x7a, 0x0b, 0xfe, 0x65, 0x97, + 0xfd, 0x19, 0xf6, 0x79, 0xe3, 0x4b, 0x2e, 0x10, 0xeb, 0x2b, 0x11, 0x18, + 0x03, 0xdf, 0x9b, 0xdd, 0xb5, 0x71, 0x65, 0xfc, 0x02, 0xce, 0xbf, 0x8b, + 0x2e, 0x9f, 0x71, 0x65, 0xff, 0xdb, 0xe0, 0x7f, 0xc8, 0x6f, 0xc4, 0xcb, + 0x2f, 0x8d, 0xf6, 0x01, 0x65, 0xfc, 0xe6, 0x67, 0xe3, 0xb5, 0x94, 0xe7, + 0xa2, 0x44, 0x77, 0xf1, 0x01, 0xf4, 0xe2, 0x2c, 0xbf, 0xfe, 0x8f, 0xc7, + 0xf6, 0x7f, 0xd8, 0x4f, 0xa3, 0x56, 0x56, 0xd0, 0x9c, 0xc4, 0x0e, 0x4e, + 0x5a, 0xc3, 0x7a, 0x84, 0xb3, 0x90, 0x11, 0x6d, 0xff, 0xf7, 0xb6, 0x16, + 0x36, 0x9a, 0x77, 0x39, 0xd9, 0x65, 0xff, 0xff, 0xde, 0x71, 0x93, 0xec, + 0xe7, 0xa3, 0x9b, 0x02, 0xfb, 0x25, 0x9b, 0xe1, 0x65, 0xf1, 0xa5, 0x92, + 0x59, 0x5e, 0x44, 0xd1, 0x3c, 0x5f, 0xfe, 0x2c, 0x37, 0xcf, 0x2f, 0x18, + 0xe2, 0x1d, 0x65, 0x41, 0xf7, 0x61, 0x15, 0x32, 0x6f, 0x1e, 0x8d, 0x62, + 0xfd, 0xad, 0x46, 0xfe, 0x2c, 0xbf, 0xf3, 0x6b, 0x67, 0x0b, 0x0f, 0x1d, + 0xac, 0xbf, 0xc1, 0xfb, 0x3e, 0xf7, 0x92, 0xcb, 0xf9, 0xf7, 0x8f, 0x08, + 0xd5, 0x96, 0x82, 0x3e, 0x31, 0x0d, 0x2f, 0xff, 0xfe, 0x04, 0x17, 0x6f, + 0xf7, 0xe8, 0x1b, 0x30, 0x9a, 0x03, 0xef, 0x42, 0xcb, 0xff, 0x10, 0x65, + 0xb3, 0x18, 0xa0, 0xeb, 0x2f, 0xee, 0x49, 0xbb, 0x7d, 0x2c, 0xbc, 0xef, + 0xda, 0xa2, 0xa1, 0x5f, 0xfe, 0x6d, 0xf8, 0xc5, 0x9a, 0x8e, 0xe3, 0x4b, + 0x2c, 0x75, 0x97, 0xb0, 0x3f, 0x23, 0xda, 0x0a, 0x4d, 0x42, 0x38, 0xfb, + 0x2e, 0xd4, 0x20, 0xef, 0xe8, 0x9a, 0x41, 0xea, 0x4b, 0x2f, 0xf8, 0x1c, + 0xd9, 0xc0, 0x3e, 0x4c, 0xb2, 0xfe, 0xdd, 0x72, 0x18, 0x9d, 0x2c, 0xa6, + 0x3e, 0xe7, 0x3c, 0xbf, 0x83, 0xdb, 0x1a, 0xfd, 0xac, 0xbe, 0xd7, 0x61, + 0x02, 0xcb, 0xfb, 0x09, 0xf5, 0xa6, 0x59, 0x6c, 0x63, 0xcf, 0xf1, 0x25, + 0x49, 0x71, 0x23, 0x0a, 0x4d, 0x2a, 0xee, 0x14, 0x7d, 0x13, 0xb3, 0x96, + 0xa3, 0x21, 0x39, 0xaf, 0xa1, 0x3c, 0x44, 0x1c, 0x7f, 0xbd, 0xb8, 0xf0, + 0xb2, 0xd8, 0xb2, 0xff, 0xf9, 0x8f, 0x1d, 0xec, 0xef, 0xcd, 0xbb, 0x07, + 0x85, 0x97, 0xff, 0x05, 0xe7, 0xe6, 0x37, 0x7d, 0xe6, 0xf5, 0x95, 0x24, + 0x56, 0xf8, 0x40, 0x95, 0x6f, 0xfa, 0x5f, 0x6d, 0x3f, 0x6c, 0x4b, 0x2f, + 0x03, 0x98, 0xb2, 0xff, 0x70, 0x33, 0x38, 0xde, 0x65, 0x97, 0xff, 0xf7, + 0x0c, 0x7d, 0xde, 0x36, 0xa6, 0xe4, 0x1d, 0xfa, 0xfa, 0xcb, 0xfa, 0x3b, + 0x62, 0x89, 0x2c, 0xbf, 0xed, 0x90, 0xc5, 0x87, 0xd4, 0x2c, 0xbd, 0xa6, + 0xe9, 0x65, 0x49, 0x33, 0x3e, 0x87, 0x26, 0x35, 0x3b, 0x0f, 0x0b, 0x3e, + 0x71, 0x7e, 0x29, 0xc1, 0x02, 0x2c, 0xbf, 0xa5, 0xb9, 0x1f, 0x82, 0x59, + 0x68, 0xc3, 0xd8, 0xdd, 0x29, 0xbf, 0x48, 0xa0, 0xe6, 0xac, 0xbf, 0xf8, + 0xf9, 0xa2, 0xc6, 0xde, 0xda, 0x75, 0x95, 0xd1, 0xf5, 0xb9, 0x45, 0xff, + 0xf9, 0xb5, 0xb3, 0x3e, 0x18, 0xc9, 0xfd, 0x8d, 0x25, 0x97, 0xfe, 0x2c, + 0x9b, 0xfe, 0xcd, 0x37, 0x16, 0x5f, 0xf8, 0xfb, 0x0e, 0xff, 0xd9, 0xef, + 0xe9, 0x65, 0xfe, 0x83, 0xe3, 0x68, 0x3b, 0x8b, 0x29, 0xcf, 0xe4, 0x28, + 0x95, 0xe4, 0x6c, 0x14, 0x2d, 0xef, 0xdd, 0x13, 0x1d, 0x96, 0x5e, 0x9f, + 0x0c, 0x59, 0x7b, 0x35, 0xe5, 0x96, 0x81, 0x41, 0xba, 0xec, 0x7a, 0xfb, + 0x6c, 0x3b, 0xb0, 0xb2, 0xa1, 0x51, 0x58, 0xc8, 0xb2, 0x32, 0xe6, 0x27, + 0xd3, 0x08, 0x4a, 0xef, 0xef, 0xbf, 0xb6, 0x0e, 0x16, 0x5f, 0xf7, 0xf8, + 0x27, 0x1f, 0xa9, 0x62, 0xcb, 0xfc, 0xf2, 0xd9, 0xc0, 0x81, 0xd6, 0x5f, + 0x47, 0xa2, 0x75, 0x96, 0x61, 0x9e, 0xbf, 0x8d, 0x6a, 0x11, 0xd1, 0x85, + 0xe1, 0x84, 0x95, 0xfb, 0x8d, 0xec, 0x1a, 0xcb, 0xf4, 0xa3, 0xf9, 0x3a, + 0xca, 0xdc, 0x3c, 0xfd, 0x13, 0xde, 0xeb, 0xf8, 0xb2, 0xfe, 0xe3, 0x17, + 0x7e, 0x85, 0x95, 0x87, 0xdf, 0xa2, 0x5f, 0x8e, 0xdf, 0x36, 0xdb, 0x79, + 0x65, 0xff, 0xb3, 0xfc, 0xd6, 0x4d, 0xe6, 0x35, 0x65, 0xff, 0xfc, 0xdc, + 0x06, 0x48, 0xa0, 0x0f, 0xee, 0xa5, 0x9f, 0x59, 0x7f, 0xf7, 0x6d, 0xad, + 0x3c, 0x9f, 0xb0, 0xf4, 0xb2, 0xff, 0xb0, 0xdc, 0x3b, 0x6d, 0xc1, 0xd6, + 0x56, 0x91, 0xb9, 0xe5, 0xa2, 0x47, 0xbf, 0xed, 0x8e, 0x59, 0xbb, 0xb3, + 0xc1, 0x59, 0x7e, 0x31, 0xb5, 0x86, 0xac, 0xa8, 0x54, 0x0b, 0x85, 0xcc, + 0x48, 0xf1, 0x8e, 0x04, 0xbc, 0x43, 0xfb, 0xfe, 0xfb, 0x71, 0x82, 0x2b, + 0x1c, 0x2c, 0xba, 0x3a, 0x59, 0x7f, 0x47, 0xf0, 0x9f, 0x71, 0x65, 0xf8, + 0x02, 0x89, 0xf0, 0xc5, 0x94, 0xc8, 0xaf, 0xd1, 0xe0, 0x05, 0xc8, 0xba, + 0xe1, 0x40, 0xa5, 0x65, 0xff, 0x9c, 0xbb, 0xfe, 0x7b, 0xff, 0x0a, 0xca, + 0x63, 0xde, 0x08, 0xfd, 0xfd, 0x1a, 0x9e, 0x35, 0x3a, 0xcb, 0xe0, 0xcf, + 0x12, 0x59, 0x52, 0x3d, 0x2e, 0x17, 0xdf, 0xfb, 0x98, 0x5f, 0xe6, 0x49, + 0xbc, 0xb2, 0xfe, 0xe6, 0x6f, 0x28, 0xe9, 0x65, 0xc1, 0xf2, 0xca, 0xe2, + 0x20, 0xfe, 0x7b, 0xb6, 0x5f, 0x7f, 0xfd, 0x00, 0xc2, 0xd8, 0xff, 0xd9, + 0xec, 0x03, 0xac, 0xb8, 0xa7, 0x59, 0x50, 0x9a, 0x06, 0x42, 0x95, 0x8c, + 0xc9, 0x46, 0xff, 0x0f, 0x0f, 0xb3, 0x8f, 0xe5, 0x97, 0x83, 0x1c, 0x59, + 0x4c, 0x7a, 0x3e, 0x35, 0xbb, 0x92, 0x59, 0x7f, 0xfb, 0xd0, 0x72, 0x73, + 0x4b, 0x01, 0xd0, 0x16, 0x5f, 0xdb, 0xdc, 0xfe, 0x31, 0xd6, 0x5f, 0xff, + 0xe6, 0x8f, 0xbf, 0x85, 0xf3, 0xd8, 0x5f, 0xd8, 0x09, 0x71, 0x65, 0xff, + 0x31, 0x36, 0x77, 0x1f, 0xe2, 0xca, 0x92, 0x62, 0xac, 0x94, 0x46, 0x1f, + 0x64, 0xbd, 0xc0, 0xe9, 0x65, 0xe6, 0xf3, 0x2c, 0xbf, 0xb4, 0xe4, 0x00, + 0x42, 0xca, 0x84, 0xfb, 0x67, 0x21, 0xc8, 0xcb, 0x18, 0xf1, 0xc7, 0x44, + 0x1b, 0xbf, 0xc5, 0x9f, 0xe0, 0x1b, 0xa5, 0x97, 0xe2, 0xc1, 0x93, 0xac, + 0xa9, 0x1e, 0xc6, 0x19, 0xdd, 0x9b, 0xd6, 0x5f, 0xa0, 0xef, 0xd7, 0xd6, + 0x5d, 0x93, 0xac, 0xbf, 0xf8, 0x7c, 0xcd, 0x16, 0x03, 0x99, 0xa5, 0x95, + 0xe4, 0x4d, 0x70, 0x63, 0xe5, 0x01, 0x17, 0xbf, 0x67, 0x61, 0x79, 0xd6, + 0x57, 0x8f, 0x98, 0x8f, 0x6f, 0xff, 0xb4, 0x41, 0xe8, 0xb1, 0xb5, 0xdf, + 0xa3, 0x8b, 0x2f, 0xff, 0xee, 0xdf, 0xd9, 0x28, 0xd4, 0x03, 0x50, 0x23, + 0x92, 0xca, 0x84, 0x55, 0x62, 0x85, 0xf4, 0xee, 0x5b, 0xd6, 0x5f, 0xc0, + 0xc2, 0xf0, 0x49, 0x65, 0x61, 0xe8, 0x39, 0x25, 0xff, 0xff, 0xfd, 0x2d, + 0x9f, 0xf3, 0x47, 0x36, 0x60, 0x7b, 0x8d, 0xfb, 0x33, 0x5a, 0xcd, 0xe1, + 0x7f, 0x2c, 0xbe, 0xfe, 0xd0, 0x29, 0xda, 0x96, 0x54, 0x23, 0x13, 0x21, + 0x27, 0x7d, 0xe2, 0x7d, 0xd5, 0x97, 0xc7, 0x6d, 0xd8, 0x59, 0x50, 0xae, + 0xbf, 0x23, 0x21, 0xf4, 0x32, 0xc9, 0xc7, 0x90, 0xe4, 0xf9, 0x30, 0x49, + 0x2f, 0xf3, 0xf5, 0xc6, 0x3c, 0x76, 0xb2, 0xf6, 0x67, 0x16, 0x5d, 0x1a, + 0x59, 0x69, 0xc6, 0x6c, 0x5c, 0x6e, 0xf0, 0x9b, 0x6e, 0xb2, 0xff, 0xfc, + 0xd3, 0xf9, 0xdb, 0xf1, 0xe6, 0xff, 0x30, 0x6b, 0x2f, 0xfb, 0x66, 0x79, + 0x9f, 0xfe, 0x85, 0x95, 0xb8, 0x88, 0xd2, 0x54, 0xaf, 0x23, 0x49, 0xe1, + 0x5b, 0x4e, 0x99, 0x00, 0x61, 0xf3, 0x7f, 0xed, 0xef, 0x2c, 0x21, 0x94, + 0x49, 0x65, 0xd3, 0xc2, 0xca, 0xc3, 0xd5, 0x09, 0xf5, 0xf6, 0x78, 0xf0, + 0xb2, 0x88, 0xf0, 0xb8, 0x43, 0x79, 0x8c, 0x99, 0x65, 0xff, 0x3f, 0x9b, + 0x9c, 0x0b, 0x81, 0x65, 0x0c, 0xf5, 0x9c, 0x7a, 0xc2, 0xf6, 0xb7, 0x47, + 0x2d, 0xb5, 0x11, 0x8a, 0x4f, 0xf6, 0x83, 0x01, 0x40, 0xbc, 0x46, 0xcd, + 0x3c, 0x26, 0xe5, 0x0b, 0x81, 0xc7, 0x8f, 0x93, 0xc5, 0x86, 0xc2, 0xaf, + 0xb8, 0x65, 0xf4, 0x5e, 0xd1, 0xb5, 0xcd, 0x0b, 0x2d, 0x4a, 0xbf, 0x3c, + 0x68, 0x9e, 0x95, 0xec, 0xf1, 0x85, 0x82, 0x13, 0x25, 0x1d, 0x9f, 0x25, + 0x3e, 0xfe, 0x71, 0x8c, 0x2e, 0x7b, 0x71, 0xc2, 0x89, 0x0b, 0xfd, 0xd7, + 0x7b, 0xc4, 0xc6, 0x2c, 0xbe, 0xed, 0xdf, 0xb5, 0x45, 0x50, 0xbf, 0xda, + 0x8d, 0xfd, 0x4b, 0x3e, 0xb2, 0xb4, 0x7c, 0xc1, 0x30, 0xbf, 0xc6, 0xc7, + 0xf9, 0xbf, 0x06, 0xb2, 0xff, 0xcf, 0x21, 0x79, 0xae, 0xdd, 0xfb, 0x54, + 0x4d, 0x6b, 0xfe, 0xf4, 0x1f, 0x9c, 0x72, 0xed, 0x65, 0xf4, 0x6a, 0x3e, + 0xb2, 0xe7, 0xfa, 0xca, 0x19, 0xb7, 0x39, 0x0d, 0xff, 0x3f, 0x5c, 0x26, + 0x81, 0x0e, 0xb2, 0xff, 0x13, 0xff, 0x93, 0x79, 0x96, 0x58, 0x5c, 0x95, + 0x12, 0xe4, 0x20, 0x8d, 0x22, 0x39, 0xb7, 0x93, 0x9d, 0xc0, 0x04, 0x22, + 0x1c, 0xdf, 0xff, 0x6e, 0x30, 0xf0, 0xfb, 0x3f, 0x9b, 0x8d, 0xbf, 0x8b, + 0x2f, 0xda, 0xed, 0xdf, 0xb5, 0x45, 0x58, 0xbd, 0xa8, 0x3a, 0xcb, 0xfe, + 0x89, 0x46, 0xa7, 0x8d, 0x4e, 0xb2, 0xff, 0xe8, 0x21, 0xc6, 0xf9, 0x9b, + 0x79, 0x01, 0x65, 0x85, 0xc2, 0x65, 0x98, 0xb3, 0xa3, 0x62, 0x1c, 0xf9, + 0xd5, 0xf1, 0x60, 0x45, 0x6b, 0x2f, 0xee, 0xbf, 0x1e, 0x7d, 0xc5, 0x97, + 0xe7, 0xf6, 0x6b, 0x16, 0x54, 0x1e, 0xbb, 0x98, 0xdf, 0xda, 0x0c, 0xdc, + 0x8f, 0xac, 0xa8, 0x46, 0x5f, 0x9f, 0x02, 0x41, 0x7f, 0xf0, 0x30, 0x85, + 0xc8, 0x1c, 0x9d, 0xc9, 0x65, 0x0b, 0x3f, 0x58, 0x2f, 0xbf, 0x86, 0xc1, + 0xfe, 0x71, 0x65, 0xfc, 0xc7, 0x6f, 0xfa, 0x16, 0x5f, 0x44, 0xd1, 0xd2, + 0xca, 0xf1, 0xe7, 0xf0, 0xb2, 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x48, 0x8b, + 0xef, 0xe9, 0xba, 0x59, 0x7f, 0xec, 0xdd, 0x69, 0xfa, 0xcd, 0x69, 0xd6, + 0x5d, 0x21, 0x78, 0x89, 0xb6, 0x36, 0xde, 0x47, 0x7f, 0x4f, 0x1a, 0xf3, + 0xb2, 0xcb, 0x0b, 0xda, 0xd3, 0xa4, 0xc7, 0xc7, 0x85, 0xef, 0x0f, 0xaf, + 0xda, 0xed, 0xdf, 0xb5, 0x45, 0xa4, 0xbf, 0xf3, 0xc8, 0x5e, 0x6b, 0xb7, + 0x7e, 0xd5, 0x13, 0xea, 0xc2, 0xf1, 0x10, 0x87, 0x36, 0xbf, 0xfc, 0x2c, + 0xef, 0x21, 0x79, 0xae, 0xdd, 0xfb, 0x54, 0x50, 0x8b, 0xff, 0xb0, 0xc1, + 0x7f, 0x35, 0xf8, 0xdf, 0x85, 0x97, 0xef, 0x87, 0xb7, 0xe2, 0xcb, 0xa3, + 0x4b, 0x2f, 0xfe, 0x83, 0x87, 0x5d, 0xbb, 0x0e, 0x26, 0x59, 0x66, 0x9c, + 0xf6, 0xe6, 0x16, 0xa3, 0xa2, 0xb7, 0xd0, 0x84, 0xbf, 0x6b, 0xb7, 0x7e, + 0xd5, 0x14, 0x7a, 0xe1, 0xe2, 0xcb, 0xe6, 0xc0, 0x71, 0x65, 0xcf, 0xda, + 0xcb, 0x60, 0xcd, 0xc6, 0xe9, 0x0d, 0xff, 0x44, 0xa3, 0x53, 0xc6, 0xa7, + 0x59, 0x7f, 0xff, 0xff, 0x84, 0x6d, 0x4d, 0x1e, 0xd6, 0x79, 0xc4, 0xe6, + 0x1a, 0xe4, 0x08, 0x28, 0x9b, 0xd0, 0xb2, 0xfc, 0xfc, 0x6f, 0xc2, 0xcb, + 0xfe, 0x89, 0xa0, 0xa2, 0x6f, 0x42, 0xca, 0x84, 0x76, 0x9b, 0x08, 0xf2, + 0x26, 0xbe, 0x3c, 0xf8, 0x62, 0xcb, 0xff, 0xf0, 0xfd, 0x02, 0x0b, 0xf9, + 0x38, 0x39, 0xc8, 0x02, 0x4a, 0x83, 0xfc, 0xc2, 0x4b, 0xcf, 0x21, 0x70, + 0xab, 0x33, 0x0a, 0x26, 0x36, 0xd2, 0x71, 0x14, 0xfe, 0x32, 0x7d, 0xb8, + 0x58, 0x5f, 0xfd, 0x9e, 0x17, 0xf3, 0x5f, 0x8d, 0xf8, 0x59, 0x61, 0x73, + 0xae, 0x45, 0x9e, 0x5e, 0x07, 0xe1, 0x0b, 0x50, 0xf8, 0x6b, 0x13, 0xd3, + 0x3e, 0xa4, 0xe7, 0x92, 0xb1, 0x8d, 0xb4, 0x79, 0x9d, 0xce, 0x15, 0xf5, + 0x1d, 0x63, 0x47, 0x21, 0x34, 0x78, 0xfe, 0x86, 0x90, 0x0a, 0xbf, 0x39, + 0xcf, 0x7f, 0xfc, 0x67, 0x7b, 0x50, 0xa4, 0x02, 0xbd, 0x6d, 0x1b, 0x36, + 0x7b, 0x6d, 0x65, 0xff, 0xff, 0xb7, 0x7e, 0x28, 0x19, 0xc5, 0x04, 0xc2, + 0xab, 0xe2, 0xbd, 0x6d, 0x1b, 0x36, 0x7b, 0x6d, 0x65, 0x79, 0x1f, 0xc6, + 0x37, 0x5f, 0xfd, 0xe8, 0x6d, 0x30, 0xaf, 0xbf, 0x41, 0x8b, 0x2f, 0xfd, + 0xc1, 0x5b, 0x1b, 0xb3, 0x67, 0xb6, 0xc5, 0xc1, 0xf6, 0xf6, 0x49, 0x7f, + 0xff, 0xff, 0xb7, 0x45, 0x6c, 0x6e, 0xcd, 0x9e, 0xdb, 0x17, 0x1e, 0x33, + 0xbd, 0xa8, 0x52, 0x01, 0x5e, 0xb6, 0x8d, 0x9b, 0x3d, 0xb6, 0xb2, 0xfd, + 0xae, 0xdd, 0xfb, 0x54, 0x44, 0x4b, 0xfd, 0xc0, 0xc4, 0xdf, 0x6d, 0xeb, + 0x2c, 0x2f, 0x0f, 0xb2, 0x63, 0x6b, 0xfb, 0x35, 0xdb, 0xbf, 0x6a, 0x88, + 0xad, 0x7f, 0xdb, 0x82, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0xae, 0x14, 0x2d, + 0x10, 0xee, 0x77, 0x7d, 0xe7, 0xd3, 0x2c, 0xbf, 0x7c, 0x02, 0x14, 0x96, + 0x5f, 0x81, 0x05, 0xd8, 0xb8, 0x3c, 0xa7, 0x21, 0xba, 0x6d, 0xc5, 0x97, + 0xf1, 0x37, 0x7f, 0x89, 0x2c, 0xb0, 0xb9, 0xcf, 0x23, 0x43, 0x76, 0x6e, + 0x91, 0x64, 0x08, 0x43, 0xdf, 0xe1, 0x4e, 0xd4, 0x51, 0xdb, 0xf4, 0xb2, + 0xfb, 0x3c, 0xff, 0x59, 0x7f, 0xb1, 0xb4, 0x00, 0x07, 0x8b, 0x2c, 0x29, + 0x23, 0xd4, 0xe1, 0x0d, 0xff, 0xff, 0xfe, 0xda, 0xb6, 0xb1, 0x4c, 0x73, + 0xd8, 0x6e, 0x0c, 0xb2, 0x76, 0x97, 0x20, 0x71, 0xe2, 0x7d, 0xc5, 0x97, + 0xf6, 0xa3, 0xee, 0x58, 0xb2, 0xff, 0xfd, 0xc6, 0xf3, 0xb4, 0x98, 0xbe, + 0x1f, 0x6b, 0x16, 0x53, 0x1f, 0xf7, 0xca, 0xef, 0xe8, 0x07, 0x3e, 0x50, + 0xb2, 0xff, 0x3b, 0x9a, 0x63, 0xeb, 0x8b, 0x2f, 0xff, 0xde, 0xc2, 0xc3, + 0x7c, 0xf2, 0xf1, 0x8e, 0x21, 0xd6, 0x5f, 0x76, 0xef, 0xda, 0xa2, 0x9e, + 0x5f, 0xff, 0x9b, 0x5e, 0x78, 0xde, 0x59, 0xcc, 0x26, 0x3a, 0xcb, 0xff, + 0x14, 0x6f, 0x6f, 0xca, 0x30, 0x96, 0x54, 0x93, 0x17, 0xd2, 0xbf, 0x8c, + 0x3e, 0xa7, 0x7f, 0x86, 0x0d, 0x91, 0xb9, 0x12, 0x59, 0x7f, 0x8e, 0xc3, + 0x0b, 0xea, 0x4b, 0x2e, 0x3b, 0x2c, 0xa8, 0x3c, 0x9e, 0xcc, 0xef, 0xff, + 0xe8, 0xff, 0x02, 0x7e, 0xd8, 0x11, 0x9e, 0x60, 0xf6, 0xb2, 0xe6, 0xe2, + 0xcb, 0xfa, 0x0f, 0xc8, 0x69, 0xd6, 0x54, 0x91, 0x3f, 0x8b, 0x9f, 0x16, + 0xbf, 0xff, 0x9f, 0x4f, 0xee, 0xa5, 0x9f, 0xc2, 0x0f, 0xc2, 0x6a, 0xcb, + 0xe9, 0x46, 0x4e, 0xb2, 0xff, 0xfd, 0xa0, 0xeb, 0x50, 0x58, 0x6b, 0x7b, + 0xd8, 0x22, 0xcb, 0x0d, 0x65, 0xed, 0x37, 0x4b, 0x2b, 0xb4, 0xc0, 0xba, + 0x5c, 0xd1, 0x11, 0xd5, 0xbe, 0x23, 0x79, 0x8b, 0xeb, 0x2f, 0xfe, 0x79, + 0x0b, 0x71, 0xe4, 0xbd, 0x1d, 0xac, 0xbf, 0x86, 0x21, 0x09, 0xd7, 0x16, + 0x5f, 0xf6, 0x9e, 0x71, 0x85, 0xf5, 0x25, 0x95, 0x07, 0xd6, 0xc6, 0x37, + 0xfd, 0x84, 0x08, 0x3b, 0x6a, 0x4b, 0x2f, 0xf3, 0x71, 0x82, 0x2b, 0x1c, + 0x2c, 0xa9, 0x1f, 0x6f, 0xcd, 0xec, 0xeb, 0x2f, 0xff, 0x8f, 0x8d, 0xf0, + 0xfe, 0x24, 0xc3, 0xc1, 0xac, 0xa6, 0x44, 0x07, 0x88, 0x80, 0x21, 0x7e, + 0xd4, 0xf1, 0xa9, 0xd6, 0x5f, 0x98, 0xbe, 0x21, 0xd6, 0x54, 0x1e, 0x90, + 0x0a, 0xaf, 0xf6, 0xa2, 0x3f, 0xc6, 0xde, 0xb2, 0xfe, 0x89, 0xdc, 0x6f, + 0xf5, 0x95, 0x24, 0x41, 0x1c, 0x87, 0x74, 0xd2, 0xfb, 0x61, 0x3c, 0x96, + 0x5f, 0x9f, 0x3c, 0xc7, 0x59, 0x5c, 0x3c, 0x9d, 0xe4, 0x75, 0x08, 0xa0, + 0xc7, 0xcb, 0xf9, 0xbe, 0xe6, 0xf9, 0x96, 0x5f, 0xf6, 0xf7, 0x3e, 0xc1, + 0xf9, 0x8e, 0xb2, 0xff, 0x8a, 0x0f, 0x12, 0x2c, 0x3a, 0xcb, 0xff, 0xc7, + 0x8d, 0x4f, 0x1d, 0x60, 0x45, 0x78, 0x35, 0x97, 0xdf, 0x94, 0x1a, 0xb2, + 0xa4, 0x98, 0x96, 0x16, 0xb1, 0xeb, 0x9b, 0x08, 0x9f, 0x7e, 0xef, 0x18, + 0xa6, 0x59, 0x7f, 0x8b, 0xbc, 0xdf, 0x9f, 0xe2, 0xcb, 0xf0, 0xc3, 0x1a, + 0x9d, 0x65, 0xce, 0x6a, 0xca, 0x83, 0xf5, 0xc3, 0x5d, 0x14, 0xdf, 0x9e, + 0x78, 0xd0, 0x56, 0x56, 0xd0, 0xcc, 0x58, 0x14, 0x42, 0x44, 0x54, 0x2b, + 0x88, 0xc7, 0x24, 0x42, 0x32, 0xcc, 0x8d, 0x2c, 0xd3, 0xee, 0xe1, 0x03, + 0xd4, 0x30, 0x5a, 0x33, 0x19, 0x93, 0x4e, 0x37, 0xe8, 0x58, 0xbc, 0x61, + 0xa5, 0x1d, 0x1f, 0x23, 0x33, 0xfa, 0x4e, 0xf8, 0x4e, 0xed, 0x96, 0xdf, + 0xfe, 0x79, 0x0b, 0x19, 0x39, 0x9c, 0xe4, 0x01, 0x65, 0xff, 0xe0, 0x00, + 0x3c, 0x16, 0x21, 0x39, 0xca, 0x16, 0x5f, 0xfc, 0x58, 0x07, 0x20, 0x0b, + 0x3b, 0x1d, 0x65, 0x69, 0x12, 0x1f, 0x4c, 0xbf, 0x3f, 0xbc, 0xd3, 0x2c, + 0xbf, 0xfb, 0x38, 0xc4, 0x02, 0xcf, 0xfb, 0x16, 0x5f, 0xf9, 0x88, 0x05, + 0x9f, 0xf6, 0x0b, 0xf1, 0xf4, 0x88, 0x51, 0x42, 0xd5, 0x8f, 0x0e, 0x36, + 0x06, 0x86, 0xe7, 0x21, 0x19, 0x6c, 0x59, 0x7e, 0x28, 0x08, 0xaf, 0x8b, + 0x2f, 0xe3, 0x74, 0xe3, 0x72, 0x59, 0x43, 0x3e, 0x8c, 0x10, 0x72, 0xbb, + 0xff, 0x98, 0x7a, 0x7e, 0x85, 0xeb, 0x51, 0x3a, 0xca, 0x16, 0x7e, 0xbe, + 0x2d, 0xb4, 0x2c, 0xbf, 0xb9, 0x1d, 0x94, 0x0d, 0x65, 0x0c, 0xde, 0xb0, + 0x85, 0xff, 0xf4, 0x6b, 0x24, 0xcf, 0xfc, 0x1b, 0x07, 0xb4, 0x97, 0x07, + 0xa5, 0x95, 0xe3, 0xe6, 0x24, 0xeb, 0x76, 0xb2, 0xfd, 0x12, 0x00, 0x64, + 0xb2, 0xfb, 0xb7, 0x7e, 0xd5, 0x15, 0x9a, 0xe8, 0x31, 0x65, 0x62, 0x20, + 0x66, 0x12, 0xd1, 0x46, 0xf3, 0x0b, 0xef, 0xb1, 0xf8, 0xb2, 0xda, 0x59, + 0x63, 0x56, 0x53, 0x1a, 0x3e, 0x08, 0xde, 0xe0, 0x7b, 0x59, 0x46, 0x9b, + 0xee, 0x10, 0x58, 0x45, 0x97, 0xb5, 0x1b, 0xd6, 0x54, 0x1b, 0x0e, 0x09, + 0x5f, 0xdb, 0xc8, 0xa3, 0x72, 0x65, 0x97, 0xe3, 0xc1, 0x4b, 0x8b, 0x2e, + 0x89, 0x96, 0x54, 0x1f, 0x84, 0xe6, 0x5a, 0x27, 0xbe, 0xff, 0x04, 0xe2, + 0xcb, 0xee, 0x72, 0x0c, 0x59, 0x67, 0x59, 0x58, 0x7a, 0xec, 0x49, 0xc2, + 0x3b, 0xa7, 0x65, 0x97, 0xfb, 0x93, 0x31, 0x7b, 0x3a, 0x59, 0x50, 0x79, + 0x78, 0x2f, 0x73, 0xfd, 0x65, 0xf0, 0x04, 0x29, 0x2c, 0xa1, 0x9b, 0x9f, + 0x8b, 0x5f, 0xff, 0x41, 0xff, 0x98, 0x5f, 0xe7, 0xb0, 0x0e, 0xb2, 0xff, + 0x1e, 0x3a, 0xe6, 0xa3, 0x7a, 0xcb, 0x9f, 0x8b, 0x2a, 0x0f, 0x30, 0x26, + 0xd7, 0xfa, 0x4c, 0x1d, 0xcd, 0xa0, 0x07, 0x59, 0x7e, 0x28, 0xf3, 0x62, + 0xca, 0xc3, 0xe1, 0x73, 0xcb, 0x32, 0xcb, 0xf6, 0x11, 0x3f, 0xd6, 0x70, + 0xb0, 0xbc, 0x19, 0x0d, 0x65, 0x78, 0xf4, 0x48, 0xd2, 0xfc, 0x5f, 0xf4, + 0x6f, 0x59, 0x79, 0xdc, 0xeb, 0x2f, 0xd9, 0x34, 0xe1, 0x02, 0xcb, 0xfb, + 0xf1, 0xa0, 0x44, 0xcb, 0x2c, 0x2e, 0x17, 0xa7, 0x47, 0x08, 0x6c, 0x85, + 0x17, 0x47, 0xed, 0x08, 0x39, 0x94, 0xb5, 0x09, 0x03, 0xc2, 0x1b, 0xcf, + 0x0e, 0xb2, 0x02, 0x12, 0x84, 0xcf, 0x21, 0x05, 0xf8, 0x40, 0x84, 0x87, + 0x79, 0x48, 0x83, 0x7b, 0xa5, 0x57, 0xf4, 0xb0, 0xe2, 0x46, 0xe2, 0xcb, + 0xfd, 0xf7, 0xd4, 0xf0, 0xc3, 0x59, 0x7f, 0x7f, 0x83, 0x68, 0x25, 0x94, + 0xc7, 0xbe, 0xe6, 0x77, 0xf4, 0x1e, 0x70, 0xea, 0x4b, 0x2f, 0xb5, 0x86, + 0x7d, 0x65, 0x78, 0xfc, 0xbe, 0x41, 0xbc, 0xbe, 0xff, 0x4f, 0xec, 0xef, + 0xd1, 0xa5, 0x97, 0xfd, 0x05, 0x2e, 0x1d, 0xc8, 0xd5, 0x95, 0x07, 0xdb, + 0xf3, 0x5b, 0xa0, 0x6b, 0x2f, 0xf8, 0x27, 0xce, 0xf5, 0xd3, 0x98, 0xb2, + 0xa4, 0x7e, 0x7c, 0x21, 0xf8, 0xb5, 0xfe, 0xd4, 0x1b, 0x84, 0xc6, 0xac, + 0xbf, 0xff, 0x60, 0xfd, 0x1c, 0xd9, 0x8d, 0xa6, 0x3c, 0x1a, 0xb2, 0xff, + 0xf4, 0x18, 0x21, 0xcb, 0x3a, 0xfc, 0x61, 0x8b, 0x2f, 0xdf, 0x62, 0xc3, + 0xac, 0xbc, 0xe4, 0x2c, 0x6a, 0xcf, 0x72, 0x30, 0x2e, 0xa3, 0x11, 0xd1, + 0x79, 0x19, 0x88, 0xad, 0xba, 0x99, 0x7f, 0xce, 0x60, 0xb1, 0xc1, 0xfa, + 0x85, 0x95, 0x24, 0x61, 0x94, 0x21, 0xef, 0xfc, 0xf2, 0x17, 0x9a, 0xed, + 0xdf, 0xb5, 0x44, 0x8a, 0xbf, 0xff, 0x7f, 0xd8, 0x42, 0xfe, 0xef, 0xd7, + 0x0d, 0x35, 0xd6, 0x5f, 0xf9, 0xfe, 0x2e, 0x1b, 0x4d, 0xf0, 0xac, 0xa1, + 0x68, 0xe6, 0x84, 0xe7, 0x59, 0xbf, 0xed, 0x69, 0x8c, 0xc9, 0x98, 0xeb, + 0x2f, 0xbb, 0x8f, 0x42, 0xca, 0x63, 0xdc, 0x23, 0xab, 0xf6, 0xbb, 0x77, + 0xed, 0x51, 0x64, 0xaa, 0x0f, 0x5b, 0x08, 0x2f, 0x98, 0xa5, 0xc5, 0x97, + 0xe8, 0xe7, 0xda, 0x75, 0x95, 0x39, 0xe4, 0x9a, 0x43, 0x7f, 0x83, 0x3f, + 0xa3, 0xfc, 0x65, 0x97, 0xf0, 0x46, 0xda, 0x7e, 0x2c, 0xb9, 0xbe, 0xb2, + 0xfd, 0xfe, 0x09, 0xc1, 0x78, 0x89, 0xbd, 0x12, 0x70, 0xd3, 0xe5, 0xb4, + 0x2d, 0x36, 0x1c, 0x8c, 0x12, 0xff, 0xfa, 0x0e, 0xe3, 0x17, 0xf8, 0xea, + 0x53, 0xe1, 0x8b, 0x2f, 0xb0, 0xce, 0x79, 0x65, 0xf4, 0x1d, 0x8c, 0x59, + 0x7f, 0x31, 0xe3, 0xc2, 0x0d, 0x65, 0x4c, 0x7a, 0x1b, 0xa4, 0x57, 0xf7, + 0x9b, 0x51, 0x2e, 0x2c, 0xbf, 0x8f, 0xf6, 0xf3, 0x9d, 0x65, 0xff, 0xe6, + 0xff, 0xb3, 0xf8, 0x51, 0xf8, 0x1a, 0xca, 0x83, 0xf4, 0x72, 0xdb, 0xfc, + 0xdf, 0x0e, 0x9f, 0x82, 0xe7, 0x4d, 0x6b, 0x1c, 0xfb, 0x26, 0xf4, 0x28, + 0x69, 0x95, 0x0e, 0x3c, 0x75, 0xd7, 0xff, 0xfb, 0xef, 0xd0, 0x05, 0x8c, + 0xa3, 0xa9, 0x7d, 0x88, 0x1c, 0x59, 0x7f, 0x66, 0xbb, 0x77, 0xed, 0x51, + 0x6c, 0x2f, 0xff, 0xde, 0xd8, 0x59, 0xaf, 0xf3, 0xd3, 0x6c, 0xd9, 0xed, + 0xb5, 0x97, 0xef, 0x3e, 0x98, 0xeb, 0x28, 0x52, 0x88, 0x8e, 0xd8, 0x6f, + 0xd9, 0xbf, 0x4f, 0xc5, 0x97, 0xb4, 0x1f, 0x2c, 0xbb, 0xe2, 0xe0, 0xfb, + 0x86, 0x51, 0xa2, 0x9a, 0x16, 0x9b, 0x6b, 0x46, 0x63, 0x7b, 0x39, 0x8b, + 0x2f, 0xbb, 0x77, 0xed, 0x51, 0x6d, 0xae, 0x7d, 0x2c, 0xb4, 0x96, 0x5b, + 0x93, 0x9a, 0x70, 0x8b, 0x56, 0x8f, 0xff, 0xea, 0xf7, 0xef, 0x7d, 0x80, + 0x15, 0x97, 0xff, 0xa2, 0x7f, 0xb0, 0xf0, 0xa4, 0xde, 0x0a, 0xca, 0x63, + 0xf1, 0xf1, 0x45, 0xff, 0x44, 0xa3, 0x53, 0xc6, 0xa7, 0x59, 0x7d, 0x13, + 0x71, 0x96, 0x54, 0x93, 0xaa, 0xc8, 0x4d, 0x4d, 0x09, 0x32, 0x21, 0xdd, + 0x3a, 0xbf, 0xf0, 0xf4, 0xc1, 0x9c, 0x5f, 0x35, 0xf5, 0x94, 0x2d, 0x13, + 0x58, 0xaf, 0x7b, 0xd9, 0x3a, 0xcb, 0xf9, 0xc7, 0x98, 0x46, 0xac, 0xbe, + 0xc2, 0x00, 0xb9, 0x8f, 0x24, 0xe3, 0xb7, 0x0a, 0x09, 0x65, 0xe1, 0x47, + 0x86, 0xb2, 0xf4, 0xfe, 0x65, 0x97, 0xfe, 0x14, 0x0a, 0x36, 0x97, 0xfd, + 0x85, 0x00, 0x59, 0x78, 0x54, 0x15, 0x62, 0xa2, 0xcb, 0xf7, 0xe3, 0xcf, + 0x32, 0xcb, 0xf1, 0x48, 0x61, 0x3a, 0xcb, 0xf8, 0xc1, 0x36, 0xdc, 0x80, + 0xb2, 0xa0, 0xf6, 0xb0, 0xa2, 0xfe, 0x61, 0x26, 0xe0, 0x7a, 0x59, 0x7e, + 0x1f, 0x7e, 0x0e, 0x96, 0x57, 0x8f, 0x6d, 0xcc, 0x6f, 0xfb, 0x35, 0xa8, + 0x93, 0xf4, 0x62, 0xcb, 0xee, 0xdd, 0xfb, 0x54, 0x5e, 0x0b, 0xf7, 0xfa, + 0xed, 0xb4, 0xb2, 0xff, 0xcc, 0x0e, 0x6c, 0xe0, 0x1f, 0x26, 0x59, 0x7f, + 0xe7, 0xfc, 0x6f, 0xd6, 0xb3, 0xae, 0x2c, 0xbf, 0xf9, 0xf4, 0x27, 0xdb, + 0xc5, 0x9f, 0xc5, 0x95, 0xa4, 0xc7, 0xce, 0x61, 0xe2, 0xa2, 0x41, 0xde, + 0x83, 0x7d, 0xf1, 0x55, 0x93, 0x2c, 0xba, 0x21, 0x65, 0x68, 0xdf, 0x7c, + 0xa6, 0xfe, 0x89, 0xca, 0x18, 0x6b, 0x2e, 0x7e, 0x2c, 0xbd, 0xb7, 0x9e, + 0x59, 0x40, 0x36, 0xbf, 0x16, 0xbf, 0x1e, 0x0a, 0x4e, 0xb2, 0xfe, 0x82, + 0xfe, 0xf7, 0xed, 0x65, 0xfd, 0x28, 0xdf, 0x1a, 0xe9, 0x65, 0xff, 0xfc, + 0xf3, 0xcd, 0x28, 0xd4, 0xff, 0x96, 0x6e, 0x39, 0x01, 0x65, 0x49, 0x17, + 0xf8, 0x5e, 0xe6, 0x17, 0xde, 0x2c, 0x99, 0x65, 0xfd, 0xf7, 0xf6, 0xc1, + 0xc2, 0xcb, 0xfe, 0x7f, 0xf2, 0x18, 0x78, 0x75, 0x95, 0x07, 0xcc, 0x45, + 0xf7, 0xe9, 0x33, 0x79, 0xd6, 0x5f, 0x16, 0x31, 0xab, 0x2f, 0xf8, 0xfd, + 0x4b, 0xf8, 0x5f, 0xe2, 0xca, 0xe9, 0x10, 0x27, 0x26, 0x10, 0x86, 0xec, + 0x35, 0x65, 0xf9, 0xe5, 0xf6, 0x9d, 0x65, 0xff, 0xe6, 0xfc, 0x17, 0x6c, + 0x73, 0xb7, 0x02, 0xb2, 0xa1, 0x17, 0x58, 0x64, 0xc2, 0xee, 0x51, 0x76, + 0x1d, 0x65, 0xf9, 0xbc, 0x36, 0xe2, 0xcb, 0x34, 0xe6, 0xf6, 0x42, 0xd7, + 0xec, 0x20, 0x6e, 0xc2, 0xcb, 0x9f, 0x8b, 0x2f, 0x05, 0xf8, 0xb2, 0xbe, + 0x6c, 0x84, 0x16, 0xbf, 0x4d, 0xa6, 0x9c, 0xeb, 0x2a, 0x0f, 0x33, 0x08, + 0xae, 0x98, 0x6b, 0x2f, 0xff, 0xff, 0x88, 0x2f, 0xcc, 0x2e, 0x73, 0x3c, + 0xdc, 0x0c, 0xfc, 0xf6, 0x75, 0xf8, 0x59, 0x7e, 0x6d, 0x3f, 0x46, 0x2c, + 0xbf, 0xf4, 0x77, 0xb3, 0x08, 0x32, 0xce, 0x2c, 0xa9, 0x23, 0x9a, 0x67, + 0xd3, 0x94, 0xdf, 0xef, 0x31, 0x86, 0xe9, 0xcc, 0x59, 0x7e, 0xdf, 0x03, + 0x3f, 0x16, 0x5f, 0xd9, 0xc0, 0xfe, 0x09, 0x65, 0xff, 0xff, 0x9d, 0xbe, + 0xe7, 0x72, 0x07, 0x7e, 0x6d, 0x48, 0x49, 0x61, 0x2c, 0xbf, 0xb0, 0x7e, + 0x8e, 0x6e, 0x2c, 0xbf, 0xa3, 0xae, 0xa4, 0xfd, 0x2c, 0xa1, 0xaa, 0x86, + 0xc8, 0x7f, 0x76, 0x62, 0xc6, 0xd3, 0x15, 0x78, 0xb0, 0x9a, 0xc2, 0x61, + 0x7f, 0x9c, 0x81, 0xfd, 0xbc, 0xf2, 0xcb, 0xfe, 0xf3, 0xc8, 0xed, 0x1a, + 0x92, 0xcb, 0x66, 0xe1, 0xf6, 0xf8, 0xd6, 0xe3, 0xf1, 0x65, 0xf4, 0x14, + 0xb7, 0x16, 0x5f, 0xfc, 0x07, 0x20, 0x16, 0x6f, 0xf6, 0x0d, 0x65, 0xff, + 0xce, 0x0c, 0x1e, 0x79, 0xb5, 0xe7, 0x59, 0x5d, 0x22, 0x1b, 0x88, 0x97, + 0xff, 0x33, 0x83, 0xed, 0xcf, 0x41, 0x7d, 0x65, 0xf6, 0x7c, 0xce, 0xd6, + 0x5d, 0x00, 0x59, 0x52, 0x4e, 0x2f, 0x0a, 0x8d, 0x17, 0x68, 0x55, 0x78, + 0x93, 0x88, 0x5f, 0x24, 0xbf, 0xcf, 0xe7, 0x10, 0xf9, 0xc5, 0x96, 0xed, + 0x65, 0xdd, 0xc9, 0x65, 0x76, 0x6a, 0xbe, 0x25, 0x5b, 0x5b, 0x3a, 0xb0, + 0x52, 0x34, 0x28, 0x21, 0x15, 0x07, 0x45, 0x5a, 0x64, 0x16, 0xcf, 0x08, + 0x29, 0x3d, 0x8c, 0x87, 0x23, 0x59, 0x36, 0x11, 0x5d, 0x90, 0xf4, 0xc2, + 0xc4, 0x33, 0x43, 0x97, 0x45, 0xc7, 0x84, 0x47, 0xa3, 0x5b, 0x77, 0x60, + 0x13, 0x94, 0x29, 0xf9, 0x2a, 0x9b, 0xf2, 0x9b, 0xf7, 0xb4, 0xed, 0xae, + 0xde, 0xfc, 0x0d, 0x65, 0xf0, 0x1f, 0x5c, 0x59, 0x77, 0x42, 0xe0, 0xdf, + 0x60, 0xe5, 0xfe, 0x00, 0xb9, 0xa5, 0x05, 0xf5, 0x94, 0x2d, 0x52, 0x24, + 0x47, 0xc1, 0xa2, 0xeb, 0xe2, 0x18, 0x9d, 0x2c, 0xbb, 0x3a, 0x59, 0x7c, + 0xfc, 0x0c, 0xeb, 0x29, 0x8d, 0xd6, 0x85, 0xef, 0xda, 0xed, 0xdf, 0xb5, + 0x45, 0xe8, 0xbf, 0x67, 0xca, 0x27, 0x59, 0x7f, 0xe7, 0x6f, 0x87, 0x4f, + 0xbf, 0x06, 0xb2, 0xf0, 0xc3, 0xc5, 0x97, 0xe8, 0x3b, 0xfa, 0x16, 0x5e, + 0x3b, 0x7d, 0x65, 0xff, 0x3f, 0xe5, 0x06, 0xfd, 0xa7, 0x59, 0x5a, 0x3f, + 0xc3, 0x93, 0x10, 0xe5, 0xfb, 0x0f, 0xe7, 0x1a, 0xca, 0x85, 0x41, 0x03, + 0x5e, 0xc2, 0x0d, 0x1b, 0x78, 0x9d, 0xcf, 0xc4, 0x84, 0xce, 0xe9, 0x75, + 0xff, 0xd8, 0x3f, 0x61, 0xce, 0xf2, 0xc2, 0x59, 0x78, 0x30, 0x05, 0x97, + 0xdb, 0xf0, 0x85, 0x8c, 0xf7, 0xb4, 0x85, 0x7f, 0x85, 0xff, 0x26, 0x93, + 0x8d, 0x65, 0x31, 0xf9, 0x78, 0xf2, 0x85, 0xa6, 0xd5, 0x91, 0xa4, 0xd6, + 0xd3, 0x77, 0xf8, 0xe2, 0xad, 0x96, 0x23, 0x2b, 0x9e, 0x16, 0x32, 0x8c, + 0x83, 0x29, 0xf4, 0x9d, 0xc6, 0x5a, 0xd3, 0xdf, 0xd3, 0x4e, 0x94, 0xea, + 0x30, 0xd3, 0xca, 0x43, 0xf4, 0xa4, 0x77, 0x29, 0x04, 0x7a, 0x25, 0x29, + 0xbf, 0x8d, 0xa1, 0xac, 0x4a, 0xcc, 0x97, 0x57, 0x78, 0xbf, 0xc5, 0x97, + 0x1c, 0xeb, 0x2d, 0xe5, 0x95, 0xb5, 0x1a, 0x80, 0x8b, 0xdf, 0xfc, 0x18, + 0x98, 0xb3, 0x7b, 0x9c, 0xec, 0xb2, 0xfb, 0x3c, 0xff, 0x59, 0x7f, 0xb1, + 0xb4, 0x00, 0x07, 0x8b, 0x2c, 0x29, 0x35, 0x13, 0x24, 0x8b, 0xc2, 0x1b, + 0xff, 0xdf, 0xe0, 0x63, 0x99, 0xf6, 0x3b, 0xc9, 0x65, 0xe8, 0xea, 0x75, + 0x94, 0x47, 0xcf, 0xf4, 0x9b, 0xe6, 0xdb, 0x83, 0xac, 0xbf, 0xef, 0xf3, + 0x3a, 0x97, 0x82, 0x6a, 0xcb, 0xdc, 0x89, 0x96, 0x53, 0x22, 0x78, 0xe4, + 0x24, 0x49, 0xc3, 0xcb, 0xc4, 0xfe, 0x59, 0x7b, 0x7c, 0x49, 0x65, 0xef, + 0x67, 0x16, 0x5f, 0xf1, 0x31, 0xbf, 0xeb, 0xb6, 0xf2, 0xcb, 0xdc, 0x89, + 0xd6, 0x54, 0x22, 0x48, 0x63, 0xd8, 0x39, 0xd1, 0xdd, 0xfe, 0xff, 0x99, + 0xc0, 0x08, 0x59, 0x7f, 0x67, 0x5d, 0x48, 0x33, 0xac, 0xbf, 0x9f, 0x52, + 0x20, 0xba, 0xcb, 0x98, 0xeb, 0x2b, 0x11, 0x4b, 0xa3, 0x20, 0x98, 0xee, + 0x96, 0x5f, 0x1c, 0x24, 0x35, 0x97, 0xb7, 0xbf, 0x4b, 0x2f, 0x1b, 0x06, + 0x2c, 0xbc, 0xef, 0xda, 0xa2, 0x23, 0x5f, 0x1b, 0xdb, 0xe9, 0x65, 0x1a, + 0x7d, 0x7d, 0x8f, 0x31, 0x4d, 0xf8, 0x51, 0xfe, 0x38, 0x16, 0x5f, 0x99, + 0xcf, 0x9a, 0x59, 0x7f, 0xc1, 0x7e, 0x8b, 0x27, 0x12, 0x4b, 0x2f, 0x76, + 0x21, 0xd6, 0x5f, 0xff, 0xf4, 0x4d, 0xf8, 0xe6, 0xa3, 0xed, 0xdb, 0x0f, + 0x61, 0xa4, 0xeb, 0x2a, 0x11, 0x10, 0x43, 0xf7, 0xff, 0x37, 0x3d, 0x86, + 0x9a, 0xfb, 0x07, 0xd2, 0xca, 0x9d, 0x52, 0xdb, 0x11, 0x6a, 0x11, 0x47, + 0x30, 0xf1, 0x67, 0x09, 0xbf, 0x0c, 0x3d, 0xe4, 0x37, 0xf3, 0xf5, 0xec, + 0x63, 0x16, 0x5d, 0x2f, 0x2c, 0xb0, 0xf4, 0x78, 0xae, 0x5d, 0x7f, 0xf7, + 0x39, 0x87, 0x2c, 0xdf, 0xb2, 0x36, 0xa5, 0x96, 0xf3, 0x1f, 0x98, 0x49, + 0xef, 0xf4, 0xfa, 0xcf, 0xfd, 0xbe, 0xb2, 0x96, 0x5f, 0xfd, 0xec, 0xf9, + 0x44, 0xdb, 0x0d, 0x27, 0x59, 0x70, 0x62, 0x63, 0xd1, 0xf8, 0x5d, 0x42, + 0x2c, 0xf9, 0x08, 0x5b, 0xc5, 0x1d, 0x2c, 0xa9, 0x1e, 0x18, 0xc9, 0xee, + 0x7f, 0x2c, 0xbf, 0xda, 0xce, 0x63, 0x94, 0xeb, 0x2f, 0x69, 0xba, 0x59, + 0x43, 0x3e, 0x5c, 0x16, 0xf9, 0x95, 0xfe, 0x08, 0xc4, 0xf7, 0x9e, 0x4b, + 0x2e, 0x19, 0xd6, 0x5f, 0x9e, 0x71, 0x18, 0x6b, 0x2f, 0xfe, 0xc3, 0x03, + 0x13, 0xfc, 0x71, 0xfe, 0x2c, 0xa9, 0x22, 0xef, 0x0d, 0x5c, 0x5c, 0x8a, + 0x6f, 0xff, 0x49, 0x8d, 0x35, 0xf9, 0x0d, 0x3b, 0xfd, 0x65, 0xff, 0xfc, + 0xed, 0xf8, 0xf1, 0x67, 0xfc, 0xde, 0xc6, 0x31, 0x65, 0x32, 0x28, 0xfc, + 0x97, 0x7f, 0xff, 0xfb, 0xff, 0x63, 0xe9, 0xb3, 0xa2, 0x0f, 0xe3, 0xdb, + 0x37, 0xb7, 0xe6, 0x85, 0x97, 0xfb, 0x18, 0x9b, 0x5a, 0xc5, 0x97, 0xfd, + 0x8e, 0x40, 0xd0, 0x60, 0x0b, 0x2a, 0x13, 0x05, 0xc2, 0x2e, 0x9f, 0x34, + 0x61, 0x7f, 0xfe, 0x3e, 0xe3, 0x3b, 0xcd, 0xff, 0x64, 0xbc, 0xdb, 0xd6, + 0x5f, 0xdd, 0x4b, 0x41, 0x80, 0x2c, 0xbf, 0x7e, 0x35, 0x00, 0x59, 0x70, + 0x87, 0x59, 0x7e, 0xcd, 0x4a, 0x0e, 0xb2, 0xa7, 0x37, 0xe7, 0x18, 0xa8, + 0x4c, 0x47, 0x16, 0x98, 0xbd, 0xd9, 0xae, 0x9c, 0xe9, 0x2e, 0x30, 0xc4, + 0x97, 0xfe, 0x17, 0xdf, 0x9a, 0x6f, 0x44, 0xe2, 0xc0, 0x6c, 0x4c, 0x18, + 0xbf, 0xdc, 0x2c, 0xfe, 0xde, 0x7d, 0x65, 0xf6, 0xf8, 0xfc, 0x2c, 0xbd, + 0xbd, 0xf4, 0xb2, 0xfb, 0x3c, 0x58, 0xb2, 0xb0, 0xdf, 0x70, 0x7a, 0xa4, + 0x98, 0x9e, 0x2e, 0xb1, 0xaf, 0xd8, 0x6d, 0xba, 0xb2, 0xfc, 0xe7, 0xce, + 0xbe, 0xb2, 0xf7, 0x1f, 0x71, 0x65, 0xfe, 0x72, 0xef, 0x61, 0x9f, 0xe2, + 0xca, 0x9d, 0x12, 0x58, 0x28, 0xc5, 0x01, 0x1f, 0xbd, 0x3c, 0x6e, 0x2c, + 0xbf, 0xfe, 0xf3, 0x1b, 0xc6, 0xc2, 0x00, 0xf4, 0xfd, 0xac, 0xbf, 0xe0, + 0x34, 0xdc, 0x6f, 0x31, 0xd6, 0x5f, 0xe8, 0xf6, 0x4d, 0x27, 0x9d, 0x65, + 0xff, 0xc5, 0x9d, 0x4b, 0x83, 0x6d, 0xf0, 0x35, 0x95, 0x3a, 0x64, 0x63, + 0x20, 0x02, 0x80, 0x4e, 0x77, 0x4d, 0x2f, 0xcd, 0xf8, 0xff, 0x16, 0x5f, + 0xe7, 0xeb, 0x8e, 0x41, 0xc5, 0x97, 0xcd, 0xa7, 0x02, 0xca, 0x91, 0xfd, + 0x00, 0x9f, 0x86, 0x57, 0xf8, 0x11, 0xbd, 0xfd, 0xe6, 0x59, 0x42, 0xcf, + 0x8f, 0xe5, 0xf7, 0xfd, 0xc0, 0xeb, 0x4d, 0x0d, 0xa5, 0x95, 0x89, 0xc4, + 0x3c, 0x65, 0x9f, 0x24, 0xb6, 0xe2, 0xcb, 0xe2, 0xea, 0x68, 0x59, 0x7f, + 0xd1, 0x9d, 0x43, 0xc9, 0xe4, 0xb2, 0xfe, 0xc0, 0x6c, 0x2c, 0x02, 0xcb, + 0x8f, 0xda, 0xca, 0x19, 0xe3, 0x39, 0x75, 0xff, 0xb0, 0xcd, 0x8e, 0x36, + 0x99, 0xa1, 0x65, 0xfa, 0x0b, 0xf0, 0x05, 0x97, 0xbe, 0x07, 0x59, 0x5a, + 0x3c, 0x23, 0x93, 0x5f, 0x16, 0x3e, 0xe2, 0xcb, 0xf4, 0x18, 0x27, 0xa1, + 0x65, 0x6d, 0x69, 0xe2, 0xc0, 0xa0, 0xc8, 0xf1, 0xf7, 0x44, 0x2f, 0x08, + 0x2e, 0x11, 0x08, 0x47, 0x7e, 0x2c, 0xf3, 0xfd, 0x65, 0xed, 0x9c, 0xed, + 0x65, 0x6e, 0x1e, 0x37, 0x89, 0xaf, 0xf3, 0x38, 0x35, 0xa0, 0xf9, 0x65, + 0xfd, 0x06, 0xe1, 0x31, 0xab, 0x2f, 0xec, 0xfe, 0xef, 0xf3, 0xcb, 0x2b, + 0x11, 0x6b, 0xe2, 0x52, 0x33, 0xe1, 0x6d, 0xfd, 0x3c, 0xd1, 0xc0, 0xf4, + 0xb2, 0xff, 0x08, 0x4e, 0x6e, 0xb5, 0x0b, 0x2a, 0x0f, 0x95, 0xcc, 0x6f, + 0xff, 0xee, 0xc5, 0xe9, 0xc9, 0xbe, 0x2f, 0x51, 0xf2, 0x70, 0x2c, 0xbb, + 0x68, 0x92, 0xcb, 0xcf, 0x84, 0xb2, 0xff, 0xef, 0x94, 0x01, 0xfe, 0x01, + 0x0a, 0x4b, 0x2f, 0xc3, 0x69, 0x9a, 0x16, 0x5f, 0xb3, 0xfb, 0x79, 0xf5, + 0x97, 0xde, 0x6d, 0x6c, 0x73, 0xd1, 0x22, 0x7a, 0xda, 0xdb, 0x85, 0xdd, + 0xa1, 0x10, 0x51, 0x0b, 0xf8, 0x8c, 0xfe, 0x73, 0xb9, 0x42, 0xb4, 0x70, + 0xe1, 0xc9, 0x53, 0x5d, 0xc6, 0x6f, 0xd4, 0x63, 0xad, 0x08, 0x79, 0xa1, + 0xd3, 0xa8, 0xf8, 0xbd, 0x1a, 0x73, 0xc6, 0xfc, 0x08, 0x67, 0x14, 0xae, + 0x7e, 0x47, 0xf5, 0xf8, 0xdd, 0x43, 0x0a, 0x0d, 0xe4, 0x06, 0x2f, 0x6d, + 0x8e, 0x08, 0x35, 0xbb, 0x09, 0x5b, 0xc2, 0x7b, 0xcb, 0x2e, 0xdd, 0xf2, + 0xcb, 0xf6, 0xbb, 0x77, 0xed, 0x51, 0x17, 0x2f, 0x68, 0x3e, 0x59, 0x7e, + 0xf8, 0x04, 0x29, 0x24, 0xbf, 0x73, 0xfe, 0x80, 0x2c, 0xbf, 0x3c, 0xf1, + 0xa0, 0xac, 0xb0, 0xb8, 0x4c, 0x12, 0x71, 0xec, 0x1a, 0xd1, 0xb3, 0x8e, + 0x84, 0xa7, 0x6c, 0xa2, 0xfc, 0x41, 0x96, 0x71, 0x65, 0xe2, 0x21, 0xac, + 0xba, 0x42, 0xf0, 0xf0, 0x88, 0x9e, 0x85, 0xab, 0xb2, 0x94, 0xad, 0x4e, + 0xa1, 0x61, 0x7f, 0xf1, 0xde, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0x99, + 0x97, 0xff, 0x0c, 0x59, 0x05, 0xc4, 0x1f, 0x98, 0xd5, 0x97, 0xbc, 0xdc, + 0x59, 0x7c, 0x29, 0xe4, 0x7d, 0x65, 0xfd, 0x1c, 0x28, 0xff, 0x16, 0x56, + 0xd2, 0x3d, 0x23, 0x93, 0x56, 0xd0, 0x89, 0x6d, 0xa6, 0xdd, 0x7f, 0xf6, + 0xd3, 0x36, 0x33, 0x5b, 0x30, 0x3a, 0x9d, 0x65, 0xf6, 0x07, 0x53, 0xac, + 0xbb, 0x6f, 0x6b, 0x59, 0x71, 0x9f, 0x59, 0x42, 0x83, 0xda, 0xda, 0x44, + 0x63, 0x1f, 0xbf, 0x85, 0x56, 0xd7, 0xb5, 0x8a, 0x79, 0x0b, 0x2d, 0x32, + 0xcb, 0xa3, 0x8b, 0x2b, 0x69, 0x1f, 0x54, 0xe8, 0x5d, 0x09, 0x5f, 0xfd, + 0xf9, 0x67, 0xbc, 0xf2, 0x66, 0x25, 0x97, 0x6d, 0xed, 0x6b, 0x2f, 0xfd, + 0xe6, 0xff, 0x1f, 0xa9, 0xf0, 0xc5, 0x97, 0xfe, 0xdf, 0x1e, 0x68, 0x9a, + 0x68, 0xed, 0x65, 0x0a, 0x51, 0xc8, 0x28, 0x42, 0xec, 0x7d, 0x90, 0x6e, + 0x63, 0xac, 0xbf, 0x7c, 0x9b, 0xaf, 0xac, 0xae, 0xcd, 0xf0, 0x82, 0xd7, + 0xfd, 0xb5, 0x80, 0xe2, 0x69, 0xa7, 0x85, 0x97, 0xc2, 0x8f, 0xb9, 0x2c, + 0xbe, 0xda, 0x85, 0x5f, 0x21, 0x65, 0x82, 0xb2, 0x85, 0x51, 0xbe, 0x62, + 0xdb, 0xb6, 0xf6, 0xb5, 0x97, 0xff, 0xff, 0xf0, 0xaf, 0xa8, 0x15, 0x36, + 0x90, 0xfb, 0xdf, 0xa9, 0x4d, 0xbc, 0x22, 0xab, 0x69, 0x8a, 0xc5, 0x58, + 0xaa, 0xd9, 0xb3, 0xdb, 0x6b, 0x2f, 0xfc, 0x51, 0x3e, 0x9f, 0xd0, 0x76, + 0x59, 0x7d, 0x80, 0x80, 0x2c, 0xbf, 0xb9, 0xa8, 0xcf, 0xf1, 0x65, 0x82, + 0xb2, 0xa0, 0xdf, 0x61, 0x6d, 0xfe, 0x71, 0xb9, 0xf5, 0x1c, 0x59, 0x7f, + 0xed, 0xe1, 0x7e, 0xc6, 0xdb, 0xe0, 0x6b, 0x2f, 0xe8, 0x3b, 0xca, 0x3e, + 0xb2, 0xff, 0xe8, 0x3b, 0xff, 0x3a, 0x01, 0xc4, 0xf2, 0xcb, 0xff, 0xdd, + 0xe8, 0x33, 0xf5, 0xc6, 0xd7, 0x7e, 0xc5, 0x97, 0xcd, 0xbd, 0xc0, 0xb2, + 0xa0, 0xfc, 0xbe, 0x9f, 0x43, 0x4d, 0xeb, 0x0c, 0x8d, 0x43, 0xf1, 0x61, + 0x42, 0xe2, 0xf9, 0xa7, 0x09, 0x2c, 0xbf, 0x64, 0xf8, 0x09, 0x96, 0x56, + 0xc3, 0xcb, 0xf9, 0x15, 0xf9, 0xb7, 0x4d, 0x6e, 0xd6, 0x5f, 0xf0, 0x65, + 0xc7, 0x3b, 0x90, 0x16, 0x56, 0x8f, 0x91, 0xcb, 0x2f, 0xe8, 0xe6, 0xc6, + 0x79, 0x96, 0x5f, 0xed, 0x98, 0x4f, 0xa0, 0x6d, 0xac, 0xb8, 0xa4, 0xb2, + 0xf6, 0xa0, 0xd5, 0x97, 0xff, 0xcf, 0xec, 0xe8, 0x1e, 0x31, 0xfd, 0x37, + 0x82, 0xb2, 0x99, 0x10, 0xd3, 0x0b, 0x1c, 0x76, 0xff, 0x0f, 0x4e, 0x07, + 0xcd, 0x2c, 0xbf, 0xb3, 0x90, 0x21, 0x42, 0xca, 0x1a, 0x69, 0x79, 0x0b, + 0xd6, 0x30, 0xf1, 0x95, 0xb1, 0x65, 0xce, 0x75, 0x95, 0xc3, 0x4d, 0xba, + 0x21, 0x76, 0xef, 0xd6, 0x58, 0x56, 0xb2, 0xc0, 0x83, 0x5e, 0x11, 0xab, + 0xc7, 0x7f, 0xac, 0xb0, 0xad, 0x65, 0x61, 0xb1, 0x21, 0xcb, 0xf6, 0xd8, + 0xc9, 0xcc, 0x59, 0x50, 0x79, 0x5f, 0x1f, 0xbf, 0xff, 0xbb, 0x28, 0x3e, + 0xc8, 0xd6, 0x9b, 0x7e, 0x9d, 0xc0, 0xb2, 0xfd, 0x27, 0xfb, 0x9a, 0xb2, + 0xa1, 0x10, 0xd8, 0xbd, 0x7c, 0x58, 0x08, 0x59, 0x44, 0x78, 0x3b, 0xc8, + 0x6f, 0xb0, 0x78, 0x35, 0x97, 0xf3, 0x18, 0xdc, 0xce, 0xd6, 0x53, 0x1f, + 0x96, 0x88, 0xf8, 0x43, 0x7c, 0xdf, 0x89, 0x2c, 0xbc, 0x78, 0x92, 0xcb, + 0xdc, 0x79, 0x96, 0x54, 0x1b, 0x9f, 0x8e, 0x5f, 0xc2, 0xe6, 0x14, 0xf9, + 0xc9, 0x65, 0x6d, 0x6c, 0x96, 0x9d, 0xa4, 0x3f, 0x3c, 0x31, 0xc6, 0x7b, + 0xda, 0xfb, 0x47, 0x33, 0x34, 0x26, 0xb5, 0x08, 0x83, 0x90, 0xfa, 0x37, + 0xa7, 0x67, 0x02, 0x99, 0x42, 0x87, 0xf1, 0xad, 0x6f, 0x2e, 0x11, 0x6b, + 0x74, 0x82, 0xfe, 0xd6, 0x9e, 0x42, 0x1d, 0x65, 0xe7, 0x2e, 0xd6, 0x5e, + 0xf9, 0x42, 0xcb, 0xe2, 0x2c, 0xfa, 0xca, 0x14, 0x9b, 0xb8, 0x1b, 0xae, + 0x1f, 0xd9, 0x8a, 0xf7, 0xcf, 0xe6, 0x99, 0x65, 0xf1, 0x4d, 0x03, 0x59, + 0x77, 0x5f, 0x59, 0x7d, 0xe9, 0xa0, 0x6b, 0x2f, 0xe0, 0x6a, 0x04, 0x72, + 0x59, 0x50, 0x9b, 0xce, 0x42, 0xab, 0xb2, 0x36, 0x22, 0x98, 0x89, 0xc6, + 0x02, 0x47, 0x7b, 0xd1, 0xd2, 0xcb, 0xf4, 0x1c, 0xb2, 0x65, 0x97, 0xf3, + 0x61, 0x0f, 0xd0, 0xb2, 0xc7, 0x59, 0x63, 0xac, 0xba, 0x09, 0x65, 0x4e, + 0x69, 0x8c, 0x11, 0xa1, 0xa2, 0xb3, 0xb2, 0x7d, 0xc2, 0xbe, 0x1b, 0xd2, + 0xcb, 0xa3, 0x8b, 0x2f, 0xed, 0x41, 0x07, 0x3c, 0xb2, 0xfb, 0x51, 0x84, + 0xb2, 0xf9, 0xff, 0x20, 0x2c, 0xbf, 0xc1, 0x39, 0x64, 0xcd, 0x3a, 0xcb, + 0x05, 0x65, 0xfe, 0x6e, 0xdf, 0x35, 0x9f, 0x59, 0x40, 0x3c, 0x3e, 0x08, + 0xdf, 0xe7, 0xd3, 0x46, 0xe3, 0x1d, 0x65, 0x1a, 0x9a, 0x8f, 0x62, 0xc7, + 0x2c, 0xf1, 0x07, 0x08, 0xbe, 0xef, 0xbc, 0x8a, 0xff, 0xb5, 0x19, 0x28, + 0xf4, 0x01, 0x65, 0xff, 0xed, 0x9e, 0x76, 0xf8, 0x02, 0x44, 0xf2, 0x59, + 0x7f, 0xc2, 0x1f, 0x38, 0xef, 0xd4, 0x96, 0x5d, 0xb5, 0x8a, 0x56, 0x5f, + 0xf7, 0xa1, 0x86, 0xdc, 0x9d, 0xd6, 0x50, 0xa8, 0x7b, 0x0c, 0x41, 0x52, + 0x5c, 0x08, 0xc8, 0x64, 0xf6, 0x82, 0xd1, 0xae, 0x69, 0xa4, 0xe6, 0xe0, + 0x4a, 0x28, 0x49, 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x15, 0x05, 0x38, 0x2a, + 0x0a, 0x36, 0x96, 0xd2, 0xec, 0x57, 0x02, 0xac, 0x51, 0xa9, 0xf7, 0x70, + 0x23, 0x15, 0x51, 0xb7, 0xd0, 0x9e, 0x14, 0x44, 0x0a, 0x37, 0x36, 0x9f, + 0xf6, 0x6c, 0xf6, 0xda, 0xcb, 0xff, 0xf0, 0x3a, 0x97, 0x83, 0x1a, 0x17, + 0xe6, 0xed, 0xf4, 0xb2, 0xf8, 0x32, 0xd9, 0xc5, 0x97, 0xfe, 0xf6, 0x16, + 0x1b, 0x85, 0x83, 0x59, 0x7f, 0xf7, 0x46, 0x47, 0xc6, 0xdb, 0x9c, 0x83, + 0xac, 0xbe, 0xe6, 0x75, 0xf5, 0x97, 0xd9, 0x34, 0x18, 0xb2, 0xfc, 0x3f, + 0x41, 0x4e, 0xb2, 0xf9, 0x8b, 0xfc, 0x59, 0x7f, 0xff, 0xc7, 0x6d, 0x78, + 0x3c, 0x94, 0x6f, 0xd4, 0x17, 0xfd, 0x92, 0x59, 0x52, 0x44, 0x4b, 0x10, + 0xdf, 0xf9, 0xbe, 0xdd, 0xb0, 0xff, 0x9d, 0xac, 0xa9, 0xd5, 0x01, 0x48, + 0x97, 0x0f, 0x34, 0x93, 0xe2, 0x32, 0x23, 0xfc, 0x2c, 0x77, 0x48, 0xaf, + 0x0d, 0xb7, 0xac, 0xbf, 0xdd, 0x96, 0x7b, 0xd8, 0x05, 0x97, 0xce, 0x63, + 0xee, 0x2c, 0xa7, 0x3d, 0x82, 0x33, 0xbf, 0x07, 0xbf, 0x31, 0x8b, 0x2f, + 0xbf, 0xb7, 0x9e, 0x59, 0x7f, 0xff, 0x9c, 0xbb, 0x2c, 0x1f, 0x83, 0xb3, + 0xd1, 0x2d, 0x44, 0xeb, 0x2b, 0x11, 0x10, 0x12, 0x5b, 0xf8, 0x42, 0x8f, + 0x44, 0x96, 0x5f, 0xff, 0xc6, 0x96, 0x00, 0x3c, 0xd9, 0x26, 0xf4, 0x76, + 0x4e, 0xb2, 0x8e, 0x88, 0xa7, 0x2d, 0xbf, 0xe6, 0xee, 0x69, 0x7a, 0x08, + 0xd5, 0x97, 0xa0, 0xff, 0x59, 0x44, 0x7a, 0xe6, 0x1d, 0xdf, 0xec, 0x32, + 0x3e, 0x4f, 0xc5, 0x97, 0x9b, 0xcc, 0xb2, 0xa0, 0xfb, 0xd8, 0x8b, 0xe6, + 0x57, 0x41, 0x2c, 0xbe, 0xce, 0xc7, 0x8b, 0x2f, 0x88, 0x62, 0x74, 0xb2, + 0xe0, 0xfd, 0x65, 0xe7, 0xd4, 0xb6, 0x1e, 0xeb, 0x91, 0x6d, 0x92, 0x50, + 0xa1, 0x7f, 0x02, 0x23, 0x2b, 0xc9, 0x4b, 0x8c, 0xf5, 0xa7, 0x63, 0x90, + 0x7a, 0x16, 0x4f, 0x0a, 0xc2, 0x87, 0x47, 0xcb, 0x42, 0xe5, 0x7f, 0x8d, + 0x7d, 0xfd, 0xe7, 0x5f, 0x59, 0x76, 0xfd, 0xc5, 0x94, 0x69, 0xea, 0x39, + 0xc5, 0xff, 0xfb, 0x5a, 0x6c, 0xde, 0x41, 0xe6, 0xce, 0x05, 0xf8, 0xb2, + 0x96, 0x5f, 0xff, 0x71, 0xb6, 0xf3, 0xbf, 0x31, 0x10, 0x75, 0x3a, 0xca, + 0xd1, 0xef, 0x7c, 0x2e, 0xfe, 0xfe, 0x1f, 0xac, 0x3a, 0xca, 0x84, 0xc1, + 0xf2, 0x16, 0xec, 0x45, 0x7f, 0x8e, 0x77, 0x97, 0x1a, 0x4b, 0x2f, 0xf1, + 0xbb, 0x23, 0xa0, 0x6a, 0x16, 0x56, 0x1f, 0x53, 0x99, 0xd3, 0x27, 0xcd, + 0xe8, 0xca, 0x4a, 0x13, 0xb7, 0xff, 0xb7, 0xe0, 0xfd, 0x1b, 0xcf, 0x04, + 0xe2, 0x2c, 0xb4, 0xcb, 0x2b, 0x0f, 0x7c, 0x29, 0xb7, 0xfd, 0x2e, 0xfc, + 0xc6, 0x41, 0x0d, 0x65, 0xfc, 0x37, 0x97, 0x1a, 0x4b, 0x2b, 0x48, 0x88, + 0x72, 0x10, 0x9d, 0x5f, 0x04, 0xbf, 0xc5, 0x97, 0xf7, 0x02, 0xc4, 0xdc, + 0x59, 0x7a, 0x35, 0x0b, 0x2b, 0x61, 0xe3, 0xf8, 0xb2, 0xbb, 0x44, 0x6e, + 0x9a, 0x6f, 0x4b, 0x6c, 0xc5, 0x97, 0x01, 0x96, 0x5f, 0x8f, 0x2f, 0x09, + 0xc5, 0x96, 0xd6, 0xc3, 0xc0, 0x10, 0x5a, 0xfc, 0xe6, 0x16, 0x0d, 0x65, + 0x42, 0x2c, 0xd9, 0x87, 0x45, 0x77, 0xfe, 0x28, 0xec, 0xd7, 0xcd, 0x30, + 0x16, 0x5f, 0xdc, 0xc6, 0xd6, 0x9d, 0x65, 0xfb, 0x9b, 0x00, 0xff, 0x59, + 0x53, 0xa2, 0x50, 0x07, 0xdf, 0x2c, 0xba, 0x34, 0xb2, 0xff, 0xe9, 0xf3, + 0x8c, 0xfe, 0x16, 0x61, 0x86, 0x24, 0xb3, 0x00, 0xf8, 0x08, 0x5a, 0xff, + 0x82, 0xfa, 0xdb, 0x0f, 0x9b, 0x4b, 0x2a, 0x11, 0xe6, 0x38, 0x48, 0xf8, + 0x9a, 0xfe, 0xeb, 0x3c, 0x1e, 0x80, 0xb2, 0xde, 0x59, 0x7f, 0x1f, 0x9e, + 0x82, 0xfa, 0xcb, 0xd3, 0xf8, 0x2b, 0x2f, 0xfd, 0xe7, 0xe7, 0xb3, 0x7e, + 0x7f, 0x8b, 0x2a, 0x0f, 0x79, 0xc7, 0xa9, 0x91, 0x57, 0xe8, 0x45, 0xdf, + 0x98, 0x3d, 0xb4, 0xeb, 0x2b, 0x13, 0x3c, 0xec, 0xc3, 0xf0, 0xbc, 0xdb, + 0x27, 0xbf, 0xe2, 0xc8, 0x35, 0xfe, 0xe6, 0xac, 0xbf, 0xa4, 0x27, 0xf9, + 0x1f, 0x59, 0x7f, 0x8f, 0x9d, 0x93, 0xe7, 0x6b, 0x2e, 0x0c, 0xcb, 0x2e, + 0x97, 0x20, 0xf2, 0xc0, 0x67, 0x7c, 0x7e, 0x09, 0xc5, 0x97, 0xbb, 0x0f, + 0x6b, 0x2a, 0x11, 0xd5, 0xd3, 0xd3, 0x16, 0x84, 0x92, 0xff, 0xbf, 0xf8, + 0x3e, 0x61, 0x1a, 0xb2, 0xff, 0xfb, 0xfe, 0xcd, 0xdf, 0xe7, 0x8b, 0x3f, + 0xe6, 0x59, 0x5d, 0x22, 0x24, 0x8e, 0x2f, 0xe2, 0x7f, 0xca, 0x0d, 0x59, + 0x7f, 0xb0, 0x03, 0x0b, 0xea, 0x4b, 0x2a, 0x0f, 0x82, 0x72, 0xdb, 0xf9, + 0xdc, 0x7b, 0xf0, 0x6b, 0x2f, 0x3b, 0xf6, 0xa8, 0xb3, 0xd7, 0xfa, 0x08, + 0xdd, 0x06, 0x09, 0x65, 0xfc, 0x07, 0x29, 0x31, 0xd6, 0x54, 0x26, 0xb5, + 0x3c, 0x20, 0xc6, 0x45, 0xd9, 0x73, 0x14, 0x80, 0xca, 0xff, 0x7b, 0xfc, + 0x7e, 0x84, 0x3a, 0xcb, 0xfd, 0x12, 0x6f, 0xc7, 0xf8, 0xb2, 0xf8, 0x02, + 0x7a, 0x16, 0x5e, 0x18, 0xdd, 0x65, 0x78, 0xfc, 0x48, 0xcb, 0xe4, 0x77, + 0xf4, 0x84, 0xcf, 0x3f, 0x4b, 0x2a, 0x13, 0x04, 0x68, 0x53, 0xb9, 0x75, + 0xff, 0x1a, 0xe5, 0x9b, 0xcb, 0x38, 0xb2, 0xfe, 0xde, 0x59, 0xcc, 0x25, + 0x96, 0xdc, 0x59, 0x58, 0x78, 0x3c, 0x2d, 0xbc, 0xd2, 0x85, 0x96, 0x7d, + 0x86, 0xf3, 0x84, 0x36, 0xd1, 0xa8, 0xde, 0xf4, 0x2d, 0xaf, 0xf3, 0x0f, + 0x0e, 0x66, 0x79, 0x65, 0xa7, 0x59, 0x7f, 0xff, 0xd9, 0xfe, 0x67, 0x6e, + 0x40, 0xd9, 0xa8, 0x20, 0xfe, 0x3c, 0xb2, 0xfd, 0xc1, 0xb4, 0x12, 0xca, + 0x84, 0x69, 0x1c, 0xcc, 0x84, 0xbe, 0xcf, 0x7f, 0xf7, 0x3e, 0xd3, 0x18, + 0xe3, 0x8e, 0xb8, 0xb2, 0x99, 0x38, 0x37, 0x8c, 0x04, 0x27, 0x77, 0x00, + 0x0b, 0x2f, 0x18, 0x61, 0x89, 0x2f, 0xfa, 0x5c, 0x2c, 0xec, 0x79, 0xa4, + 0x82, 0xcd, 0x05, 0xa4, 0xb2, 0x99, 0x12, 0x6e, 0x6f, 0xf4, 0xbb, 0xfe, + 0x90, 0xfd, 0x05, 0x18, 0x62, 0xcb, 0xf6, 0xe8, 0x4f, 0x83, 0x59, 0x7f, + 0xfd, 0xbc, 0x83, 0x2c, 0xde, 0xdf, 0x8e, 0xf3, 0xcb, 0x2f, 0xd9, 0xbf, + 0x64, 0x8e, 0xb2, 0xdf, 0x83, 0xff, 0xf2, 0x9d, 0x42, 0x61, 0x38, 0x70, + 0x18, 0x55, 0x5f, 0xfb, 0xa9, 0x10, 0x41, 0xb3, 0xb3, 0x81, 0x65, 0xd0, + 0x6a, 0xcb, 0xfe, 0x1c, 0x14, 0x02, 0x5e, 0x65, 0x97, 0xc6, 0xfd, 0xa7, + 0x59, 0x50, 0x8b, 0x69, 0xd1, 0x18, 0x5c, 0x26, 0xf7, 0xfb, 0xcc, 0x32, + 0x77, 0x99, 0x65, 0xfe, 0x1f, 0x82, 0xe0, 0xdb, 0xc5, 0x97, 0xce, 0x08, + 0xd2, 0xca, 0x84, 0x44, 0xb1, 0x97, 0x0d, 0xaf, 0xa3, 0xf9, 0x3a, 0xcb, + 0xfd, 0x1b, 0x3f, 0x9c, 0xe4, 0x2c, 0xbf, 0x86, 0x20, 0xc3, 0xfe, 0x2c, + 0xa3, 0x51, 0x0d, 0xa2, 0x22, 0x34, 0xbf, 0xb3, 0x92, 0xf0, 0x9c, 0x59, + 0x4c, 0x7b, 0xe4, 0x61, 0x7a, 0x08, 0xd5, 0x95, 0x26, 0xc9, 0x48, 0x71, + 0x90, 0xe4, 0x2f, 0x0d, 0x86, 0xbf, 0x71, 0xda, 0xf5, 0x1b, 0x83, 0x23, + 0x4d, 0x19, 0x16, 0xa5, 0x0f, 0x9e, 0x36, 0x1f, 0x4a, 0x94, 0x04, 0x32, + 0x0a, 0x33, 0x7e, 0x43, 0xab, 0xf0, 0xc5, 0xdf, 0x18, 0x98, 0x84, 0x17, + 0xfd, 0x9a, 0x2c, 0xde, 0xfa, 0x92, 0xcb, 0x81, 0xc5, 0x97, 0xe2, 0xfe, + 0x00, 0xeb, 0x2f, 0xb4, 0xd1, 0xf5, 0x97, 0xf7, 0x0b, 0x26, 0x83, 0xac, + 0xa0, 0x1e, 0x77, 0xc8, 0x69, 0xd1, 0x2e, 0x17, 0x5b, 0xa3, 0xeb, 0x2f, + 0x80, 0xe6, 0x7d, 0x65, 0xfe, 0x73, 0x3c, 0xd1, 0xa8, 0x59, 0x7f, 0x04, + 0xfc, 0x0e, 0xa7, 0x59, 0x7e, 0x6d, 0xf0, 0x5f, 0x59, 0x50, 0x9e, 0x60, + 0xce, 0x4d, 0x85, 0x77, 0x44, 0x4c, 0x2d, 0xa2, 0x32, 0x32, 0xe1, 0x85, + 0xff, 0xb4, 0xdc, 0x90, 0x9e, 0x82, 0x85, 0x97, 0xda, 0x68, 0x3a, 0xcb, + 0xff, 0xf7, 0xcd, 0x0c, 0x60, 0xfd, 0x9c, 0xea, 0x51, 0xe5, 0x95, 0xa4, + 0x5b, 0x1c, 0xf8, 0x88, 0x6f, 0x80, 0x1d, 0x4e, 0xb2, 0xf4, 0xc1, 0xd2, + 0xcb, 0x9e, 0x4b, 0x2f, 0xe3, 0xe1, 0x7f, 0x6f, 0x16, 0x5f, 0xff, 0xec, + 0xf8, 0x40, 0x77, 0x93, 0x8e, 0x09, 0xf4, 0xf2, 0x59, 0x7f, 0x13, 0x99, + 0xfc, 0xf6, 0x22, 0x34, 0x8b, 0xef, 0xf6, 0x7b, 0xc1, 0xfb, 0x92, 0xcb, + 0x98, 0x6b, 0x2f, 0xef, 0x76, 0xfa, 0x79, 0x2c, 0xb7, 0x72, 0x3c, 0x4c, + 0x16, 0xbc, 0xd3, 0x71, 0x65, 0x41, 0xe2, 0x9c, 0xa2, 0xff, 0xef, 0xb7, + 0x9c, 0xfb, 0x61, 0xf3, 0x69, 0x65, 0xfc, 0xff, 0x3c, 0x67, 0xd6, 0x53, + 0x9f, 0x98, 0x51, 0xef, 0x7a, 0x38, 0xb2, 0x86, 0xa9, 0xca, 0x68, 0x51, + 0xe9, 0x0c, 0xf0, 0xbb, 0x28, 0x4a, 0x7c, 0x86, 0xfb, 0xdd, 0x3e, 0xe2, + 0xcb, 0xf7, 0x9c, 0xed, 0xc5, 0x94, 0x33, 0xcd, 0xec, 0x9a, 0xb1, 0x5b, + 0x43, 0x4a, 0x90, 0x78, 0x5a, 0xdf, 0x9b, 0xce, 0x76, 0x59, 0x79, 0xc8, + 0x0b, 0x2b, 0x61, 0xe0, 0xf6, 0x4d, 0x7b, 0x7e, 0x0d, 0x65, 0xb5, 0x39, + 0xe1, 0xcc, 0x4b, 0x73, 0xf9, 0x65, 0xf4, 0xd2, 0x72, 0x59, 0x5a, 0x37, + 0x1c, 0x16, 0xbf, 0xdb, 0xba, 0xcd, 0xd2, 0x09, 0x8b, 0x2a, 0x73, 0xdb, + 0x30, 0x86, 0xf6, 0xeb, 0x0d, 0x65, 0x61, 0xe1, 0xb9, 0x25, 0x42, 0xec, + 0xd3, 0x17, 0xfa, 0x5c, 0x63, 0xc2, 0xfc, 0xa3, 0x00, 0xbf, 0x8f, 0xde, + 0xcc, 0x3f, 0x16, 0x5f, 0xff, 0xff, 0x03, 0x99, 0x84, 0x68, 0x9a, 0x28, + 0xcf, 0x0b, 0xe1, 0x64, 0xe7, 0xc3, 0xac, 0xbb, 0x58, 0xb2, 0xee, 0x32, + 0xca, 0x9c, 0xd6, 0x68, 0x5a, 0xe1, 0x24, 0xb2, 0xf9, 0xb7, 0xb6, 0xf5, + 0x97, 0xd0, 0x42, 0x1d, 0x65, 0x62, 0x20, 0x4e, 0x44, 0xe3, 0x02, 0x12, + 0xd6, 0x26, 0xd1, 0xf8, 0xcb, 0x2e, 0x07, 0x16, 0x5f, 0x6c, 0x28, 0xed, + 0x65, 0xf3, 0xfa, 0x04, 0x59, 0x58, 0x7b, 0xbe, 0x17, 0xde, 0x49, 0x7d, + 0x06, 0x60, 0xd6, 0x5f, 0xff, 0x07, 0xa9, 0x70, 0x7e, 0x8d, 0x0d, 0xdc, + 0xc5, 0x97, 0x6d, 0x62, 0xa2, 0xca, 0xc4, 0xd2, 0xda, 0x10, 0xda, 0x30, + 0x22, 0x21, 0x14, 0xae, 0xcf, 0xac, 0xb8, 0xec, 0xb2, 0x86, 0x6b, 0x08, + 0x5a, 0xf8, 0xc8, 0xeb, 0x8b, 0x2f, 0x7c, 0x4c, 0x59, 0x74, 0x4e, 0xb2, + 0x9c, 0xda, 0x70, 0x76, 0xf0, 0xe2, 0x4b, 0x2f, 0xd3, 0x4a, 0x3a, 0xfa, + 0xcb, 0xfb, 0xbf, 0x36, 0xf7, 0xd2, 0xcb, 0x44, 0xe7, 0xb5, 0x85, 0x57, + 0x67, 0x96, 0x53, 0xa2, 0xcc, 0x9d, 0xb6, 0xc9, 0xee, 0xc1, 0xac, 0xbb, + 0xe2, 0xb5, 0x95, 0x3a, 0xe8, 0x5c, 0xa5, 0x72, 0x63, 0xd7, 0x88, 0x38, + 0xb1, 0xf8, 0x69, 0xef, 0x31, 0xdb, 0x16, 0xbf, 0x68, 0x07, 0x6e, 0x2c, + 0xba, 0x37, 0xac, 0xac, 0x3c, 0x0d, 0xe5, 0x17, 0xbc, 0x13, 0x16, 0x5e, + 0xf3, 0xce, 0xb2, 0xfd, 0xcf, 0xb4, 0x74, 0xb2, 0xe0, 0xf6, 0xb2, 0xa4, + 0x78, 0x00, 0x28, 0xbd, 0xfc, 0x11, 0x65, 0xfc, 0x70, 0xf3, 0xf9, 0xf5, + 0x97, 0xf8, 0xc7, 0xef, 0x0b, 0x06, 0xb2, 0xfc, 0xfe, 0xea, 0x5c, 0x59, + 0x50, 0x88, 0xae, 0x17, 0x04, 0xce, 0xfd, 0x9c, 0x04, 0x4c, 0xb2, 0xfe, + 0x8e, 0xb9, 0xb3, 0x50, 0xb2, 0xf4, 0xa3, 0x8b, 0x2c, 0x15, 0x95, 0x23, + 0x5a, 0x01, 0xcb, 0xc3, 0x0f, 0x6b, 0x2f, 0x86, 0x51, 0x25, 0x95, 0x07, + 0xc0, 0xc4, 0x2e, 0x3d, 0x7b, 0x18, 0x6b, 0x2f, 0xff, 0x09, 0xb3, 0xaf, + 0x94, 0x66, 0xcc, 0xeb, 0xeb, 0x2f, 0xfa, 0x3c, 0xd1, 0x34, 0xd1, 0xda, + 0xca, 0x85, 0x69, 0x83, 0x23, 0x34, 0x7b, 0xa5, 0xd6, 0x22, 0x9a, 0x14, + 0xfa, 0x2f, 0x39, 0x47, 0xa1, 0x7b, 0xf2, 0xc0, 0x8d, 0xef, 0x50, 0xbf, + 0xcd, 0x33, 0x93, 0x75, 0xc5, 0x97, 0x67, 0x6b, 0x2f, 0xf1, 0x7f, 0x85, + 0x1f, 0xe2, 0xcb, 0xfd, 0xe2, 0xc6, 0x04, 0x01, 0x65, 0xf9, 0xb7, 0xe1, + 0x71, 0x65, 0xff, 0xfd, 0x1e, 0x0f, 0x51, 0xfe, 0xfd, 0x1a, 0x0e, 0x06, + 0x65, 0x95, 0x88, 0xe9, 0x63, 0x2d, 0x18, 0xf8, 0xa2, 0xfd, 0xfc, 0xf0, + 0x77, 0x16, 0x5f, 0xfa, 0x7f, 0x31, 0xe3, 0x73, 0xd9, 0x3a, 0xca, 0xe8, + 0xfb, 0xb4, 0x57, 0x7f, 0x6b, 0x3d, 0xe0, 0xfd, 0x65, 0xfb, 0xc5, 0x19, + 0xa5, 0x17, 0xf6, 0x6a, 0x70, 0xb8, 0xd5, 0x10, 0x68, 0x59, 0xa6, 0xb6, + 0xa7, 0x45, 0x0c, 0x95, 0x2f, 0x8b, 0xd9, 0xd2, 0xca, 0x84, 0xc4, 0x1a, + 0x18, 0x8e, 0x55, 0x7e, 0x7e, 0xd8, 0xf0, 0xb2, 0xfe, 0x97, 0x89, 0xfa, + 0xfa, 0xca, 0xec, 0xf5, 0x48, 0x9e, 0xf8, 0x42, 0x79, 0xd6, 0x5f, 0xb8, + 0xda, 0x60, 0x2c, 0xac, 0x3e, 0xce, 0x11, 0x6e, 0x91, 0xdf, 0xa3, 0xfb, + 0x0e, 0x62, 0xcb, 0xff, 0x4f, 0xff, 0x47, 0xb3, 0x7b, 0xc9, 0x65, 0xe3, + 0xc7, 0x6b, 0x2f, 0x88, 0x01, 0xe2, 0xca, 0xc3, 0x7f, 0xa1, 0xda, 0x84, + 0x50, 0x34, 0x20, 0x2f, 0xcf, 0x39, 0x39, 0xab, 0x2f, 0xf8, 0x7c, 0xe6, + 0x68, 0x7e, 0xc5, 0x97, 0xfd, 0xc7, 0x28, 0x99, 0x87, 0x3a, 0xcb, 0xfd, + 0x26, 0x3c, 0x78, 0x41, 0xac, 0xbf, 0xfd, 0x18, 0x5d, 0x7f, 0x34, 0xd3, + 0xb9, 0xd6, 0x5d, 0x9e, 0xd8, 0x8b, 0x6e, 0x1c, 0xfc, 0xd2, 0xec, 0xe2, + 0xcb, 0x19, 0xf3, 0xd3, 0xdb, 0x3d, 0xa8, 0x4d, 0xb9, 0xe3, 0x42, 0xbf, + 0xec, 0x97, 0xb0, 0x9f, 0x46, 0xac, 0xb8, 0xe6, 0x2c, 0xa1, 0x67, 0xa1, + 0x23, 0x8b, 0xf4, 0x1f, 0xf9, 0xe5, 0x95, 0xb1, 0x7d, 0x6f, 0x68, 0x33, + 0x88, 0xc0, 0x25, 0x1d, 0xce, 0x43, 0xd3, 0x46, 0x3e, 0x86, 0x5b, 0x93, + 0x14, 0x72, 0xc1, 0x78, 0xdd, 0x24, 0xb8, 0x70, 0xb2, 0xec, 0x92, 0xcb, + 0xff, 0xf3, 0x76, 0xc3, 0xfc, 0x82, 0x5f, 0xe7, 0x9e, 0x4b, 0x2f, 0xff, + 0xbd, 0x07, 0xd9, 0xe8, 0x7d, 0x0c, 0xa2, 0x4b, 0x29, 0xd1, 0xa5, 0xc1, + 0x6f, 0x8b, 0x05, 0x5a, 0xec, 0x11, 0x65, 0xfe, 0x7f, 0xbe, 0x0d, 0xb7, + 0xac, 0xbe, 0x07, 0xa0, 0x6b, 0x2f, 0xef, 0x31, 0x85, 0x03, 0x59, 0x7f, + 0xd0, 0x03, 0xc6, 0x17, 0xf8, 0xb2, 0xff, 0xb9, 0x86, 0x79, 0xce, 0xdc, + 0x59, 0x7e, 0xcd, 0x4e, 0x1e, 0x2c, 0xae, 0xd3, 0x1b, 0x63, 0x39, 0x88, + 0xbc, 0x5b, 0xc3, 0x7d, 0xe7, 0x37, 0xe6, 0xea, 0x4c, 0x4b, 0x2f, 0x37, + 0xb1, 0x65, 0xfd, 0xf7, 0x39, 0xe0, 0xeb, 0x2b, 0x0f, 0xbf, 0xb2, 0x7e, + 0x86, 0xe9, 0x65, 0x1c, 0xdd, 0x98, 0x61, 0x7f, 0xc1, 0x9f, 0x66, 0x7f, + 0xd1, 0xf5, 0x97, 0x34, 0xcb, 0x2a, 0x0f, 0xd7, 0xb2, 0x2d, 0xd3, 0xcb, + 0xdc, 0x09, 0x2c, 0xbf, 0xf0, 0x4d, 0x38, 0x7f, 0xe8, 0x08, 0xad, 0x65, + 0x74, 0x7c, 0x24, 0x39, 0x7c, 0x78, 0xd1, 0xab, 0x2f, 0xb0, 0x00, 0x75, + 0x97, 0x84, 0xf3, 0xac, 0xac, 0x3e, 0x12, 0x23, 0xdb, 0x21, 0xa9, 0xd1, + 0x66, 0x64, 0x20, 0xef, 0x84, 0x82, 0xed, 0x65, 0xee, 0x7a, 0x16, 0x54, + 0x8d, 0xf8, 0xc8, 0xef, 0xc5, 0xa3, 0x1e, 0x75, 0x95, 0x08, 0xb3, 0xc6, + 0x97, 0x21, 0xbf, 0x16, 0x7f, 0xcc, 0xb2, 0xfb, 0xbf, 0x41, 0x8b, 0x2f, + 0xd9, 0xfe, 0x31, 0xd6, 0x5c, 0x12, 0x59, 0x78, 0xb2, 0x75, 0x95, 0x0b, + 0xb6, 0x32, 0x3c, 0xc8, 0xcc, 0x9a, 0x37, 0xad, 0x47, 0xf3, 0xe2, 0xd1, + 0x59, 0x31, 0x12, 0x70, 0x9c, 0x41, 0x6b, 0xfe, 0x83, 0xc7, 0xd8, 0xb2, + 0x4b, 0x2d, 0x25, 0x97, 0xdc, 0x0c, 0x01, 0x65, 0xc1, 0xdd, 0x59, 0x5a, + 0x44, 0x1f, 0x8d, 0x80, 0x22, 0x44, 0x57, 0x61, 0x2c, 0xbf, 0x70, 0x4e, + 0x78, 0x2b, 0x2b, 0xc6, 0xff, 0xe2, 0xb7, 0xff, 0xb4, 0xd0, 0x7c, 0xd9, + 0x9e, 0x6c, 0x3a, 0xcb, 0xe6, 0xe4, 0x3a, 0xca, 0xd8, 0x7d, 0x3c, 0x49, + 0xbf, 0xd8, 0x59, 0xd7, 0xe4, 0x75, 0x97, 0x7e, 0x16, 0x54, 0x1e, 0x4b, + 0x99, 0xdf, 0xf3, 0xc8, 0x6c, 0x11, 0x5b, 0x69, 0x65, 0xfb, 0x08, 0xa0, + 0x6b, 0x2f, 0xbc, 0xfe, 0x85, 0x97, 0xf4, 0x4e, 0x77, 0x9a, 0x16, 0x5b, + 0x4b, 0x2a, 0x47, 0xc1, 0x31, 0x08, 0x4b, 0xaf, 0xff, 0x9c, 0xdf, 0xc6, + 0x81, 0xa8, 0xf9, 0x38, 0x16, 0x5f, 0xe8, 0xec, 0x7e, 0x0b, 0xf1, 0x65, + 0xce, 0x6a, 0xcb, 0xfa, 0x72, 0xcf, 0xea, 0x16, 0x5f, 0x76, 0x27, 0xf8, + 0xb2, 0xfe, 0x2c, 0x06, 0x14, 0x96, 0x5f, 0xff, 0x1b, 0xb0, 0x42, 0x7f, + 0xf1, 0xba, 0xf3, 0x18, 0xb2, 0xb1, 0x10, 0x0e, 0x57, 0x7b, 0x50, 0x6a, + 0xca, 0x84, 0xc4, 0x18, 0xb4, 0xa1, 0x4b, 0xc2, 0x1a, 0x85, 0xc6, 0xdc, + 0x7b, 0x68, 0x45, 0x69, 0xb4, 0xe4, 0x1e, 0x3c, 0x78, 0x42, 0x91, 0x87, + 0x13, 0xfe, 0x68, 0x18, 0xc9, 0xee, 0xe6, 0xf5, 0x97, 0x37, 0xd6, 0x5f, + 0x31, 0x38, 0xd6, 0x5c, 0x27, 0xd6, 0x5f, 0xf8, 0xf9, 0xfe, 0x09, 0xc7, + 0x96, 0x2c, 0xbf, 0x72, 0x35, 0xf8, 0x58, 0x2c, 0xdf, 0xd0, 0xd1, 0x61, + 0xa2, 0x0e, 0x2b, 0xdc, 0xc2, 0xb5, 0x97, 0xc6, 0x64, 0x99, 0x65, 0xec, + 0x63, 0x56, 0x5f, 0x4c, 0xef, 0xa5, 0x94, 0xe7, 0xc0, 0x44, 0x42, 0x0e, + 0x5e, 0xc6, 0xde, 0xb2, 0xf4, 0x84, 0x3a, 0xca, 0xf1, 0xbb, 0x71, 0xdb, + 0xfb, 0x8d, 0xac, 0x0e, 0x96, 0x5f, 0xff, 0xd3, 0x6c, 0x6e, 0xc3, 0xae, + 0x07, 0x61, 0xdb, 0xfe, 0x65, 0x97, 0x41, 0xab, 0x2a, 0x0f, 0xe5, 0x98, + 0xab, 0x15, 0x6c, 0x1a, 0x32, 0xd0, 0xc6, 0x98, 0xc0, 0xef, 0x5e, 0x69, + 0xf9, 0x06, 0xec, 0x29, 0xae, 0x38, 0xa5, 0x51, 0x7e, 0x2f, 0xd3, 0xf5, + 0x28, 0x1a, 0xcb, 0xf6, 0x13, 0x75, 0x25, 0x97, 0xb5, 0x98, 0xb2, 0xb6, + 0xb3, 0xec, 0x62, 0xae, 0x13, 0xde, 0x28, 0x02, 0xcb, 0xcd, 0x9e, 0x59, + 0x71, 0x77, 0x06, 0xdb, 0x43, 0x77, 0xff, 0x4b, 0xe1, 0x94, 0x8f, 0xff, + 0xc1, 0xd6, 0x5f, 0xef, 0xf2, 0x27, 0xce, 0x0d, 0x65, 0xde, 0xc5, 0x97, + 0xff, 0xde, 0x81, 0xe7, 0x7b, 0x30, 0xb0, 0x7e, 0x85, 0x97, 0xfd, 0xa8, + 0xf3, 0x6f, 0xd4, 0x49, 0x65, 0xff, 0xfe, 0x04, 0x75, 0x2e, 0x0f, 0x30, + 0xb3, 0xbf, 0x30, 0x7e, 0xb2, 0xff, 0xe6, 0xc2, 0xcc, 0xe6, 0xc9, 0x70, + 0xeb, 0x2f, 0xfc, 0xf1, 0xd4, 0xb6, 0x73, 0xa1, 0xc2, 0xcb, 0xf9, 0xe7, + 0x2c, 0x9c, 0x2b, 0x28, 0x6a, 0xb1, 0x31, 0xa7, 0xa2, 0xc6, 0x46, 0xdc, + 0x34, 0x98, 0x5b, 0x4a, 0x00, 0x3a, 0xe3, 0x0f, 0xd1, 0x36, 0xd0, 0xaf, + 0x1b, 0x1a, 0x59, 0x7c, 0x77, 0x18, 0x56, 0x5f, 0xe1, 0x23, 0xcd, 0xc8, + 0x11, 0x65, 0xf0, 0x09, 0xe4, 0xb2, 0xfe, 0xf3, 0x1d, 0xdf, 0x75, 0x65, + 0xe0, 0xf5, 0xc5, 0x97, 0x8b, 0x37, 0x56, 0x5e, 0x3e, 0x6f, 0x59, 0x5b, + 0x0f, 0x6b, 0x07, 0x9c, 0x7a, 0xf6, 0x9a, 0x75, 0x97, 0xf0, 0xe0, 0x1a, + 0xce, 0x96, 0x5b, 0x6d, 0x65, 0x0b, 0x4e, 0xae, 0x07, 0x46, 0x44, 0x69, + 0xa7, 0x64, 0x33, 0x42, 0x27, 0x45, 0xe7, 0x1d, 0x15, 0x97, 0x5f, 0xf3, + 0x1b, 0x1a, 0x2c, 0x63, 0x56, 0x5d, 0xdc, 0xeb, 0x2f, 0xd8, 0xda, 0x9a, + 0x4b, 0x2f, 0x89, 0xff, 0xc5, 0x96, 0x83, 0x9e, 0x4e, 0xf2, 0x8b, 0x9a, + 0x65, 0x97, 0xfe, 0xc9, 0xf6, 0x7a, 0x26, 0x6e, 0xa4, 0xb2, 0xfe, 0x83, + 0x46, 0x51, 0xd2, 0xca, 0x83, 0xf1, 0xd2, 0x1d, 0xf1, 0x46, 0x8d, 0x59, + 0x7d, 0x05, 0x86, 0xac, 0xbd, 0xc8, 0x35, 0x65, 0xfe, 0x7c, 0xeb, 0xff, + 0x7f, 0x2c, 0xbf, 0xf8, 0x23, 0xcd, 0x44, 0x98, 0x70, 0x4b, 0x2f, 0xf8, + 0x9e, 0x78, 0xd6, 0x9e, 0x4b, 0x2a, 0x47, 0xf5, 0xe4, 0x2b, 0xff, 0x1f, + 0x39, 0xcc, 0x20, 0x6d, 0xe2, 0xcb, 0xff, 0xed, 0x3f, 0x0b, 0x27, 0x12, + 0x41, 0x86, 0x25, 0x95, 0x08, 0xb1, 0x72, 0x20, 0xa0, 0x57, 0x49, 0xd4, + 0xf8, 0x77, 0xf1, 0xaf, 0x5f, 0xff, 0xe6, 0xe0, 0x33, 0x63, 0x6f, 0x8f, + 0x34, 0x4d, 0x34, 0x76, 0xb2, 0xf7, 0xda, 0x75, 0x97, 0xe0, 0x3f, 0x51, + 0x32, 0xcb, 0xc5, 0x1d, 0xac, 0xbf, 0xf3, 0x4d, 0xe8, 0xd7, 0x52, 0x8d, + 0x2c, 0xbf, 0xfd, 0xff, 0x46, 0xfe, 0x13, 0xfe, 0x66, 0xde, 0xb2, 0xff, + 0xcc, 0x7c, 0xd6, 0x44, 0xcc, 0x75, 0x95, 0x88, 0x8b, 0xd2, 0x75, 0x0d, + 0x1d, 0xbc, 0x86, 0x5d, 0xf6, 0x7e, 0x06, 0xb2, 0xff, 0xf3, 0x13, 0xf5, + 0xce, 0x66, 0x87, 0xec, 0x59, 0x5b, 0x17, 0x44, 0xe5, 0x08, 0x8c, 0x21, + 0xec, 0x89, 0xa3, 0xca, 0xd1, 0xc1, 0xd9, 0x5c, 0x74, 0x8a, 0x79, 0x18, + 0x49, 0x85, 0x1b, 0xa4, 0x36, 0x85, 0x94, 0xb2, 0xf6, 0x60, 0x16, 0x5e, + 0xf3, 0x7d, 0x65, 0xb7, 0xe1, 0xe9, 0x30, 0x81, 0x05, 0x88, 0x37, 0x7e, + 0xd4, 0xe1, 0x71, 0xac, 0xb6, 0xda, 0xca, 0xc3, 0x7a, 0x21, 0x4d, 0xe8, + 0xdd, 0xe2, 0xca, 0x34, 0xf0, 0x3b, 0x21, 0xbf, 0x6b, 0x59, 0xb9, 0x32, + 0xcb, 0x8c, 0xe2, 0xca, 0x86, 0x75, 0xd0, 0xe1, 0x01, 0x92, 0xd6, 0x1a, + 0x52, 0x5e, 0xe4, 0x23, 0x0e, 0x71, 0xe6, 0x27, 0x9d, 0x3c, 0x04, 0x61, + 0xc1, 0x85, 0xfe, 0xf2, 0x41, 0x0b, 0x2f, 0x1d, 0xc4, 0x59, 0x7f, 0x8a, + 0x45, 0x87, 0x8e, 0xd6, 0x5d, 0x9b, 0x6b, 0x2b, 0x0f, 0x2f, 0xc6, 0x57, + 0xef, 0x36, 0xfc, 0x1a, 0xcb, 0xdb, 0x3e, 0xcb, 0x2f, 0xfc, 0x38, 0x2c, + 0x20, 0xcb, 0x38, 0xb2, 0xed, 0x9d, 0x2c, 0xbf, 0x39, 0xdb, 0x77, 0x16, + 0x5f, 0xd9, 0xe7, 0xfb, 0xcc, 0xb2, 0xe8, 0xe9, 0x65, 0x74, 0x78, 0x9f, + 0x2d, 0xac, 0x44, 0x83, 0xb6, 0xdf, 0xf6, 0x04, 0xb3, 0xe4, 0xe7, 0x59, + 0x69, 0x96, 0x5e, 0xf6, 0x01, 0x65, 0x31, 0xae, 0xf8, 0x95, 0xfe, 0xe4, + 0x4a, 0x27, 0x89, 0xd6, 0x5d, 0x86, 0xac, 0xbf, 0xfd, 0x86, 0xf9, 0xb9, + 0xec, 0xdf, 0x19, 0xd2, 0xca, 0x84, 0x5b, 0xb1, 0x07, 0x8d, 0x08, 0x5e, + 0xed, 0x62, 0xcb, 0xe8, 0xfc, 0x76, 0xb2, 0xed, 0xaf, 0x75, 0x65, 0x00, + 0xf0, 0x48, 0x8a, 0xf9, 0xb5, 0x12, 0x59, 0x7d, 0x39, 0xe3, 0x8b, 0x2a, + 0x73, 0xc4, 0xc2, 0x1b, 0xff, 0x47, 0xdc, 0x3f, 0x7e, 0xb3, 0xeb, 0x2f, + 0xfb, 0x5b, 0x20, 0x7e, 0xce, 0xe1, 0x65, 0xff, 0xd1, 0x83, 0x6e, 0x16, + 0x6f, 0x62, 0x59, 0x5e, 0x45, 0xdb, 0x9f, 0x04, 0xee, 0xfd, 0xdb, 0xc3, + 0x6d, 0xac, 0xbc, 0x59, 0xc5, 0x97, 0xff, 0xfe, 0x8f, 0x31, 0xc5, 0xcd, + 0x27, 0xd0, 0x9e, 0x6e, 0xb9, 0xdb, 0x4e, 0xb2, 0xa7, 0x5d, 0xac, 0x1b, + 0x41, 0xa4, 0x3d, 0x94, 0xb0, 0xf6, 0xe1, 0xe4, 0xd0, 0xaa, 0xd1, 0x0f, + 0xa3, 0x1b, 0x01, 0xd1, 0x2b, 0xf1, 0x97, 0xf0, 0xdd, 0x09, 0x78, 0x85, + 0x5b, 0xa3, 0x77, 0xb5, 0xc0, 0xac, 0xb7, 0x16, 0x5f, 0xee, 0xc0, 0xe0, + 0x62, 0xed, 0x65, 0x78, 0xf1, 0x48, 0x46, 0xb1, 0x10, 0x6c, 0xc5, 0x7f, + 0xa7, 0x1e, 0x7f, 0x8f, 0xd2, 0xcb, 0xed, 0x8f, 0x2d, 0xa9, 0x65, 0xf9, + 0xe5, 0xc1, 0x9d, 0x65, 0xff, 0xd9, 0xbf, 0x07, 0x84, 0x19, 0x67, 0x16, + 0x5f, 0xb5, 0x1e, 0x10, 0x6b, 0x2b, 0x47, 0xda, 0xe8, 0x96, 0x02, 0xcb, + 0xa7, 0x85, 0x96, 0x89, 0xcd, 0x43, 0x08, 0xdf, 0x18, 0xf9, 0xc5, 0x97, + 0xf0, 0xe0, 0x05, 0x9d, 0x2c, 0xbf, 0xe9, 0x1d, 0xe5, 0xfe, 0x41, 0xab, + 0x2a, 0x11, 0x13, 0x84, 0x4e, 0x5b, 0x7b, 0x8c, 0x4b, 0x2c, 0x05, 0x97, + 0xdd, 0xec, 0xe7, 0x4b, 0x2b, 0x46, 0xe0, 0x84, 0x6f, 0xf0, 0x92, 0x8d, + 0xec, 0x40, 0x59, 0x7c, 0xfb, 0xb8, 0x4b, 0x2b, 0x11, 0x96, 0xea, 0x64, + 0x41, 0xc3, 0x5a, 0xc5, 0x67, 0xdd, 0x90, 0xee, 0x1a, 0x9c, 0xa5, 0xe1, + 0x2a, 0x04, 0x92, 0x85, 0x78, 0x61, 0xf1, 0x7d, 0xc9, 0xc3, 0xc5, 0x97, + 0x4f, 0x25, 0x97, 0x9b, 0xcc, 0xb2, 0xb0, 0xf5, 0xfa, 0x24, 0xf8, 0xc5, + 0xff, 0xd3, 0xf7, 0xe6, 0x13, 0x46, 0xe7, 0x5f, 0x59, 0x7d, 0x9d, 0x4a, + 0x16, 0x5e, 0x0b, 0xf1, 0x65, 0x62, 0x22, 0x3c, 0x94, 0x21, 0x15, 0xef, + 0xb4, 0xeb, 0x2f, 0xf9, 0x8d, 0x81, 0xc6, 0xfc, 0xf2, 0xcb, 0xf4, 0x10, + 0x0f, 0xf5, 0x97, 0xf9, 0x8c, 0xea, 0x5c, 0xce, 0xd6, 0x5f, 0xd2, 0x10, + 0x00, 0x8e, 0x96, 0x53, 0x22, 0x37, 0xc4, 0xee, 0x6d, 0x7f, 0x07, 0x91, + 0x30, 0x74, 0xb2, 0xf0, 0x73, 0xa5, 0x95, 0xe3, 0xcc, 0xf9, 0x7d, 0xfd, + 0xfc, 0x8f, 0xe1, 0xd6, 0x5f, 0xd8, 0x7d, 0x6a, 0x06, 0xb2, 0xfd, 0xd7, + 0x3e, 0xd3, 0xac, 0xbf, 0x82, 0x53, 0xf1, 0xba, 0x59, 0x7f, 0xf4, 0x4e, + 0x63, 0xf5, 0xcc, 0x1b, 0x71, 0x65, 0x42, 0x27, 0xe4, 0x54, 0x45, 0xf7, + 0xec, 0x37, 0xed, 0x3a, 0xcb, 0xc0, 0xce, 0x96, 0x57, 0x47, 0x8c, 0x02, + 0x9b, 0xfc, 0x18, 0x9c, 0xb1, 0xa7, 0x59, 0x7f, 0xfe, 0x8d, 0x03, 0x38, + 0x41, 0x79, 0x78, 0x2f, 0x3a, 0xcb, 0xf7, 0xf1, 0xcb, 0xb5, 0x95, 0xe3, + 0xfc, 0xdd, 0x55, 0xbd, 0xd4, 0x1d, 0x65, 0xff, 0xe1, 0xfa, 0x3a, 0x91, + 0x61, 0xf3, 0xaf, 0xac, 0xbf, 0x1f, 0x3d, 0x84, 0xb2, 0x98, 0xfc, 0x5d, + 0x2e, 0xff, 0x82, 0xf2, 0x1e, 0x60, 0x38, 0xb2, 0xff, 0xec, 0xdf, 0xe7, + 0x96, 0xcf, 0xf9, 0xcd, 0x59, 0x7e, 0x3e, 0x69, 0xc9, 0x65, 0xff, 0xba, + 0x97, 0xa0, 0xef, 0xd4, 0xb1, 0x65, 0xfc, 0xdd, 0x75, 0x2c, 0xfa, 0xca, + 0x84, 0x4a, 0xe1, 0x30, 0x10, 0x2b, 0xc9, 0xa2, 0x11, 0xc7, 0x21, 0xbd, + 0x7e, 0xeb, 0x87, 0x6d, 0xc5, 0x97, 0xff, 0x79, 0xdb, 0xe0, 0x09, 0x13, + 0xc9, 0x65, 0xf4, 0x10, 0x45, 0x6b, 0x2e, 0xce, 0x6c, 0x3e, 0x7f, 0x21, + 0x54, 0x23, 0x08, 0xa1, 0x27, 0x7f, 0x3c, 0xe0, 0x72, 0x1a, 0xca, 0x9d, + 0x7c, 0x08, 0x70, 0xc7, 0xed, 0xeb, 0xa2, 0x26, 0x2c, 0x9a, 0x19, 0x9a, + 0x74, 0x39, 0x1f, 0xa1, 0x5e, 0x44, 0xbc, 0x84, 0x77, 0xe3, 0x64, 0xdf, + 0x0f, 0x7d, 0xb2, 0x6b, 0xf0, 0x32, 0x66, 0x3a, 0xcb, 0xfe, 0xf7, 0xb1, + 0xba, 0x96, 0x69, 0x65, 0x41, 0xf0, 0xb9, 0x45, 0xfe, 0xf8, 0x67, 0x8f, + 0xc0, 0xd6, 0x5e, 0xfe, 0x12, 0xcb, 0xde, 0x7d, 0xc5, 0x97, 0xe0, 0xcb, + 0x01, 0xc5, 0x97, 0xf8, 0x48, 0xef, 0x6f, 0x35, 0x0b, 0x2f, 0xf8, 0x78, + 0x1d, 0x4f, 0xdb, 0x4e, 0xb2, 0xff, 0xf6, 0xfc, 0x21, 0x93, 0x99, 0xce, + 0x40, 0x16, 0x5f, 0xff, 0xfc, 0x76, 0xe6, 0xc9, 0xa4, 0x12, 0xfe, 0xcf, + 0x44, 0x98, 0xb0, 0xf0, 0xb2, 0xb1, 0x18, 0x01, 0x4b, 0xbe, 0x6d, 0x41, + 0xd6, 0x56, 0x8f, 0x0f, 0xc4, 0x57, 0xff, 0xdd, 0xf8, 0x25, 0x9d, 0x49, + 0xb8, 0x59, 0xbd, 0x65, 0xfb, 0xd1, 0xe6, 0x35, 0x65, 0xcf, 0x37, 0x0f, + 0xeb, 0x75, 0x4a, 0xa1, 0x19, 0xbe, 0x84, 0xe5, 0xff, 0xfe, 0x6d, 0xe4, + 0x1e, 0x6c, 0x10, 0xa0, 0x7e, 0x79, 0x67, 0x16, 0x54, 0x95, 0x98, 0x1a, + 0x37, 0xa1, 0xff, 0x14, 0x39, 0xbf, 0xe5, 0x06, 0x6f, 0x27, 0xa8, 0x66, + 0x45, 0xce, 0x61, 0x93, 0xe3, 0xed, 0x1a, 0x4e, 0x88, 0x1e, 0x5b, 0x25, + 0xd3, 0x05, 0x65, 0x8e, 0xb2, 0xba, 0x35, 0x22, 0xb1, 0x8b, 0xfd, 0xf0, + 0x04, 0xb8, 0xc3, 0x59, 0x7e, 0x90, 0x33, 0x06, 0xb2, 0xdb, 0xd8, 0xf6, + 0x9c, 0xce, 0xfd, 0xe6, 0xd0, 0x02, 0xb2, 0xda, 0xc3, 0xd0, 0x98, 0xa2, + 0xfe, 0x33, 0x8f, 0x1d, 0x49, 0x65, 0x41, 0xeb, 0xe1, 0x45, 0xff, 0x67, + 0x4f, 0xf8, 0xfb, 0x81, 0x65, 0xff, 0xe9, 0x8a, 0x3f, 0xcf, 0xf5, 0xdb, + 0x14, 0xeb, 0x2f, 0xcc, 0x71, 0x26, 0xe2, 0xcb, 0xf8, 0xb3, 0xe1, 0x82, + 0x59, 0x7e, 0xea, 0x45, 0x03, 0x59, 0x47, 0x3d, 0x37, 0x2b, 0xbf, 0xa4, + 0xc4, 0x77, 0xfa, 0xcb, 0xfe, 0x1e, 0x6c, 0xe3, 0x17, 0x52, 0x59, 0x68, + 0xe8, 0xf9, 0xcc, 0x2c, 0xa8, 0x4e, 0xcd, 0x8e, 0x3c, 0x9a, 0xef, 0xa5, + 0x08, 0x8b, 0xf3, 0xcb, 0x27, 0x85, 0x97, 0xff, 0x47, 0x39, 0x87, 0xf9, + 0x41, 0xf8, 0xb2, 0xff, 0xa3, 0x46, 0xf8, 0xa3, 0x34, 0xb2, 0xfe, 0x37, + 0x66, 0x1e, 0x3b, 0x59, 0x7f, 0xf4, 0x75, 0x2f, 0x86, 0x27, 0x6e, 0xbe, + 0xb2, 0xff, 0x37, 0x9f, 0xb8, 0x21, 0xac, 0xa6, 0x45, 0x51, 0x18, 0xf1, + 0x1e, 0xfe, 0x8e, 0xc0, 0x70, 0x81, 0x65, 0xf6, 0xf6, 0x21, 0xac, 0xbf, + 0xf1, 0x40, 0xfd, 0x07, 0x2c, 0xed, 0x65, 0xe6, 0x2f, 0xac, 0xac, 0x3f, + 0xb9, 0x88, 0xfc, 0x7b, 0x7f, 0x87, 0xc6, 0xf7, 0xb0, 0x6b, 0x2f, 0xfe, + 0x68, 0xe1, 0x3c, 0xb6, 0x73, 0x34, 0xb2, 0xff, 0x0c, 0xb2, 0x5e, 0x81, + 0xac, 0xbc, 0x4f, 0xa5, 0x97, 0xce, 0xef, 0xba, 0xb2, 0xff, 0xfe, 0xc1, + 0xec, 0x60, 0x46, 0xcf, 0xfb, 0x3f, 0xe7, 0x92, 0xcb, 0xff, 0xb9, 0x3e, + 0x19, 0x84, 0x1d, 0xd8, 0x17, 0x88, 0x9c, 0x38, 0xde, 0xf2, 0x3a, 0x84, + 0xcf, 0x9a, 0x19, 0xd7, 0xfb, 0xa9, 0x72, 0x69, 0x44, 0xeb, 0x28, 0x6b, + 0x8c, 0xdd, 0x93, 0xcc, 0x87, 0xa8, 0x71, 0x1c, 0xbb, 0xd0, 0xaa, 0x72, + 0xf2, 0x33, 0xfc, 0x70, 0x41, 0x27, 0xbf, 0xff, 0xbf, 0x9d, 0x7f, 0x5a, + 0x8f, 0x80, 0x42, 0x97, 0xb1, 0x65, 0xcd, 0xbd, 0x65, 0xf4, 0x14, 0xb8, + 0xb2, 0xcd, 0xd2, 0x25, 0xa6, 0x5d, 0x00, 0xc5, 0xfe, 0xd4, 0xe5, 0x1d, + 0xb4, 0x96, 0x57, 0x8f, 0xad, 0xcd, 0xef, 0xde, 0x8d, 0xe3, 0x85, 0x97, + 0x86, 0xe4, 0xb2, 0xdb, 0xd6, 0x5f, 0xba, 0xf9, 0x47, 0x96, 0x5b, 0x50, + 0x6e, 0xdc, 0x4e, 0xfb, 0xa9, 0xa3, 0x4b, 0x2d, 0xa5, 0x95, 0x86, 0xd4, + 0x24, 0x95, 0x24, 0x7c, 0x8c, 0xa7, 0x4a, 0xdc, 0x5a, 0xbe, 0x6d, 0xf8, + 0x35, 0x97, 0xc5, 0xfc, 0x25, 0x97, 0x17, 0xf4, 0x78, 0x6e, 0x47, 0x7f, + 0xdd, 0x4b, 0x81, 0xfc, 0x7f, 0x8b, 0x2f, 0xda, 0x93, 0xf4, 0x62, 0xcb, + 0xfd, 0xc3, 0x1c, 0x71, 0xd7, 0x16, 0x54, 0x23, 0x1b, 0x0b, 0x18, 0xed, + 0xca, 0xaf, 0xdc, 0x0f, 0xe0, 0x96, 0x5f, 0xe0, 0xf5, 0x2f, 0xf0, 0x3b, + 0x8b, 0x2f, 0x72, 0x3a, 0x59, 0x7a, 0x3d, 0xc5, 0x97, 0x39, 0x9d, 0x1b, + 0x90, 0x0e, 0xd4, 0x93, 0x00, 0xc3, 0x9f, 0x13, 0x93, 0x95, 0xfe, 0xce, + 0xb6, 0x67, 0x9b, 0xcb, 0x2e, 0xf0, 0xd6, 0x5c, 0xdd, 0xac, 0xb9, 0xfe, + 0x33, 0x5d, 0xb6, 0x2f, 0x5a, 0x44, 0x93, 0xb1, 0xda, 0x16, 0x5f, 0xda, + 0x86, 0x93, 0xf1, 0x65, 0x0c, 0xde, 0x74, 0x21, 0x7f, 0xdf, 0xe0, 0x64, + 0x20, 0xdb, 0xeb, 0x2a, 0x0f, 0x75, 0xc8, 0xaf, 0xde, 0x8c, 0x93, 0xac, + 0xbd, 0x8d, 0xc5, 0x97, 0xef, 0xff, 0x03, 0x3a, 0xcb, 0xff, 0xe9, 0xdf, + 0xd8, 0x3d, 0x98, 0x45, 0x8c, 0x05, 0x95, 0x3a, 0x24, 0xfb, 0x1b, 0xd1, + 0x4d, 0xff, 0x7b, 0xb6, 0x7d, 0x9c, 0x7f, 0x2c, 0xa1, 0xa6, 0x4d, 0x90, + 0xb9, 0x73, 0x2b, 0xe2, 0x89, 0x32, 0xcb, 0xce, 0x53, 0x2c, 0xbd, 0xd4, + 0x99, 0x65, 0x9c, 0xe6, 0xe4, 0x87, 0x2f, 0x06, 0x09, 0x65, 0xff, 0xfe, + 0x6f, 0xc1, 0x3c, 0xb0, 0x7c, 0x7d, 0x37, 0x9b, 0x7a, 0xcb, 0xe8, 0x29, + 0x71, 0x65, 0x69, 0x31, 0x9f, 0x2c, 0x91, 0x2e, 0xf1, 0xb1, 0x17, 0xef, + 0xff, 0xdc, 0x2d, 0x9e, 0x76, 0xf8, 0x02, 0x44, 0xf2, 0x59, 0x7f, 0xff, + 0xf4, 0x6b, 0x26, 0x83, 0xe7, 0x6c, 0x3f, 0x47, 0xf8, 0x6e, 0xb3, 0x75, + 0x65, 0xfe, 0xf3, 0x1b, 0xb6, 0x1d, 0x1a, 0xb2, 0xff, 0x8f, 0x05, 0xdb, + 0x90, 0x05, 0x2b, 0x2f, 0xf3, 0x1f, 0x59, 0xb6, 0xc0, 0x59, 0x7f, 0xd0, + 0x0d, 0x6a, 0x0c, 0x1f, 0x4b, 0x2f, 0xf1, 0x87, 0xf4, 0x31, 0x4e, 0xb2, + 0xff, 0xf3, 0xc9, 0xb5, 0x9d, 0x4d, 0x28, 0xd4, 0xeb, 0x2a, 0x11, 0x00, + 0x03, 0x4b, 0xff, 0xe2, 0xce, 0x61, 0xe3, 0xbc, 0xfb, 0x6b, 0x16, 0x57, + 0x69, 0xea, 0x1c, 0xe7, 0xc7, 0x80, 0x35, 0xfc, 0x2e, 0xf7, 0x91, 0x5f, + 0xfa, 0x6e, 0x7c, 0x3d, 0x60, 0xdc, 0x96, 0x5c, 0x1e, 0x96, 0x5f, 0xd0, + 0x78, 0xce, 0xbe, 0xb2, 0xd8, 0x73, 0xc5, 0xf8, 0xc5, 0x42, 0xb5, 0x6c, + 0x94, 0x94, 0xec, 0x01, 0x84, 0x2d, 0xfd, 0x3e, 0x69, 0xbb, 0x85, 0x97, + 0xc4, 0x38, 0x3a, 0xcb, 0xff, 0xe0, 0x97, 0xf9, 0xe6, 0x98, 0xa0, 0xef, + 0x25, 0x97, 0xf6, 0xa1, 0xa4, 0xfc, 0x59, 0x70, 0x5d, 0x65, 0xb3, 0x61, + 0xe1, 0x11, 0x65, 0x1d, 0x17, 0x3b, 0xe1, 0x23, 0x7f, 0x38, 0x30, 0x6f, + 0x25, 0x95, 0x09, 0x98, 0x64, 0x36, 0x98, 0xaa, 0xf8, 0x1c, 0xda, 0x62, + 0x95, 0x97, 0xe8, 0xed, 0xf5, 0x3a, 0xca, 0x64, 0xf9, 0xfd, 0x1a, 0xf3, + 0x99, 0x91, 0x6d, 0xfb, 0xc0, 0x6d, 0x1a, 0xb2, 0xf7, 0x62, 0x49, 0x65, + 0xf4, 0x68, 0x57, 0xc5, 0x95, 0xe3, 0xc5, 0x00, 0xfd, 0xfe, 0x1f, 0xb0, + 0x01, 0xff, 0x16, 0x5f, 0xff, 0xff, 0xd9, 0xb9, 0x83, 0xe4, 0x0e, 0x3f, + 0xec, 0x0f, 0x7e, 0x8e, 0x7b, 0x38, 0xf0, 0x75, 0x97, 0xef, 0x64, 0xa4, + 0xeb, 0x2f, 0xff, 0xb3, 0xdd, 0xf9, 0xa6, 0x27, 0x33, 0xf9, 0xe5, 0x95, + 0x89, 0xe3, 0x33, 0x73, 0x91, 0x70, 0xd3, 0xf0, 0x8a, 0xdb, 0x27, 0xbd, + 0xc1, 0x00, 0xb2, 0xf4, 0x11, 0xab, 0x2a, 0x0d, 0xd7, 0x07, 0xaa, 0x1b, + 0x9a, 0xc9, 0xe3, 0x27, 0x1c, 0x7a, 0x79, 0x39, 0x65, 0xdc, 0x73, 0xed, + 0x18, 0xd4, 0xd2, 0x91, 0xb5, 0x0c, 0xe3, 0xc2, 0xef, 0xd1, 0xa3, 0x3c, + 0x69, 0xa0, 0x4d, 0x29, 0x75, 0x7f, 0x94, 0x5e, 0x19, 0x40, 0xe2, 0x42, + 0x5e, 0xff, 0xec, 0x20, 0x66, 0x6b, 0x9f, 0x8c, 0x59, 0x7f, 0xdd, 0x7f, + 0x34, 0xd3, 0xb9, 0xd6, 0x5e, 0xcd, 0xf8, 0xb2, 0xd8, 0x04, 0x4c, 0x12, + 0x0f, 0x0e, 0xaf, 0x0a, 0xe4, 0xcb, 0x2f, 0xa0, 0x9e, 0x4b, 0x2f, 0xd9, + 0xb8, 0xe4, 0x0d, 0x87, 0x81, 0xa2, 0x0b, 0xc7, 0x79, 0x96, 0x5f, 0xcc, + 0x78, 0xf0, 0x83, 0x59, 0x7f, 0xc2, 0x7d, 0x88, 0x32, 0xce, 0x2c, 0xa9, + 0x1f, 0x3b, 0x17, 0x5f, 0xbc, 0xd1, 0xae, 0x2c, 0xae, 0xd1, 0x99, 0xe8, + 0x42, 0x6f, 0x21, 0xbf, 0xff, 0x4b, 0x85, 0x9f, 0xe3, 0x61, 0xff, 0xac, + 0x31, 0x65, 0xff, 0xbc, 0xc7, 0x1e, 0x4d, 0x19, 0xa5, 0x97, 0xa5, 0x1d, + 0x2c, 0xbf, 0x04, 0x83, 0x1d, 0x2c, 0xbc, 0x7c, 0xfa, 0xcb, 0xe8, 0x03, + 0x9d, 0x65, 0xa5, 0x88, 0xc0, 0x98, 0xf8, 0xe3, 0xa0, 0x28, 0x21, 0xca, + 0xe9, 0x36, 0x42, 0x8c, 0x56, 0xfb, 0x8d, 0xf8, 0x59, 0x50, 0x79, 0x6e, + 0x55, 0x7e, 0x2c, 0x00, 0x78, 0xb2, 0xff, 0x6c, 0x27, 0x9c, 0xa3, 0xa5, + 0x97, 0xfe, 0xf3, 0x7f, 0xd8, 0xdf, 0x80, 0x2c, 0xbb, 0xb6, 0xc4, 0x4c, + 0xe8, 0x9f, 0x86, 0xb7, 0xbb, 0xe7, 0xd6, 0x5f, 0xcf, 0xf0, 0x08, 0x52, + 0x59, 0x53, 0x9e, 0x67, 0x87, 0xaf, 0xf0, 0x63, 0x7e, 0x7d, 0xb4, 0xb2, + 0xfb, 0xbf, 0x34, 0xcb, 0x2f, 0xff, 0xfb, 0x40, 0x00, 0x79, 0xe6, 0xfc, + 0xb3, 0xce, 0x06, 0x1c, 0x2c, 0xbf, 0xe7, 0xd6, 0x6f, 0xcd, 0xf0, 0x35, + 0x95, 0x88, 0xa1, 0x03, 0x35, 0xff, 0xf6, 0x1a, 0x6b, 0x0f, 0xcd, 0x37, + 0x9b, 0xaf, 0xac, 0xa3, 0x9f, 0xa9, 0x11, 0x54, 0x26, 0xb7, 0x91, 0x9d, + 0x5c, 0x1d, 0x2c, 0xbd, 0xdb, 0xe9, 0x65, 0xff, 0xa7, 0xc2, 0x3e, 0x7f, + 0x82, 0x71, 0x65, 0xfb, 0x9d, 0xc6, 0x8d, 0x59, 0x7f, 0x30, 0x3a, 0x96, + 0x7d, 0x65, 0x4e, 0x8c, 0xcf, 0x0b, 0xb8, 0xe8, 0x10, 0x37, 0x95, 0x5f, + 0x4b, 0xf8, 0x05, 0x97, 0xb8, 0xd3, 0x2c, 0xae, 0x8d, 0xff, 0x08, 0xaf, + 0xbf, 0xe0, 0xf6, 0xb2, 0xfd, 0x8c, 0x3f, 0x32, 0xca, 0x9c, 0xf2, 0xa4, + 0x49, 0x79, 0xf4, 0x6a, 0xcb, 0xff, 0x9e, 0x5b, 0x38, 0x59, 0xfe, 0x66, + 0xe2, 0xca, 0x84, 0x7a, 0x63, 0x63, 0x91, 0x84, 0x76, 0xff, 0xdd, 0x7f, + 0x8c, 0x50, 0x07, 0x3a, 0xca, 0x59, 0x58, 0x79, 0x3b, 0xcf, 0xaf, 0x48, + 0xfe, 0x59, 0x53, 0x9e, 0x07, 0xc8, 0xef, 0xff, 0xfd, 0xb7, 0x9f, 0xf3, + 0x8c, 0x59, 0x66, 0xf2, 0xce, 0x71, 0xba, 0xfa, 0xcb, 0x74, 0xb2, 0xfb, + 0x0f, 0x1b, 0x8b, 0x2d, 0xd0, 0xac, 0xdb, 0x70, 0x4a, 0xf1, 0xac, 0x62, + 0xcb, 0xf1, 0x8d, 0x84, 0x6a, 0xca, 0x63, 0xc6, 0x08, 0xf5, 0xfe, 0x18, + 0x99, 0x37, 0x9c, 0xeb, 0x2b, 0x13, 0x93, 0x62, 0x37, 0x85, 0x41, 0x39, + 0x04, 0x86, 0xfb, 0xcf, 0xbb, 0xc5, 0x97, 0xfe, 0xce, 0xbe, 0x66, 0x10, + 0xfd, 0x0b, 0x2c, 0xfd, 0x9f, 0x26, 0x89, 0x6d, 0x8b, 0x2f, 0xb5, 0x3b, + 0x4e, 0xb2, 0xf7, 0x9b, 0x4b, 0x2c, 0xec, 0x78, 0x13, 0x12, 0x56, 0xc3, + 0xf7, 0xf2, 0x85, 0xf7, 0x0a, 0x0e, 0xb2, 0xff, 0xa7, 0x8e, 0x63, 0x6f, + 0x73, 0xac, 0xbd, 0xbf, 0x09, 0x65, 0x42, 0x27, 0x3a, 0x24, 0x72, 0x1f, + 0x9d, 0x5e, 0xf4, 0x8e, 0xb2, 0xef, 0x32, 0xca, 0xc3, 0x67, 0xf1, 0xda, + 0x86, 0x6c, 0xf4, 0x9d, 0x32, 0x30, 0xe3, 0x63, 0xe7, 0xea, 0x17, 0x2d, + 0x08, 0x7d, 0x11, 0xfa, 0x38, 0xf7, 0x87, 0xa1, 0x46, 0xff, 0xc9, 0x4a, + 0xdf, 0x85, 0x80, 0x63, 0x3b, 0xdb, 0x6f, 0xbf, 0xd1, 0x33, 0x75, 0xc0, + 0x9d, 0x65, 0xcc, 0x62, 0xcb, 0x76, 0xb2, 0xb0, 0xd4, 0x9c, 0x5e, 0xf3, + 0xf5, 0x25, 0x95, 0x3a, 0x26, 0xc6, 0xbd, 0xf2, 0x0b, 0xfb, 0xec, 0x4c, + 0x0e, 0x2c, 0xbe, 0x19, 0x67, 0x96, 0x58, 0x7b, 0x0f, 0x34, 0x42, 0xcb, + 0xf6, 0x70, 0x3a, 0x9d, 0x65, 0xff, 0xff, 0xff, 0x74, 0x0d, 0x77, 0xcd, + 0xcd, 0xed, 0xb4, 0x1a, 0x26, 0xd5, 0xc9, 0x6d, 0x2d, 0x0a, 0x9b, 0x01, + 0xb9, 0xb3, 0x67, 0xb6, 0xd6, 0x56, 0x26, 0x30, 0x45, 0x62, 0x14, 0xde, + 0x3b, 0xfd, 0x65, 0xd2, 0xfa, 0xcb, 0xfb, 0xb1, 0xb6, 0xf8, 0x1a, 0xcb, + 0x79, 0x65, 0x80, 0xb2, 0xee, 0x49, 0x65, 0x42, 0x27, 0x06, 0x38, 0xe2, + 0xe0, 0x30, 0xe0, 0x88, 0x44, 0x6f, 0xe9, 0xe6, 0x90, 0xa3, 0x53, 0xac, + 0xba, 0x40, 0x59, 0x79, 0xf3, 0x4b, 0x2f, 0x16, 0x7d, 0x65, 0xef, 0x61, + 0xd6, 0x57, 0x47, 0xd3, 0xe1, 0x72, 0x1b, 0xf8, 0xdd, 0xdf, 0x25, 0x97, + 0xa3, 0xae, 0x2c, 0xbe, 0x62, 0x96, 0x2c, 0xbd, 0x3b, 0x92, 0xca, 0x19, + 0xec, 0x9c, 0x77, 0xe4, 0x17, 0x6b, 0xcb, 0x2f, 0xa0, 0x6f, 0x25, 0x97, + 0xec, 0xff, 0x9b, 0xeb, 0x2f, 0xcf, 0xd6, 0x75, 0xf5, 0x95, 0xe3, 0xd0, + 0xf9, 0x3d, 0xe7, 0xd4, 0x96, 0x5e, 0xf6, 0x1d, 0x65, 0x48, 0xdc, 0x7c, + 0x72, 0xff, 0x8d, 0x9b, 0x33, 0xbf, 0xc1, 0xab, 0x2f, 0x04, 0xa7, 0x59, + 0x5b, 0x13, 0x5c, 0x9c, 0x5c, 0xd7, 0x1e, 0x96, 0xb4, 0x43, 0xe3, 0xcb, + 0xe3, 0xed, 0xee, 0x0d, 0x65, 0xa7, 0x59, 0x6d, 0x2c, 0xa9, 0xcd, 0x1b, + 0x09, 0x5f, 0x4e, 0xef, 0xe5, 0x97, 0xe0, 0xce, 0xef, 0xe5, 0x97, 0xec, + 0x18, 0x1f, 0xeb, 0x2b, 0x61, 0xf8, 0xf8, 0x8b, 0x79, 0x45, 0xf8, 0x49, + 0x06, 0x38, 0xb2, 0xa7, 0x3d, 0xc3, 0x4c, 0xee, 0xeb, 0xeb, 0x2f, 0xff, + 0xe6, 0xd6, 0x1d, 0xfa, 0x16, 0x30, 0xbe, 0xa4, 0xe0, 0x59, 0x7e, 0x9b, + 0xcd, 0xd7, 0xd6, 0x57, 0x91, 0x0f, 0xf5, 0xdb, 0xf6, 0x10, 0xfd, 0x0b, + 0x2b, 0x6b, 0x5d, 0x78, 0x88, 0x4f, 0xc8, 0xf3, 0x1b, 0xda, 0x38, 0xb3, + 0xae, 0xf9, 0x31, 0xe1, 0xdc, 0x44, 0x81, 0x84, 0xf9, 0x84, 0x77, 0xfd, + 0x83, 0x1b, 0x75, 0x9d, 0x7d, 0x65, 0xf7, 0x65, 0x12, 0x59, 0x5e, 0x3d, + 0xc7, 0x3a, 0xbf, 0xd1, 0x9f, 0x8f, 0x38, 0xd6, 0x5f, 0xf6, 0x7e, 0x3b, + 0x12, 0x01, 0x8b, 0x2f, 0x47, 0x52, 0x59, 0x53, 0xa2, 0xa0, 0x64, 0x26, + 0x18, 0xee, 0x9c, 0xdf, 0x66, 0x17, 0xd6, 0x5f, 0xfe, 0xde, 0xc4, 0x0f, + 0x33, 0xcb, 0xed, 0x3a, 0xcb, 0xe0, 0xbe, 0xa4, 0xb2, 0xa0, 0xfb, 0x46, + 0x97, 0x7f, 0xf0, 0xe0, 0x7a, 0x8f, 0xb7, 0x6c, 0x35, 0x97, 0xc1, 0x7d, + 0x49, 0x65, 0xe8, 0xdd, 0x92, 0xca, 0x19, 0xe0, 0xcc, 0x45, 0x7f, 0x7f, + 0xb1, 0x8c, 0xfa, 0x59, 0x7e, 0xfb, 0x14, 0x01, 0x65, 0xff, 0x4d, 0xcd, + 0xee, 0x53, 0x84, 0x6b, 0x2f, 0xe7, 0x30, 0x00, 0x3e, 0xda, 0xcb, 0xec, + 0xfe, 0x1d, 0x65, 0xc4, 0x6a, 0xca, 0x73, 0x70, 0x12, 0x1a, 0x92, 0x22, + 0xb8, 0xd5, 0x7e, 0x91, 0x05, 0xf8, 0xb2, 0xff, 0xd0, 0x41, 0xfc, 0x82, + 0x5f, 0xe2, 0xca, 0xc3, 0xe5, 0xd1, 0x3d, 0xff, 0x8a, 0x3f, 0x2c, 0xdc, + 0x72, 0x02, 0xcb, 0xc0, 0x60, 0x2c, 0xbe, 0x9e, 0x6f, 0x32, 0xcb, 0x7b, + 0x0f, 0x00, 0x23, 0x97, 0x39, 0xd6, 0x5f, 0xf6, 0xe7, 0x9b, 0x61, 0xba, + 0xce, 0x2c, 0xae, 0xcf, 0x54, 0x22, 0xd7, 0xfe, 0x27, 0x37, 0xcf, 0x2e, + 0x30, 0xd6, 0x5f, 0xbc, 0xc4, 0xf3, 0xac, 0xb7, 0x6b, 0x2f, 0x83, 0x2c, + 0xe7, 0x66, 0xe4, 0x89, 0xe8, 0xe8, 0xaf, 0x27, 0x7b, 0xc5, 0x9f, 0x59, + 0x70, 0x87, 0x59, 0x4c, 0x7a, 0xa4, 0x45, 0xf1, 0xbb, 0xba, 0x1a, 0xcb, + 0xb7, 0xba, 0xcb, 0xfd, 0x1a, 0x8e, 0xf3, 0x7e, 0x2c, 0xa8, 0x5e, 0x11, + 0x9d, 0x0a, 0x50, 0x8d, 0x19, 0x0e, 0x42, 0x14, 0xd2, 0x3e, 0x8c, 0x18, + 0x9a, 0x68, 0x63, 0xea, 0x11, 0x07, 0x21, 0xf3, 0xf9, 0x3e, 0x7e, 0x32, + 0x70, 0x96, 0xef, 0x18, 0xdb, 0x18, 0xbf, 0x4d, 0x1f, 0x2d, 0xeb, 0x2f, + 0xa6, 0xc6, 0x02, 0xca, 0xd8, 0x79, 0x90, 0x55, 0x7f, 0xf4, 0x6f, 0xd4, + 0x6b, 0x1b, 0xd0, 0x35, 0x97, 0x46, 0x2c, 0xa2, 0x3d, 0x9e, 0x22, 0x5c, + 0xe7, 0x59, 0x74, 0xdb, 0x6b, 0x28, 0x8d, 0x8e, 0xf1, 0x6b, 0xff, 0xf3, + 0x1f, 0xa9, 0x73, 0x67, 0xb3, 0xfc, 0x27, 0xfa, 0xcb, 0x83, 0xf5, 0x95, + 0x24, 0xd7, 0xf1, 0xf1, 0x94, 0xbe, 0x45, 0xb6, 0xb1, 0x61, 0x7b, 0x5c, + 0x30, 0xf9, 0xb6, 0xa2, 0xe1, 0x4c, 0x2a, 0x36, 0x88, 0x51, 0x8a, 0x23, + 0x1b, 0xda, 0x50, 0x83, 0x15, 0x08, 0xc5, 0x52, 0x06, 0xd3, 0x63, 0x8a, + 0x4c, 0x7c, 0xf2, 0xa6, 0xa5, 0x38, 0xe0, 0x3a, 0x42, 0x16, 0x56, 0xa8, + 0x46, 0xcb, 0x0c, 0xee, 0x7b, 0x1b, 0xa9, 0xd6, 0x66, 0x9c, 0x11, 0x9a, + 0x90, 0x1f, 0xa9, 0xf4, 0x03, 0xce, 0xc8, 0xfa, 0xb2, 0x38, 0x79, 0xe8, + 0x20, 0x4e, 0x5b, 0x0a, 0xe1, 0xb4, 0x54, 0xd4, 0x2e, 0x57, 0x48, 0x5f, + 0xa7, 0xb5, 0x06, 0x39, 0x7d, 0xf1, 0xcb, 0x19, 0x0c, 0xcd, 0xb9, 0xdc, + 0xd1, 0x27, 0xf1, 0xb7, 0x65, 0x59, 0xd0, 0xb8, 0x64, 0x01, 0x32, 0xa7, + 0xb1, 0x89, 0x89, 0x7f, 0xf8, 0x59, 0xde, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, + 0xa8, 0x9b, 0x17, 0xed, 0x76, 0xef, 0xda, 0xa2, 0xad, 0x5c, 0x0d, 0xeb, + 0x2e, 0xe6, 0xda, 0xcb, 0x0b, 0xc3, 0xe9, 0xf1, 0xb7, 0x06, 0x6e, 0xdf, + 0xa5, 0x97, 0x3c, 0x2c, 0xbf, 0xd2, 0x90, 0x7e, 0x51, 0x25, 0x97, 0xd9, + 0xe7, 0xfa, 0xcb, 0x0a, 0x70, 0xf5, 0x08, 0xce, 0xff, 0xff, 0xd2, 0x8d, + 0xf0, 0xda, 0xed, 0x8e, 0xf2, 0x62, 0xc1, 0xe1, 0xab, 0x2f, 0xef, 0xb6, + 0xce, 0x63, 0x2c, 0xbf, 0xf4, 0xb2, 0x58, 0xf2, 0x28, 0x3a, 0xcb, 0x6a, + 0x0f, 0xa9, 0x8b, 0xaf, 0xf6, 0xb3, 0xb8, 0x00, 0x87, 0x59, 0x7f, 0xb8, + 0xff, 0x17, 0xc2, 0x85, 0x97, 0xf4, 0x4f, 0xa8, 0xc1, 0xac, 0xa9, 0x1f, + 0x0f, 0x8d, 0x2f, 0xff, 0xd1, 0x3c, 0x6a, 0x0f, 0x11, 0xff, 0x30, 0x0e, + 0xb2, 0xa0, 0xfd, 0xbc, 0x45, 0x7a, 0x07, 0x32, 0xca, 0x92, 0xa4, 0x66, + 0x86, 0xb6, 0x89, 0xbd, 0x18, 0x67, 0xc8, 0x6f, 0xb4, 0x7f, 0x0d, 0x65, + 0xff, 0xda, 0x91, 0x67, 0xf9, 0x07, 0xff, 0x6b, 0x2a, 0x0f, 0xa0, 0x24, + 0x77, 0x87, 0x84, 0xb2, 0xff, 0xce, 0xdb, 0xb1, 0xef, 0x96, 0x49, 0x65, + 0xfa, 0x4d, 0xdb, 0xe9, 0x65, 0x78, 0xf9, 0xf8, 0x7f, 0x79, 0xdf, 0xb5, + 0x45, 0x68, 0xbf, 0x1b, 0xd7, 0x03, 0xd2, 0xca, 0x83, 0xf7, 0xec, 0x89, + 0x8a, 0x6f, 0xe0, 0xb1, 0xba, 0x81, 0xac, 0xbf, 0xd1, 0xa0, 0x09, 0xc8, + 0xc5, 0x97, 0xff, 0x9b, 0xf2, 0x8e, 0xfc, 0xdf, 0xe3, 0xf4, 0xb2, 0xb4, + 0x8d, 0xa3, 0x97, 0x78, 0xbb, 0x79, 0x9d, 0xfc, 0x0d, 0x99, 0xa6, 0x35, + 0x65, 0xff, 0x60, 0xdb, 0x93, 0x14, 0x0d, 0x65, 0x0c, 0xfa, 0x1c, 0xc2, + 0xff, 0xa3, 0xbc, 0x3e, 0x17, 0xf6, 0xd6, 0x5f, 0xef, 0x46, 0x81, 0xfc, + 0x9d, 0x65, 0xfe, 0x2c, 0x96, 0xc6, 0xf4, 0x96, 0x5d, 0xe6, 0x3a, 0x28, + 0xfc, 0x77, 0xf3, 0x4b, 0xff, 0x9e, 0x5b, 0x35, 0x1f, 0x6e, 0xd8, 0x6b, + 0x2d, 0x25, 0x96, 0x94, 0x1e, 0xbf, 0x48, 0xd7, 0x83, 0xcf, 0xac, 0xbf, + 0xff, 0x49, 0xc9, 0xbf, 0x1e, 0xef, 0x06, 0x51, 0xc5, 0x97, 0xff, 0xe6, + 0xdd, 0x82, 0x0c, 0x9b, 0x9c, 0x8d, 0x87, 0xed, 0x65, 0x32, 0x2b, 0x5d, + 0x4e, 0xe6, 0xe9, 0x65, 0xff, 0xf7, 0x71, 0xac, 0x03, 0x9d, 0xe5, 0x0d, + 0xda, 0xcb, 0xff, 0xe9, 0x73, 0x0a, 0x0e, 0xf9, 0xff, 0xc1, 0xd6, 0x54, + 0x22, 0x71, 0xd3, 0xeb, 0x48, 0xd4, 0xfc, 0x2c, 0xe8, 0xe9, 0xf3, 0xfa, + 0x19, 0x5f, 0x87, 0xad, 0xff, 0xff, 0xdb, 0xdb, 0xfc, 0xc3, 0x7b, 0xf3, + 0x7f, 0x26, 0x28, 0x3c, 0xf8, 0x62, 0xcb, 0xff, 0xef, 0xbe, 0x70, 0x79, + 0x2f, 0x46, 0xf1, 0xc2, 0xcb, 0xff, 0xff, 0xf9, 0xbe, 0x3c, 0x0f, 0x36, + 0x7b, 0x3b, 0xf0, 0x67, 0x6c, 0x2e, 0xa5, 0xce, 0x06, 0x16, 0x53, 0xa3, + 0x74, 0x94, 0x2a, 0x13, 0x75, 0x78, 0xd5, 0x2f, 0xef, 0xbf, 0xb6, 0x0e, + 0x16, 0x5e, 0x90, 0x66, 0x59, 0x50, 0x79, 0xae, 0x5f, 0x7d, 0x2f, 0xb4, + 0xeb, 0x2f, 0xdc, 0xe3, 0x94, 0xeb, 0x2f, 0xc2, 0x7c, 0xa0, 0x0b, 0x2d, + 0xe5, 0x95, 0xd2, 0x21, 0x0e, 0x47, 0xbc, 0xa0, 0x42, 0x8b, 0xff, 0xe0, + 0x3e, 0x79, 0xdb, 0x76, 0x0e, 0x4e, 0x6a, 0xcb, 0xff, 0x37, 0x30, 0x7d, + 0x72, 0x35, 0xc5, 0x97, 0xf9, 0xe5, 0xf6, 0x9f, 0xcc, 0xb2, 0xa1, 0x30, + 0x3c, 0x41, 0xed, 0x41, 0x8f, 0xef, 0xd9, 0xe6, 0xc3, 0xac, 0xbf, 0x30, + 0x0e, 0xda, 0x59, 0x7f, 0xe1, 0xb6, 0xf6, 0x1e, 0x19, 0x9e, 0x59, 0x7f, + 0xff, 0xcf, 0xf8, 0x27, 0x9e, 0x35, 0x0d, 0x28, 0x39, 0x41, 0xab, 0x2f, + 0xf3, 0x71, 0x82, 0x2b, 0x1c, 0x2c, 0xa2, 0x44, 0xcf, 0xd8, 0xef, 0xef, + 0x47, 0x64, 0xe7, 0x59, 0x7f, 0xe7, 0x6e, 0xfc, 0xe1, 0x9f, 0x4c, 0xb2, + 0x98, 0xfb, 0x08, 0xb6, 0xf7, 0x61, 0x85, 0x97, 0xfa, 0x78, 0xc2, 0x1f, + 0xa1, 0x65, 0xb1, 0x8f, 0x3d, 0xc7, 0x6a, 0x75, 0x49, 0x03, 0x26, 0xc2, + 0x76, 0x86, 0xcf, 0xa1, 0x1c, 0x4d, 0xf7, 0xff, 0x9f, 0xae, 0x7a, 0x39, + 0x9f, 0x27, 0x35, 0x65, 0xfe, 0x94, 0x6a, 0x78, 0xd4, 0xeb, 0x2f, 0xa5, + 0xac, 0x3a, 0xcb, 0xd9, 0xa0, 0x2c, 0xbf, 0x4d, 0x83, 0x3e, 0xe2, 0xcb, + 0xf8, 0xa0, 0xce, 0xa5, 0xc5, 0x95, 0xd2, 0x26, 0x58, 0x8a, 0x61, 0xcd, + 0xd2, 0xcb, 0xc6, 0x87, 0xb5, 0x95, 0x09, 0x97, 0x64, 0x33, 0x8d, 0x41, + 0xbf, 0xff, 0xff, 0x37, 0x79, 0xf8, 0x2f, 0xf3, 0x64, 0x30, 0xf0, 0xfb, + 0x35, 0x0d, 0x27, 0xe2, 0xcb, 0xff, 0xce, 0xdf, 0x0e, 0x9f, 0x82, 0x61, + 0x76, 0xb2, 0xff, 0xfb, 0x40, 0xe0, 0x3c, 0xf2, 0x6f, 0x94, 0x01, 0x65, + 0x62, 0x63, 0xbe, 0x84, 0x20, 0x52, 0xaf, 0xec, 0xfb, 0x90, 0x02, 0xb2, + 0xfe, 0xf6, 0xc6, 0x9d, 0xc9, 0x65, 0xfc, 0x7e, 0x0c, 0x9c, 0xc5, 0x97, + 0xe0, 0x73, 0x69, 0xed, 0x3d, 0xa6, 0xb2, 0xa0, 0xfa, 0x5c, 0xba, 0xfd, + 0xdb, 0x0f, 0x09, 0x65, 0xf6, 0x9a, 0x0e, 0xb2, 0xe7, 0x1a, 0xca, 0xe8, + 0xdb, 0x80, 0x86, 0xb1, 0x10, 0x0e, 0xbd, 0x52, 0x4e, 0x17, 0x0b, 0x0a, + 0x13, 0x1c, 0x85, 0x05, 0xff, 0x6a, 0x62, 0xc1, 0xfa, 0x37, 0xac, 0xbf, + 0xf0, 0xfc, 0x17, 0x37, 0x06, 0xf2, 0x59, 0x58, 0x7f, 0x44, 0x77, 0x5b, + 0x5b, 0x6b, 0x8a, 0x29, 0x19, 0x14, 0x34, 0xc4, 0xa7, 0x09, 0xe1, 0x7c, + 0x32, 0x1c, 0x8f, 0x4c, 0xd8, 0x53, 0xf7, 0x0c, 0x4e, 0xa1, 0x24, 0xd2, + 0x83, 0xf5, 0x1d, 0x81, 0xdd, 0x7d, 0x1d, 0x3b, 0xca, 0x84, 0x03, 0x09, + 0x46, 0xf1, 0xc8, 0xd4, 0xbf, 0x1d, 0xd0, 0x90, 0xc0, 0xbe, 0x16, 0x71, + 0x37, 0x16, 0x50, 0xb4, 0xe6, 0x8d, 0x8d, 0xc6, 0xfc, 0x64, 0x76, 0xdd, + 0xac, 0xbf, 0xff, 0x7b, 0x0b, 0x0d, 0xf3, 0xcb, 0xc6, 0x38, 0x87, 0x59, + 0x7d, 0xdb, 0xbf, 0x6a, 0x8b, 0x01, 0x52, 0x44, 0x3e, 0x95, 0xef, 0xf1, + 0xdb, 0x81, 0x8d, 0x4c, 0xb2, 0xfb, 0xb1, 0x3d, 0x32, 0xca, 0x83, 0xda, + 0x73, 0x4b, 0xc0, 0x10, 0x0b, 0x2f, 0xc3, 0xcc, 0x07, 0x16, 0x54, 0x27, + 0x27, 0x90, 0xb1, 0xe3, 0xef, 0xc8, 0x04, 0x1e, 0xbf, 0xc3, 0x81, 0x7d, + 0x7c, 0x30, 0xb2, 0x85, 0xa2, 0x14, 0x29, 0xf7, 0xed, 0x76, 0xef, 0xda, + 0xa2, 0x75, 0x5f, 0xff, 0xef, 0x44, 0xe3, 0xc3, 0x8b, 0xe7, 0x33, 0xcd, + 0xc0, 0xce, 0xb2, 0xfc, 0x2c, 0xef, 0x21, 0x78, 0x89, 0xb9, 0x8d, 0xaf, + 0xff, 0xe2, 0x0c, 0x7f, 0x98, 0x42, 0xc0, 0x08, 0xf3, 0xce, 0xb2, 0xfe, + 0x21, 0x73, 0x3c, 0xce, 0xb2, 0xa1, 0x11, 0x98, 0xb9, 0x78, 0xd8, 0x3a, + 0xcb, 0xd3, 0xc7, 0x6b, 0x2f, 0xfb, 0xc1, 0xe8, 0x6d, 0xbe, 0x06, 0xb2, + 0xd9, 0x39, 0xed, 0x7c, 0x7a, 0xf9, 0xfb, 0x10, 0xeb, 0x2f, 0x4b, 0x82, + 0xcd, 0x46, 0x19, 0x3b, 0xef, 0x28, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x16, + 0xca, 0xff, 0xef, 0x37, 0xfc, 0x1e, 0xb0, 0xef, 0xd2, 0xcb, 0xef, 0xe9, + 0xba, 0x59, 0x7f, 0x7d, 0xfd, 0xb0, 0x70, 0xb2, 0xff, 0xfe, 0x90, 0xbe, + 0x43, 0x60, 0xdb, 0x39, 0x9f, 0x28, 0x59, 0x50, 0x88, 0x87, 0x2f, 0xbf, + 0x4a, 0x1b, 0x7c, 0x2c, 0xbf, 0x61, 0x00, 0xf8, 0xb2, 0xff, 0xa3, 0x82, + 0xfc, 0xdd, 0xbe, 0x96, 0x5f, 0xf3, 0x61, 0x1b, 0x1b, 0xdf, 0xcb, 0x2a, + 0x11, 0x85, 0xd9, 0x40, 0x09, 0xb6, 0xce, 0xef, 0xfa, 0x25, 0x1a, 0x9e, + 0x35, 0x3a, 0xcb, 0xf0, 0xfc, 0xc6, 0x0a, 0x16, 0x58, 0x5e, 0x2a, 0xb1, + 0xec, 0xd9, 0x91, 0x8f, 0x0a, 0xb7, 0x87, 0x19, 0x20, 0x70, 0xea, 0xff, + 0xc4, 0x2c, 0xe1, 0x6f, 0x93, 0xee, 0xac, 0xbf, 0x3f, 0x3c, 0xf2, 0x59, + 0x7f, 0x83, 0xf0, 0x68, 0x32, 0xe2, 0xca, 0xd1, 0xee, 0x11, 0x3d, 0xfc, + 0xfa, 0xdb, 0x72, 0x35, 0x65, 0xe0, 0xf0, 0x5e, 0x1e, 0x89, 0x10, 0xdc, + 0xe0, 0xc4, 0xc8, 0xc1, 0x0e, 0xfb, 0xba, 0xed, 0x65, 0xf7, 0x6e, 0xfd, + 0xaa, 0x2e, 0x65, 0x8e, 0xb2, 0xb4, 0x78, 0x26, 0x18, 0x5f, 0xc5, 0x9d, + 0x01, 0xa4, 0xb2, 0xc2, 0xb5, 0x95, 0xa3, 0xc2, 0xde, 0x5b, 0x79, 0xcf, + 0xc5, 0x97, 0x4c, 0x75, 0x94, 0xb2, 0xa1, 0x32, 0x2c, 0x5a, 0x66, 0x57, + 0x24, 0x30, 0x73, 0x6c, 0x62, 0xfe, 0x9c, 0x5e, 0xd5, 0xb5, 0xed, 0x7b, + 0x52, 0xcb, 0xfb, 0xa1, 0x7f, 0xe3, 0xe9, 0x65, 0x0b, 0x46, 0x7e, 0x2c, + 0x3a, 0x35, 0xfb, 0x5d, 0xbb, 0xf6, 0xa8, 0xbb, 0xd7, 0xfa, 0x42, 0xf9, + 0xad, 0x31, 0x8b, 0x2c, 0x2f, 0x0f, 0xb5, 0xcd, 0xaf, 0xf8, 0xa1, 0xe7, + 0xeb, 0x90, 0x35, 0x97, 0x0c, 0x0b, 0x2e, 0x8d, 0xd5, 0x97, 0x8b, 0x27, + 0x59, 0x61, 0x63, 0x44, 0x29, 0xa7, 0x20, 0x17, 0x21, 0x9a, 0x88, 0x76, + 0xef, 0x66, 0x32, 0x10, 0xfb, 0x46, 0xea, 0x18, 0xad, 0x5b, 0xca, 0xea, + 0x52, 0x29, 0xe1, 0x81, 0xe8, 0x68, 0x3c, 0x39, 0x01, 0x2b, 0xdc, 0xa3, + 0x98, 0xe4, 0xa2, 0x4f, 0xc2, 0x74, 0x48, 0x56, 0xdf, 0xf8, 0xc7, 0x29, + 0xf8, 0xc5, 0xd4, 0x96, 0x5f, 0xfd, 0x93, 0xe1, 0x9e, 0xce, 0x63, 0x12, + 0xcb, 0xff, 0x31, 0x16, 0x1b, 0xd8, 0x5c, 0x6b, 0x2f, 0xd9, 0xe1, 0xb9, + 0x2c, 0xb9, 0x85, 0xf9, 0x1c, 0xe4, 0x81, 0xc4, 0x31, 0x0f, 0xaf, 0xdc, + 0xe1, 0xde, 0x4b, 0x2f, 0xff, 0xde, 0x82, 0x9f, 0x81, 0x76, 0x97, 0x3c, + 0xf2, 0x59, 0x7f, 0xfe, 0xf4, 0x14, 0xfc, 0x0b, 0xb4, 0xb9, 0xe7, 0x92, + 0xcb, 0xff, 0xff, 0xf9, 0xa0, 0xbe, 0x4e, 0x6e, 0x7c, 0x3f, 0x6f, 0xf3, + 0xcd, 0xa8, 0x9d, 0xf5, 0xda, 0xcb, 0xbc, 0xc3, 0x46, 0xef, 0x95, 0x6e, + 0xe4, 0x2c, 0xbf, 0xfb, 0xae, 0xc2, 0xfd, 0x7f, 0x30, 0x8d, 0x59, 0x78, + 0x9c, 0x5c, 0x27, 0xca, 0x32, 0x8e, 0xe3, 0x32, 0xe1, 0x77, 0xc5, 0xaf, + 0xed, 0xaf, 0x68, 0x8e, 0xb5, 0x3a, 0xcb, 0xc7, 0x0e, 0xe2, 0xcb, 0xc1, + 0x73, 0xac, 0xbe, 0x0e, 0xe8, 0xe1, 0x65, 0xfb, 0x37, 0x7f, 0x06, 0xac, + 0xb6, 0xea, 0xca, 0x9c, 0xdf, 0xe1, 0x5d, 0xf7, 0x1b, 0xbd, 0x2c, 0xa9, + 0xd1, 0xc9, 0xa2, 0x0f, 0x0e, 0x13, 0x21, 0x84, 0x37, 0xfe, 0xe3, 0x9b, + 0xe6, 0x82, 0x0c, 0x2c, 0xbf, 0xf7, 0x9f, 0xef, 0xee, 0xa5, 0x9f, 0x59, + 0x58, 0x7f, 0x8c, 0x7b, 0x73, 0x81, 0x65, 0xff, 0xff, 0xe2, 0x73, 0x0b, + 0x3f, 0xfc, 0x9e, 0x09, 0xcd, 0xe1, 0xe3, 0x08, 0x6b, 0x2f, 0x60, 0x9c, + 0x59, 0x58, 0x8a, 0x8d, 0x0b, 0x6e, 0xba, 0xde, 0x69, 0xb8, 0xb2, 0xfe, + 0x28, 0x01, 0xde, 0x4b, 0x2f, 0xe2, 0x80, 0x1d, 0xe4, 0xb2, 0xff, 0x6d, + 0x7b, 0x41, 0x60, 0xfc, 0x15, 0x97, 0xec, 0xdf, 0x05, 0xfc, 0x3e, 0x9e, + 0x16, 0x5f, 0x88, 0x3c, 0xf3, 0x6c, 0x47, 0x86, 0x0e, 0xea, 0x12, 0xb7, + 0xe1, 0xb6, 0xfd, 0x62, 0xcb, 0x7a, 0x0f, 0xef, 0x14, 0xaf, 0xf3, 0xcb, + 0x59, 0xb6, 0xc0, 0x59, 0x7f, 0xa0, 0xa3, 0xbe, 0x00, 0xeb, 0x2f, 0xa2, + 0x6f, 0x32, 0xcb, 0xce, 0xfd, 0xaa, 0x25, 0x75, 0xfe, 0x35, 0xc8, 0x1f, + 0xcf, 0x2c, 0xa9, 0xcf, 0xfb, 0xb2, 0x26, 0x29, 0xbd, 0xec, 0xed, 0x65, + 0xf6, 0x00, 0x3c, 0x59, 0x73, 0xf5, 0x86, 0xfc, 0x87, 0x6f, 0xce, 0x6b, + 0xfe, 0x4b, 0x2f, 0xff, 0xb8, 0xcf, 0xd7, 0x9d, 0xbe, 0x1d, 0x3f, 0x16, + 0x5b, 0xa2, 0x3f, 0x7f, 0x94, 0x5f, 0xfd, 0xec, 0x97, 0x7e, 0x61, 0xc1, + 0x7d, 0x65, 0x31, 0xf6, 0x7c, 0xa2, 0xa4, 0xaa, 0xa8, 0x64, 0xdd, 0x9a, + 0xea, 0x16, 0x27, 0x6f, 0x28, 0xc3, 0xaf, 0xfd, 0xdb, 0x6b, 0x3c, 0xda, + 0xf3, 0xac, 0xbf, 0xf8, 0x3c, 0xf3, 0xcb, 0xec, 0xe4, 0x05, 0x97, 0xbc, + 0xdf, 0xe9, 0x10, 0x3a, 0x3e, 0xbf, 0xb4, 0xf2, 0x7e, 0xa4, 0xb2, 0xfc, + 0x4e, 0x60, 0x87, 0x59, 0x50, 0x7a, 0xff, 0x2e, 0xbf, 0x43, 0x01, 0x8e, + 0xb2, 0xf6, 0x9b, 0xa5, 0x95, 0x23, 0xc3, 0xf9, 0x35, 0xfa, 0x27, 0xfe, + 0x79, 0x65, 0xfd, 0x07, 0x1e, 0x9f, 0xb5, 0x95, 0xe3, 0xd6, 0x22, 0x8b, + 0xff, 0xc5, 0xff, 0x64, 0xba, 0xfe, 0xa3, 0x0c, 0x59, 0x7f, 0xff, 0xf9, + 0xc8, 0x48, 0x06, 0x4b, 0xd1, 0xbc, 0x70, 0x2f, 0x08, 0x32, 0xce, 0x2c, + 0xa8, 0x46, 0x26, 0x92, 0xee, 0x94, 0xeb, 0x2f, 0xbb, 0x79, 0x62, 0xcb, + 0xff, 0xff, 0xff, 0xf0, 0xdc, 0xe7, 0x79, 0x4a, 0x04, 0x81, 0xb6, 0x9f, + 0xa1, 0xfa, 0x35, 0xc6, 0x77, 0x28, 0xef, 0xd1, 0x32, 0xcb, 0xf8, 0xbe, + 0x1f, 0x0a, 0x61, 0x65, 0xcd, 0xf8, 0x47, 0x0b, 0x42, 0xc2, 0xb1, 0x33, + 0x47, 0x8c, 0x0e, 0xfe, 0x20, 0x6b, 0x4d, 0x3a, 0xcb, 0xfd, 0x9a, 0xe3, + 0xf6, 0x1e, 0x96, 0x5f, 0xff, 0xdd, 0x73, 0x35, 0xff, 0xbc, 0xe2, 0x1c, + 0x7e, 0x63, 0x56, 0x56, 0x22, 0x55, 0xcd, 0x6f, 0xf7, 0x58, 0xdc, 0xe0, + 0x61, 0x65, 0x82, 0xb2, 0xfb, 0xed, 0x9a, 0x59, 0x4b, 0x2f, 0xbf, 0x1f, + 0xe2, 0xcb, 0x9e, 0x5b, 0x51, 0xad, 0xc0, 0xba, 0x9d, 0x11, 0xfe, 0x11, + 0xde, 0x9d, 0x7f, 0xd8, 0xdb, 0xca, 0x33, 0x52, 0x59, 0x7f, 0xfe, 0xfc, + 0xb3, 0x71, 0xc8, 0x1d, 0x7f, 0x51, 0x86, 0x2c, 0x30, 0xdc, 0x5f, 0xba, + 0xff, 0xa0, 0x0b, 0x2b, 0x11, 0xfc, 0xed, 0x61, 0x6a, 0xbf, 0xff, 0xd8, + 0x36, 0xef, 0xcc, 0x31, 0xe1, 0x82, 0x4d, 0xe0, 0x9a, 0xb2, 0xff, 0xf4, + 0xc5, 0x1f, 0xe7, 0xfa, 0xed, 0x8a, 0x75, 0x97, 0xfc, 0xe6, 0x0f, 0xd1, + 0x3e, 0x18, 0xb2, 0x99, 0x11, 0x04, 0x9b, 0x7f, 0xfc, 0xc0, 0xc3, 0xb7, + 0xf9, 0x07, 0x7e, 0xbe, 0xb2, 0xff, 0xfe, 0xdf, 0x83, 0xd4, 0x07, 0x8d, + 0xbd, 0xd8, 0x61, 0x85, 0x95, 0x88, 0xac, 0x64, 0xfb, 0xff, 0xfd, 0xdb, + 0xe9, 0xfd, 0xd4, 0xb3, 0xf9, 0xf8, 0x08, 0xaf, 0x16, 0x5f, 0xfc, 0xfd, + 0x49, 0xbf, 0xe8, 0xd7, 0xe1, 0x65, 0xff, 0x41, 0xff, 0x93, 0x49, 0xbe, + 0xb2, 0xa4, 0x98, 0x1b, 0x10, 0x9d, 0x97, 0xe8, 0x97, 0xff, 0xfb, 0xcc, + 0x31, 0xe1, 0x9d, 0x7c, 0x2f, 0xcf, 0x18, 0xe3, 0x59, 0x7c, 0x17, 0xd4, + 0x96, 0x5f, 0xc5, 0x13, 0x81, 0xfe, 0xb2, 0xff, 0x38, 0xc4, 0xdd, 0x82, + 0x92, 0xcb, 0x47, 0x67, 0xc6, 0x72, 0xdb, 0xff, 0xe3, 0xb9, 0x03, 0xc6, + 0x39, 0x4f, 0xdb, 0x4e, 0xb2, 0xff, 0xfe, 0xd3, 0xf3, 0x0a, 0x30, 0x1c, + 0xc9, 0xa3, 0xae, 0x2c, 0xb9, 0xbe, 0xe8, 0xac, 0x0a, 0x95, 0x0d, 0x38, + 0x66, 0x84, 0x2b, 0xc3, 0x52, 0xff, 0x82, 0x03, 0xbc, 0xb9, 0xa1, 0xac, + 0xbf, 0xff, 0xd8, 0xc5, 0xfc, 0x2d, 0x84, 0xe3, 0x82, 0x9e, 0x34, 0xb2, + 0xbe, 0x89, 0x8d, 0xe7, 0x56, 0xd2, 0xcb, 0xff, 0xf7, 0x5f, 0x28, 0xf3, + 0xf3, 0x3b, 0x27, 0xce, 0xd6, 0x56, 0x22, 0x2f, 0xb2, 0x50, 0x88, 0xdf, + 0xff, 0xfe, 0xf6, 0x1c, 0x0f, 0xac, 0xdf, 0x83, 0xce, 0x05, 0xfa, 0xf1, + 0x8f, 0xf5, 0x97, 0xfa, 0x3c, 0xdf, 0xe3, 0xf4, 0xb2, 0xff, 0xd9, 0xd7, + 0xff, 0x07, 0xf6, 0x4e, 0xb2, 0xff, 0xa6, 0xef, 0xcc, 0x78, 0xd1, 0xab, + 0x2f, 0xf0, 0x33, 0x59, 0x9f, 0xe2, 0xca, 0xc3, 0xee, 0xe8, 0xf2, 0xa1, + 0x7f, 0xb8, 0x70, 0xee, 0xc8, 0xf4, 0x3b, 0x3d, 0xf4, 0x7d, 0x45, 0x1a, + 0xe7, 0xcc, 0x02, 0xf4, 0x61, 0x98, 0x90, 0xae, 0xbd, 0x80, 0x75, 0x97, + 0xb5, 0x9d, 0x2c, 0xbd, 0xe7, 0x97, 0x8d, 0xc0, 0x06, 0xef, 0xff, 0xcc, + 0x3f, 0x3b, 0x7e, 0x0b, 0xb6, 0x39, 0xd9, 0x65, 0xb3, 0xc8, 0x85, 0x23, + 0x2b, 0xfe, 0xce, 0xb8, 0x38, 0x72, 0x9d, 0x65, 0xfe, 0x7e, 0x41, 0x7f, + 0xcc, 0xb2, 0xfc, 0x79, 0xb8, 0xc4, 0xb2, 0xff, 0xee, 0xdb, 0x5e, 0xc9, + 0xbc, 0xda, 0x9d, 0x65, 0xff, 0xce, 0x0c, 0x2e, 0xbf, 0xa8, 0xc3, 0x16, + 0x5f, 0xf3, 0xcb, 0x9e, 0x8d, 0x08, 0x35, 0x95, 0x24, 0xdf, 0xb0, 0x9c, + 0xd3, 0x9e, 0xcc, 0x7a, 0x28, 0x24, 0x7f, 0xa2, 0x5f, 0x81, 0x33, 0x04, + 0x56, 0xb2, 0xff, 0xff, 0x7b, 0x3b, 0x2c, 0x3e, 0x16, 0x7c, 0x20, 0x3b, + 0xc9, 0x65, 0xfd, 0xe7, 0x39, 0x47, 0x4b, 0x2f, 0xfc, 0x59, 0xec, 0x9a, + 0x4d, 0xa9, 0x2c, 0xbf, 0xff, 0xfe, 0x04, 0x17, 0x6f, 0xf7, 0xe8, 0x19, + 0xbd, 0xbf, 0x2f, 0x37, 0xf8, 0xc3, 0x59, 0x7f, 0xe6, 0xde, 0xdf, 0x9a, + 0x50, 0x5f, 0x59, 0x50, 0x9d, 0xb4, 0x8b, 0x71, 0x7f, 0xb2, 0xde, 0x8f, + 0xbe, 0xff, 0x7f, 0xf9, 0xf2, 0x5e, 0xc6, 0x2c, 0x06, 0xde, 0x2c, 0xbc, + 0xf2, 0x17, 0xb4, 0x37, 0x83, 0xd1, 0x18, 0xf4, 0xa1, 0x8e, 0x38, 0x64, + 0x64, 0xe2, 0x3f, 0x70, 0xe5, 0xea, 0x11, 0x8c, 0xc9, 0x33, 0xc6, 0xa1, + 0xca, 0x72, 0x2f, 0x46, 0x98, 0xe5, 0x00, 0x86, 0x18, 0xac, 0x84, 0xa3, + 0xc0, 0xe5, 0x20, 0x73, 0xf2, 0xb9, 0x44, 0x94, 0x39, 0xba, 0xb1, 0x70, + 0xaf, 0x16, 0x5f, 0xbf, 0x01, 0x15, 0xe2, 0xcb, 0xfe, 0x96, 0x7f, 0xcd, + 0x1a, 0x02, 0xcb, 0xf6, 0x76, 0xf2, 0xc5, 0x97, 0xfb, 0x06, 0xc5, 0xfc, + 0xf2, 0xcb, 0xff, 0xf8, 0x7e, 0x82, 0x9f, 0x81, 0x76, 0x97, 0x3c, 0xf2, + 0x59, 0x7b, 0x3c, 0x2f, 0x69, 0xa6, 0x61, 0x83, 0x5d, 0x15, 0xf8, 0xe0, + 0x89, 0xf8, 0x63, 0x79, 0xa1, 0xd6, 0x5e, 0xfc, 0x0d, 0x25, 0xff, 0xef, + 0x3b, 0x7e, 0x24, 0xda, 0x9c, 0x20, 0x49, 0x7b, 0x42, 0xb1, 0x70, 0x7c, + 0xdc, 0x1c, 0xbc, 0xfd, 0x8b, 0x92, 0x2e, 0x47, 0x08, 0x0b, 0x0b, 0x1b, + 0xa2, 0xc4, 0xee, 0x51, 0x79, 0xeb, 0xc8, 0x1f, 0xca, 0xaf, 0xdf, 0x19, + 0x4d, 0xff, 0xe1, 0x67, 0x79, 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, 0x61, + 0x5f, 0x43, 0x09, 0xe5, 0x97, 0xfb, 0xb8, 0xeb, 0xe5, 0x12, 0x59, 0x7f, + 0xbd, 0x04, 0xe7, 0x8d, 0xd5, 0x97, 0x98, 0x4f, 0x2c, 0xbf, 0xff, 0xb3, + 0x7b, 0x8f, 0xd0, 0x2f, 0xfe, 0xc1, 0x87, 0xfc, 0x59, 0x76, 0x49, 0x65, + 0xff, 0xed, 0x38, 0x05, 0x9b, 0xf9, 0x19, 0x1c, 0x92, 0xcb, 0xb0, 0x58, + 0xd3, 0x6b, 0xc2, 0x27, 0x34, 0x01, 0xa1, 0x0e, 0x85, 0x7c, 0x41, 0x6b, + 0xb6, 0xa1, 0x51, 0x65, 0xb7, 0xac, 0xa1, 0x49, 0xb4, 0x39, 0x0d, 0xf9, + 0xbd, 0xec, 0x9d, 0x65, 0xe1, 0x47, 0x86, 0xb2, 0xff, 0xe1, 0x4e, 0x75, + 0x20, 0xbf, 0xca, 0x24, 0xb2, 0xfb, 0x69, 0x64, 0x8e, 0xb2, 0xfd, 0xb4, + 0x6d, 0x1b, 0x56, 0xde, 0xd6, 0xb2, 0xef, 0xed, 0x35, 0x97, 0x75, 0xb8, + 0xb2, 0xfd, 0xe6, 0x3c, 0x76, 0xb2, 0xec, 0x3e, 0xc3, 0xc3, 0xec, 0x6e, + 0xfe, 0x83, 0xe0, 0x23, 0x7a, 0xca, 0x19, 0xef, 0x78, 0xc2, 0xff, 0x6b, + 0x3b, 0x80, 0x08, 0x75, 0x97, 0xef, 0xbc, 0xef, 0xc5, 0x97, 0xd0, 0x76, + 0xd2, 0xcb, 0x44, 0xc7, 0x93, 0xa2, 0x8b, 0xe8, 0x26, 0x99, 0x65, 0xff, + 0xfb, 0x27, 0xd9, 0x98, 0x5f, 0xf3, 0xb7, 0x1b, 0x7a, 0xcb, 0xf7, 0xa0, + 0x6c, 0x6a, 0xca, 0x64, 0xda, 0x34, 0x44, 0x77, 0xe2, 0x28, 0xf9, 0x0e, + 0xea, 0xbd, 0xf7, 0x84, 0xe1, 0x2c, 0xbb, 0x6b, 0xfa, 0xcb, 0xe9, 0x98, + 0xc9, 0x96, 0x5f, 0xe8, 0x3b, 0x7a, 0x30, 0x96, 0x5c, 0xfc, 0x59, 0x47, + 0x3e, 0xbf, 0x92, 0xef, 0x30, 0xbf, 0xbf, 0x1b, 0xc9, 0xfa, 0x59, 0x7e, + 0x2e, 0xd8, 0xb1, 0x65, 0xff, 0xb8, 0x3d, 0x13, 0x99, 0x9d, 0x7d, 0x65, + 0xfe, 0x30, 0xb3, 0xaf, 0xe7, 0x96, 0x56, 0x1f, 0xa3, 0x20, 0x5f, 0xe8, + 0x79, 0xfe, 0x6b, 0xe9, 0x65, 0xf9, 0xf5, 0x27, 0x3a, 0xca, 0x1a, 0x7f, + 0x99, 0x08, 0x7e, 0x8c, 0x58, 0xbf, 0xd0, 0x9a, 0x22, 0x00, 0x9a, 0x58, + 0xeb, 0x2f, 0xf7, 0xfc, 0xed, 0xc6, 0xde, 0xb2, 0xdb, 0x5a, 0xca, 0x23, + 0xca, 0xdb, 0x34, 0xbf, 0xdc, 0x8c, 0x21, 0xfa, 0x16, 0x5f, 0xd1, 0x84, + 0x3f, 0x42, 0xcb, 0xc1, 0xd4, 0xdb, 0x0f, 0x73, 0x86, 0x37, 0xf8, 0xcd, + 0x98, 0x3f, 0x46, 0xf5, 0x97, 0xfe, 0x0e, 0x1b, 0x9f, 0x0c, 0x74, 0x35, + 0x95, 0x07, 0xf0, 0xc7, 0x17, 0xf8, 0x83, 0xfc, 0xf8, 0x93, 0xac, 0xad, + 0x1e, 0xaf, 0xc8, 0x2f, 0xff, 0xcd, 0xaf, 0x3e, 0xc1, 0xe4, 0xbd, 0x1b, + 0xc7, 0x0b, 0x2f, 0xf8, 0xc1, 0x3d, 0x1d, 0xf9, 0xa6, 0x59, 0x7c, 0x13, + 0xe0, 0xd6, 0x57, 0x47, 0xbf, 0xba, 0x7b, 0x7f, 0xff, 0xde, 0xc9, 0x64, + 0xbd, 0x85, 0x86, 0xf9, 0xe5, 0x92, 0x3a, 0xca, 0xc4, 0x45, 0xfc, 0x9a, + 0xfd, 0xa8, 0x97, 0x31, 0x65, 0xf3, 0x7f, 0x37, 0xac, 0xbf, 0xd8, 0x67, + 0xc9, 0xc1, 0xc5, 0x95, 0x07, 0xfb, 0xe2, 0x7f, 0x91, 0xd4, 0x97, 0x04, + 0x31, 0x6f, 0xb8, 0x40, 0x6a, 0x30, 0x4f, 0x11, 0x14, 0x68, 0x5f, 0x84, + 0xfd, 0xff, 0xf4, 0x17, 0xf5, 0x0d, 0x22, 0xc3, 0xbc, 0x96, 0x5f, 0xfe, + 0x8e, 0xf8, 0x1f, 0xb7, 0x98, 0xdf, 0x32, 0xcb, 0xf8, 0xf1, 0x85, 0xfd, + 0xb5, 0x97, 0xda, 0x6e, 0xa4, 0xb2, 0xdc, 0x59, 0x7e, 0x8c, 0x2f, 0xed, + 0xac, 0xbd, 0xc7, 0xeb, 0x62, 0x23, 0x18, 0xbe, 0x62, 0x33, 0x88, 0xd0, + 0xd3, 0x74, 0x3a, 0x67, 0xe1, 0xaf, 0x7f, 0xdb, 0x98, 0x3f, 0x46, 0xe1, + 0x42, 0xca, 0x63, 0xf3, 0x73, 0x6b, 0xfe, 0xd4, 0xfd, 0xf9, 0xbc, 0x1f, + 0xac, 0xaf, 0x1e, 0xe3, 0x90, 0x5f, 0xe6, 0x37, 0x59, 0x3c, 0x4e, 0xb2, + 0xfd, 0x07, 0xde, 0x09, 0x2c, 0xae, 0x1e, 0xff, 0xcd, 0x6e, 0xfb, 0x2c, + 0xb8, 0x38, 0xb2, 0xed, 0x71, 0x65, 0x48, 0xf9, 0x4d, 0x22, 0x00, 0xb6, + 0xd8, 0xb5, 0xff, 0xfa, 0x41, 0xd4, 0x76, 0x66, 0x37, 0xbb, 0x69, 0xf7, + 0x56, 0x5e, 0xd4, 0x7d, 0x65, 0xfb, 0xb6, 0xe7, 0x99, 0x65, 0xfd, 0x8c, + 0x5f, 0x0f, 0x96, 0x57, 0x47, 0xa9, 0xe2, 0x8b, 0xf7, 0x64, 0xdd, 0x49, + 0x65, 0x4c, 0x98, 0xc7, 0x17, 0x3e, 0xe0, 0x12, 0x3b, 0xc7, 0xd9, 0x8b, + 0x2f, 0xed, 0x63, 0x7a, 0x06, 0xb2, 0xf6, 0x83, 0xc5, 0x97, 0xff, 0xde, + 0x82, 0xcf, 0xfb, 0x3f, 0xe8, 0x08, 0xad, 0x65, 0xfc, 0xda, 0xd8, 0xe4, + 0x05, 0x97, 0xbd, 0x9d, 0x2c, 0xbf, 0xff, 0xc6, 0x6e, 0xff, 0x3d, 0xb0, + 0xb2, 0x76, 0xc2, 0xea, 0x5c, 0x59, 0x7e, 0x33, 0xf9, 0xee, 0xd6, 0x56, + 0x22, 0x45, 0xd9, 0xea, 0x13, 0xb6, 0x18, 0xf6, 0x16, 0x30, 0xef, 0x94, + 0x9c, 0xb8, 0xa1, 0x5d, 0x7f, 0xfb, 0xe4, 0xe0, 0xf6, 0x30, 0xc3, 0xfe, + 0x2c, 0xbe, 0xdf, 0x83, 0x85, 0x97, 0xd2, 0xc8, 0xe9, 0x65, 0xff, 0x44, + 0xe2, 0x4b, 0xc1, 0x79, 0xd6, 0x54, 0x23, 0x2b, 0x12, 0x66, 0x23, 0xd1, + 0x15, 0xff, 0xba, 0x96, 0xcf, 0x3f, 0x70, 0x43, 0x59, 0x7f, 0x13, 0x00, + 0xf1, 0xbd, 0x65, 0xed, 0x00, 0xeb, 0x29, 0x8f, 0x2c, 0x25, 0xd7, 0xf3, + 0x13, 0xf6, 0x58, 0xb2, 0xb1, 0x1b, 0x3c, 0x84, 0x68, 0x48, 0x6f, 0x8b, + 0x18, 0xd5, 0x97, 0xcd, 0x1d, 0x71, 0x65, 0xf8, 0x4f, 0x94, 0x01, 0x65, + 0x1c, 0xfa, 0xfe, 0x43, 0xbc, 0x8a, 0xfb, 0xff, 0xc3, 0x16, 0x5f, 0xfe, + 0x8f, 0x82, 0x25, 0x9d, 0x7e, 0x70, 0x98, 0xb2, 0xfd, 0x07, 0xd3, 0xcc, + 0xb2, 0xff, 0xf9, 0xbf, 0x2c, 0xd6, 0x72, 0x18, 0x78, 0x75, 0x97, 0xb8, + 0xe0, 0x59, 0x50, 0x99, 0x96, 0x18, 0xb1, 0x1f, 0x93, 0x5c, 0xa3, 0xe9, + 0xb4, 0xb2, 0xfa, 0x0e, 0xd2, 0x59, 0x77, 0xa2, 0x46, 0xb3, 0x41, 0x77, + 0xa0, 0x8d, 0x59, 0x73, 0xc9, 0x65, 0xfa, 0x3b, 0x27, 0x3a, 0xcb, 0xff, + 0x44, 0xb6, 0x67, 0x9b, 0x5e, 0x75, 0x96, 0x6f, 0x1f, 0x37, 0x09, 0xe8, + 0x68, 0xeb, 0xe8, 0xb3, 0x70, 0x73, 0xcf, 0x97, 0xe9, 0xb8, 0x30, 0xce, + 0xb2, 0xff, 0xff, 0xf4, 0x7b, 0xcf, 0xcd, 0x9e, 0x76, 0xe7, 0xb0, 0x1b, + 0x35, 0x9f, 0x7e, 0x96, 0x5f, 0xfb, 0xae, 0x77, 0xe6, 0x1b, 0x6b, 0xb5, + 0x97, 0xf3, 0x83, 0x5a, 0x6d, 0x2c, 0xbd, 0xfd, 0x98, 0xb2, 0xa1, 0x33, + 0x3d, 0x15, 0xbb, 0xd8, 0x10, 0x84, 0x2d, 0xbd, 0x8c, 0x05, 0x97, 0xde, + 0x0f, 0x5f, 0x59, 0x7f, 0xf7, 0xb2, 0x34, 0x58, 0x73, 0x86, 0x65, 0x97, + 0xf7, 0xc4, 0x00, 0x23, 0xa5, 0x97, 0xfc, 0xdf, 0x6c, 0x39, 0x64, 0xeb, + 0x29, 0x8f, 0x9f, 0xc6, 0x17, 0xf7, 0x18, 0xd3, 0xbf, 0xd6, 0x5f, 0xfb, + 0x7c, 0x1b, 0x26, 0x28, 0xd4, 0x2c, 0xbf, 0xff, 0xf6, 0xb3, 0x7c, 0x17, + 0xf6, 0x08, 0x51, 0xe7, 0x6f, 0xc7, 0xf8, 0xb2, 0xee, 0xc5, 0x0b, 0x2f, + 0x89, 0xfc, 0x6a, 0xcb, 0xd3, 0x86, 0x4b, 0x2f, 0x16, 0x73, 0x61, 0xee, + 0x0c, 0x73, 0x08, 0xaf, 0x9c, 0x12, 0x1a, 0xcb, 0xfd, 0x07, 0xec, 0x9f, + 0x3b, 0x59, 0x43, 0x55, 0x31, 0xdc, 0x2a, 0xfa, 0x21, 0x62, 0xed, 0x1f, + 0xef, 0x86, 0x51, 0x88, 0x02, 0x11, 0x5f, 0x6c, 0xdf, 0xbb, 0x3a, 0xca, + 0x1a, 0xb6, 0x9c, 0x95, 0x78, 0x6c, 0x20, 0xad, 0xb8, 0xb2, 0xdb, 0x8b, + 0x2f, 0x60, 0xfe, 0xb2, 0xc7, 0x63, 0x61, 0xa1, 0x4b, 0xbf, 0x8b, 0x2f, + 0xfc, 0xdb, 0xf0, 0x7e, 0xce, 0xf0, 0x96, 0x5f, 0xe8, 0x28, 0x03, 0xbe, + 0xea, 0xcb, 0xda, 0x79, 0x2c, 0xbf, 0xc3, 0xf6, 0x77, 0xe8, 0xd2, 0xca, + 0x1a, 0x20, 0xf4, 0x66, 0x43, 0x97, 0xee, 0x67, 0xf5, 0x0b, 0x2f, 0xff, + 0x0a, 0xca, 0x0e, 0xed, 0xe7, 0xff, 0xa1, 0x65, 0x42, 0x6f, 0x32, 0x16, + 0x68, 0x61, 0x70, 0xbc, 0x24, 0xf7, 0x3f, 0x6b, 0x2f, 0xe6, 0x99, 0xfb, + 0xe4, 0x96, 0x5f, 0xff, 0xf0, 0xc7, 0x9b, 0x71, 0xac, 0x21, 0xfa, 0x04, + 0x00, 0x23, 0xa5, 0x95, 0xda, 0x2c, 0x3c, 0x2e, 0xe5, 0xf7, 0xff, 0xb5, + 0x0c, 0x59, 0xfe, 0x47, 0x9c, 0xeb, 0x2f, 0xff, 0xf7, 0x98, 0x87, 0xac, + 0xef, 0xd1, 0xec, 0xd6, 0xa0, 0xd5, 0x97, 0xe0, 0xee, 0xb6, 0x1d, 0x65, + 0xfb, 0xee, 0x76, 0xfa, 0xca, 0x34, 0xf4, 0x48, 0xaa, 0xfd, 0xe8, 0xc9, + 0x3a, 0xcb, 0xff, 0x37, 0xc3, 0xa7, 0xe6, 0xc3, 0xfd, 0x65, 0x42, 0x22, + 0x46, 0x44, 0xe4, 0xd7, 0xf9, 0xb0, 0xe5, 0x93, 0xba, 0xcb, 0xfd, 0xc6, + 0xde, 0x38, 0x04, 0xeb, 0x2b, 0x0f, 0x9d, 0xcc, 0x6f, 0xbf, 0xc0, 0x05, + 0x65, 0xe6, 0x3f, 0xd6, 0x5e, 0x21, 0x3e, 0xb2, 0xfc, 0x11, 0xb9, 0x03, + 0x61, 0xb9, 0x71, 0xca, 0x84, 0x4d, 0x49, 0x72, 0xfe, 0xf3, 0x7c, 0xa0, + 0xeb, 0x2f, 0xa3, 0x79, 0x42, 0xcb, 0xcf, 0x2c, 0x59, 0x53, 0x1f, 0x49, + 0xcb, 0x08, 0x8a, 0xb6, 0xb5, 0xe9, 0xc8, 0x44, 0xc8, 0xe7, 0xfb, 0x87, + 0xf3, 0x18, 0x4c, 0x8f, 0xe8, 0xce, 0xca, 0x12, 0xbf, 0x85, 0xd0, 0x61, + 0x17, 0x7f, 0xfc, 0xe7, 0x1f, 0xa3, 0xd0, 0x70, 0xf5, 0x2e, 0x2c, 0xbf, + 0xfd, 0x9f, 0xf3, 0x67, 0x5f, 0xcd, 0xf1, 0xc5, 0x96, 0xf7, 0x91, 0x38, + 0x4a, 0x37, 0xcf, 0xcf, 0xce, 0xb2, 0xfc, 0xce, 0x0d, 0x9f, 0x59, 0x7f, + 0xf3, 0x97, 0xa1, 0x86, 0xdc, 0xc9, 0x2c, 0xbd, 0x00, 0x11, 0x65, 0xfd, + 0x9b, 0xfc, 0xc0, 0x99, 0x65, 0x62, 0x60, 0x46, 0x94, 0x78, 0x8d, 0xca, + 0x49, 0x07, 0x83, 0xb7, 0x14, 0x2c, 0xbe, 0xf4, 0x72, 0x16, 0x5e, 0x10, + 0x78, 0xb2, 0xf0, 0xaf, 0x82, 0x85, 0x95, 0x39, 0xfc, 0x0c, 0x55, 0xc8, + 0x78, 0x3b, 0x7b, 0x8d, 0xc5, 0x97, 0xdb, 0x0f, 0xb3, 0xb5, 0x97, 0xf4, + 0xf3, 0x48, 0x51, 0xa9, 0xd6, 0x5e, 0xce, 0xc6, 0xb2, 0xfb, 0xf8, 0x40, + 0x59, 0x7f, 0x39, 0x91, 0xfc, 0x9d, 0x65, 0xfd, 0x9a, 0xd4, 0x40, 0xd6, + 0x56, 0xd6, 0x8c, 0xec, 0x36, 0x61, 0xd2, 0x21, 0xdb, 0x2e, 0xbf, 0xfa, + 0x7f, 0x60, 0xc6, 0xdd, 0x67, 0x5f, 0x59, 0x7d, 0x38, 0x81, 0x9d, 0x65, + 0xf4, 0xd2, 0x89, 0xd6, 0x54, 0x1e, 0x56, 0x13, 0x5f, 0xcd, 0xf0, 0x08, + 0x52, 0x59, 0x7c, 0x64, 0xdc, 0x85, 0x97, 0xcd, 0x07, 0xc5, 0x97, 0xe8, + 0x37, 0x3f, 0xc5, 0x97, 0xff, 0xf6, 0x13, 0x0f, 0x99, 0xce, 0x67, 0x9b, + 0x81, 0x9d, 0x65, 0xfc, 0x3d, 0x3f, 0xfc, 0x15, 0x97, 0x3f, 0xe4, 0x88, + 0x8e, 0x2d, 0x5f, 0xcd, 0xe0, 0x9c, 0xec, 0xb2, 0xff, 0xe0, 0xcb, 0x39, + 0xb3, 0xed, 0xb7, 0x93, 0xac, 0xb3, 0x48, 0xfd, 0xc8, 0xb6, 0xa1, 0x54, + 0xf4, 0xf0, 0x91, 0x34, 0x83, 0xa2, 0xed, 0x12, 0x78, 0x80, 0xa1, 0x61, + 0xf8, 0x52, 0xd8, 0x5e, 0xd6, 0xea, 0xa8, 0x76, 0xa2, 0x51, 0x49, 0x40, + 0xa0, 0x87, 0x69, 0x24, 0x0a, 0xa2, 0x8d, 0xa6, 0x81, 0x12, 0x89, 0xa4, + 0xb2, 0x39, 0x43, 0xf9, 0x38, 0xfb, 0xdc, 0xab, 0xfe, 0xa1, 0xca, 0xd1, + 0xac, 0x4d, 0x1f, 0xae, 0xa3, 0x2f, 0x3c, 0x62, 0xbe, 0x8f, 0x45, 0xe3, + 0x6b, 0x04, 0x6e, 0x82, 0xb4, 0xa2, 0x97, 0x09, 0xc9, 0xed, 0xaf, 0xca, + 0x4f, 0x0c, 0x33, 0xb7, 0x9e, 0x18, 0x39, 0xb7, 0x0f, 0x61, 0x25, 0x76, + 0xdf, 0xff, 0x0a, 0x76, 0xb1, 0x4b, 0x09, 0xec, 0xea, 0x59, 0xbb, 0xc5, + 0x97, 0xfa, 0x66, 0xfe, 0x6b, 0xf0, 0xb2, 0xfd, 0x86, 0x67, 0x9d, 0x65, + 0xff, 0xf6, 0x9b, 0xa9, 0x71, 0xbf, 0xe8, 0xd7, 0xe1, 0x65, 0xfe, 0x8d, + 0x3c, 0xcf, 0xc9, 0x2c, 0xbc, 0xef, 0xda, 0xa2, 0xae, 0x5f, 0xce, 0x27, + 0xbc, 0xe7, 0x59, 0x5d, 0x9e, 0xbf, 0x8a, 0x6f, 0xe6, 0xd7, 0x9c, 0x43, + 0xac, 0xbe, 0x6f, 0xca, 0x16, 0x50, 0xd1, 0xf9, 0xa8, 0x45, 0x78, 0x8f, + 0x79, 0x75, 0xf1, 0x6e, 0xf1, 0xd6, 0x5f, 0x16, 0x4d, 0x0b, 0x2d, 0xb8, + 0xb2, 0xff, 0xf4, 0x4f, 0xf6, 0x1e, 0x14, 0x9b, 0xc1, 0x59, 0x58, 0x7f, + 0xc7, 0x21, 0xf0, 0xa5, 0xd0, 0x75, 0x97, 0x70, 0x6b, 0x2b, 0x46, 0xb5, + 0xc5, 0xaf, 0xf4, 0x6b, 0xf0, 0x50, 0x05, 0x97, 0xf8, 0x5e, 0x6b, 0xb7, + 0x7e, 0xd5, 0x11, 0xe2, 0xfd, 0xe6, 0xd7, 0x9d, 0x65, 0xe2, 0xfb, 0xac, + 0xbb, 0x07, 0x87, 0x85, 0xc2, 0x7a, 0x92, 0x2c, 0x4f, 0x08, 0x5b, 0xfd, + 0x28, 0xd4, 0xf1, 0xa9, 0xd6, 0x5f, 0xff, 0xc5, 0x9b, 0xbc, 0xd9, 0xc0, + 0x6f, 0xd8, 0xfc, 0x96, 0x9d, 0x65, 0xfc, 0xfe, 0x82, 0x80, 0x2c, 0xad, + 0xe8, 0x8f, 0xdb, 0x64, 0xbf, 0xfa, 0x78, 0xd7, 0x79, 0xce, 0x60, 0xf1, + 0x65, 0x42, 0x66, 0x39, 0x0c, 0x47, 0x28, 0xbf, 0xef, 0xb0, 0x45, 0x79, + 0x29, 0xe6, 0x59, 0x7f, 0xff, 0xda, 0x2c, 0x9f, 0x61, 0x66, 0xf2, 0xcd, + 0xde, 0x6c, 0xe0, 0x37, 0xac, 0xbf, 0xec, 0xff, 0x04, 0xe6, 0xce, 0xe4, + 0xb2, 0xfe, 0x2c, 0xff, 0x30, 0xc5, 0x95, 0x09, 0x8d, 0xe1, 0xf9, 0xdc, + 0x5c, 0xfa, 0xff, 0x76, 0xdc, 0xf3, 0x7d, 0x96, 0x5f, 0xb2, 0x77, 0x2e, + 0x96, 0x57, 0x47, 0xb6, 0x46, 0x77, 0xef, 0xff, 0x08, 0x0b, 0x2f, 0xf6, + 0xeb, 0x8e, 0x30, 0x6c, 0xb2, 0xc2, 0xf6, 0xb6, 0x40, 0x2c, 0x31, 0x4e, + 0x66, 0x32, 0x7c, 0x8d, 0x31, 0x91, 0x26, 0x85, 0x16, 0x96, 0xfc, 0x40, + 0xf0, 0xe2, 0x28, 0xd6, 0x79, 0x1a, 0x77, 0xe1, 0x2c, 0x21, 0x16, 0xe9, + 0x3d, 0xef, 0x39, 0xd6, 0x5f, 0xb5, 0xdb, 0xbf, 0x6a, 0x8b, 0x05, 0x78, + 0xd8, 0x9d, 0x65, 0xfc, 0xda, 0x2c, 0xdf, 0x8b, 0x2f, 0xff, 0xc1, 0x79, + 0xcf, 0x9b, 0x61, 0xd6, 0x6a, 0x42, 0x49, 0x65, 0x79, 0x11, 0x04, 0x5b, + 0x7d, 0xfd, 0x37, 0x4b, 0x2f, 0xd8, 0x59, 0xfe, 0x2c, 0xbf, 0x67, 0x02, + 0xfd, 0x2c, 0xbf, 0xda, 0x73, 0x89, 0xa7, 0xe9, 0x65, 0x85, 0xc2, 0x78, + 0x18, 0x38, 0x69, 0xb7, 0x70, 0xa6, 0x62, 0x27, 0x23, 0x22, 0x61, 0x0a, + 0x2f, 0xf0, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x2c, 0xa5, 0xff, 0xb3, 0xf2, + 0xc0, 0x6d, 0xe7, 0x82, 0xb2, 0xff, 0xf6, 0x38, 0xfd, 0x9a, 0xd4, 0x6f, + 0x36, 0x16, 0x5f, 0x76, 0xef, 0xda, 0xa2, 0xd3, 0x56, 0xe1, 0xfd, 0xe9, + 0x2e, 0xfc, 0x59, 0x3b, 0x18, 0xb2, 0xff, 0x0f, 0xcf, 0x37, 0x98, 0xeb, + 0x29, 0x63, 0x9b, 0x4b, 0xfd, 0x07, 0xc1, 0x94, 0x74, 0xb2, 0xfc, 0x36, + 0x04, 0x12, 0xcb, 0xf0, 0x73, 0x4f, 0xc5, 0x96, 0x16, 0x34, 0xf5, 0xb2, + 0x17, 0x9d, 0x92, 0x9d, 0x73, 0xc3, 0x4e, 0x65, 0xc2, 0x6b, 0xf6, 0xd5, + 0xb5, 0x8a, 0x82, 0xa0, 0xa8, 0xb2, 0xf8, 0x54, 0xda, 0xf6, 0xbd, 0xa1, + 0x65, 0x6d, 0x47, 0xf3, 0xb4, 0x90, 0xaf, 0xf8, 0x51, 0xe6, 0x30, 0x6e, + 0xfd, 0xac, 0xbf, 0x6d, 0x21, 0x4f, 0x32, 0x16, 0x5f, 0xf0, 0xa9, 0xb2, + 0x66, 0xf1, 0x07, 0xeb, 0x2f, 0xf0, 0x87, 0xcf, 0xf1, 0xb8, 0xb2, 0xcc, + 0xb2, 0x85, 0x07, 0x89, 0xb6, 0x69, 0x7f, 0x0a, 0x5b, 0xb8, 0xeb, 0x8b, + 0x2f, 0xf4, 0x4f, 0xa7, 0x1c, 0xee, 0xb2, 0xff, 0xfd, 0xe7, 0x2f, 0xcb, + 0x35, 0x90, 0x45, 0x9f, 0x59, 0x52, 0x44, 0x2b, 0x1a, 0x5f, 0xff, 0x3c, + 0xef, 0xbf, 0x9b, 0x1f, 0x7f, 0x7e, 0x6d, 0x2c, 0xbf, 0x6f, 0x71, 0xe1, + 0xd6, 0x5f, 0x38, 0x36, 0xf1, 0x65, 0xff, 0x72, 0x3d, 0x03, 0xf3, 0x9a, + 0xb2, 0xb6, 0x1e, 0xef, 0xc9, 0x2e, 0xcd, 0xeb, 0x2d, 0xc8, 0x37, 0x84, + 0x49, 0x7e, 0xfc, 0x14, 0x4c, 0xb2, 0xf4, 0x75, 0xc5, 0x95, 0x87, 0x88, + 0x72, 0x7b, 0xf8, 0xed, 0xbb, 0x04, 0xcb, 0x2f, 0x6e, 0x8e, 0x16, 0x53, + 0x1e, 0x68, 0x4b, 0xaf, 0xd0, 0x5d, 0xfa, 0x16, 0x5f, 0xfd, 0x9f, 0xf3, + 0x1f, 0x3f, 0xc1, 0x38, 0xb2, 0xff, 0xd8, 0xe0, 0x89, 0x6a, 0x30, 0x96, + 0x57, 0x68, 0x80, 0x64, 0x5b, 0xe6, 0xdf, 0xed, 0xeb, 0x2f, 0xb9, 0x05, + 0x32, 0xcb, 0xe8, 0xdd, 0x9b, 0x16, 0x53, 0x9e, 0x39, 0x11, 0x5f, 0xed, + 0xd6, 0x06, 0xc7, 0xf0, 0x56, 0x54, 0x95, 0xe1, 0x0c, 0x8b, 0x15, 0xda, + 0x18, 0x53, 0x34, 0xf9, 0xb8, 0x04, 0x25, 0x0a, 0x7e, 0x11, 0xfd, 0xb7, + 0x74, 0x82, 0xff, 0x1c, 0x43, 0x80, 0xec, 0x05, 0x97, 0xed, 0x9a, 0xd0, + 0x7c, 0xb2, 0xfc, 0xc6, 0xc1, 0x76, 0xb2, 0xb8, 0x7a, 0x7f, 0x2b, 0xa8, + 0x45, 0x56, 0x42, 0x22, 0xf3, 0x64, 0xeb, 0x2f, 0xff, 0x77, 0xe6, 0xf3, + 0x6a, 0x26, 0x33, 0x3c, 0xb2, 0xbc, 0x7d, 0x04, 0x39, 0x78, 0x05, 0x8b, + 0x2e, 0x2c, 0x59, 0x5b, 0x0d, 0x80, 0x06, 0xef, 0xfd, 0xc6, 0xd9, 0xe7, + 0xd4, 0x6f, 0x85, 0x97, 0xfc, 0x77, 0x96, 0xd8, 0x7c, 0xda, 0x59, 0x53, + 0xa2, 0x83, 0x44, 0x67, 0x41, 0xbf, 0x3f, 0x3f, 0x03, 0x59, 0x50, 0x7b, + 0x01, 0x31, 0xbf, 0xcf, 0xa9, 0x3f, 0xdf, 0xb5, 0x97, 0xff, 0xb3, 0x0b, + 0x00, 0x59, 0xff, 0x64, 0x96, 0x54, 0x27, 0xc7, 0xe8, 0xd2, 0x42, 0x43, + 0xba, 0x67, 0x7f, 0xf1, 0xc9, 0xcd, 0x2c, 0x04, 0xf8, 0x62, 0xcb, 0xff, + 0xc5, 0x86, 0xf9, 0xe5, 0xe3, 0x1c, 0x43, 0xac, 0xb7, 0xa1, 0x12, 0x38, + 0x8b, 0x7e, 0x89, 0x70, 0xf2, 0x59, 0x7d, 0x02, 0x47, 0x96, 0x5c, 0xd3, + 0xac, 0xbc, 0xef, 0xda, 0xa2, 0xdc, 0x5f, 0xbf, 0xce, 0x34, 0xcb, 0x2a, + 0x73, 0xe9, 0xec, 0x5c, 0x42, 0x9b, 0xff, 0x36, 0xbc, 0xf9, 0xa9, 0xda, + 0x75, 0x97, 0xd3, 0x40, 0xf1, 0x65, 0xfc, 0x03, 0xe7, 0x02, 0x4b, 0x2f, + 0xf7, 0xf9, 0x1a, 0xd6, 0x18, 0xb2, 0x98, 0xf8, 0x5c, 0xb6, 0xff, 0xd9, + 0xac, 0x2d, 0x9e, 0xce, 0x8c, 0x59, 0x7e, 0x20, 0x3f, 0x5c, 0x59, 0x50, + 0x7d, 0x2e, 0x83, 0x52, 0x54, 0xee, 0x69, 0x3f, 0x45, 0x1a, 0x84, 0x5f, + 0x8c, 0x9c, 0xfc, 0xa1, 0x07, 0xc8, 0x44, 0xdf, 0xf9, 0xc6, 0x4f, 0xbf, + 0xd1, 0x37, 0x16, 0x5f, 0x6f, 0x8e, 0xc9, 0x65, 0xfc, 0x40, 0x98, 0xa0, + 0xeb, 0x28, 0xd4, 0x48, 0x9d, 0x01, 0xc9, 0x2f, 0x1c, 0x99, 0x65, 0x89, + 0x65, 0xbb, 0x59, 0x7f, 0xde, 0x0b, 0xf3, 0x30, 0x8d, 0x59, 0x7f, 0xfe, + 0x8e, 0xf6, 0x67, 0x9b, 0x51, 0xec, 0x21, 0xc2, 0xcb, 0xf7, 0x1f, 0xa7, + 0x1a, 0xcb, 0x30, 0xd1, 0x6a, 0x73, 0x8f, 0xaa, 0xdf, 0xe7, 0x16, 0x59, + 0x3c, 0x1a, 0xb2, 0xa1, 0x35, 0xcc, 0x1b, 0x61, 0x0f, 0x43, 0x1c, 0x8d, + 0x6f, 0xfa, 0x1c, 0xbd, 0x98, 0x5d, 0xac, 0xbf, 0xdf, 0xfb, 0x4e, 0x78, + 0x25, 0x97, 0xfc, 0x12, 0x9c, 0x9f, 0x4f, 0x25, 0x95, 0x24, 0x50, 0xe1, + 0xb7, 0x0c, 0xef, 0xf1, 0x04, 0xf1, 0xcf, 0xb2, 0xcb, 0xf4, 0x6b, 0x59, + 0xba, 0xb2, 0xf6, 0x9b, 0xa5, 0x95, 0x07, 0xf2, 0x46, 0x5f, 0x2a, 0xbf, + 0xc1, 0x19, 0x66, 0xf7, 0x92, 0xcb, 0xff, 0xf7, 0xa6, 0xd8, 0x70, 0xfd, + 0xa7, 0xcf, 0x9b, 0x9e, 0x59, 0x7f, 0x14, 0x4d, 0x36, 0x01, 0x65, 0xff, + 0xe8, 0x9f, 0xec, 0x3c, 0x29, 0x37, 0x82, 0xb2, 0xff, 0xa4, 0xdb, 0xf3, + 0xce, 0x53, 0xac, 0xbd, 0x19, 0xa5, 0x97, 0xfb, 0xd1, 0x26, 0xdb, 0xc3, + 0xac, 0xa1, 0x9e, 0x87, 0x06, 0xef, 0xdb, 0x3a, 0xe3, 0x1a, 0xb2, 0xa7, + 0x3c, 0xee, 0x88, 0xab, 0xa4, 0x7e, 0x3c, 0x36, 0x2f, 0xfd, 0x9e, 0x6d, + 0x0f, 0xd0, 0x5d, 0xac, 0xbf, 0xf1, 0x67, 0xf9, 0x1b, 0x3f, 0x9d, 0xac, + 0xbe, 0xd9, 0xfc, 0x02, 0xca, 0x92, 0x28, 0x98, 0xfb, 0xc8, 0x17, 0xfb, + 0xa9, 0x41, 0x7f, 0x00, 0xb2, 0xfb, 0x80, 0x6f, 0xac, 0xa9, 0x2b, 0x50, + 0xec, 0xd1, 0x96, 0xfc, 0x5c, 0xf1, 0xa2, 0xf2, 0x19, 0x41, 0x2f, 0x10, + 0xce, 0xfc, 0xfa, 0xfe, 0x79, 0x65, 0xff, 0x98, 0x11, 0x21, 0xfa, 0x0b, + 0xb5, 0x95, 0x23, 0xe5, 0xf9, 0x3d, 0xfd, 0xf9, 0x66, 0xb3, 0x8b, 0x29, + 0x65, 0xe0, 0xbf, 0xd6, 0x5c, 0x18, 0x59, 0x52, 0x36, 0x5f, 0x1c, 0xa5, + 0x97, 0xdd, 0x76, 0xda, 0x59, 0x71, 0xc5, 0xe2, 0x23, 0x7a, 0x3d, 0x39, + 0x0f, 0xc2, 0xef, 0xb0, 0x64, 0x35, 0x95, 0x07, 0xd9, 0xbd, 0x2e, 0xff, + 0x8b, 0xfe, 0x79, 0x05, 0xc4, 0x59, 0x50, 0x9d, 0x26, 0x11, 0x34, 0x64, + 0xce, 0x47, 0x7d, 0xfd, 0x82, 0xa1, 0x2c, 0xbc, 0xed, 0x3a, 0xca, 0xc3, + 0xc5, 0x34, 0xa6, 0xcc, 0xb2, 0xdb, 0x6b, 0x2c, 0x40, 0x34, 0x9f, 0x10, + 0xbd, 0xb3, 0x68, 0xda, 0x16, 0x5f, 0xf4, 0x85, 0xe6, 0xbb, 0x77, 0xed, + 0x51, 0x43, 0xaf, 0xd2, 0xd9, 0xbc, 0xf0, 0xb2, 0xa1, 0x30, 0xa6, 0x46, + 0x98, 0x99, 0xca, 0x49, 0x26, 0xf6, 0x8d, 0xed, 0x65, 0xf4, 0x77, 0x87, + 0x59, 0x52, 0x3c, 0x10, 0x0f, 0xdf, 0x46, 0xe0, 0x61, 0x65, 0xe9, 0xb0, + 0x6b, 0x2f, 0x4d, 0x1f, 0x59, 0x50, 0x6e, 0x82, 0x3b, 0x5a, 0x45, 0x00, + 0x08, 0xb8, 0xbd, 0x70, 0x44, 0x59, 0x7e, 0xe3, 0xfb, 0x3b, 0x59, 0x5d, + 0x1e, 0x07, 0x06, 0x2f, 0x0e, 0x0e, 0xb2, 0xff, 0xb2, 0x07, 0xe8, 0xdd, + 0x89, 0x96, 0x5f, 0xe0, 0x37, 0xbd, 0x80, 0x75, 0x94, 0x73, 0xed, 0x01, + 0xdd, 0xff, 0xb3, 0xfc, 0xf6, 0x6b, 0x58, 0x62, 0xcb, 0xff, 0x16, 0xeb, + 0x93, 0x9c, 0x78, 0x35, 0x95, 0x09, 0xde, 0x63, 0x83, 0x11, 0xbc, 0x22, + 0x44, 0x22, 0xdd, 0x3f, 0xbf, 0xf3, 0x8e, 0x07, 0xe6, 0x26, 0x3a, 0xcb, + 0xff, 0x6f, 0x7d, 0x71, 0xfd, 0xc8, 0x9d, 0x65, 0xfe, 0xe0, 0x7b, 0xcf, + 0x94, 0x2c, 0xa3, 0xa2, 0xc3, 0xc7, 0x9f, 0x41, 0xbd, 0xfc, 0xed, 0x65, + 0xd9, 0xda, 0xcb, 0x66, 0xc3, 0x69, 0xf1, 0xdb, 0xfe, 0xf3, 0xeb, 0xaf, + 0xc3, 0x4e, 0xb2, 0xff, 0x17, 0x7b, 0x26, 0xef, 0xd3, 0x2c, 0xa9, 0x1f, + 0xa3, 0x9d, 0x51, 0x22, 0xf4, 0x30, 0x9c, 0xbf, 0xd2, 0x8d, 0x4f, 0x1a, + 0x9d, 0x65, 0xf4, 0x3e, 0x80, 0xb2, 0xff, 0x76, 0xdc, 0xc1, 0xbf, 0x6b, + 0x28, 0x67, 0xab, 0xe2, 0x1b, 0xf3, 0xf3, 0x7e, 0x71, 0x65, 0xf9, 0xff, + 0xb2, 0x21, 0x65, 0x42, 0x3f, 0x72, 0x11, 0x40, 0x22, 0x09, 0x4d, 0xfb, + 0x67, 0xb0, 0x0e, 0xb2, 0xff, 0x6a, 0x3c, 0xe3, 0x91, 0xd6, 0x5f, 0xf1, + 0xdb, 0xfb, 0x78, 0x4e, 0x6a, 0xcb, 0xfa, 0x4f, 0xac, 0xeb, 0xeb, 0x2f, + 0xe1, 0xb9, 0xfc, 0xc6, 0x2c, 0xa8, 0x3d, 0xcc, 0x2e, 0xbf, 0xec, 0xff, + 0x04, 0xe6, 0x9f, 0x8b, 0x2f, 0x0e, 0x79, 0xd6, 0x5f, 0x9b, 0xfc, 0x76, + 0x59, 0x7f, 0xda, 0x06, 0x9c, 0xbf, 0x80, 0x59, 0x53, 0xa7, 0x94, 0x32, + 0x9c, 0x33, 0xd4, 0x25, 0xce, 0x40, 0xe7, 0x40, 0x1f, 0x09, 0x35, 0xe1, + 0x35, 0x25, 0x97, 0xf0, 0x9f, 0x0c, 0x64, 0xeb, 0x2f, 0xe0, 0x79, 0xdb, + 0xc1, 0x59, 0x52, 0x3f, 0xa9, 0x87, 0xb4, 0x5f, 0x7f, 0xf7, 0x65, 0x1f, + 0x2c, 0xdf, 0x9a, 0x92, 0xcb, 0xf3, 0xf3, 0x93, 0xf1, 0x65, 0xee, 0x1d, + 0xd6, 0x5f, 0xe2, 0x34, 0x4f, 0x78, 0x3c, 0x59, 0x53, 0x1e, 0x90, 0x47, + 0x2f, 0xfe, 0x0f, 0x3c, 0xf2, 0x82, 0x1e, 0x79, 0x65, 0xff, 0x09, 0x00, + 0x9a, 0x51, 0xa9, 0xd6, 0x5f, 0xc4, 0xff, 0x12, 0x3b, 0x59, 0x47, 0x3e, + 0xa2, 0x3c, 0xbe, 0x20, 0x4e, 0x05, 0x97, 0xff, 0xfa, 0x6e, 0x30, 0xf6, + 0x4c, 0xc5, 0xbd, 0xe6, 0x7f, 0x86, 0x16, 0x56, 0x22, 0xa9, 0x88, 0x5c, + 0x8e, 0xff, 0x8f, 0xcd, 0x98, 0x38, 0x2f, 0xac, 0xbf, 0xdc, 0xd9, 0xfd, + 0x83, 0xc2, 0x59, 0x60, 0x2c, 0xae, 0x8f, 0x23, 0x46, 0xf5, 0x08, 0xa5, + 0x68, 0x41, 0x5f, 0xc1, 0xef, 0xd1, 0xac, 0x59, 0x7d, 0xd7, 0x3e, 0xcb, + 0x2b, 0x0f, 0x45, 0xcb, 0xaa, 0x15, 0xe9, 0xe1, 0x81, 0xa8, 0xac, 0xf7, + 0xa2, 0x3f, 0x46, 0xae, 0x50, 0xd2, 0xe3, 0xbd, 0xf9, 0xc2, 0x6c, 0x08, + 0xb2, 0xfc, 0x28, 0xcd, 0x47, 0x16, 0x54, 0xc7, 0xa8, 0x45, 0x37, 0xf6, + 0x7d, 0x87, 0x87, 0x59, 0x7c, 0x52, 0x63, 0xac, 0xb6, 0xc9, 0x8f, 0x35, + 0xcb, 0x2f, 0xe6, 0x2d, 0xef, 0x30, 0xaa, 0x59, 0x7f, 0x44, 0xdd, 0x4b, + 0x37, 0xac, 0xa9, 0x8f, 0x9b, 0x86, 0xb4, 0x34, 0x59, 0xbc, 0x24, 0x2f, + 0xff, 0xc3, 0xf4, 0x08, 0x2f, 0xe4, 0xe0, 0xe7, 0x20, 0x09, 0x2e, 0x1e, + 0x2c, 0xbf, 0x4f, 0x13, 0xbf, 0x16, 0x56, 0x22, 0x5d, 0x96, 0x1c, 0x5a, + 0xfe, 0xdd, 0x70, 0x1e, 0x38, 0xb2, 0xe8, 0x02, 0xcb, 0x05, 0x60, 0x85, + 0xb5, 0x78, 0xf9, 0xc0, 0x8d, 0x7f, 0xee, 0x6f, 0x79, 0xa7, 0x72, 0x79, + 0x96, 0x5f, 0xfa, 0x37, 0x66, 0x7d, 0xef, 0xfd, 0xf0, 0xb2, 0xff, 0xd8, + 0x38, 0x94, 0x68, 0xff, 0xe9, 0x65, 0xfc, 0xe0, 0x98, 0xa0, 0x6b, 0x2f, + 0xf8, 0xb2, 0x71, 0xfb, 0x0b, 0xeb, 0x2f, 0x7d, 0xb8, 0xb2, 0xa1, 0x36, + 0x99, 0x88, 0xb4, 0x84, 0x74, 0x5f, 0x1f, 0x91, 0x6f, 0x0e, 0x2b, 0x6a, + 0x75, 0x55, 0xbb, 0x41, 0x68, 0xa8, 0x7c, 0x2a, 0x8c, 0x76, 0x9c, 0x21, + 0x45, 0x59, 0x4c, 0x4e, 0x3d, 0x4a, 0x34, 0xf1, 0xca, 0x71, 0xc9, 0x69, + 0xc6, 0xc6, 0x27, 0xdc, 0x71, 0x9d, 0x43, 0xb5, 0xa1, 0x51, 0x34, 0xb7, + 0xdd, 0x4a, 0x87, 0x3c, 0x71, 0xfe, 0x95, 0xca, 0xf1, 0x86, 0x82, 0x32, + 0x12, 0x8c, 0x93, 0x92, 0x82, 0xbf, 0x39, 0x86, 0x18, 0x67, 0xef, 0x8c, + 0x8b, 0x6e, 0x17, 0xc2, 0x47, 0xfb, 0x7f, 0xf6, 0xb3, 0xae, 0xfc, 0xdf, + 0xe3, 0xf4, 0xb2, 0xf8, 0x02, 0x14, 0x96, 0x5d, 0xd8, 0xb0, 0x1f, 0x57, + 0xd1, 0xe8, 0x5a, 0xab, 0x80, 0xca, 0x87, 0xbe, 0x8d, 0x48, 0xeb, 0x2f, + 0xba, 0xe3, 0xee, 0x2c, 0xbf, 0x60, 0xc3, 0xfe, 0x2c, 0xbf, 0xcf, 0xe7, + 0x10, 0xf9, 0xc5, 0x97, 0x9f, 0x46, 0xac, 0xb0, 0xb9, 0xd1, 0x80, 0xc4, + 0x44, 0x4d, 0xbc, 0xa0, 0xc3, 0x3b, 0xfc, 0x2f, 0x35, 0xdb, 0xbf, 0x6a, + 0x8b, 0xcd, 0x50, 0xfd, 0x9c, 0x72, 0x79, 0x1c, 0x78, 0xf9, 0x6a, 0xd1, + 0x7a, 0xa5, 0x1a, 0xea, 0x55, 0xf9, 0xdf, 0x7d, 0x28, 0x64, 0xad, 0x72, + 0x7f, 0x21, 0xdd, 0xbd, 0x52, 0xff, 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, + 0x96, 0x5d, 0xb5, 0xed, 0x35, 0x97, 0x7e, 0x75, 0x97, 0xe6, 0x17, 0xcc, + 0x65, 0x97, 0xff, 0xef, 0x61, 0x61, 0xbe, 0x79, 0x78, 0xc7, 0x10, 0xeb, + 0x2f, 0xbb, 0x77, 0xed, 0x51, 0x61, 0x2a, 0x48, 0x87, 0xd2, 0xbd, 0xc3, + 0xc5, 0x97, 0x37, 0x4b, 0x2d, 0xf8, 0x35, 0xba, 0x16, 0xbf, 0xfe, 0xc2, + 0x1c, 0x7a, 0x3a, 0xfe, 0x13, 0x9d, 0x65, 0xe2, 0x0f, 0x6b, 0x2a, 0x0f, + 0xa9, 0xd3, 0x6d, 0xc5, 0x97, 0xf0, 0x74, 0xd3, 0xb9, 0xd6, 0x58, 0x5e, + 0xd3, 0x54, 0x51, 0x04, 0x43, 0x18, 0xc8, 0x57, 0xb2, 0x81, 0xe1, 0x21, + 0xc2, 0x0d, 0xb1, 0x1b, 0xfc, 0x2f, 0x35, 0xdb, 0xbf, 0x6a, 0x8b, 0x2d, + 0x69, 0x2c, 0xbb, 0x46, 0xac, 0xbe, 0x16, 0x6e, 0xd3, 0xda, 0x96, 0x52, + 0x4b, 0xc2, 0xc4, 0x3a, 0xca, 0xec, 0xf7, 0x38, 0x62, 0x10, 0xba, 0x35, + 0x16, 0xa4, 0x23, 0xc7, 0x4b, 0xa3, 0xcb, 0x2c, 0x05, 0x97, 0x1b, 0x3a, + 0xcb, 0x6a, 0x46, 0xab, 0x04, 0x6b, 0xb3, 0xe6, 0x74, 0x0b, 0x01, 0x65, + 0x8d, 0x59, 0x4c, 0x68, 0xfe, 0x23, 0x7f, 0xfe, 0x1b, 0x7f, 0xd8, 0x36, + 0xc1, 0xbc, 0xee, 0x4b, 0x2f, 0xf9, 0xfa, 0x2c, 0xeb, 0xf0, 0x6a, 0xcb, + 0xfd, 0x3f, 0x5c, 0x81, 0xfd, 0x96, 0x5f, 0xa3, 0x37, 0xc7, 0x16, 0x5a, + 0x1c, 0xf7, 0x4c, 0x35, 0xa8, 0x4c, 0x45, 0xd4, 0xca, 0x12, 0xf7, 0xcf, + 0x29, 0x0d, 0x65, 0xff, 0xda, 0xf3, 0x8c, 0xa0, 0x3d, 0xf9, 0xd6, 0x5f, + 0xb5, 0x1f, 0x7f, 0x2c, 0xa6, 0x3e, 0xb7, 0x44, 0xbc, 0x61, 0x86, 0x24, + 0xbf, 0xe8, 0x97, 0x5f, 0xd4, 0x67, 0x49, 0x05, 0x9a, 0x0b, 0xfe, 0x0b, + 0xf5, 0x9f, 0x6e, 0x8c, 0x59, 0x74, 0x71, 0x65, 0x0d, 0x36, 0xaf, 0x42, + 0x34, 0x90, 0x38, 0x99, 0xbc, 0xee, 0xed, 0xa7, 0xb5, 0x2c, 0xbf, 0x99, + 0xf8, 0x0e, 0x05, 0x65, 0xff, 0xcd, 0x27, 0xe3, 0x90, 0x7b, 0xce, 0x24, + 0xbf, 0xff, 0xbc, 0xdf, 0xf6, 0x70, 0xb0, 0xe1, 0xe7, 0x9e, 0x4b, 0x2f, + 0xf4, 0x4b, 0xef, 0xe7, 0x1a, 0xcb, 0xe7, 0xf9, 0xbc, 0x59, 0x50, 0x8f, + 0x2c, 0x43, 0xd2, 0xd3, 0x99, 0x5a, 0x4b, 0x2d, 0x25, 0x96, 0x92, 0xcb, + 0xc6, 0x18, 0x62, 0xcb, 0x76, 0x90, 0x59, 0xa0, 0xa8, 0x3f, 0x73, 0x44, + 0x58, 0x44, 0x06, 0x34, 0xb2, 0xfc, 0x1e, 0x79, 0xe4, 0xb3, 0x09, 0x77, + 0xff, 0xdc, 0x6e, 0xf0, 0xb5, 0x05, 0x83, 0xc3, 0x56, 0x51, 0xd1, 0x07, + 0xf3, 0x5b, 0x74, 0xb2, 0xc6, 0xac, 0xb0, 0x56, 0x51, 0x1a, 0x3e, 0x09, + 0x56, 0x1f, 0xc7, 0x08, 0xfe, 0x6b, 0x77, 0x0d, 0x59, 0x6c, 0x59, 0x70, + 0x41, 0x06, 0xa0, 0x63, 0x17, 0x34, 0x2c, 0xbf, 0x8a, 0x0e, 0x51, 0x8b, + 0x2f, 0xfe, 0x87, 0xd7, 0xfd, 0x83, 0x0f, 0xf8, 0xb2, 0xe9, 0x42, 0xcb, + 0xdc, 0x19, 0xab, 0x2a, 0x74, 0x71, 0x8c, 0xb2, 0x61, 0x5f, 0x15, 0x05, + 0x10, 0x41, 0x6b, 0xff, 0xd9, 0xd7, 0xc4, 0xfb, 0x7f, 0xd8, 0x36, 0x59, + 0x7f, 0xff, 0xfa, 0x3f, 0xc6, 0xe7, 0x23, 0xfe, 0x68, 0xd0, 0x0e, 0xf2, + 0x97, 0xcd, 0x59, 0x46, 0xa3, 0x0f, 0xc9, 0x77, 0x37, 0x4b, 0x2f, 0x02, + 0x5e, 0x59, 0x74, 0x1d, 0x65, 0xff, 0xfa, 0x08, 0x32, 0x94, 0x7f, 0xd8, + 0x71, 0x20, 0x0b, 0x2f, 0xfe, 0x69, 0xe3, 0xcd, 0x1f, 0xe0, 0x78, 0xb2, + 0xff, 0xe0, 0xcb, 0x39, 0xa8, 0x69, 0x3f, 0x12, 0x59, 0xb4, 0x88, 0x72, + 0x44, 0xa9, 0x26, 0x07, 0xf8, 0x6e, 0x5d, 0xd8, 0xb8, 0x65, 0x8e, 0xcf, + 0x09, 0x69, 0x22, 0x8e, 0x33, 0x1c, 0x8e, 0x74, 0xd5, 0x1e, 0xc8, 0xb5, + 0x18, 0xfb, 0xc2, 0xc4, 0xa3, 0x41, 0xe4, 0x67, 0x3f, 0x8c, 0x77, 0x79, + 0x21, 0x82, 0xfb, 0x63, 0xa2, 0x46, 0x33, 0x7f, 0xf8, 0x59, 0xde, 0x42, + 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0xa3, 0x17, 0xcd, 0xf7, 0xdb, 0x59, 0x7f, + 0x3e, 0x80, 0x78, 0x02, 0xcb, 0xe8, 0xd4, 0x01, 0x65, 0xfd, 0x03, 0x83, + 0xc0, 0x8b, 0x2a, 0x64, 0x4f, 0xf8, 0x93, 0x79, 0x68, 0x84, 0x37, 0xf1, + 0x3f, 0xfc, 0xd3, 0x2c, 0xbe, 0xcc, 0x26, 0x59, 0x7e, 0xf4, 0x4f, 0x83, + 0x59, 0x7e, 0x27, 0x04, 0x08, 0xb2, 0xff, 0x67, 0xf8, 0x24, 0xf1, 0x3a, + 0xcb, 0xff, 0x60, 0x33, 0x26, 0x31, 0xfa, 0xe2, 0xcb, 0xff, 0x37, 0x52, + 0xe1, 0x67, 0xfc, 0x15, 0x97, 0xfc, 0xda, 0xf6, 0x61, 0x4b, 0x8b, 0x2a, + 0x47, 0xed, 0xd9, 0xfd, 0xf3, 0xef, 0xc2, 0x59, 0x7f, 0xff, 0xd8, 0x7f, + 0x34, 0x7c, 0xb3, 0xfe, 0xc2, 0xc3, 0x1c, 0x0b, 0x2b, 0xa4, 0x54, 0x68, + 0x8f, 0xc4, 0x57, 0x6e, 0x6e, 0xac, 0xbf, 0xf3, 0xcb, 0xbf, 0x31, 0xe3, + 0x46, 0xac, 0xbf, 0xfb, 0x6d, 0xc8, 0x19, 0xf8, 0x26, 0x02, 0xcb, 0x0b, + 0x85, 0x68, 0x58, 0x82, 0x69, 0x6c, 0xc3, 0xfe, 0x28, 0x01, 0x39, 0x1b, + 0x7e, 0x35, 0xe0, 0x98, 0x98, 0x3a, 0x22, 0x05, 0x49, 0xb5, 0x17, 0xd4, + 0xa6, 0xb3, 0xc2, 0x2d, 0xe9, 0x82, 0xbc, 0x8c, 0x9b, 0xf3, 0x87, 0xb7, + 0xff, 0x0b, 0x79, 0x0b, 0xcd, 0x76, 0xef, 0xda, 0xa2, 0x39, 0x5f, 0xfe, + 0x16, 0x77, 0x90, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x27, 0x25, 0xfe, 0x17, + 0x9a, 0xed, 0xdf, 0xb5, 0x45, 0x98, 0xbb, 0xe0, 0x59, 0x7e, 0xcf, 0x16, + 0x69, 0x65, 0xe9, 0xe3, 0x4b, 0x2f, 0xd2, 0xe3, 0x9c, 0x5f, 0x8f, 0x68, + 0x85, 0xf8, 0x4d, 0x7c, 0x2a, 0xf6, 0xad, 0xa8, 0x55, 0xac, 0xbf, 0xc3, + 0xc3, 0xc7, 0x50, 0x75, 0x95, 0xb5, 0x1f, 0x60, 0xab, 0x39, 0xb6, 0xf5, + 0x97, 0xfb, 0x51, 0xff, 0x3f, 0x52, 0x59, 0x7f, 0xff, 0xfd, 0x13, 0x7a, + 0x3f, 0x02, 0x36, 0xa6, 0x8f, 0x66, 0xfc, 0xf6, 0x0f, 0x7e, 0x2c, 0xa0, + 0x22, 0xd4, 0x8d, 0x2f, 0xfb, 0x38, 0xff, 0x00, 0x85, 0x25, 0x96, 0x02, + 0xcb, 0xfb, 0x9a, 0xd6, 0x75, 0xc5, 0x95, 0xb5, 0x1e, 0x06, 0x08, 0xde, + 0xd6, 0x1d, 0x65, 0xf3, 0x16, 0x71, 0x65, 0xb3, 0xe6, 0xf3, 0x74, 0x72, + 0xff, 0xff, 0xde, 0x82, 0x0f, 0x39, 0x02, 0x7d, 0x88, 0x32, 0xce, 0x7d, + 0x96, 0x5f, 0x8b, 0x37, 0xe1, 0x2c, 0xbe, 0xff, 0xdb, 0x4b, 0x2e, 0xe0, + 0x16, 0x54, 0x91, 0x96, 0xcd, 0x7a, 0x27, 0xf9, 0x15, 0xbe, 0xb2, 0xdb, + 0xab, 0x2b, 0x6c, 0xd2, 0x88, 0x23, 0x79, 0xcb, 0xb5, 0x97, 0xb9, 0x1c, + 0x59, 0x76, 0xdf, 0x16, 0x5f, 0x9c, 0xc9, 0xf0, 0xc5, 0x95, 0x39, 0xe2, + 0x10, 0xd5, 0xc2, 0x8f, 0x2c, 0xb3, 0x2c, 0xbf, 0xd1, 0xc8, 0xfc, 0xf8, + 0x62, 0xcb, 0x31, 0xcf, 0x10, 0x84, 0x2e, 0xee, 0x4b, 0x2f, 0xdf, 0xe1, + 0x44, 0x96, 0x5f, 0x19, 0xf8, 0x35, 0x65, 0x41, 0xf1, 0xe0, 0xc3, 0x13, + 0xdf, 0xf8, 0x87, 0xe8, 0xe7, 0x33, 0x50, 0xb2, 0xe0, 0x3a, 0xcb, 0xd1, + 0x84, 0xb2, 0xfb, 0xaf, 0xe4, 0x2c, 0xa1, 0x9b, 0xcc, 0x1a, 0xb0, 0x8b, + 0x2f, 0xff, 0x77, 0x1c, 0xe6, 0x1f, 0xaf, 0x84, 0xbe, 0xb2, 0xb6, 0x1e, + 0xf6, 0x09, 0x5f, 0xce, 0x5f, 0xdb, 0x73, 0x56, 0x5f, 0xbb, 0xf3, 0xb0, + 0xad, 0x65, 0xf8, 0x3c, 0x8e, 0x42, 0xca, 0xd1, 0xe9, 0xb9, 0x65, 0xfc, + 0x40, 0xf6, 0x01, 0xd6, 0x5f, 0x14, 0x6f, 0x0a, 0xca, 0x63, 0xcf, 0x72, + 0xcb, 0xba, 0x3a, 0xca, 0x59, 0x7f, 0xc4, 0x0c, 0xfc, 0x13, 0x01, 0x65, + 0xb6, 0xf0, 0xf0, 0x5c, 0x2e, 0xf1, 0x06, 0x65, 0x96, 0x17, 0xb5, 0x32, + 0x00, 0x05, 0x25, 0xb1, 0x0c, 0x89, 0xc8, 0xa4, 0xf2, 0x36, 0x2c, 0x87, + 0xa1, 0xac, 0x3d, 0x92, 0xf4, 0x39, 0x33, 0x06, 0x88, 0x8e, 0xbf, 0xe8, + 0x44, 0xb9, 0x60, 0xac, 0xf4, 0x94, 0xb8, 0xfd, 0xf2, 0x30, 0xc2, 0x0f, + 0x7b, 0x86, 0xd9, 0x00, 0x8b, 0x3b, 0xa5, 0x37, 0xed, 0x76, 0xef, 0xda, + 0xa2, 0xdd, 0x5b, 0x8b, 0x2b, 0x0f, 0x1c, 0x06, 0xd7, 0xe1, 0x63, 0xf4, + 0x69, 0x65, 0x0b, 0x3c, 0xbf, 0x10, 0xdf, 0x98, 0x1c, 0xcd, 0xd5, 0x97, + 0xf1, 0x38, 0xbd, 0x4f, 0xe5, 0x97, 0x9b, 0xa0, 0x2c, 0xbf, 0x75, 0x2f, + 0x30, 0x16, 0x5f, 0xfd, 0xa7, 0xec, 0x01, 0xe7, 0xe3, 0xa3, 0x16, 0x5c, + 0x46, 0xac, 0xb3, 0xac, 0xbe, 0xed, 0xdf, 0xb5, 0x45, 0x20, 0xac, 0x3d, + 0x79, 0x85, 0xf4, 0x21, 0x7f, 0xa5, 0xf6, 0x33, 0x80, 0x65, 0x97, 0xfe, + 0xcf, 0x36, 0xff, 0x66, 0x17, 0x6b, 0x2f, 0xec, 0xf6, 0x79, 0x8d, 0x59, + 0x7e, 0xfc, 0x6f, 0x6d, 0xeb, 0x2f, 0x3c, 0x85, 0xc2, 0x78, 0x43, 0x29, + 0xc8, 0x4f, 0xf4, 0x5f, 0xc3, 0x4f, 0x9f, 0xef, 0x2d, 0xbe, 0xce, 0x78, + 0x2b, 0x2f, 0xe8, 0x2e, 0x71, 0x8e, 0xb2, 0xb0, 0xf3, 0x98, 0x8a, 0xff, + 0x30, 0xc3, 0xfe, 0x1c, 0x96, 0x5f, 0x18, 0x78, 0xe2, 0xcb, 0xce, 0x52, + 0x59, 0x61, 0x70, 0xae, 0x5b, 0xb2, 0xad, 0x18, 0x1e, 0x3d, 0xff, 0x43, + 0x31, 0xc8, 0x02, 0x66, 0x61, 0x1d, 0xff, 0xc2, 0xde, 0x42, 0xf3, 0x5d, + 0xbb, 0xf6, 0xa8, 0x94, 0x95, 0x3b, 0x61, 0x51, 0x32, 0xb1, 0xd7, 0x1e, + 0x13, 0xa0, 0xa4, 0x5c, 0x94, 0xa0, 0xaf, 0xcb, 0xba, 0xdd, 0x84, 0x35, + 0xe1, 0x6f, 0xda, 0xcb, 0xf9, 0x8b, 0x3d, 0x9d, 0xac, 0xbf, 0x98, 0xbf, + 0x8c, 0x35, 0x97, 0x4b, 0xeb, 0x2f, 0x14, 0x18, 0xb2, 0xe8, 0x17, 0xa3, + 0x66, 0x42, 0xf5, 0x24, 0x45, 0xfd, 0x7a, 0xf7, 0x02, 0x75, 0x96, 0xda, + 0xd6, 0x58, 0x5c, 0x93, 0x0d, 0xea, 0x16, 0xec, 0x47, 0xb6, 0x3b, 0x78, + 0x9e, 0x4b, 0x2f, 0xc2, 0x81, 0x4e, 0xb9, 0xc5, 0x97, 0xff, 0x9b, 0xa0, + 0x6b, 0x07, 0x1a, 0x6e, 0x80, 0xb2, 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x4e, + 0xcb, 0xfa, 0x77, 0xd7, 0x7a, 0xc5, 0x97, 0xbc, 0xe6, 0x2c, 0xbf, 0xe2, + 0x79, 0x04, 0x07, 0x79, 0x2c, 0xb6, 0x0c, 0xf5, 0x7c, 0x3b, 0x79, 0xe4, + 0x2c, 0x55, 0x26, 0xbb, 0x06, 0x38, 0x96, 0xe6, 0xc5, 0x08, 0x4b, 0xa7, + 0xdc, 0x59, 0x7f, 0xfe, 0x61, 0x84, 0xf1, 0xba, 0xe3, 0x28, 0x2c, 0xed, + 0x65, 0xfe, 0x94, 0x6a, 0x78, 0xd4, 0xeb, 0x2f, 0xfd, 0xe2, 0x79, 0x04, + 0x07, 0x79, 0x2c, 0xa8, 0x3f, 0x3c, 0x35, 0xbf, 0xff, 0x67, 0x52, 0xf4, + 0x71, 0xf5, 0x1b, 0xbe, 0x7e, 0xd6, 0x58, 0x5e, 0x2b, 0x3a, 0x3c, 0x6f, + 0x1e, 0x65, 0x71, 0xb2, 0x86, 0x4e, 0xe9, 0x05, 0xf3, 0x6a, 0x37, 0xac, + 0xbb, 0x3c, 0xb2, 0xff, 0xed, 0xb7, 0x20, 0x67, 0xe0, 0x98, 0x0b, 0x2c, + 0x2f, 0x87, 0xfb, 0xb6, 0x46, 0x20, 0xb5, 0xff, 0xce, 0x7f, 0x67, 0x6f, + 0xe8, 0x12, 0x4b, 0x2f, 0xdf, 0xd6, 0x41, 0x8b, 0x2f, 0x30, 0xdd, 0x65, + 0xff, 0xc5, 0x9e, 0x79, 0xf3, 0x84, 0xfd, 0x2c, 0xbb, 0x6c, 0x58, 0xd1, + 0x96, 0xc8, 0xbe, 0x28, 0xe0, 0xdd, 0x42, 0xf7, 0x84, 0xa3, 0x2c, 0x3c, + 0xb8, 0x8e, 0x43, 0xa7, 0x6e, 0x30, 0x6b, 0xff, 0x72, 0x0b, 0xa0, 0x73, + 0x90, 0x05, 0x97, 0xff, 0xff, 0xfd, 0xe6, 0xfb, 0xbf, 0x5c, 0xe7, 0x20, + 0xf1, 0xec, 0xc9, 0xf0, 0xb3, 0xaf, 0xf2, 0x3a, 0x59, 0x7f, 0xa2, 0x4d, + 0xf6, 0x29, 0x2c, 0xbf, 0xff, 0xf7, 0x61, 0x9f, 0x37, 0xc7, 0x58, 0x37, + 0x90, 0x87, 0xe6, 0x38, 0xd6, 0x5f, 0x0d, 0xfe, 0x2f, 0x13, 0x75, 0xec, + 0xff, 0x50, 0x94, 0xe1, 0x8d, 0xff, 0xd3, 0x75, 0xc6, 0x3e, 0xc1, 0x35, + 0x93, 0xac, 0xbe, 0xed, 0xdf, 0xb5, 0x44, 0x58, 0xbf, 0x9b, 0x4e, 0x5d, + 0xc2, 0xca, 0xd1, 0xee, 0x78, 0xc2, 0xfb, 0x3e, 0x06, 0x59, 0x7f, 0xe7, + 0x90, 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x25, 0xd5, 0xfe, 0x71, 0xc1, 0x7a, + 0x38, 0xb2, 0xfb, 0x4c, 0x19, 0xd6, 0x5f, 0xff, 0xd8, 0x3f, 0x40, 0x82, + 0xfe, 0x4e, 0x0e, 0x72, 0x00, 0x92, 0xc2, 0xe1, 0x3e, 0x9c, 0x85, 0x3e, + 0x88, 0x8e, 0x43, 0xe4, 0xef, 0x98, 0xed, 0x91, 0xdf, 0xfc, 0x77, 0x90, + 0xbc, 0xd7, 0x6e, 0xfd, 0xaa, 0x26, 0x25, 0xfd, 0xe8, 0x2e, 0xa6, 0x75, + 0x97, 0xf9, 0xdb, 0x6d, 0x81, 0x83, 0x59, 0x7d, 0x9d, 0xc0, 0xb8, 0x3e, + 0x2f, 0x17, 0x50, 0xb4, 0x78, 0x7a, 0x16, 0xd7, 0xfb, 0xce, 0x71, 0x6e, + 0x11, 0xac, 0xbf, 0x6b, 0xb7, 0x7e, 0xd5, 0x15, 0x4a, 0xd8, 0xb2, 0xb0, + 0xf1, 0x8d, 0x36, 0xbf, 0xed, 0x69, 0x88, 0xb0, 0x3d, 0xac, 0xbf, 0xf0, + 0x5f, 0x52, 0x2c, 0x31, 0xc0, 0xb2, 0xff, 0xe7, 0xe6, 0x98, 0xcf, 0xf9, + 0xb5, 0x25, 0x97, 0xfd, 0xa7, 0xf7, 0x52, 0xcf, 0x8b, 0x84, 0x5d, 0x8c, + 0xe3, 0xc7, 0xd4, 0x2d, 0x33, 0xd7, 0x86, 0xed, 0xff, 0x85, 0xfa, 0x0f, + 0x83, 0x82, 0xfa, 0xcb, 0xdf, 0x69, 0xd6, 0x5f, 0xf9, 0xe4, 0x2f, 0x35, + 0xdb, 0xbf, 0x6a, 0x89, 0xd1, 0x7c, 0x1e, 0x30, 0x16, 0x5e, 0x6e, 0x8c, + 0x59, 0x40, 0x3c, 0x0e, 0x11, 0x51, 0xa8, 0xcd, 0x38, 0xe8, 0x21, 0x1d, + 0x7c, 0xe5, 0xfe, 0x2c, 0xbe, 0x9c, 0xa2, 0x75, 0x97, 0xc7, 0x83, 0x45, + 0x9c, 0xf1, 0x02, 0x43, 0x7f, 0xe0, 0x07, 0x82, 0xc6, 0x63, 0x94, 0x96, + 0x50, 0xb4, 0x7c, 0x33, 0xd0, 0x0f, 0x2f, 0xf3, 0x3e, 0xa2, 0x4f, 0xbd, + 0x65, 0xf3, 0x10, 0x19, 0x65, 0xfa, 0x68, 0x9a, 0x38, 0xb2, 0xfe, 0x33, + 0x1b, 0x7e, 0x12, 0xca, 0x63, 0xd7, 0xe1, 0x4d, 0xe6, 0xf4, 0x2c, 0x16, + 0x68, 0x6f, 0xfe, 0x0f, 0x3f, 0x1d, 0x0b, 0x0c, 0xcc, 0x75, 0x95, 0x24, + 0xc3, 0x8f, 0x09, 0x8f, 0x16, 0xdf, 0xb5, 0xdb, 0xbf, 0x6a, 0x89, 0xdd, + 0x7f, 0xff, 0x41, 0xc3, 0xa9, 0xa0, 0xfb, 0x0f, 0x9f, 0xe3, 0x71, 0x65, + 0xe7, 0x90, 0xbc, 0x44, 0xa7, 0xcd, 0xaf, 0xdf, 0x0b, 0x9d, 0x92, 0x5f, + 0xf8, 0xa3, 0xf9, 0xcc, 0xce, 0xa4, 0xb2, 0x86, 0xaa, 0x93, 0x23, 0x41, + 0x3c, 0x32, 0x9c, 0xd7, 0xe4, 0xf7, 0xfc, 0x38, 0x94, 0x0b, 0x33, 0x80, + 0x59, 0x7e, 0xe1, 0x40, 0x38, 0xb2, 0xf1, 0x60, 0xd6, 0x5d, 0x02, 0xe0, + 0xf0, 0x80, 0x4f, 0x42, 0xd3, 0x01, 0xc5, 0x52, 0x7e, 0xbf, 0x70, 0x5f, + 0x7f, 0x85, 0x97, 0xff, 0x85, 0x9d, 0xe4, 0x2f, 0x35, 0xdb, 0xbf, 0x6a, + 0x8a, 0x15, 0x7f, 0xfc, 0xff, 0x96, 0x13, 0x0c, 0x5f, 0x27, 0x8d, 0x2c, + 0xbe, 0x27, 0xd6, 0xf5, 0x97, 0x8e, 0xe6, 0x2c, 0xb0, 0xb8, 0x3c, 0x09, + 0xc8, 0xee, 0x9d, 0x96, 0x5f, 0xfe, 0xf0, 0x7f, 0x05, 0x93, 0x9a, 0x18, + 0x99, 0x65, 0xfc, 0x13, 0x9d, 0xe4, 0x2e, 0x0f, 0x8f, 0xb1, 0x7b, 0xff, + 0xff, 0x16, 0x6f, 0x6f, 0x04, 0x5f, 0x7e, 0x6f, 0x14, 0x66, 0xb0, 0xeb, + 0x2a, 0x49, 0xa1, 0x7a, 0x11, 0xbc, 0x47, 0xbf, 0x07, 0xaf, 0xb7, 0x6b, + 0x2f, 0xd8, 0x0c, 0x72, 0x59, 0x7d, 0xc6, 0x33, 0xeb, 0x2f, 0x40, 0x05, + 0xce, 0x7e, 0x44, 0x55, 0xf2, 0x5a, 0x64, 0x75, 0x14, 0x2a, 0x2f, 0xf8, + 0xef, 0xcc, 0x32, 0x08, 0x6b, 0x2f, 0xfc, 0xf2, 0x17, 0x9a, 0xed, 0xdf, + 0xb5, 0x45, 0x24, 0xbf, 0xd9, 0xe2, 0xc1, 0xf8, 0x2b, 0x2f, 0x41, 0x0d, + 0x65, 0x85, 0xe2, 0x34, 0xce, 0x71, 0xf4, 0xe3, 0x0c, 0xaf, 0xff, 0xfb, + 0x08, 0x3c, 0x8c, 0x2f, 0x93, 0x9b, 0x93, 0x41, 0x0d, 0x65, 0xc7, 0x25, + 0x97, 0xff, 0x4d, 0xe7, 0x3f, 0xfd, 0x1f, 0x09, 0xd6, 0x5f, 0x61, 0x44, + 0xeb, 0x2b, 0x0f, 0x9f, 0x48, 0xd7, 0xb3, 0x82, 0xc9, 0x30, 0x1e, 0x31, + 0x88, 0xfb, 0x50, 0xd8, 0xc3, 0x4f, 0x29, 0x16, 0x51, 0xb1, 0xe1, 0x57, + 0x71, 0xdc, 0x4c, 0x55, 0xa9, 0x40, 0x87, 0x97, 0xac, 0xe6, 0x20, 0x2b, + 0x25, 0xcf, 0xca, 0xbd, 0x0c, 0x3e, 0x76, 0xe3, 0x46, 0xbe, 0xed, 0xdf, + 0xb5, 0x44, 0x48, 0xbf, 0xff, 0x36, 0xbc, 0xfb, 0x26, 0xf4, 0x4e, 0x2b, + 0xd4, 0x6d, 0xac, 0xad, 0x22, 0x43, 0xc6, 0x17, 0xff, 0xfb, 0xd1, 0x38, + 0xaf, 0x51, 0xb6, 0x2f, 0x4d, 0x07, 0x9f, 0x0c, 0x59, 0x61, 0x78, 0x88, + 0xf9, 0x88, 0xef, 0x69, 0xf4, 0xb2, 0xff, 0xcf, 0x21, 0x79, 0xae, 0xdd, + 0xfb, 0x54, 0x4b, 0xcb, 0xe7, 0xfb, 0xce, 0xb2, 0xc2, 0xd9, 0x11, 0x87, + 0x1c, 0xdb, 0x4e, 0xbf, 0xfa, 0x37, 0xbc, 0xcd, 0xae, 0xa5, 0x13, 0x2c, + 0xbd, 0xb5, 0x1c, 0x0b, 0x2e, 0x98, 0x96, 0x5f, 0xf8, 0x54, 0x76, 0x18, + 0x60, 0xa2, 0x4b, 0x2f, 0xfb, 0x64, 0x7d, 0xb5, 0x1b, 0xe6, 0x59, 0x7f, + 0xfb, 0xd1, 0xc1, 0x07, 0x1a, 0x9b, 0x08, 0x0b, 0x2f, 0xb4, 0x1f, 0xf1, + 0x65, 0xfc, 0x36, 0x35, 0xc8, 0x0b, 0x2f, 0xd0, 0x40, 0x19, 0xd6, 0x5f, + 0xb4, 0x03, 0xb7, 0x16, 0x5e, 0x82, 0xe9, 0x65, 0xfb, 0xe2, 0x1c, 0xa1, + 0x65, 0x9b, 0xc7, 0x88, 0x43, 0x97, 0xff, 0xbd, 0xbe, 0x08, 0x1b, 0x98, + 0x3c, 0xd7, 0x4b, 0x2f, 0xf3, 0x69, 0xc6, 0xc4, 0x6a, 0xcb, 0xa3, 0xeb, + 0x2f, 0xf9, 0xe7, 0xd4, 0x75, 0x26, 0x3a, 0xcb, 0xff, 0xc1, 0x1b, 0x68, + 0x49, 0xb7, 0x42, 0xe5, 0x32, 0xca, 0x92, 0x68, 0xec, 0x4d, 0xe4, 0xf0, + 0x19, 0x10, 0xb7, 0x0e, 0xaf, 0xe0, 0x7a, 0x34, 0xc7, 0x59, 0x7f, 0xe9, + 0xb9, 0x1b, 0xdf, 0xd1, 0xd4, 0xcb, 0x2a, 0x0f, 0xc1, 0xcb, 0x6f, 0x6e, + 0x88, 0x75, 0x97, 0x78, 0x0b, 0x29, 0x8d, 0xc3, 0x90, 0xdf, 0xb2, 0x7c, + 0xe1, 0xd6, 0x5f, 0xb5, 0x1f, 0x6d, 0xeb, 0x2f, 0xd3, 0xbf, 0x1c, 0x0b, + 0x29, 0x8f, 0x45, 0xca, 0x6f, 0xfe, 0x9b, 0x60, 0x85, 0x1b, 0xdf, 0x7c, + 0x4c, 0xb2, 0x96, 0x5f, 0x7f, 0x35, 0x32, 0xcb, 0xdf, 0x7d, 0xeb, 0x2d, + 0x2c, 0x3c, 0x17, 0x23, 0xbf, 0x3f, 0x23, 0x7e, 0x2c, 0xa9, 0x8f, 0x3b, + 0x79, 0x35, 0x42, 0x61, 0x78, 0x98, 0xf0, 0x9a, 0xbb, 0x50, 0xb2, 0xb6, + 0xa5, 0xdd, 0xc9, 0x1e, 0x8d, 0x2f, 0x08, 0xfa, 0x2d, 0x62, 0x79, 0xa3, + 0xb3, 0xd4, 0x31, 0xbc, 0xb0, 0x43, 0xff, 0x79, 0xdf, 0x19, 0x5e, 0xe9, + 0x9d, 0xd8, 0x4b, 0x2f, 0xed, 0x9c, 0xf6, 0x37, 0xd6, 0x50, 0xcf, 0x11, + 0x85, 0x6d, 0xd2, 0xcb, 0xfe, 0x03, 0xfe, 0x70, 0xcd, 0x1b, 0x8b, 0x28, + 0x67, 0xa0, 0xc2, 0x57, 0xf1, 0x07, 0xf3, 0x41, 0xab, 0x2f, 0x0a, 0xdb, + 0x4b, 0x29, 0xcf, 0x3c, 0x25, 0xf7, 0xff, 0x63, 0x75, 0xcf, 0xc4, 0xe7, + 0x79, 0x2c, 0xa6, 0x3e, 0x6d, 0x10, 0xdf, 0xe0, 0xff, 0xc5, 0x19, 0xa5, + 0x97, 0xe2, 0xc9, 0xc4, 0xde, 0xb2, 0xfb, 0x27, 0x13, 0x7a, 0xcb, 0xf0, + 0xe3, 0xa1, 0xbe, 0xc3, 0xd1, 0x22, 0xbb, 0xff, 0xe6, 0xd6, 0xcf, 0x43, + 0x7f, 0x81, 0xec, 0x30, 0xb2, 0xf9, 0xa7, 0x06, 0xe2, 0xcb, 0x74, 0xb2, + 0xf3, 0xbf, 0x6a, 0x8a, 0x5d, 0x4b, 0x2b, 0x0f, 0x1b, 0xb1, 0x29, 0x8a, + 0x6f, 0x8b, 0xf1, 0xa5, 0x97, 0xfd, 0x9a, 0xdc, 0xc1, 0xe6, 0xba, 0x59, + 0x4c, 0x7b, 0xbb, 0xc8, 0x6f, 0xfd, 0x12, 0xf3, 0xb7, 0x5c, 0x83, 0x56, + 0x54, 0xea, 0x9c, 0x25, 0x08, 0x33, 0x50, 0x26, 0x52, 0xd3, 0x67, 0xa1, + 0x1a, 0x44, 0x77, 0xff, 0xcf, 0xa9, 0xf6, 0x6f, 0x0f, 0xa1, 0x8f, 0x03, + 0x59, 0x7a, 0x35, 0xf5, 0x97, 0xf0, 0xfa, 0x8d, 0x37, 0x4b, 0x2f, 0xbf, + 0x3e, 0x18, 0xb2, 0xa4, 0x7d, 0xec, 0x38, 0x45, 0xf7, 0xe6, 0x37, 0x59, + 0xc5, 0x97, 0xfe, 0x82, 0x8f, 0x6c, 0x09, 0x07, 0xb5, 0x97, 0x82, 0xfc, + 0x59, 0x7d, 0x30, 0x5e, 0x65, 0x97, 0xe8, 0x03, 0xf5, 0xc5, 0x97, 0x89, + 0x80, 0xb2, 0xf6, 0x7f, 0x8b, 0x2a, 0x0d, 0xbf, 0x06, 0xea, 0x49, 0x93, + 0x8c, 0xa2, 0x64, 0x0f, 0x0e, 0x00, 0x93, 0xeb, 0xf7, 0xed, 0xc7, 0x21, + 0xee, 0xac, 0xa5, 0x97, 0xee, 0x7f, 0x51, 0xc5, 0x96, 0x8e, 0x8d, 0x9f, + 0xc2, 0xef, 0xf8, 0x1c, 0xd4, 0x75, 0x26, 0x3a, 0xcb, 0xdf, 0x7d, 0xeb, + 0x2f, 0xd3, 0x86, 0x68, 0xdc, 0x59, 0x7c, 0x19, 0xa3, 0x71, 0x65, 0xcf, + 0x3e, 0xc3, 0xd3, 0x9c, 0xb6, 0xa1, 0x1b, 0x8e, 0x74, 0x17, 0x1b, 0xfe, + 0x86, 0x07, 0x20, 0xef, 0xf5, 0x97, 0xfc, 0xdc, 0x99, 0x8b, 0xf0, 0x05, + 0x97, 0xff, 0x17, 0xf7, 0xc6, 0xb8, 0xe5, 0x1b, 0x8b, 0x2f, 0xe7, 0x69, + 0xf6, 0x1f, 0x16, 0x54, 0x93, 0x13, 0xd1, 0x71, 0xcd, 0xf8, 0x71, 0xf4, + 0x7b, 0xfd, 0x1b, 0x9c, 0x83, 0xbf, 0xd6, 0x5c, 0xe4, 0xb2, 0xff, 0xa0, + 0x1b, 0x3d, 0x07, 0x72, 0x59, 0x5d, 0x1e, 0x76, 0xf1, 0x5b, 0xff, 0xec, + 0x18, 0x93, 0x73, 0xfe, 0xc1, 0x87, 0xfc, 0x59, 0x52, 0x47, 0xde, 0xa1, + 0x07, 0xe2, 0x5b, 0xfa, 0x0c, 0x6f, 0x07, 0x71, 0x65, 0xfd, 0xd4, 0xb8, + 0xe5, 0xd2, 0xca, 0x85, 0xc5, 0x19, 0x30, 0x64, 0xa1, 0x66, 0x8d, 0x1b, + 0x46, 0xa2, 0x18, 0xdf, 0xf8, 0xa6, 0xd9, 0xa8, 0xea, 0x4c, 0x75, 0x97, + 0xff, 0xb7, 0xc1, 0x7f, 0xfe, 0xc1, 0x87, 0xfc, 0x59, 0x74, 0x1d, 0x65, + 0x42, 0x29, 0x31, 0x0b, 0x49, 0x97, 0xe2, 0x9b, 0xec, 0x6a, 0xcb, 0xf3, + 0x0c, 0x25, 0x8b, 0x2f, 0xfe, 0xff, 0xb2, 0x5b, 0x20, 0x7e, 0x7e, 0x96, + 0x54, 0xc7, 0xda, 0x44, 0xd5, 0x08, 0xb8, 0x0c, 0x25, 0xaf, 0xfa, 0x59, + 0xa9, 0xb0, 0xa0, 0xeb, 0x2f, 0xc0, 0x8e, 0xf0, 0xeb, 0x2f, 0xf6, 0x4f, + 0xc8, 0x98, 0x3a, 0x59, 0x7e, 0x3e, 0x3b, 0x4e, 0xb2, 0x99, 0x17, 0x9a, + 0x38, 0x22, 0x8e, 0x1a, 0xdd, 0x2c, 0x59, 0x7e, 0xe1, 0xba, 0x73, 0x16, + 0x5e, 0x28, 0x3a, 0xca, 0x19, 0xe2, 0xe8, 0xaa, 0xfb, 0xad, 0xcc, 0x92, + 0xcb, 0xfc, 0xfa, 0x9b, 0x3f, 0xbb, 0xbd, 0x65, 0xe8, 0x07, 0x16, 0x54, + 0x26, 0x66, 0x33, 0xbc, 0x5b, 0x72, 0x20, 0x93, 0x18, 0x73, 0x7c, 0xfe, + 0x79, 0xd6, 0x5f, 0xbc, 0x13, 0x70, 0x96, 0x5e, 0x31, 0xe4, 0xb2, 0xff, + 0x18, 0x4f, 0xf9, 0x38, 0xd6, 0x5f, 0xbe, 0x24, 0xf1, 0xe5, 0x97, 0xfd, + 0x1e, 0xe3, 0xfe, 0x35, 0xba, 0xb2, 0xff, 0xc7, 0x71, 0x89, 0x34, 0xa0, + 0xba, 0x59, 0x43, 0x3f, 0xc6, 0x3b, 0xbf, 0x83, 0xe8, 0xd6, 0x01, 0x65, + 0xf6, 0x80, 0x26, 0xf5, 0x97, 0x98, 0xcf, 0xac, 0xa9, 0x1f, 0x87, 0x8b, + 0x78, 0x4d, 0x53, 0xaa, 0x00, 0x19, 0x16, 0x14, 0x74, 0x3b, 0x31, 0x9f, + 0xa1, 0x4d, 0xf8, 0x48, 0xdf, 0xe2, 0xfe, 0x71, 0x9f, 0xcb, 0x2f, 0xb9, + 0x2e, 0x3a, 0xcb, 0xfe, 0x03, 0x7b, 0x34, 0xf3, 0x71, 0x65, 0xff, 0xf4, + 0x8a, 0x27, 0x12, 0x6e, 0x7b, 0x37, 0x74, 0x05, 0x97, 0xa4, 0x3d, 0xeb, + 0x2a, 0x0f, 0xd5, 0xd5, 0xaf, 0xed, 0x87, 0xcf, 0xbf, 0xd6, 0x5f, 0xde, + 0x61, 0xb6, 0xbb, 0x59, 0x6e, 0xd6, 0x5b, 0x98, 0x7d, 0xfd, 0x97, 0xb9, + 0x75, 0xee, 0xa6, 0xe2, 0xca, 0xe8, 0xf4, 0xdc, 0xd2, 0xf4, 0x30, 0xd6, + 0x5f, 0xe9, 0xbc, 0xdf, 0x28, 0x3a, 0xca, 0x85, 0x4a, 0x63, 0x31, 0xe8, + 0x88, 0xf0, 0xae, 0x78, 0x71, 0x70, 0x88, 0x23, 0x77, 0xfb, 0x0c, 0x93, + 0x70, 0x27, 0x59, 0x76, 0xfe, 0x2c, 0xbf, 0x83, 0xc8, 0x98, 0x3a, 0x59, + 0x7e, 0xc9, 0xf3, 0xdc, 0x59, 0x50, 0x7e, 0x1e, 0x19, 0x22, 0xfb, 0xe3, + 0x86, 0x6d, 0x2c, 0xbd, 0x9a, 0xe2, 0xca, 0xec, 0xfb, 0x4e, 0x5b, 0xbc, + 0x92, 0xff, 0x81, 0x00, 0x13, 0x7c, 0x16, 0xea, 0xcb, 0xff, 0xf4, 0xf1, + 0xf8, 0xf3, 0x7e, 0x4d, 0xae, 0xfd, 0x0b, 0x2a, 0x13, 0xd7, 0xc8, 0xc4, + 0x58, 0xc9, 0xcf, 0xaf, 0xff, 0xfb, 0x5d, 0x76, 0xdd, 0x6c, 0x35, 0xf6, + 0x73, 0xcf, 0xdc, 0x10, 0xd6, 0x5f, 0xf3, 0xf0, 0x4f, 0xf5, 0xdb, 0x1d, + 0x65, 0xbd, 0x08, 0xab, 0x0b, 0x7d, 0xf3, 0x1b, 0xb7, 0x8b, 0x2f, 0xe1, + 0x3f, 0x13, 0x97, 0x4b, 0x2f, 0xff, 0xbb, 0xf3, 0xcc, 0x24, 0xd2, 0x62, + 0xc3, 0xc2, 0xcb, 0xc4, 0xc7, 0x59, 0x5a, 0x46, 0x10, 0x09, 0x48, 0xc3, + 0xea, 0x57, 0xff, 0x7f, 0x82, 0x73, 0x08, 0x3f, 0x8f, 0x2c, 0xbf, 0xa1, + 0xcb, 0xf8, 0x4b, 0x2b, 0x0f, 0xbc, 0x91, 0x6f, 0xf4, 0x75, 0xcd, 0xc8, + 0xd1, 0xab, 0x2f, 0xf7, 0x9e, 0x66, 0xd4, 0x4e, 0xb2, 0xfd, 0xba, 0x78, + 0xcf, 0xac, 0xbf, 0xf8, 0x4f, 0xca, 0x06, 0xe5, 0x9f, 0x02, 0xca, 0xc3, + 0xee, 0xd1, 0x55, 0xd8, 0x75, 0x94, 0x35, 0x58, 0xd9, 0x0e, 0xa3, 0xc2, + 0xaf, 0xc4, 0x0e, 0x70, 0x18, 0x51, 0x6f, 0x21, 0xbf, 0x6e, 0xb1, 0xe3, + 0x8b, 0x2f, 0xcf, 0xbf, 0x35, 0xc5, 0x97, 0xe9, 0xc4, 0xde, 0xf2, 0x59, + 0x43, 0x3f, 0xf3, 0x95, 0x11, 0x4d, 0x8c, 0x59, 0x7e, 0xf3, 0x93, 0x1d, + 0x65, 0xf1, 0xb3, 0x72, 0x16, 0x5f, 0xf4, 0x7f, 0xcf, 0x33, 0xcd, 0x8b, + 0x2f, 0xe0, 0x74, 0x0c, 0xd6, 0x2c, 0xbf, 0xbb, 0x86, 0xfb, 0x49, 0x65, + 0xe8, 0xcf, 0xac, 0xbf, 0x66, 0xb4, 0x19, 0xd6, 0x5c, 0xe0, 0x39, 0xe2, + 0x7c, 0x6e, 0xa1, 0x19, 0x98, 0x5c, 0xce, 0x37, 0xc3, 0xf3, 0xf4, 0xb2, + 0xfe, 0x07, 0x23, 0xd1, 0xc5, 0x95, 0x07, 0xa0, 0xe4, 0x77, 0xdf, 0xe6, + 0x4e, 0xb2, 0xff, 0xff, 0x79, 0xb7, 0xb8, 0x1a, 0x51, 0xbd, 0xcf, 0x1e, + 0xdd, 0x75, 0x95, 0xd2, 0x22, 0x3c, 0x47, 0x76, 0x4e, 0xb2, 0x9c, 0xdd, + 0x91, 0x25, 0x42, 0xb0, 0xe1, 0x97, 0x60, 0x93, 0x13, 0x4c, 0x49, 0xe8, + 0xc1, 0x49, 0xf7, 0x90, 0xe3, 0xbf, 0xff, 0xde, 0xed, 0xb9, 0x83, 0xef, + 0xcd, 0xfc, 0x98, 0xa0, 0xeb, 0x2e, 0x07, 0x6b, 0x2d, 0xc5, 0x97, 0x31, + 0xbc, 0x35, 0x21, 0x18, 0xbc, 0x07, 0xed, 0x65, 0xf1, 0x93, 0x72, 0x16, + 0x5f, 0x3c, 0xf1, 0xf5, 0x97, 0xe7, 0x26, 0xdc, 0xde, 0xb2, 0xdc, 0x23, + 0xcd, 0xde, 0x45, 0x7e, 0x9d, 0xf9, 0x92, 0x59, 0x7f, 0xfc, 0x3c, 0xde, + 0xfa, 0x98, 0x49, 0x3f, 0xdc, 0xeb, 0x2e, 0xcd, 0xc5, 0x95, 0x08, 0x94, + 0x62, 0x8d, 0x29, 0xdf, 0xcf, 0xd0, 0x0e, 0xdc, 0x59, 0x63, 0x56, 0x5f, + 0xb5, 0x9b, 0xc7, 0x0b, 0x2a, 0x13, 0xe2, 0xe8, 0x76, 0x67, 0x1d, 0x42, + 0xf7, 0xc5, 0xc0, 0x2e, 0xf8, 0x95, 0xfc, 0xc6, 0x3c, 0xd0, 0x75, 0x97, + 0xb7, 0x63, 0x8b, 0x2b, 0xe7, 0x9a, 0x12, 0xeb, 0x0b, 0x14, 0xba, 0x9c, + 0x4d, 0xa1, 0x20, 0x54, 0x22, 0x15, 0x62, 0xf1, 0x3c, 0x3b, 0x3c, 0x62, + 0x72, 0x71, 0x1c, 0x35, 0xb2, 0x54, 0x8f, 0x6e, 0x5d, 0x43, 0x0d, 0xa3, + 0x54, 0x9a, 0x72, 0xab, 0x51, 0x84, 0x9e, 0x1c, 0xde, 0x94, 0x2c, 0xf2, + 0x95, 0x81, 0x2b, 0x14, 0xa5, 0x23, 0x72, 0x5d, 0x8f, 0xe7, 0x00, 0x82, + 0xf7, 0xb7, 0x08, 0xb1, 0x25, 0x07, 0xee, 0xc2, 0xe2, 0xfd, 0xae, 0xdd, + 0xfb, 0x54, 0x53, 0x8b, 0xfb, 0xcc, 0x72, 0x73, 0x56, 0x58, 0x5e, 0x1f, + 0x1b, 0x1b, 0x5f, 0xd0, 0x7c, 0xdd, 0x8f, 0xac, 0xbe, 0xf4, 0x11, 0xab, + 0x2f, 0xa3, 0xb8, 0xf2, 0xca, 0x39, 0xf9, 0xfc, 0xbc, 0x42, 0x2b, 0xec, + 0xe0, 0x92, 0x59, 0x7f, 0xda, 0x7e, 0x7b, 0x30, 0xbb, 0x59, 0x7f, 0x07, + 0x99, 0xf1, 0x27, 0x59, 0x4c, 0x7d, 0x1e, 0x38, 0xbf, 0x1f, 0x5a, 0xce, + 0x2c, 0xbf, 0xff, 0x78, 0x3f, 0xd4, 0x7f, 0x99, 0xdf, 0x23, 0x5d, 0xac, + 0xbe, 0x0e, 0xeb, 0xcc, 0xb2, 0xff, 0x31, 0xb9, 0x28, 0x07, 0x16, 0x54, + 0x8f, 0x67, 0x84, 0xd7, 0x87, 0x07, 0x59, 0x7f, 0xa3, 0xed, 0xdb, 0x0e, + 0x16, 0x5b, 0x4b, 0x2f, 0xff, 0xa6, 0x26, 0xe7, 0xe0, 0x46, 0xd4, 0xd1, + 0xe5, 0x95, 0x23, 0xe2, 0xc1, 0x1a, 0x1a, 0x34, 0x74, 0x39, 0xf8, 0x4a, + 0x5e, 0xce, 0x32, 0xcb, 0xfd, 0x1f, 0x86, 0x21, 0x38, 0xb2, 0xb0, 0xf3, + 0x74, 0x37, 0x7f, 0xfe, 0xcf, 0xf0, 0x4e, 0x7d, 0xa0, 0xbe, 0x4e, 0x05, + 0x97, 0xf7, 0x52, 0x83, 0x86, 0x65, 0x97, 0xf1, 0xc7, 0x1c, 0x09, 0x2c, + 0xbd, 0x28, 0x3a, 0xcb, 0xbc, 0xcb, 0x2b, 0xa3, 0x65, 0xf1, 0xca, 0x84, + 0x58, 0xb1, 0x83, 0xaf, 0xdf, 0x73, 0x67, 0x04, 0x59, 0x7f, 0xf6, 0x6f, + 0xc1, 0xea, 0x1a, 0x4f, 0xc5, 0x96, 0x7e, 0x8f, 0xab, 0x44, 0xd7, 0xa5, + 0x06, 0x2c, 0xbf, 0xcd, 0x87, 0x34, 0xd7, 0xe9, 0x65, 0xbf, 0xd1, 0xe9, + 0x70, 0x76, 0xfe, 0x71, 0x33, 0x7c, 0x71, 0x65, 0x61, 0xec, 0x04, 0xa6, + 0xff, 0xef, 0x30, 0x9f, 0x62, 0x0c, 0xb3, 0x8b, 0x2f, 0xfc, 0xdd, 0x70, + 0xb0, 0x7e, 0x73, 0x16, 0x5f, 0xff, 0x64, 0xf9, 0xd7, 0xf8, 0xc5, 0x00, + 0x73, 0xac, 0xac, 0x46, 0x91, 0xa8, 0x9c, 0x3f, 0xbf, 0xf6, 0x7a, 0x35, + 0x82, 0xcc, 0x30, 0xc4, 0x97, 0x31, 0x8b, 0x2e, 0x9c, 0x5c, 0x2f, 0x9b, + 0x48, 0xc0, 0x70, 0x8b, 0xc2, 0x1e, 0xca, 0x3a, 0x85, 0x8b, 0x43, 0xce, + 0x68, 0x41, 0x1c, 0x87, 0xd1, 0x82, 0x82, 0x12, 0xe5, 0x0d, 0x2f, 0xc3, + 0xcf, 0x6c, 0xc3, 0x75, 0x0e, 0xfd, 0xae, 0xdd, 0xfb, 0x54, 0x57, 0x8b, + 0xef, 0xe9, 0xba, 0x59, 0x7f, 0xff, 0x60, 0xfd, 0x02, 0x0b, 0xf9, 0x38, + 0x39, 0xc8, 0x02, 0x4b, 0x0b, 0xc4, 0x5b, 0x31, 0xb6, 0xd9, 0x1d, 0xff, + 0xc2, 0xde, 0x42, 0xf3, 0x5d, 0xbb, 0xf6, 0xa8, 0x91, 0xd7, 0x61, 0xd6, + 0x5d, 0xfc, 0x59, 0x5d, 0x9a, 0xce, 0x85, 0xaf, 0xff, 0x1a, 0xda, 0xcd, + 0x4a, 0x3d, 0xe6, 0x02, 0xcb, 0xbc, 0x35, 0x97, 0xff, 0xef, 0xc0, 0xe0, + 0x22, 0xbd, 0x47, 0xd8, 0x11, 0x25, 0x97, 0x89, 0xc5, 0xc8, 0xfb, 0xf7, + 0x8b, 0xde, 0x60, 0x42, 0xcb, 0xdd, 0xe1, 0xd2, 0x0b, 0x2e, 0xef, 0xb1, + 0xfa, 0x02, 0xcb, 0xff, 0xf7, 0xa0, 0x83, 0xcf, 0x36, 0xb3, 0x7c, 0x17, + 0xd6, 0x5f, 0xfc, 0xda, 0xcd, 0x4a, 0x3d, 0xe6, 0x02, 0xcb, 0xee, 0xdd, + 0xfb, 0x54, 0x49, 0x0b, 0xf9, 0xf5, 0x9b, 0xfd, 0x8b, 0x2a, 0x74, 0xc6, + 0x24, 0x44, 0x6a, 0xae, 0x90, 0xc0, 0x61, 0x7d, 0x37, 0xf3, 0xb5, 0x97, + 0xe8, 0x60, 0x31, 0xd6, 0x54, 0x1e, 0x54, 0x89, 0x2f, 0xf4, 0x17, 0xca, + 0x0f, 0xc5, 0x97, 0xff, 0xe6, 0xd3, 0x6e, 0xc1, 0x4f, 0x1f, 0x6f, 0x3c, + 0xeb, 0x2f, 0xcf, 0x2f, 0xb4, 0xeb, 0x2a, 0x0f, 0xfd, 0x95, 0xef, 0xff, + 0x3f, 0xe6, 0xe6, 0x0c, 0x61, 0x7d, 0x49, 0x65, 0xff, 0xf3, 0xf5, 0xcc, + 0xf3, 0x96, 0x4e, 0x70, 0xf9, 0x65, 0xff, 0xde, 0x6e, 0xbf, 0x9d, 0x7f, + 0x5a, 0x85, 0x97, 0xff, 0x34, 0x1d, 0xc6, 0x26, 0xec, 0x14, 0x96, 0x56, + 0x23, 0x73, 0xb5, 0x0f, 0x23, 0x5f, 0xfd, 0x80, 0xdb, 0xcd, 0x44, 0xef, + 0xae, 0xd6, 0x5f, 0x9c, 0x1f, 0xc0, 0x2c, 0xa2, 0x3e, 0xfe, 0x24, 0x5f, + 0xec, 0xf3, 0x9c, 0xa3, 0xa5, 0x97, 0x48, 0x5c, 0x2e, 0x73, 0xe4, 0x68, + 0xcd, 0x09, 0x79, 0x88, 0x7d, 0x0b, 0x00, 0x10, 0x72, 0x32, 0x7f, 0xc2, + 0x7c, 0x42, 0x1b, 0xf0, 0x7a, 0xed, 0xb8, 0xb2, 0xfd, 0x9e, 0x17, 0x87, + 0x59, 0x7c, 0x69, 0x04, 0xeb, 0x2c, 0x2e, 0x17, 0xcc, 0xf0, 0x8f, 0xb8, + 0x5c, 0xbc, 0xe9, 0xc0, 0x21, 0x53, 0xf2, 0xa1, 0x0a, 0x6f, 0xfe, 0x16, + 0xf2, 0x17, 0x9a, 0xed, 0xdf, 0xb5, 0x44, 0x94, 0xbf, 0x6b, 0xb7, 0x7e, + 0xd5, 0x17, 0x8a, 0xff, 0xa4, 0x2f, 0x35, 0xdb, 0xbf, 0x6a, 0x89, 0x35, + 0x61, 0x78, 0x7f, 0xee, 0x6d, 0x7d, 0xdf, 0x98, 0x96, 0x5c, 0x31, 0x42, + 0xcb, 0xfe, 0x14, 0xed, 0x1b, 0x47, 0xb0, 0xf9, 0xc5, 0x97, 0xf6, 0xd4, + 0x28, 0x07, 0xff, 0xd2, 0xcb, 0xf7, 0x39, 0x85, 0x8b, 0x2f, 0xfb, 0x5d, + 0xc4, 0xf9, 0x85, 0xf5, 0x97, 0xf1, 0x09, 0x36, 0xa3, 0x7a, 0xcb, 0xfa, + 0x38, 0xc7, 0x89, 0x96, 0x5f, 0x3b, 0x75, 0xc5, 0x96, 0xf2, 0xca, 0xc4, + 0x78, 0x31, 0x36, 0xe1, 0xc9, 0xcc, 0x7c, 0x5a, 0x61, 0x15, 0xfe, 0x60, + 0x61, 0x47, 0x5c, 0x59, 0x7b, 0x7c, 0x49, 0x65, 0xfa, 0x3f, 0xcc, 0xfa, + 0xcb, 0xce, 0x43, 0xc3, 0xc5, 0xf0, 0xf5, 0xfe, 0x63, 0x7a, 0xe6, 0x11, + 0xab, 0x2f, 0xf9, 0xf5, 0x2e, 0x60, 0x75, 0x3a, 0xca, 0x64, 0x50, 0x78, + 0xc4, 0x26, 0xb7, 0xfd, 0x80, 0x1f, 0xa0, 0xa0, 0xc5, 0x97, 0xc0, 0xe6, + 0x12, 0xca, 0x83, 0xd9, 0x63, 0x8b, 0xff, 0x07, 0xbe, 0x71, 0xf5, 0xf8, + 0x35, 0x65, 0xfb, 0xdf, 0xe6, 0x7d, 0x65, 0x31, 0xf4, 0xba, 0x0d, 0xff, + 0xfb, 0xce, 0xc0, 0xe6, 0x1a, 0xe7, 0xd4, 0x61, 0x2c, 0xb9, 0x86, 0xb2, + 0xa0, 0xfa, 0x7c, 0xa7, 0x7d, 0x20, 0xc7, 0x4b, 0x2f, 0xfa, 0x76, 0xe7, + 0x1c, 0x1e, 0x0a, 0xcb, 0xf9, 0xb4, 0x32, 0x8e, 0x96, 0x5f, 0xf6, 0x1a, + 0x6b, 0xcb, 0x3a, 0xfa, 0xcb, 0xd3, 0xc4, 0xeb, 0x2f, 0x05, 0xfa, 0xc3, + 0xd9, 0x10, 0xee, 0xfe, 0xf6, 0x67, 0xfd, 0x8b, 0x2f, 0xfa, 0x25, 0xcd, + 0x69, 0xcb, 0xeb, 0x2a, 0x4a, 0xab, 0x87, 0x08, 0x9e, 0xe1, 0x13, 0x31, + 0x0e, 0x88, 0xfc, 0x75, 0xc8, 0x43, 0x7c, 0xd3, 0x79, 0x65, 0xfc, 0xd8, + 0x51, 0xd7, 0x16, 0x5f, 0xd9, 0xff, 0xc1, 0x4e, 0xb2, 0xfd, 0x83, 0xda, + 0x45, 0xb8, 0xb2, 0xfe, 0x72, 0x06, 0xd2, 0x2d, 0xc5, 0x97, 0x38, 0xf7, + 0x9f, 0x2e, 0xd9, 0x85, 0x1d, 0x1e, 0x1e, 0x2c, 0x0c, 0x24, 0xaf, 0x39, + 0x76, 0xb2, 0xf7, 0xa0, 0x45, 0x95, 0xf3, 0x72, 0x60, 0xe5, 0xff, 0xbc, + 0xf2, 0x6f, 0x3c, 0x9b, 0xcb, 0x2f, 0xe2, 0x70, 0x13, 0x9d, 0x65, 0xf8, + 0x7e, 0xdc, 0x62, 0x59, 0x7f, 0x8b, 0x0f, 0xb7, 0x9a, 0x85, 0x95, 0x07, + 0xbd, 0x31, 0x55, 0xe8, 0xff, 0x16, 0x5f, 0xf4, 0x1f, 0xd8, 0x31, 0xb7, + 0x4b, 0x2b, 0x0f, 0xdf, 0xa2, 0x26, 0x1c, 0xbe, 0xdd, 0x68, 0x35, 0x65, + 0xe9, 0x74, 0x6a, 0xcb, 0xf8, 0xff, 0xf0, 0x7f, 0xc5, 0x97, 0x82, 0x3e, + 0x96, 0x5f, 0xfc, 0xe0, 0xef, 0xcd, 0xa2, 0x6f, 0xf1, 0x65, 0xfe, 0xdf, + 0x92, 0xf4, 0x11, 0xab, 0x2e, 0x29, 0xd6, 0x54, 0x26, 0x42, 0x32, 0x5c, + 0x1f, 0x62, 0xf7, 0x1e, 0x02, 0x20, 0x86, 0xb6, 0xfa, 0xcb, 0xfe, 0x8d, + 0x01, 0xff, 0xb7, 0x9f, 0x59, 0x76, 0xb1, 0x65, 0xf7, 0x4d, 0xd4, 0x96, + 0x5c, 0x24, 0xeb, 0x29, 0x8d, 0xe8, 0x09, 0x2b, 0x48, 0xbf, 0xf0, 0x88, + 0x0e, 0xc9, 0x4e, 0xec, 0x3a, 0xcb, 0xda, 0xdf, 0xe5, 0x97, 0xec, 0xd3, + 0xc0, 0xd6, 0x54, 0x1e, 0xdb, 0x8b, 0x10, 0xfd, 0xe1, 0xe1, 0x2c, 0xbf, + 0xf6, 0x82, 0x7f, 0x34, 0x1d, 0xc9, 0x65, 0xff, 0x72, 0x0e, 0x59, 0x28, + 0x25, 0x97, 0xf9, 0x8b, 0x66, 0x1d, 0xbe, 0xb2, 0xb4, 0x8a, 0x6f, 0x9e, + 0xef, 0x36, 0xb8, 0xa4, 0xb2, 0xe1, 0x41, 0x8b, 0x28, 0x26, 0xcb, 0x6c, + 0x5a, 0xa1, 0x34, 0x9c, 0x86, 0x0e, 0xeb, 0x25, 0xff, 0xdd, 0x85, 0xc7, + 0xbf, 0x07, 0xb4, 0x8b, 0x71, 0x65, 0xf3, 0x7a, 0x37, 0xac, 0xad, 0x1f, + 0x9f, 0xd4, 0x2f, 0xf4, 0x6a, 0x3a, 0x06, 0xa1, 0x65, 0xe6, 0xdd, 0x9d, + 0x65, 0xa7, 0x59, 0x50, 0x6c, 0x88, 0x82, 0xf7, 0x83, 0xb8, 0xb2, 0xfe, + 0x28, 0xff, 0x9e, 0x4b, 0x2a, 0x0f, 0x32, 0x62, 0x0b, 0xdf, 0x8d, 0x2c, + 0xa8, 0x4c, 0xc2, 0x72, 0x29, 0x99, 0x5d, 0xac, 0x24, 0x57, 0x3f, 0x6b, + 0x2f, 0xff, 0xff, 0x61, 0x13, 0xcb, 0xcd, 0xb0, 0x4d, 0x6a, 0x24, 0xdf, + 0x6d, 0x38, 0x16, 0x5f, 0x86, 0x19, 0xc4, 0x3a, 0xcb, 0xfc, 0x59, 0xff, + 0x37, 0x52, 0x59, 0x5d, 0x9e, 0xf7, 0x8a, 0xef, 0xee, 0xb9, 0x87, 0x7e, + 0x2c, 0xbe, 0x1e, 0x7a, 0x16, 0x5b, 0x4b, 0x2f, 0xd3, 0xea, 0x3a, 0xd2, + 0xca, 0x9c, 0xdd, 0xe0, 0x8d, 0xfe, 0x08, 0xf2, 0x50, 0x0e, 0x2c, 0xa8, + 0x4f, 0xb6, 0x42, 0xf9, 0x0d, 0x56, 0x23, 0x72, 0xe2, 0x5c, 0xe1, 0x0d, + 0xff, 0xec, 0xf7, 0x7e, 0x6e, 0xbf, 0x87, 0x7e, 0x2c, 0xbe, 0x9c, 0xe1, + 0xdc, 0x59, 0x7e, 0xf9, 0xe6, 0x21, 0xac, 0xa7, 0x3d, 0x02, 0x27, 0xbf, + 0x4d, 0xce, 0x31, 0xd6, 0x5e, 0xe0, 0x7a, 0x59, 0x7f, 0xfd, 0x39, 0x8f, + 0x2e, 0x73, 0x34, 0x64, 0x68, 0xd5, 0x96, 0x25, 0x97, 0xf3, 0xff, 0x93, + 0xe1, 0x8b, 0x2f, 0xff, 0xe6, 0xe3, 0xcb, 0x8d, 0xbf, 0x81, 0x76, 0x93, + 0x6f, 0x59, 0x70, 0x82, 0x2c, 0xac, 0x4d, 0x42, 0x62, 0x97, 0x1e, 0x02, + 0xa1, 0x08, 0x7c, 0xbc, 0x45, 0xdb, 0xf6, 0x68, 0x00, 0x85, 0x97, 0x6d, + 0x8b, 0xda, 0xdb, 0x52, 0xc1, 0x49, 0x16, 0xd2, 0x1b, 0xda, 0x68, 0xf1, + 0x19, 0x4c, 0x96, 0x47, 0x18, 0xbe, 0x4b, 0x36, 0xee, 0x38, 0x3e, 0x9b, + 0x98, 0x8a, 0x63, 0xdd, 0x46, 0x01, 0xe8, 0xd3, 0xde, 0x32, 0x10, 0x42, + 0x5c, 0xa3, 0x75, 0xe4, 0x7b, 0x5f, 0x94, 0x70, 0x63, 0x2e, 0xdc, 0x26, + 0xc4, 0x8d, 0xc3, 0x75, 0x92, 0xff, 0x06, 0x71, 0x7b, 0xbb, 0xac, 0x6a, + 0xca, 0x87, 0xd7, 0x1d, 0x9e, 0x16, 0xf2, 0xb5, 0x3f, 0xc3, 0x94, 0x9a, + 0xd3, 0xfa, 0x33, 0x47, 0x84, 0x73, 0x9f, 0x4f, 0xda, 0xfe, 0x10, 0x01, + 0x86, 0xa8, 0x95, 0xaa, 0xa6, 0xec, 0x76, 0x75, 0x14, 0xc0, 0x58, 0x79, + 0xe7, 0x59, 0xa5, 0x4d, 0xd7, 0x1d, 0x30, 0x43, 0x33, 0xb1, 0xbc, 0x36, + 0x98, 0xf7, 0xde, 0x36, 0xf8, 0xfa, 0xb6, 0xb3, 0x4d, 0x5d, 0xc3, 0x6e, + 0x4a, 0x75, 0x9b, 0x12, 0x9d, 0x5a, 0xc5, 0x05, 0xc9, 0xf7, 0x0a, 0xc8, + 0xfd, 0x69, 0x03, 0x5f, 0x12, 0xc7, 0x00, 0xad, 0xd7, 0x85, 0x73, 0x90, + 0xe5, 0x78, 0xca, 0xfc, 0xbc, 0x22, 0x2f, 0xe6, 0x16, 0xa6, 0x1c, 0x48, + 0xd1, 0xef, 0xad, 0x7b, 0x8c, 0xac, 0x49, 0xb6, 0xe7, 0xe2, 0x84, 0xac, + 0xd8, 0xb7, 0x6f, 0x64, 0xd6, 0x80, }; -static const unsigned kPreloadedHSTSBits = 608997; +static const unsigned kPreloadedHSTSBits = 803081; -static const unsigned kHSTSRootPosition = 608327; +static const unsigned kHSTSRootPosition = 802430; #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index c455c54..04c1bc3 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -248,6 +248,7 @@ { "name": "talk.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" }, { "name": "wallet.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" }, { "name": "xn--7xa.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" }, + { "name": "dns.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" }, // Other Google-related domains that must use HTTPS. { "name": "apis.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" }, @@ -729,7 +730,6 @@ { "name": "carezone.com", "mode": "force-https" }, { "name": "conformal.com", "include_subdomains": true, "mode": "force-https" }, { "name": "cyphertite.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "logotype.se", "include_subdomains": true, "mode": "force-https" }, { "name": "bccx.com", "include_subdomains": true, "mode": "force-https" }, { "name": "launchkey.com", "include_subdomains": true, "mode": "force-https" }, { "name": "carlolly.co.uk", "include_subdomains": true, "mode": "force-https" }, @@ -1628,7 +1628,6 @@ { "name": "visionless.me", "include_subdomains": true, "mode": "force-https" }, { "name": "vrobert.fr", "include_subdomains": true, "mode": "force-https" }, { "name": "wbg-vs.de", "include_subdomains": true, "mode": "force-https" }, - { "name": "hstspreload.appspot.com", "include_subdomains": true, "mode": "force-https" }, { "name": "hg.python.org", "include_subdomains": true, "mode": "force-https" }, { "name": "doc.python.org", "include_subdomains": true, "mode": "force-https" }, { "name": "console.python.org", "include_subdomains": true, "mode": "force-https" }, @@ -4606,7 +4605,6 @@ { "name": "infinitusgaming.eu", "include_subdomains": true, "mode": "force-https" }, { "name": "infocommsociety.com", "include_subdomains": true, "mode": "force-https" }, { "name": "instant.io", "include_subdomains": true, "mode": "force-https" }, - { "name": "involved-it.be", "include_subdomains": true, "mode": "force-https" }, { "name": "ipcfg.me", "include_subdomains": true, "mode": "force-https" }, { "name": "ipswitch.com.tw", "include_subdomains": true, "mode": "force-https" }, { "name": "iready.ro", "include_subdomains": true, "mode": "force-https" }, @@ -5626,7 +5624,6 @@ { "name": "asun.co", "include_subdomains": true, "mode": "force-https" }, { "name": "atlantichomes.com.au", "include_subdomains": true, "mode": "force-https" }, { "name": "autokovrik-diskont.ru", "include_subdomains": true, "mode": "force-https" }, - { "name": "bam.com.au", "include_subdomains": true, "mode": "force-https" }, { "name": "ben.ninja", "include_subdomains": true, "mode": "force-https" }, { "name": "bm-trading.nl", "include_subdomains": true, "mode": "force-https" }, { "name": "bodyblog.nl", "include_subdomains": true, "mode": "force-https" }, @@ -6964,7 +6961,7 @@ { "name": "united.com", "include_subdomains": false, "mode": "force-https" }, { "name": "www.united.com", "include_subdomains": true, "mode": "force-https" }, { "name": "mobile.united.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "smartphone.continental.com ", "include_subdomains": true, "mode": "force-https" }, + { "name": "smartphone.continental.com", "include_subdomains": true, "mode": "force-https" }, { "name": "0513c.com", "include_subdomains": true, "mode": "force-https" }, { "name": "0x.cx", "include_subdomains": true, "mode": "force-https" }, { "name": "1022996493.rsc.cdn77.org", "include_subdomains": true, "mode": "force-https" }, @@ -8517,7 +8514,6 @@ { "name": "swimming.ca", "include_subdomains": true, "mode": "force-https" }, { "name": "swite.com", "include_subdomains": true, "mode": "force-https" }, { "name": "syncmylife.net", "include_subdomains": true, "mode": "force-https" }, - { "name": "tablotv.com", "include_subdomains": true, "mode": "force-https" }, { "name": "talentcast.nl", "include_subdomains": true, "mode": "force-https" }, { "name": "tasmansecurity.com", "include_subdomains": true, "mode": "force-https" }, { "name": "teachercreatedmaterials.com", "include_subdomains": true, "mode": "force-https" }, @@ -8817,7 +8813,2797 @@ { "name": "zoeller.me", "include_subdomains": true, "mode": "force-https" }, { "name": "gendrin.com", "include_subdomains": true, "mode": "force-https" }, { "name": "webmail.xalqbank.az", "include_subdomains": true, "mode": "force-https" }, - { "name": "winebid.com", "include_subdomains": true, "mode": "force-https" } + { "name": "winebid.com", "include_subdomains": true, "mode": "force-https" }, + + // Manual additions in Chrome 51 or later that do not belong in a + // special section above. + // START OF MANUAL ADDITIONS + { "name": "050media.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "0x.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "0x44.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "1001.best", "include_subdomains": true, "mode": "force-https" }, + { "name": "1018hosting.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "123test.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "12vpn.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "12vpnchina.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "1750studios.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "1cover.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "1hourproofreading.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "1q365a.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "1st-community.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "247healthshop.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "24ip.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "24ip.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "2kgwf.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "2nains.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "300m.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "321live.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "33drugstore.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "360ds.co.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "365beautyworld.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "365healthworld.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "404.sh", "include_subdomains": true, "mode": "force-https" }, + { "name": "4455software.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "4500.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "4679.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "4d2.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "4elements.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "4w-performers.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "4winds.pt", "include_subdomains": true, "mode": "force-https" }, + { "name": "50millionablaze.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "50plusnet.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "57aromas.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "60ych.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "6120.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "646.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "69square.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "8t8.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "8thportsmouth.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "92url.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "aa-tour.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "aaeblog.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "aapp.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "aaronsilber.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "aatf.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "abareplace.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "abc.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "abearofsoap.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "aberdeenjudo.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "abilitylist.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "abthorpe.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "accelerole.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "accuenergy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "acheritage.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "acisonline.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "acritelli.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "acrylicwifi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "activateplay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "activeweb.top", "include_subdomains": true, "mode": "force-https" }, + { "name": "adamkaminski.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "adamricheimer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "adams.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "adastra.re", "include_subdomains": true, "mode": "force-https" }, + { "name": "addstar.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "adelaides.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "adiponectinsupplement.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "adiponectinsupplement.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "adme.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "admitcard.co.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "adoal.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "adquisitio.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "adrenaline-gaming.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "aduvi.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "advelty.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "adventistdeploy.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "adventureforest.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "adzuna.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "afb24.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "aficionados.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "africatravel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "afvallendoeje.nu", "include_subdomains": true, "mode": "force-https" }, + { "name": "agowa338.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "agro-id.gov.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "ahabingo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ahmad.works", "include_subdomains": true, "mode": "force-https" }, + { "name": "aia.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "airlinecheckins.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "aisle3.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "aiwdirect.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "akerek.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "akoww.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "akropolis-ravensburg.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "akstudentsfirst.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "akutun.cl", "include_subdomains": true, "mode": "force-https" }, + { "name": "alariel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "alasta.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "alertwire.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alexisabarca.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alexmerkel.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "alexmerkel.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "alexsergeyev.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alienstat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alittlebitcheeky.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "all.tf", "include_subdomains": true, "mode": "force-https" }, + { "name": "allforyou.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "alliedfrozenstorage.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "allmbw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "allstarswithus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "allthingssquared.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "almeria-si.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "alnitech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alphabuild.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "alt-three.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "alterbaum.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "altopia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "amcvega.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "amees.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "american-truck-simulator.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "american-truck-simulator.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "americanworkwear.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "americkykongres.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "amilx.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "amilx.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "amitube.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "amnesy.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "amv-crm.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "analytic-s.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "ananke.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "anassiriphotography.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "anastasiafond.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "and-stuff.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "and.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "andreastoneman.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "andrepicard.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "andrewhowden.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "andrewthelott.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "andsat.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "annarokina.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "annetta.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "anonukradio.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ant.land", "include_subdomains": true, "mode": "force-https" }, + { "name": "antoine-roux.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "antoinedeschenes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "antoniorequena.com.ve", "include_subdomains": true, "mode": "force-https" }, + { "name": "antscript.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "any.pm", "include_subdomains": true, "mode": "force-https" }, + { "name": "ao-dev.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "apervita.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "apexitsolutions.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "api-geek.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "apmg-certified.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "apmg-cyber.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "app-arena.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "appdrinks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "appleoosa.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "applic8.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "appointed.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "appraisal-comps.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "appreciationkards.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "appsdash.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "aprovpn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "aquapoint.kiev.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "aramido.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "aran.me.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "arbeitskreis-asyl-eningen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "arlen.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "arnesolutions.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "arpa.ph", "include_subdomains": true, "mode": "force-https" }, + { "name": "arrowgrove.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ars.toscana.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "artetrama.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "artisanhd.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "artistnetwork.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "arubasunsetbeach.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "arvid.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "arw.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "as.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "ascamso.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ascii.moe", "include_subdomains": true, "mode": "force-https" }, + { "name": "asdpress.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "asmui.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "astromelody.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "asurepay.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "atchleyjazz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "atchleyjazz.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "atchleylab.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ateli.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "athensbusinessresources.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "audiovisualdevices.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "augias.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "augiero.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "aujapan.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "aussiehq.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "authoritynutrition.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "auto-serwis.zgorzelec.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "automacity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "autotsum.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "autumnwindsagility.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avenueeyecare.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avg.club", "include_subdomains": true, "mode": "force-https" }, + { "name": "avinet.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avmemo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avmoo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avsox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "avtovokzaly.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "awanderlustadventure.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "awxg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "axeny.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ayurveda101.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "azimut.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "aztrix.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "babacasino.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "babak.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "babyhouse.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "babystep.tv", "include_subdomains": true, "mode": "force-https" }, + { "name": "back-bone.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "backmountaingas.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bacula.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "bad.horse", "include_subdomains": true, "mode": "force-https" }, + { "name": "baiduaccount.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bakabt.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "bakkerdesignandbuild.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "baliyano.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bankofdenton.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "barisi.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "bashc.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "basicsolutionsus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "baumstark.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "bazdell.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bblovess.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "bbuio.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bc-bd.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bcbsmagentprofile.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bcmlu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bcweightlifting.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "beavers.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "bebef.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "beepan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "beeznest.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "befundonline.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "behere.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "beikeil.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "belliash.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "belly-button-piercings.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bemyvictim.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "benjaminblack.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "benzkosmetik.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "bermytraq.bm", "include_subdomains": true, "mode": "force-https" }, + { "name": "bestbrakes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bestessayhelp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bestlashesandbrows.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bestorangeseo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "betz.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "bevinco2020.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bf.am", "include_subdomains": true, "mode": "force-https" }, + { "name": "bgcparkstad.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "bgdaddy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bhtelecom.ba", "include_subdomains": true, "mode": "force-https" }, + { "name": "bible-maroc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "biblerhymes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "biblionaut.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "bielsa.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "bienenblog.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "biergaizi.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "big-black.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "bikermusic.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "billiger-mietwagen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "billogram.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "billpro.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "bingofriends.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bingostars.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "biodieseldata.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bioemsan.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "biolindo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitbeans.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitbr.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitcoin-india.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitf.ly", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitfehler.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitfinder.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitfuse.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitheus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bithosting.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitmoe.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitref.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitsafe.systems", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitskins.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "bivsi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bl4ckb0x.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "black-armada.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "black-armada.com.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "black-armada.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "blaudev.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "blogarts.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "blubberladen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "blucas.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "blue-labs.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "blue-leaf81.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "blueflare.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "blueliv.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "blueperil.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "bluepoint.foundation", "include_subdomains": true, "mode": "force-https" }, + { "name": "bluepoint.institute", "include_subdomains": true, "mode": "force-https" }, + { "name": "blusmurf.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "bngsecure.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "boensou.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "boernecancerfonden.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "bonfi.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "boomersurf.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "boringsmith.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "botox.bz", "include_subdomains": true, "mode": "force-https" }, + { "name": "bourse-aux-jouets.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bourse-puericulture.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bouwbedrijfpurmerend.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "brandnewdays.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "breechdepot.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brejoc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brewtrackr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brianpcurran.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brideandgroomdirect.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "brightonbank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brilliantdecisionmaking.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "britishscienceweek.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "britzer-toner.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "broken-oak.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "brunn.email", "include_subdomains": true, "mode": "force-https" }, + { "name": "bta.lv", "include_subdomains": true, "mode": "force-https" }, + { "name": "btcdlc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bubblegumblog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "buchheld.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "budgetthostels.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "buffalodrinkinggame.beer", "include_subdomains": true, "mode": "force-https" }, + { "name": "buildbox.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "built.by", "include_subdomains": true, "mode": "force-https" }, + { "name": "bulletpoint.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "bumarkamoda.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "busindre.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "businessesdirectory.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "buyfox.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "by4cqb.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "byte.wtf", "include_subdomains": true, "mode": "force-https" }, + { "name": "byteshark.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bytesund.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "byteturtle.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "bziaks.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "bztech.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "c3w.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "cachethq.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "cadao.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "cajapopcorn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "calltrackingreports.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "camaya.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "campaign-ad.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "campbellsoftware.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "campbrainybunch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "camperdays.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "campermanaustralia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "candicontrols.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "caphane.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "capogna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "captivatedbytabrett.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "capturapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "capturethepen.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "caputo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "carano-service.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "caraudio69.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "cardloan-manual.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "careerstuds.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "carigami.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "carlandfaith.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "carlgo11.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "carsten.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "carstenfeuls.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "casedi.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "casinolistings.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "casinoreal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "castlejackpot.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "catalyst-ecommerce.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "catgirl.pics", "include_subdomains": true, "mode": "force-https" }, + { "name": "cdndepo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cdnjs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cdreporting.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ced-services.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ceilingpac.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "celti.ie.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "centrepoint-community.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ceritamalam.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "certnazionale.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "cfcproperties.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cfoitplaybook.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cg-systems.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "cgan.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "chabaudparfum.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "championsofregnum.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chaos-inc.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "charityclear.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "charmyadesara.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "charnleyhouse.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "chartpen.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chateau-belvoir.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chatme.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "chatup.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "chebedara.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cheetah85.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "cherrywoodtech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chestnut.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "chiaramail.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chihiro.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "chikan-beacon.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "childcaresolutionscny.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "chilihosting.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "china-line.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "chinternet.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "chirgui.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "chotu.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "chris-edwards.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "chris-web.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "chrisandsarahinasia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chrisfaber.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chrisfinazzo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "christadelphiananswers.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "christianhoffmann.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "christiesantiques.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "chua.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "cipherboy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ciscohomeanalytics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "citizensbankal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cityoflaurel.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "classicshop.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "clcleaningco.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "clearc.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "clearsettle-admin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "clientsecure.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "climatestew.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "clochix.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "close.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cloudey.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "cloverleaf.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "clownish.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "cloxy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cmahy.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "cni-certing.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "coachingconsultancy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "coam.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "cocolovesdaddy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "codeferm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "codefoundry.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "coderhangout.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "codesport.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "codeyellow.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "coi-verify.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "coinjar-sandbox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "colisfrais.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "collada.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "collectiblebeans.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "collegepulse.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "coloradolottery.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "colorbrush.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "commerciallocker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "commoncore4kids.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "compareandrecycle.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "compliance-systeme.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "complymd.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "condepenalba.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "confirm365.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "connected-verhuurservice.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "connectfss.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "connyduck.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "consciousbrand.org.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "consciousbranding.org.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "consciousbrands.net.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "consumer.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "contactbig.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "containerstatistics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "convocatoriafundacionpepsicomexico.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "coolchevy.org.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "cooxa.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cordlessdog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "corepartners.com.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "corpfin.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "correctpaardbatterijnietje.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "costreportdata.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "coursdeprogrammation.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "covenantbank.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "covybrat.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "coweo.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "cpuvinf.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "cracking.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "cranesafe.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "crazycen.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "creativeplayuk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "creditproautos.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "crefelder.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "crowd.supply", "include_subdomains": true, "mode": "force-https" }, + { "name": "crufad.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "crushroom.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "crypticshell.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "cryptojar.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "cryptonit.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "cryptonym.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "csbs.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "csfm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ct-status.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ctpe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "cultiv.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "cupidmentor.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "curacao-license.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyberguerrilla.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyberguerrilla.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyberhouse.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyberwire.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "cybozu.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyclebeads.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyfly.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "cymtech.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "cyph.audio", "include_subdomains": true, "mode": "force-https" }, + { "name": "czechamlp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "d-20.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "d-training.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "daallexx.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "dadtheimpaler.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dag-konsult.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dah5.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dailystormerpodcasts.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "damianuv-blog.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "dammekens.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "damngoodpepper.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dancerdates.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "danielworthy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "danijobs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "danilapisarev.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dannycrichton.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "danscomp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "danseressen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "darkspacelab.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "darkwater.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "dashnimorad.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "databutlr.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "datajapan.co.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "datenreiter.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "datenreiter.gq", "include_subdomains": true, "mode": "force-https" }, + { "name": "datenreiter.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "datenreiter.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "david-corry.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "davidgouveia.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "davidhunter.scot", "include_subdomains": true, "mode": "force-https" }, + { "name": "dccoffeeproducts.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dckd.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "dcmt.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "dcurt.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "dd.art.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ddos-mitigation.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ddos-mitigation.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "deaktualisierung.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "deathy.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "deco.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "decor-d.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "decoratrix.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "decoyrouting.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dedelta.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "deduijventil.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "deetzen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "degeberg.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "delta-data.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "deltanet-production.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "delvj.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "demotops.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "denimio.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dentallaborgeraeteservice.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "dentystabirmingham.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "derbyshire-language-scheme.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "derchris.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "deregowski.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "desiccantpackets.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "designgears.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "designthinking.or.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "detest.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "devcu.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "devilshakerz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "devincrow.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "devmsg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "devnull.team", "include_subdomains": true, "mode": "force-https" }, + { "name": "devuan.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "dfekt.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "diarbag.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "diasdasemana.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dicionariofinanceiro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dienstplan.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "dierenkruiden.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "dieti.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "digidroom.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "digital-coach.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "digital-eastside.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "digitallocker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "digitalquery.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dipl.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "directebanking.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "discipul.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "disposable.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "dissectcyber.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dixiediner.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dizihocasi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "djlive.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "djxmmx.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "djz4music.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dmeevalumate.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dmi.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "dna.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "dnc.org.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "dnshallinta.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "dnslog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "doctor-locks.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "doctorfox.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "docufiel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dogbox.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "dogfi.sh", "include_subdomains": true, "mode": "force-https" }, + { "name": "doku-gilde.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "dolarcanadense.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "dolphinswithlasers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "domadillo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "donotspellitgav.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "dontcageus.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "doodledraw.ninja", "include_subdomains": true, "mode": "force-https" }, + { "name": "doordecor.bg", "include_subdomains": true, "mode": "force-https" }, + { "name": "downloadsoftwaregratisan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dr2dr.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "drainagebuizen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "dranderle.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "drawingcode.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "dreamcreator108.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dreweryinc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "drhopeson.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "driftdude.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "drino.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "droidboss.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "drrr.chat", "include_subdomains": true, "mode": "force-https" }, + { "name": "drycreekphoto.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dsbrowser.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dshiv.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "duijf.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "duijfathome.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "duncancmt.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "duo.money", "include_subdomains": true, "mode": "force-https" }, + { "name": "durangoenergyllc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dutch1.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "dutchweballiance.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "dutyfreeonboard.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dworzak.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "dxa.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "dzyabchenko.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "e-mak.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "e-teacher.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "e3amn2l.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "e3kids.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eagleridgecampground.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "earga.sm", "include_subdomains": true, "mode": "force-https" }, + { "name": "easyconstat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "easycosmetic.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "eatery.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "eatvisor.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ebcs-solutions.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ebecs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ebermannstadt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ecchidreams.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eckro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ecorus.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "edelblack.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "edicct.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "edk.com.tr", "include_subdomains": true, "mode": "force-https" }, + { "name": "edmundcelis.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ego-world.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "egretail.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "ehrlichesbier.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ehuber.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "eicfood.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eickemeyer.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "eirastudios.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ejeff.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ekbanden.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ekokontakt.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "ekostecki.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "el-soul.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "elanguest.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "elanguest.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "elanguest.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "eligibleapi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "elisabeth-kostecki.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "elisabethkostecki.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ella-kwikmed.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eloge.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "elternforum-birmensdorf.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "eluhome.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "em-biotek.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "emailfuermich.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "emeldi-commerce.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "emielraaijmakers.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "emjainteractive.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "emprego.pt", "include_subdomains": true, "mode": "force-https" }, + { "name": "emrenovation.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "enaim.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "encfs.win", "include_subdomains": true, "mode": "force-https" }, + { "name": "encnet.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "encryptio.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "enjoy-nepal.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "enlightenedhr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "enloestatebank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "enscosupply.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "epaygateway.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "epicsecure.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "epicsoft.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "epostplus.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "equilibre-yoga-jennifer-will.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "equipsupply.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "erepublik-deutschland.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ergorium.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ergorium.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "ericwie.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "ericyl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "erigrid.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "errlytics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "erudikum.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "erwinwensveen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "escritoriodearte.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "esigmbh.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "esn-ypci.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "essentialoilsimports.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "esseriumani.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "essexcosmeticdentists.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "essexghosthunters.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "estaleiro.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "estebanborges.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "etdonline.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "eteesheet.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "etelej.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eth0.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ethicall.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ethosinfo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "etkaddict.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "etrker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ets2mp.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "etula.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "etyd.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "euro.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "evantage.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "evantageglobal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "evegalaxy.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "eventaro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "everling.lu", "include_subdomains": true, "mode": "force-https" }, + { "name": "everymove.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "evi.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "evin.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "evites.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "evowl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "exchangeworks.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "exemples-de-stands.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "exoscale.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "exoticads.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "expressemotion.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "extremenetworking.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "exy.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "exyplis.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eyeglassuniverse.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "eyeonid.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ez.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "f-be.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "faber.org.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "factorable.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "factys.do", "include_subdomains": true, "mode": "force-https" }, + { "name": "factys.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "fadilus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fail4free.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "faircom.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "fairlyoddtreasures.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fakturi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "falkena.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "falsum.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "familie-kupschke.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "familie-monka.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fanjoe.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "fanyl.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "fanyue123.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "farhood.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "fasset.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "fatgeekflix.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "fatwin.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "fawong.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fcburk.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fdt.name", "include_subdomains": true, "mode": "force-https" }, + { "name": "fedux.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "feedhq.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "fernandes.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ferrugem.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "festrip.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "feuerwehr-oberkotzau.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fexmen.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ffmradio.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ficus.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "fid.to", "include_subdomains": true, "mode": "force-https" }, + { "name": "filemeal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "filhodohomem.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "financieringsportaal.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "fingent.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "finisron.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "firehost.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "firstmall.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fish2.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "fit4medien.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fitbylo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fitiapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fitnesswerk.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "fitzsim.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "fivestarsitters.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fixatom.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fixhotsauce.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fixmycomputerdude.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "flareon.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "flawcheck.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "flazznetworks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "flexinvesting.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "flipneus.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "floless.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "florence.uk.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "florent-tatard.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "florian-thie.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "floriankeller.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "flyaces.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fndout.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fnordserver.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "fokkusu.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "fondanastasia.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "font-converter.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "foodievenues.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "foraje-profesionale.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "forbook.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "forex-dan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fortesanshop.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "fortworth.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "fotm.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "fotocerita.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "fotopasja.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "fotowettbewerb.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxbnc.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxdev.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxley-farm.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxley-seeds.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxleyseeds.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "foxtrot.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "fragnic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fraho.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "francescopalazzo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "franckgirard.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "frank.fyi", "include_subdomains": true, "mode": "force-https" }, + { "name": "fransallen.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "frasys.cloud", "include_subdomains": true, "mode": "force-https" }, + { "name": "frasys.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "frasys.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "freeform4u.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "freematthale.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "freemedforms.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "freesoftwaredriver.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "freetsa.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "freshfind.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "frickelboxx.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "frizo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fromlemaytoz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "frontisme.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "froot.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "frugro.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "fsbpaintrock.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fsbturton.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fsm2016.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ftc.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "fundacionhijosdelsol.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "fundays.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "funi4u.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "funkyweddingideas.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "furgo.love", "include_subdomains": true, "mode": "force-https" }, + { "name": "futbol11.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fx-rk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fxp.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "fyfywka.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fyn.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "fysiohaenraets.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "g-o.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gafachi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gagniard.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "gagor.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi-epsilon.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi-epsilon.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi4.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi4.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "gakkainavi4.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "galactic-crew.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "game7.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gamecave.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gamedevelopers.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gamepader.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gamingmedia.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "gamingreinvented.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ganhonet.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "gar-nich.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "garantieabschluss.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "garedtech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gasbarkenora.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gatapro.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "gateworld.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "ge1.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "gee.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "geeq.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "geli-graphics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gemeentemolenwaard.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "generationnext.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "genyhitch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "geolad.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "georgesonarthurs.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "georgmayer.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "geoscan.aero", "include_subdomains": true, "mode": "force-https" }, + { "name": "germandarknes.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "getcarefirst.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "getcarina.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "getkai.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "getlifti.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "getsensibill.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "getsetupfile.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "getwashdaddy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gflclan.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "ghcif.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "giftgofers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "giftsn.com.sg", "include_subdomains": true, "mode": "force-https" }, + { "name": "gig.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "gigawa.lt", "include_subdomains": true, "mode": "force-https" }, + { "name": "gingali.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gipsic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gistfy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "git.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "givemyanswer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gix.net.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gixtools.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "gixtools.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gixtools.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "gixtools.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "gjcampbell.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "gjung.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "glidingshop.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "glidingshop.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "glitchsys.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "globalgivingtime.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "globalmusic.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "globalsites.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gloomyvancouver.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "goerres2014.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gogetssl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gogold-g.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gohon.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "goldpros.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "goldsecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "golf18network.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "goodmengroup.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gosccs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gosharewood.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gospelvestcination.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "gotgenes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gotomi.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "govillemo.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "gozel.com.tr", "include_subdomains": true, "mode": "force-https" }, + { "name": "gprs.uk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gpstuner.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "grademypc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gradienthosting.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "graycell.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "gresb.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gretchelizartistry.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "greysolutions.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "gribani.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "grieg-gaarden.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "grieglogistics.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "griegshipbrokers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "groovinads.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gtamodshop.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "gtldna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gts-schulsoftware.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "guava.studio", "include_subdomains": true, "mode": "force-https" }, + { "name": "guerrilla.technology", "include_subdomains": true, "mode": "force-https" }, + { "name": "gugaltika-ipb.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "gulenbase.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "gunnaro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "guoqiang.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "gurkan.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "guts.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "gypsycatdreams.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gypthecat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gz-benz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "gz-bmw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "haarkliniek.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "habanaavenue.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hackerforever.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hackmd.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "haeckl.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "hahayidu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "hamali.bg", "include_subdomains": true, "mode": "force-https" }, + { "name": "hancc.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "handiworker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hansen.hn", "include_subdomains": true, "mode": "force-https" }, + { "name": "hansvaneijsden.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hanu.la", "include_subdomains": true, "mode": "force-https" }, + { "name": "haomwei.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "happyandrelaxeddogs.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "harabuhouse.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "harmoney.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "harrisonsand.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hartie95.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "harvestrenewal.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "harz.cloud", "include_subdomains": true, "mode": "force-https" }, + { "name": "hashimah.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "hashworks.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "haskovec.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "haveforeningen-enghaven.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "havellab.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hawksguild.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hd-gaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hdhoang.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "heartmdinstitute.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "heavensinferno.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "hebikhiv.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hedgeschool.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "heinpost.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hellersgas.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hellotandem.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "helloworldhost.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hellscanyonraft.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hennadesigns.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "hentschke-bau.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hentschke-invest.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "herbertmouwen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hermes-net.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "herr-webdesign.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "herrenfahrt.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "heycms.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hibilog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hicl.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "hiddendepth.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "higgstools.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "higp.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.cl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.co.kr", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.ee", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.kz", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.lu", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.lv", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.pt", "include_subdomains": true, "mode": "force-https" }, + { "name": "hilti.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "hippies.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "hitoy.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "hochzeit-dana-laurens.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hoffmeister.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "homedna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "homeprivate.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "homewatt.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "honda-centrum.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "honeybeard.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "honeycome.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "hooray.beer", "include_subdomains": true, "mode": "force-https" }, + { "name": "hopesb.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "horvathd.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "hory.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "hosiet.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "hosmussynergie.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hostam.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "hosteasy.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hosted-service.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hostinaus.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "hostmijnpagina.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "hotchoc.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "hotel-pension-sonnalp.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "hotting.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "houser.lu", "include_subdomains": true, "mode": "force-https" }, + { "name": "howbehealthy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hr-intranet.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "http418.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "huarongdao.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "huersch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hugosleep.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "huiser.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "humeurs.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "huntshomeinspections.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hup.blue", "include_subdomains": true, "mode": "force-https" }, + { "name": "hurd.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "hxying.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hydrocloud.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "hydrozone.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "hyk.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "i--b.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "i-partners.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "iapws.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ib-wedler.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "iba.community", "include_subdomains": true, "mode": "force-https" }, + { "name": "ibnuwebhost.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "iceloch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "icpc2016.in.th", "include_subdomains": true, "mode": "force-https" }, + { "name": "icreative.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ict-concept.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ictual.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "idacmedia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ideasmeetingpoint.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "idedr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "idensys.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "idexxpublicationportal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "idgard.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ieeespmb.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ies-italia.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "ifasec.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "igiftcards.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "igk.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ihrnationalrat.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "ihuanmeng.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ikon.name", "include_subdomains": true, "mode": "force-https" }, + { "name": "ile-kalorii.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "im2net.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "imanolbarba.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "imjad.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "immobilier-nice.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "immoprotect.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "immunicity.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "imolug.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "imperialwebsolutions.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "imu.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "in-flames.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "inbox-group.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "inbox.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "inche-ali.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "indoorskiassen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "indredouglas.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "indusfastremit-ca.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "industreiler.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "informatiebeveiliging.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "infosec.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "infotics.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "infra-con.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "inkable.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "inkstory.gr", "include_subdomains": true, "mode": "force-https" }, + { "name": "insightera.co.th", "include_subdomains": true, "mode": "force-https" }, + { "name": "inspire-av.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "inspy.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "instantdev.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "intelldynamics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "intermedinet.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "internect.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "internetzentrale.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "internl.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "interociter-enterprises.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "interways.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "intimateperrierjouet.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "intocities.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "intramanager.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "intrasoft.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "invoicefinance.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "iolife.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "iompost.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "iomstamps.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ionc.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "ionx.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "iossifovlab.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "iotsms.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "ip6.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "ipal.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "ipal.name", "include_subdomains": true, "mode": "force-https" }, + { "name": "iplabs.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ipmotion.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "iptel.by", "include_subdomains": true, "mode": "force-https" }, + { "name": "ireef.tv", "include_subdomains": true, "mode": "force-https" }, + { "name": "isbengrumpy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ischool.co.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "iseek.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "israkurort.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "istanbultravelguide.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "istheapplestoredown.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "it-go.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "itb-online.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "itforge.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "itnota.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "itos.asia", "include_subdomains": true, "mode": "force-https" }, + { "name": "itos.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "its-v.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "itsecguy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "iwilcox.me.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "izolight.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "izoox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "izzzorgconcerten.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ja-publications.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaclynjohnson.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaispirit.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaketremper.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jakubtopic.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "jamessan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jan27.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "janbrodda.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "janosh.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "japan-foods.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "japan4you.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "japlex.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaredeberle.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaredfernandez.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jartza.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "javelinsms.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaymecd.rocks", "include_subdomains": true, "mode": "force-https" }, + { "name": "jazz-alliance.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jazz-alliance.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "jazzinutrecht.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "jcch.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "jcyz.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "jdh8.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "jeff.forsale", "include_subdomains": true, "mode": "force-https" }, + { "name": "jekkt.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jennifersauer.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "jensrex.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "jeremye77.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jerodslay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jeroendeneef.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jessicabenedictus.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "jesters-court.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "jetwhiz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jfmel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jirav.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jobflyapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jobmedic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "johndong.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "johners.tech", "include_subdomains": true, "mode": "force-https" }, + { "name": "jokewignand.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "jonnichols.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "jooto.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jornadasciberdefensa2016.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "josahrens.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "joyqi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "js-online.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "jsanders.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "jsg-technologies.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "json-viewer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jthackery.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jualssh.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "julibear.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "julido.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "juliemaurel.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "jumba.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "jumbox.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "jump.bg", "include_subdomains": true, "mode": "force-https" }, + { "name": "junge-selbsthilfe.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "jungesforumkonstanz.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "junjung.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "justnaw.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "justudin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "juwairen.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "jym.fit", "include_subdomains": true, "mode": "force-https" }, + { "name": "jznet.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "k-tube.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kaangenc.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "kaasbijwijn.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kabuabc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kadioglumakina.com.tr", "include_subdomains": true, "mode": "force-https" }, + { "name": "kainz.bayern", "include_subdomains": true, "mode": "force-https" }, + { "name": "kainz.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "kaizeronion.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kall.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "kangarooislandholidayaccommodation.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "karateka.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "karsofsystems.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "karting34.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kashdash.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "katiaetdavid.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "katnunn.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "katproxy.site", "include_subdomains": true, "mode": "force-https" }, + { "name": "kavik.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "kb3.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "keeweb.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "keisaku.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "kekz.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "kempkens.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "kendra.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "kenkoelectric.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kentacademiestrust.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "kerangalam.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "keybored.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "kgm-irm.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "kickerplaza.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kid-dachau.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kidbacker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kiel-media.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kienlen.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "kilerd.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "killerrobots.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kimberg.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "kiocloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kionetworks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kirbear.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kirinas.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kis-toitoidixi.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kisstyle.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "kita.id", "include_subdomains": true, "mode": "force-https" }, + { "name": "kitabgaul.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kittmedia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kizil.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "kk-neudorf-duissern.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "klas.or.id", "include_subdomains": true, "mode": "force-https" }, + { "name": "kleertjesvoordelig.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kleine-dingen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "klimat-pro.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "klunkergarten.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "klustekeningen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "knccloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kngk-group.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "kngk.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "knot-store.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kodakit.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "koerper-wie-seele.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "koezmangal.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "koi-sama.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "koketteriet.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "kollabria.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "komget.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "komikito.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "komiksbaza.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kompetenzwerft.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kon-sil.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "koophetlokaal.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "koretech.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "kozuch.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "kraynik.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kreationnext.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kromonos.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "krunut.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ksfh-mail.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kstan.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "kucom.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "kuehnel.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "kueulangtahunanak.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "kulde.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "kupelne-ptacek.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "kurofuku.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "kurz.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "kvalita-1a.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "kylelaker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kyosaku.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "l-lab.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "laboiteapc.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "lagalerievirtuelle.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "lampl.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "lan2k.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "lanbyte.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "langbein.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "lansinoh.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "laposte.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "lasnaves.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "latinphone.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lauftreff-himmelgeist.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "laurel4th.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "lbrt.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "lcti.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "ld-begunjscica.si", "include_subdomains": true, "mode": "force-https" }, + { "name": "le-dev.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "le-hosting.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "leadingsalons.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "leandre.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "learnflakes.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "learnfrenchfluently.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "learningorder.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lechiennoir.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "leesilvey.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "legarage.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "leilonorte.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "leitner.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "leiyun.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "lengzzz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lenovogaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "leonard.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "leopold.email", "include_subdomains": true, "mode": "force-https" }, + { "name": "leopoldina.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "lesnet.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "letsmultiplayerplay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "letstox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lgiswa.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "lgrs.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "libertas-tech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "liderwalut.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "lifeskillsdirect.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lifestylehunter.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "lifetimemoneymachine.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lifi.digital", "include_subdomains": true, "mode": "force-https" }, + { "name": "lifi.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "likeaross.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lingros-test.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "lingvo-svoboda.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "link2serve.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "linno.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "linuxeyecandy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "linuxhostsupport.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "linuxwebservertips.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "lislan.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "litevault.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "liudon.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "liverpoolmutualhomes.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "lkummer.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "llamacuba.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lm-pumpen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "loadso.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "localbitcoins.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "logario.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "london-transfers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "londonlanguageexchange.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "longboarding-ulm.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "loophost.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "lordjevington.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "lost.host", "include_subdomains": true, "mode": "force-https" }, + { "name": "lotsencafe.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "louiewatch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "love-schna.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "lover-bg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lowmagnitude.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lowsidetna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lpbk-bethel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "lucaterzini.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lucidframeworks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "luke.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "lukeng.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "lukeng.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "lungdoc.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "luno.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "luoxiao.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "lustrum.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "lwl.moe", "include_subdomains": true, "mode": "force-https" }, + { "name": "lynero.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "lynthium.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "m-edmondson.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "macaque.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "machon.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "macnemo.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "maddi.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "madebyshore.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "madin.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "madreacqua.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mafiasi.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "magenx.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mahrer.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "mailfence.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mailhost.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "mainlined.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "malerversand.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "malware.watch", "include_subdomains": true, "mode": "force-https" }, + { "name": "mamaxi.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "manaboutahor.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "management-ethics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "managewp.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "manhattanchoralensemble.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "manningbrothers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "maosensanguentadasdejesus.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "marcel-preuss.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "marchagen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "marcontrol.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "marie-elisabeth.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "marinelausa.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mark-a-hydrant.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "marketingdesignu.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "markido.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "markt-heiligenstadt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "marleyresort.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "marquiseclub.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "martensmxservice.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "martialc.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "martin-smith.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "martinkup.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "masse.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "matchneedle.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mathembedded.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "matthiasadler.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "mauriciog.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "mauricioghiorzi.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "mausi.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "maxbytes.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "maxima.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "maximiliankrieg.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "maxr1998.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "maxtruxa.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mbaestlein.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mbinformatik.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mbsec.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "mc81.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mcdonaldwhsl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mce.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "mce.nyc", "include_subdomains": true, "mode": "force-https" }, + { "name": "mceconferencecentre.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "mcooperlaw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mdewendt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mdkr.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mdpraha.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "mdwftw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mea.in.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "mechanus.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "medba.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "mediaburst.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "mediaselection.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "medm-test.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "meedoenzaanstad.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "meetingmanager.ovh", "include_subdomains": true, "mode": "force-https" }, + { "name": "megakiste.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mehrwert.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "meillard-auto-ecole.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "mein-webportal.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "meincenter-meinemeinung.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "meine-email-im.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "melearning.university", "include_subdomains": true, "mode": "force-https" }, + { "name": "melissaadkins.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "melody-lyrics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "melvinlow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mensagemdaluz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "menthix.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "menudrivetest.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "menuonlineordering.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "merkel.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "metaether.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "meteorapp.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "metzgerei-birkenhof.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "meuemail.pro", "include_subdomains": true, "mode": "force-https" }, + { "name": "meyeraviation.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mghiorzi.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "mhdsyarif.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mheistermann.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "microdots.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "midair.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "midirs.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "midlgx.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mijnreisoverzicht.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mijntransacties.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mikadesign.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "mikeburns.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mil0.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "milatrans.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "millenniumweb.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mindbodycontinuum.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "miniskipper.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "minobar.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mipiaci.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "mipiaci.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "mireservaonline.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "misakiya.co.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "missrain.tw", "include_subdomains": true, "mode": "force-https" }, + { "name": "mitnetz-gas.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mixposure.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "miyoshi-kikaku.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mizi.name", "include_subdomains": true, "mode": "force-https" }, + { "name": "mjcaffarattilaw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mkes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mkp-deutschland.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mktemp.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mm13.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "mma-acareporting.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mmgazhomeloans.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mmmm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mobility-events.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "modifiedmind.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "moebel-nagel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "moegirl.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mogry.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "mona.lu", "include_subdomains": true, "mode": "force-https" }, + { "name": "monasterialis.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "mondar.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "mondopoint.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "moneygo.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "monkeydust.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "montanacures.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "montenero.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "moo.la", "include_subdomains": true, "mode": "force-https" }, + { "name": "moonagic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "moonvpn.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mostwuat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "motherbase.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "motionfreight.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "motoryz.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mountainadventureseminars.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "moviesabout.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "movinglogistics.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mpcompliance.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mplant.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "mpserver12.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mpsgarage.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "mrnonz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mrpopat.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "msno.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "mtcgf.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mtg-esport.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mtn.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "mumei.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "murfy.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "murodese.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "murrayrun.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "muzykaprzeszladoplay.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "mx.org.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "my-owncloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "myairshop.gr", "include_subdomains": true, "mode": "force-https" }, + { "name": "mybon.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "mycollab.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "mydnaresults.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mydocserve.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "myip.tech", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.com.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.lt", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.lv", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "myownconference.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "myruststats.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mysticplumes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mystudy.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "mytc.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "mythslegendscollection.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mytripcar.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "mytripcar.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mytripcar.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "mytripcar.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "myworth.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "nabankco.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nagaya.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "nako.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "nalifornia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nargileh.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "naro.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "nartuk.com.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "natalia.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "natalt.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "natanaelys.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "natenom.name", "include_subdomains": true, "mode": "force-https" }, + { "name": "nathansmetana.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nationalcentereg.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "natural-progesterone.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "naturesystems.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "nauck.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "navigate-it-services.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nb6.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nbp.com.pk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ncoding.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "ncpw.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "ncstep.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "nebra.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "neftebitum-kngk.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "negativecurvature.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "neilgreen.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "neo19.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "netbank.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "netbulls.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "netmazk.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "netwerkmanager.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "networkalarmcorp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "networking4all.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "networkingnexus.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "networkingphoenix.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "netzwerkwerk.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "neuronasdigitales.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "never-afk.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "newedivideo.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "newlooknow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "newstone-tech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "newsyslog.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "newtnote.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "next176.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "next24.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "nextgencel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ng-firewall.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nghe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "nichteinschalten.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "niconiconi.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "niduxcomercial.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nierenpraxis-dr-merkel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nierenpraxis-merkel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nightfirecat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nightwinds.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "nikklassen.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "niklaslindblad.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "nikolasgrottendieck.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nine-hells.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ninespec.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nippon-oku.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nirada.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "nixien.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "nl-ix.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "nlegall.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "nmsnj.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nnqc.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "no17sifangjie.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "nodespin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "noedidacticos.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "noez.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nolatepayments.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nomesbiblicos.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "noobunbox.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "nord-sud.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "norskpensjon.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "nosecretshop.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nossasenhoradodesterro.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "notenoughtime.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "notificami.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "notoriousdev.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "notypiesni.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "npol.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nspeaks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nufla.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nukenet.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "null.cat", "include_subdomains": true, "mode": "force-https" }, + { "name": "nurserybook.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "nutleyeducationalfoundation.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "nutleyef.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "nuttyveg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nwra.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nwwc.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "nyip.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "nyronet.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "nzbs.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "o0o.one", "include_subdomains": true, "mode": "force-https" }, + { "name": "oasisim.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "obsidianirc.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "occentus.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ochaken.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "octanio.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "octocat.ninja", "include_subdomains": true, "mode": "force-https" }, + { "name": "oddtime.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ohiohealthfortune100.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ohsocool.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "oishioffice.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "oke.com.tw", "include_subdomains": true, "mode": "force-https" }, + { "name": "okutama.in.th", "include_subdomains": true, "mode": "force-https" }, + { "name": "olcso-vps-szerver.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "oliver-pietsch.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ollehbizev.co.kr", "include_subdomains": true, "mode": "force-https" }, + { "name": "ollies.cloud", "include_subdomains": true, "mode": "force-https" }, + { "name": "olymp-arts.world", "include_subdomains": true, "mode": "force-https" }, + { "name": "omniasl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "onefour.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "oneminute.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "oneweb.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "oneworldbank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "onguardonline.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "oniichan.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "online-wetten.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "onlinecompliance.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "onlinedeposit.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "onlinelighting.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "onlinetravelmoney.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "onmaps.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ontras.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "onyxwall.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "onyxwall.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ooyo.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "open-future.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "openblox.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "openconnect.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "openmtbmap.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "opim.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "oprbox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "optometriepunt.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "oracaodocredo.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "orbiosales.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ordereat.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "orientalart.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "orioncustompcs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "oroweatorganic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "osaiyuwu.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ossan-kobe-gourmet.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "osteammate.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "otpsmart.com.ua", "include_subdomains": true, "mode": "force-https" }, + { "name": "outsider.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "ovpn.to", "include_subdomains": true, "mode": "force-https" }, + { "name": "ovvy.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "owensmith.website", "include_subdomains": true, "mode": "force-https" }, + { "name": "own3d.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "ownit.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "oxygenabsorbers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "oznamovacipovinnost.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "p-s-b.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pacelink.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "packlane.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paestbin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pagetoimage.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "painosso.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "paisaone.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pajowu.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "pakremit.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paperturn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paperwork.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "paragon.com.sg", "include_subdomains": true, "mode": "force-https" }, + { "name": "paragreen.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "parentinterview.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "parentmail.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "parleu2016.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "partnerbeam.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pastaenprosecco.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pastaf.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paster.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "pasteros.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "pastie.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "patentfamily.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "paternitydnatest.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "patfs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "patientinsight.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "patralos.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "patrickschneider.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "paulbdelaat.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "paulinewesterman.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "paxwinkel.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "paypaq.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paypro.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "payroll.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "payslipview.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "paytwopay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pbapp.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pc-nf.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "pccentral.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pchax.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pdamsidoarjo.co.id", "include_subdomains": true, "mode": "force-https" }, + { "name": "peaceandwool.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "peakapp.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "peername.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pekkarik.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "pencepay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pentano.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pentest.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pepperhead.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "perfectseourl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "performous.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "perspectivum.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pet-nsk.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "petpost.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "pewboards.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pfarchimedes-pensioen123.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pgpm.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "pgtb.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "pharynks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "philipkohn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "philipmordue.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "phillmoore.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "phillprice.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "phormance.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "photo.org.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "phpdistribution.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "phpsecure.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "pickme.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "piekacz.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "piekacz.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "piekacz.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pieq.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "pieq.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "pieterjangeeroms.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "piliszek.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "pinnaclelife.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "pinnaclelife.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "pirateproxy.tv", "include_subdomains": true, "mode": "force-https" }, + { "name": "pisupp.ly", "include_subdomains": true, "mode": "force-https" }, + { "name": "pixelhero.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "pixipics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "piyabute.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "plaintech.net.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "plaintray.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "planpharmacy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "plasti-pac.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "plhdb.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "pliosoft.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "plixer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ploader.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "pluff.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "plumlocosoft.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pmt-documenten.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pnona.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "pointaction.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pointpro.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "policeiwitness.sg", "include_subdomains": true, "mode": "force-https" }, + { "name": "politically-incorrect.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "politiewervingshop.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "pompompoes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pontualcomp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "poolsandstuff.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "portosonline.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "portraitsystem.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "portvaletickets.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "poshpak.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "potatofrom.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "potatoheads.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "power99press.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "powerentertainment.tv", "include_subdomains": true, "mode": "force-https" }, + { "name": "powergridess.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "powerwellness-korecki.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ppipe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "prazynka.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "precedecaritas.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "prego-shop.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "preparetheword.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prescotonline.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "preworkout.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "prilock.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "princessmargaretlotto.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prior-it.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "privaterelay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "privatestatic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prjktruby.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prnt.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "pro-zone.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "profidea.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "profivps.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prohostonline.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "proitconsulting.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "projectbenson.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "promoscuola.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "promotiongeeks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "propipesystem.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prosocialmachines.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prosoft.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "protoyou.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "proxybay.top", "include_subdomains": true, "mode": "force-https" }, + { "name": "proxyweb.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "prtpe.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "prvikvadrat.hr", "include_subdomains": true, "mode": "force-https" }, + { "name": "przemas.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "psb1911.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "psicologia.co.ve", "include_subdomains": true, "mode": "force-https" }, + { "name": "pste.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "pterodactylus.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "ptsoft.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "puddis.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "pugliese.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "pvtschlag.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pxx.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "pyol.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "pysays.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "qccareerschool.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qcdesignschool.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qceventplanning.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qcmakeupacademy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qcstudentcenter.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qcstyleacademy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qctravelschool.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qingpat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qonqa.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "qrara.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "qrlending.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qualityofcourse.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "quantacloud.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "questsandrewards.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "quickpayservice.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "quietapple.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "quikpay.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "quintessa.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "quotemaster.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "quotev.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "r6-team.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "racasdecachorro.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "radyn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "raidstone.rocks", "include_subdomains": true, "mode": "force-https" }, + { "name": "railyardurgentcare.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rainforest.engineering", "include_subdomains": true, "mode": "force-https" }, + { "name": "raitza.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "randc.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "randomcage.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "randstaddirect.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "rannseier.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "rapido.nu", "include_subdomains": true, "mode": "force-https" }, + { "name": "ratajczak.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "ratd.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ratuseks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ratuseks.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ratuseks.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "rautermods.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ravindran.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "rawet.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "rawsec.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "raymondjcox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rcafox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rcorporation.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "rdh.asia", "include_subdomains": true, "mode": "force-https" }, + { "name": "rdns.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "readr.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "real-it.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "realwaycome.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "reanimated.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "reardenporn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "recapp.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "redar.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "redballoonsecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "redbee.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "redburn.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "reddingsbrigade-zwolle.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "rede-reim.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "rede.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "redigest.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "redzurl.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "regaloaks.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "regalosymuestrasgratis.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "regendevices.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "register.gov.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "reic.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "reiki-coaching.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "reimers.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "reithguard-it.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "relaxhavefun.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "remambo.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "rent-a-coder.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "renteater.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "replicagunsswords.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "republique.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "repustate.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "reputationweaver.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "res42.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "resc.la", "include_subdomains": true, "mode": "force-https" }, + { "name": "resist.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "restrito.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "retrotracks.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "revamed.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "revensoftware.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "reverie.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "revthefox.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "revtut.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "rhodenmanorcattery.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "rhynl.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "ribs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "righttoknow.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "rijschoolgevonden.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "riskmgt.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "riversideauto.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "riyono.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "robodeidentidad.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "rockcanyonbank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rocksberg.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "rolandreed.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "romeoferraris.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ron2k.za.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "root.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "rootswitch.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rotterdamjazz.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "rottweil-hilft.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "rout0r.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "rouvray.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "rowancasting.ie", "include_subdomains": true, "mode": "force-https" }, + { "name": "royalmarinesassociation.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "royalpub.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "rring.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "rsampaio.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "rsync.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "runcarina.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "runreport.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "ruobiyi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "rusempire.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "ryankearney.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "s-cubed.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "saccani.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "safic.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "salmo23.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "salmododia.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "salmos91.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "salverainha.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "saml2.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sanandreasstories.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sanasalud.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sanradon.by", "include_subdomains": true, "mode": "force-https" }, + { "name": "sarah-beckett-harpist.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sarahlicity.me.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sarahs-roestcafe.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sarahsweetlife.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sarindia.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "saskpension.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "satrent.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "satsukii.moe", "include_subdomains": true, "mode": "force-https" }, + { "name": "saucyfox.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "saunasandstuff.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "saunasandstuff.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "savenet.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "savingsstoreonline.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "schooltrends.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "schoolze.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "schreinerei-jahreis.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "schritt4fit.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "schroepfglas-versand.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sculpture.support", "include_subdomains": true, "mode": "force-https" }, + { "name": "secboom.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondary-survivor.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondary-survivor.help", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondary-survivor.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondarysurvivor.help", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondarysurvivorportal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "secondarysurvivorportal.help", "include_subdomains": true, "mode": "force-https" }, + { "name": "secretpanties.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sectun.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "secure-server-hosting.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "secure.chat", "include_subdomains": true, "mode": "force-https" }, + { "name": "secureonline.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "securityinet.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "securityinet.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "securityinet.org.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "securityprimes.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "securitysoapbox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "seedbox.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "seen.life", "include_subdomains": true, "mode": "force-https" }, + { "name": "segitz.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "selectruckscalltrackingreports.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "selfcarecentral.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "selldorado.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "semen3325.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "semps-servers.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "semps.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "semyonov.su", "include_subdomains": true, "mode": "force-https" }, + { "name": "sendinvoice.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "senedirect.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sensibus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "serenitycreams.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "serverpedia.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "servious.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sesha.co.za", "include_subdomains": true, "mode": "force-https" }, + { "name": "setphaserstostun.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "setuid.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "setuid0.kr", "include_subdomains": true, "mode": "force-https" }, + { "name": "sevenmatches.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sexton.uk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shadoom.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shadowsocks.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "shadowsworldonline.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "shagi29.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "shakespearesolutions.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "shareimg.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "sharepointdrive.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sharescope.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "shauncrowley.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "shawcentral.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "shazbots.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "shellfire.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "shenghaiautoparts.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shep.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "shh.sh", "include_subdomains": true, "mode": "force-https" }, + { "name": "shinnyosangha.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "shocksrv.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shorebreaksecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shortpath.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "showkeeper.tv", "include_subdomains": true, "mode": "force-https" }, + { "name": "shu-kin.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "shyrydan.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "sichere-kartenakzeptanz.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sieh.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "signslabelstapesandmore.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "silicagelpackets.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "silver-drachenkrieger.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "silverbowflyshop.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "silvistefi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "simbihaiti.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "simobilklub.si", "include_subdomains": true, "mode": "force-https" }, + { "name": "simon-hofmann.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "simoncommunity.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "simongong.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "simonkjellberg.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "simonreich.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "simonsreich.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "simplepractice.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "simplixos.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "simplymozzo.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "singleuse.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "singlu10.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sinosky.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sirius-lee.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "sistem-maklumat.com.my", "include_subdomains": true, "mode": "force-https" }, + { "name": "skalender.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "skaraborgsassistans.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "skarrok.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "skatclub-beratzhausen.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ski-insurance.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "skigebiete-test.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "skilldetector.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "skk.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "skotty.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "sloancom.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "slotcar.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "slowfood.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "slxh.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "slxh.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "smallplanet.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "smart-ov.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "smartftp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smarthdd.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smarthomedna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smarthouse.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "smartrak.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "smartshiftme.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smdavis.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "sme-gmbh.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "smithandcanova.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "smkw.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smoo.st", "include_subdomains": true, "mode": "force-https" }, + { "name": "smow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smow.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "smusg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sneakpod.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "snfdata.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sniderman.eu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "snow-online.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "snow-online.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "snughealth.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "so-healthy.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "social-events.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "socialbillboard.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "socialdevelop.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "sockeye.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "softwaredesign.foundation", "include_subdomains": true, "mode": "force-https" }, + { "name": "sogeek.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "sogravatas.net.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "sokkenhoek.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "sol-3.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "solar-ec.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "solidfuelappliancespares.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "solinter.com.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "soll-i.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "solutionhoisthire.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "solved.tips", "include_subdomains": true, "mode": "force-https" }, + { "name": "somethingnew.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "sona-gaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sondergaard.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sonic.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sos.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sotar.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "sotor.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "soulema.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sourcely.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "sous-surveillance.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "southside-crew.club", "include_subdomains": true, "mode": "force-https" }, + { "name": "southworcestershiregpservices.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "spacecompute.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "spacehq.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "spaggel.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "spauted.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "spaysy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "speculor.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "speedmann.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "speedyprep.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "speidel.com.tr", "include_subdomains": true, "mode": "force-https" }, + { "name": "spherenix.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "spicydog.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "spirit-dev.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "spitefultowel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "splitdna.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "sqlapius.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "sqr-training.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "square-src.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "squeezemetrics.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "srchub.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "srv47.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ssl247.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ssl247.com.mx", "include_subdomains": true, "mode": "force-https" }, + { "name": "ssl247.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "ssl247.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ssnc.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sss3s.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stabletoken.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stadionmanager.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stadjerspasonline.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "stage-props-blank-guns.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stageirites.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "stagingjobshq.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stagstickets.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "stahl.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "starmusic.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "stash.ai", "include_subdomains": true, "mode": "force-https" }, + { "name": "statecover.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "stateofexception.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "static.or.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "stationnementdenuit.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "statuschecks.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "stealsaga.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "steckregal-super.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "steidlewirt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "steigerplank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stellanova-planeten.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sterlingtrader.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stevensononthe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "stoffe-monster.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "stoick.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "storecove.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "storeden.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stqry.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "str0.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "strchr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "streamzilla.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "strictlysudo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stroeercrm.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "studenckiemetody.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "stupendous.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "stuur.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "stw-group.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "styleci.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "stylenda.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "su1ph3r.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "subseq.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "subtitle.rip", "include_subdomains": true, "mode": "force-https" }, + { "name": "suncountrymarine.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "supastuds.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "super-o-blog.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "superhome.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "superiorfloridavacation.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "superkonsult.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "superswingtrainer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "superwally.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "surfone-leucate.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "surgenet.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "survature.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "susastudentenjobs.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "sustainability.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "sustsol.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "svenskacasino.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "swaggerdile.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "swaleacademiestrust.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sycamorememphis.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sydgrabber.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sylvaindurand.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sylvanorder.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "synapticconsulting.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "sync-it.no", "include_subdomains": true, "mode": "force-https" }, + { "name": "syneic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "synfin.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "syriatalk.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "syriatalk.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "sysmike.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "szechenyi2020.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "t-hawk.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "t-point.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "t-shirts4less.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "tabla-periodica.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tacomafia.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "takusan.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "talsi.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "tangiblesecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tante-bugil.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tapfinder.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "taquilla.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "taskforce512.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "tastycake.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tatilbus.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tavoittaja.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "taxspeaker.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "team-one.racing", "include_subdomains": true, "mode": "force-https" }, + { "name": "team3482.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tech-essential.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tech-rat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "techmajesty.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "techpointed.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tecnogaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tedeh.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tedovo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "teebeedee.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "teemo.gg", "include_subdomains": true, "mode": "force-https" }, + { "name": "telefonkonferenz.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "tempcraft.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tenenz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tengroup.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tennisadmin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tentations-voyages.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "teos.online", "include_subdomains": true, "mode": "force-https" }, + { "name": "teoskanta.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "tepid.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "terracloud.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "terravirtua.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "testingbot.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "teuniz.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "teunstuinposters.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "texterseo.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "textoplano.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "tgr.re", "include_subdomains": true, "mode": "force-https" }, + { "name": "thackbarth.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "thai.land", "include_subdomains": true, "mode": "force-https" }, + { "name": "thaicyberpoint.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thaihostcool.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theberkshirescompany.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thecitizens.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thecitywarehouse.clothing", "include_subdomains": true, "mode": "force-https" }, + { "name": "theclementinebutchers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theclubjersey.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thedevrycommonsbrasil.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theendofzion.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thefarbeyond.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theflyingbear.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "thefootballanalyst.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thefox.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "thegcccoin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thegvoffice.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "thehiddenbay.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "thelastsurprise.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "themillerslive.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thenorthschool.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "thepiratebay.poker", "include_subdomains": true, "mode": "force-https" }, + { "name": "theploughharborne.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "theseoframework.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thesharepointfarm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theshopally.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "theurbanyoga.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thevintagenews.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thewindow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thierfreund.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "thinktux.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "thirdpartytrade.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "thirty5.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "thomwiggers.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "threatcentral.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "throwaway.link", "include_subdomains": true, "mode": "force-https" }, + { "name": "tibbitshall.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "ticketoplichting.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "tickettoaster.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "tickreport.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tigerdile.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "timbuktutimber.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "time-river.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "timestamp.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "timmersgems.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "timwittenberg.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tippspiel.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "tjenestetorvet.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "tls.care", "include_subdomains": true, "mode": "force-https" }, + { "name": "tmi-products.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "tmi-produkter.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "tmpraider.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tofu.im", "include_subdomains": true, "mode": "force-https" }, + { "name": "togelonlinecommunity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tokaido.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tokoone.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tokotimbangandigitalmurah.web.id", "include_subdomains": true, "mode": "force-https" }, + { "name": "tommsy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tomwilson.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "tonegidoarchief.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "tonkinson.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "topbrakes.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "topdevbox.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "torsten-schmitz.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "toshkov.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "totalbeauty.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "totaltriathlon.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "totem-international.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tourispo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tourpeer.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tout-art.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "towandalibrary.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "tp-iryuubun.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tp-kabushiki.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tp-kyouyufudousan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tp-law.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "trade-smart.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "tradeinvent.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "trademan.ky", "include_subdomains": true, "mode": "force-https" }, + { "name": "tradinghope.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tradiz.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "trakfusion.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "transacid.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "transmithe.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "transportal.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "travelinsurance.co.nz", "include_subdomains": true, "mode": "force-https" }, + { "name": "tretkowski.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "trident-online.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "trim-a-slab.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "trinityaffirmations.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "trinnes.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tripdelta.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tripseats.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "troi.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "truckerswereld.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "truejob.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "trueteaching.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "truthmessages.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "trw-reseller.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tsecy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tsgbit.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tsrstore.gq", "include_subdomains": true, "mode": "force-https" }, + { "name": "tubepro.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "tunai.id", "include_subdomains": true, "mode": "force-https" }, + { "name": "turbobit.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "turnik-67.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "turtle.ai", "include_subdomains": true, "mode": "force-https" }, + { "name": "turtlementors.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tuxcloud.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "twarog.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "twd2.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "twd2.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "twelve.rocks", "include_subdomains": true, "mode": "force-https" }, + { "name": "twogo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tx041cap.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "txclimbers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "txf.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "tyl.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "tylerschmidtke.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tylian.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tyroproducts.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "tysye.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "uber.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "uberboxen.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ublox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ubuntuhot.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "udomain.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ufgaming.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "uhc.gg", "include_subdomains": true, "mode": "force-https" }, + { "name": "ukchemicalresearch.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "ukdropshipment.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "ukdropshipment.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ultieme.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "umie.cc", "include_subdomains": true, "mode": "force-https" }, + { "name": "umisonoda.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "under30stravelinsurance.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "undo.co.il", "include_subdomains": true, "mode": "force-https" }, + { "name": "unfiltered.nyc", "include_subdomains": true, "mode": "force-https" }, + { "name": "unicooo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "uniform-agri.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "unit7jazz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "unit7jazz.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "universalcarremote.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "universalpaymentgateway.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "university4industry.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "universogay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "unsystem.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "upani.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "upstox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "uptimed.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "uptimenotguaranteed.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "urbanesecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "urlchomp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "urspringer.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "usaab.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "usbirthcertificate.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "usercare.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "usleep.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "utopianhomespa.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "uttnetgroup.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "v2.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "vakuutuskanava.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "valkyrja.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "valleyridgepta.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "vampirism.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "vandalfsen.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "vande-walle.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "vanitynailworkz.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vantien.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vavai.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vbest.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vcientertainment.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vcr.re", "include_subdomains": true, "mode": "force-https" }, + { "name": "vdbongard.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vdrpro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vennet.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "venturepro.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vetdnacenter.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "victorjacobs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vide-maisons.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "videogamesartwork.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "videotogel.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vidid.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vidz.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "vigilantnow.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vigilo.cf", "include_subdomains": true, "mode": "force-https" }, + { "name": "vigilo.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "vigo-tarife.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "vikasbabyworld.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "viktorsvantesson.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vincentpancol.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vincitraining.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vintageheartcoffee.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vinyculture.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vipmusic.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "virtualdesignmedia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "visioflux-premium.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vistaalmar.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "vistarait.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vitagenda.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "vitalita.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "vitapingu.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "viviotech.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "vlora.city", "include_subdomains": true, "mode": "force-https" }, + { "name": "vnvisa.center", "include_subdomains": true, "mode": "force-https" }, + { "name": "voceinveste.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "volkergropp.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "vonavycukor.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "vpn-byen.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "vps-szerver-berles.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "vratny.space", "include_subdomains": true, "mode": "force-https" }, + { "name": "vuosaarenmontessoritalo.fi", "include_subdomains": true, "mode": "force-https" }, + { "name": "vux.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "vxapps.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vxstream-sandbox.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "w4xzr.top", "include_subdomains": true, "mode": "force-https" }, + { "name": "wa-stromerzeuger.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "waelti.xxx", "include_subdomains": true, "mode": "force-https" }, + { "name": "waffle.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "waka-mono.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wakamiyasumiyosi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wakened.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "wallsblog.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "wangql.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "wangql.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "warhaggis.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "warhistoryonline.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "warmservers.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "warped.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "watchium.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wave.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "wavefrontsystemstech.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wavesboardshop.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "waylaydesign.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wdt.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "wealthcentral.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "wealthfactory.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wealthreport.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "wear2work.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wearandcare.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "web4pro.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "webchat.domains", "include_subdomains": true, "mode": "force-https" }, + { "name": "webdesign-kronberg.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "webergrillrestaurant.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "webhosting4.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "weblogic.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "webmax.com.tr", "include_subdomains": true, "mode": "force-https" }, + { "name": "webperformance.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "webs4all.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "websectools.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "webseitenserver.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "webstylemedia.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "webtheapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "webwit.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "webwork.pw", "include_subdomains": true, "mode": "force-https" }, + { "name": "weicn.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "welcomehelp.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wellastore.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "wellensteyn.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "werbewelt-tv.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "werken-bij-inwork.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "werkenbijkfc.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "westsussexconnecttosupport.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "wetoxic.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "whatanime.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "whatsstalk.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "whiskynerd.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "whitelabelcashback.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wholesomeharvestbread.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wholikes.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "wiberg.nu", "include_subdomains": true, "mode": "force-https" }, + { "name": "wiedu.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "wijnservices.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wikiclash.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "willberg.bayern", "include_subdomains": true, "mode": "force-https" }, + { "name": "willcipriano.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "william.si", "include_subdomains": true, "mode": "force-https" }, + { "name": "wimake.solutions", "include_subdomains": true, "mode": "force-https" }, + { "name": "windrunner.se", "include_subdomains": true, "mode": "force-https" }, + { "name": "winghill.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wingumd.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "winterschoen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wintodoor.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wiretrip.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "wispapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "witway.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wizzr.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wmcuk.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "wofford-ecs.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "wonder.com.mx", "include_subdomains": true, "mode": "force-https" }, + { "name": "wonderlandmovies.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wondy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wordxtra.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "workfone.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "woutervdb.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wow-foederation.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wowapi.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "wphostingspot.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wsa.poznan.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "wth.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "wubocong.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "wuetix.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "wufu.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "wvg.myds.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "www3.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "x3led.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "x509.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "xa1.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "xalqbank-online.az", "include_subdomains": true, "mode": "force-https" }, + { "name": "xbb.hk", "include_subdomains": true, "mode": "force-https" }, + { "name": "xbb.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "xboxdownloadthat.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xcentricmold.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xdeftor.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xendo.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "xg3n1us.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "xichuangke.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xilef.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "xinbiji.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "xmpp.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "xn--3lqp21gwna.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "xn--3lqp21gwna.xn--fiqz9s", "include_subdomains": true, "mode": "force-https" }, + { "name": "xn--79q87uvkclvgd56ahq5a.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "xn--pbt947am3ab71g.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xnode.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "xoffy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xrockx.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "xsmobile.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "xuc.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "xxbase.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "xyfun.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "yacobo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yak.is", "include_subdomains": true, "mode": "force-https" }, + { "name": "yal.sh", "include_subdomains": true, "mode": "force-https" }, + { "name": "yameveo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yaoidreams.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yapbreak.fr", "include_subdomains": true, "mode": "force-https" }, + { "name": "yasinaydin.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ydy.jp", "include_subdomains": true, "mode": "force-https" }, + { "name": "yesonline.asia", "include_subdomains": true, "mode": "force-https" }, + { "name": "yesonline.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "yinlei.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "yjsoft.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "ynode.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "ynode.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "youkaryote.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "youkaryote.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "yourznc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yuhen.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "yuko.moe", "include_subdomains": true, "mode": "force-https" }, + { "name": "yum.beer", "include_subdomains": true, "mode": "force-https" }, + { "name": "z-vector.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zaalleatherwear.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "zahe.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "zamorano.edu", "include_subdomains": true, "mode": "force-https" }, + { "name": "zap.yt", "include_subdomains": true, "mode": "force-https" }, + { "name": "zbigniewgalucki.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "zbp.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "zebry.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "zeedroom.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "zehdenick-bleibt-bunt.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "zeitzer-turngala.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "zenvideocloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zerekin.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "zertif.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "zerudi.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zespia.tw", "include_subdomains": true, "mode": "force-https" }, + { "name": "zeto365.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "zetorzeszow.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "zhangruilin.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zhh.in", "include_subdomains": true, "mode": "force-https" }, + { "name": "ziin.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "zimiao.moe", "include_subdomains": true, "mode": "force-https" }, + { "name": "zingarastore.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zionvps.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zippy-download.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zippy-download.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "zjutv.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zohar.wang", "include_subdomains": true, "mode": "force-https" }, + { "name": "zomerschoen.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "zorium.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "zuram.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "zvncloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "zyf.pw", "include_subdomains": true, "mode": "force-https" }, + // END OF MANUAL ADDITIONS + + // Entries submitted through hstspreload.appspot.com in Chrome 51 or later. + // START OF BULK ADDITIONS + { "name": "bodhi.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "communityblog.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "keys.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "meetbot.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "paste.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "spins.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "src.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "torrent.fedoraproject.org", "include_subdomains": true, "mode": "force-https" }, + // END OF BULK ADDITIONS + + // To avoid trailing comma changes from showing up in diffs, we place a + // single entry at the end. + { "name": "hstspreload.appspot.com", "include_subdomains": true, "mode": "force-https" } ], // |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/net.gyp b/net/net.gyp index 1f30e79..8c51208 100644 --- a/net/net.gyp +++ b/net/net.gyp
@@ -706,34 +706,6 @@ ], }, { - 'target_name': 'net_docs', - 'type': 'none', - 'actions': [ - { - 'action_name': 'net_docs', - 'variables': { - 'net_docs_input_dir': '.', - }, - 'inputs': [ - '<@(net_docs_sources)', - ], - 'outputs': [ - '<(net_docs_output_dir)', - ], - 'action': [ - 'python', - '<(net_docs_script)', - '--input_path', - '<(net_docs_input_dir)', - '--output_path', - '<(net_docs_output_dir)', - '<@(net_docs_sources)', - ], - 'message': 'Rendering network stack documentation', - } - ], - }, - { 'target_name': 'http_server', 'type': 'static_library', 'variables': { 'enable_wexit_time_destructors': 1, },
diff --git a/net/net.gypi b/net/net.gypi index b47e43f..9e7161f 100644 --- a/net/net.gypi +++ b/net/net.gypi
@@ -62,7 +62,6 @@ 'base/registry_controlled_domains/registry_controlled_domain.h', 'base/sockaddr_storage.cc', 'base/sockaddr_storage.h', - 'base/socket_performance_watcher.cc', 'base/socket_performance_watcher.h', 'base/socket_performance_watcher_factory.h', 'base/sys_addrinfo.h', @@ -121,6 +120,10 @@ 'cert/signed_certificate_timestamp.h', 'cert/signed_tree_head.cc', 'cert/signed_tree_head.h', + 'cert/sth_distributor.cc', + 'cert/sth_distributor.h', + 'cert/sth_observer.h', + 'cert/sth_reporter.h', 'cert/x509_cert_types.cc', 'cert/x509_cert_types.h', 'cert/x509_certificate.cc', @@ -2001,17 +2004,5 @@ "websockets/websocket_stream.cc", "websockets/websocket_stream.h", ], - 'net_docs_script': 'tools/net_docs/net_docs.py', - 'net_docs_sources': [ - 'README.md', - 'docs/bug-triage.md', - 'docs/bug-triage-labels.md', - 'docs/bug-triage-suggested-workflow.md', - 'docs/code-patterns.md', - 'docs/crash-course-in-net-internals.md', - 'docs/life-of-a-url-request.md', - 'sdch/README.md', - ], - 'net_docs_output_dir': '<(PRODUCT_DIR)/net/docs', } }
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index 0a5ab02..4774b5bf 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -11,8 +11,8 @@ #include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "net/base/chunked_upload_data_stream.h" -#include "net/base/network_quality_estimator.h" #include "net/base/socket_performance_watcher.h" +#include "net/base/socket_performance_watcher_factory.h" #include "net/base/test_completion_callback.h" #include "net/base/test_data_directory.h" #include "net/cert/mock_cert_verifier.h" @@ -139,47 +139,53 @@ bool was_called_; }; -class TestNetworkQualityEstimator : public NetworkQualityEstimator { +class TestSocketPerformanceWatcher : public SocketPerformanceWatcher { public: - TestNetworkQualityEstimator() - : NetworkQualityEstimator(scoped_ptr<net::ExternalEstimateProvider>(), - std::map<std::string, std::string>()), - watcher_count_(0) {} + explicit TestSocketPerformanceWatcher(bool* rtt_notification_received) + : rtt_notification_received_(rtt_notification_received) {} + ~TestSocketPerformanceWatcher() override {} - ~TestNetworkQualityEstimator() override {} + bool ShouldNotifyUpdatedRTT() const override { return true; } + void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override { + *rtt_notification_received_ = true; + } + + void OnConnectionChanged() override {} + + private: + bool* rtt_notification_received_; + + DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher); +}; + +class TestSocketPerformanceWatcherFactory + : public SocketPerformanceWatcherFactory { + public: + TestSocketPerformanceWatcherFactory() + : watcher_count_(0u), rtt_notification_received_(false) {} + ~TestSocketPerformanceWatcherFactory() override {} + + // SocketPerformanceWatcherFactory implementation: scoped_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher( const Protocol protocol) override { if (protocol != PROTOCOL_QUIC) { - NOTIMPLEMENTED(); + return nullptr; } ++watcher_count_; - return NetworkQualityEstimator::CreateSocketPerformanceWatcher(protocol); + return scoped_ptr<SocketPerformanceWatcher>( + new TestSocketPerformanceWatcher(&rtt_notification_received_)); } size_t watcher_count() const { return watcher_count_; } - private: - size_t watcher_count_; - DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator); -}; - -class TestRTTObserver : public NetworkQualityEstimator::RTTObserver { - public: - TestRTTObserver() : rtt_notification_received_(false) {} - bool rtt_notification_received() const { return rtt_notification_received_; } - // NetworkQualityEstimator::RttObserver implementation: - void OnRTTObservation( - int32_t rtt_ms, - const base::TimeTicks& timestamp, - net::NetworkQualityEstimator::ObservationSource source) override { - rtt_notification_received_ = true; - } - private: + size_t watcher_count_; bool rtt_notification_received_; + + DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory); }; class QuicNetworkTransactionTest @@ -190,7 +196,6 @@ : clock_(new MockClock), maker_(GetParam(), 0, clock_, kDefaultServerHostName), cert_transparency_verifier_(new MultiLogCTVerifier()), - test_network_quality_estimator_(new TestNetworkQualityEstimator()), ssl_config_service_(new SSLConfigServiceDefaults), proxy_service_(ProxyService::CreateDirect()), auth_handler_factory_( @@ -442,7 +447,7 @@ params_.transport_security_state = &transport_security_state_; params_.cert_transparency_verifier = cert_transparency_verifier_.get(); params_.socket_performance_watcher_factory = - test_network_quality_estimator_.get(); + &test_socket_performance_watcher_factory_; params_.proxy_service = proxy_service_.get(); params_.ssl_config_service = ssl_config_service_.get(); params_.http_auth_handler_factory = auth_handler_factory_.get(); @@ -455,8 +460,6 @@ params_.quic_host_whitelist.insert(host); } - test_network_quality_estimator_->AddRTTObserver(&rtt_observer_); - session_.reset(new HttpNetworkSession(params_)); session_->quic_stream_factory()->set_require_confirmation(false); ASSERT_EQ(params_.quic_socket_receive_buffer_size, @@ -588,8 +591,7 @@ MockCertVerifier cert_verifier_; TransportSecurityState transport_security_state_; scoped_ptr<CTVerifier> cert_transparency_verifier_; - scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_; - TestRTTObserver rtt_observer_; + TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_; scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; scoped_ptr<ProxyService> proxy_service_; scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; @@ -649,9 +651,11 @@ params_.enable_alternative_service_with_different_host = false; CreateSession(); - EXPECT_FALSE(rtt_observer_.rtt_notification_received()); + EXPECT_FALSE( + test_socket_performance_watcher_factory_.rtt_notification_received()); SendRequestAndExpectQuicResponse("hello!"); - EXPECT_TRUE(rtt_observer_.rtt_notification_received()); + EXPECT_TRUE( + test_socket_performance_watcher_factory_.rtt_notification_received()); // Check that the NetLog was filled reasonably. TestNetLogEntry::List entries; @@ -711,7 +715,8 @@ mock_quic_data.AddSocketDataToFactory(&socket_factory_); - EXPECT_FALSE(rtt_observer_.rtt_notification_received()); + EXPECT_FALSE( + test_socket_performance_watcher_factory_.rtt_notification_received()); // There is no need to set up an alternate protocol job, because // no attempt will be made to speak to the proxy over TCP. @@ -721,7 +726,8 @@ CreateSession(); SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); - EXPECT_TRUE(rtt_observer_.rtt_notification_received()); + EXPECT_TRUE( + test_socket_performance_watcher_factory_.rtt_notification_received()); } // Regression test for https://crbug.com/492458. Test that for an HTTP @@ -831,7 +837,7 @@ params_.enable_alternative_service_with_different_host = false; CreateSession(); - EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count()); + EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count()); for (size_t i = 0; i < 2; ++i) { scoped_ptr<HttpNetworkTransaction> trans( new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); @@ -839,7 +845,7 @@ int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); - EXPECT_EQ(1 + i, test_network_quality_estimator_->watcher_count()); + EXPECT_EQ(1 + i, test_socket_performance_watcher_factory_.watcher_count()); } } @@ -863,7 +869,7 @@ CreateSession(); SendRequestAndExpectHttpResponse("hello world"); - EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count()); + EXPECT_EQ(0U, test_socket_performance_watcher_factory_.watcher_count()); } TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) { @@ -2292,7 +2298,8 @@ TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { maker_.set_hostname("www.example.org"); - EXPECT_FALSE(rtt_observer_.rtt_notification_received()); + EXPECT_FALSE( + test_socket_performance_watcher_factory_.rtt_notification_received()); MockQuicData mock_quic_data; mock_quic_data.AddWrite( ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, @@ -2310,7 +2317,8 @@ CreateSession(); AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); SendRequestAndExpectQuicResponse("hello!"); - EXPECT_TRUE(rtt_observer_.rtt_notification_received()); + EXPECT_TRUE( + test_socket_performance_watcher_factory_.rtt_notification_received()); } TEST_P(QuicNetworkTransactionTest, QuicUpload) {
diff --git a/net/third_party/mozilla_security_manager/nsKeygenHandler.cpp b/net/third_party/mozilla_security_manager/nsKeygenHandler.cpp index f239cc1..51d15bd0 100644 --- a/net/third_party/mozilla_security_manager/nsKeygenHandler.cpp +++ b/net/third_party/mozilla_security_manager/nsKeygenHandler.cpp
@@ -215,9 +215,9 @@ } // Convert the signed public key and challenge into base64/ascii. - base::Base64Encode( - std::string(reinterpret_cast<char*>(signedItem.data), signedItem.len), - &result_blob); + base::Base64Encode(base::StringPiece(reinterpret_cast<char*>(signedItem.data), + signedItem.len), + &result_blob); failure: if (!isSuccess) {
diff --git a/net/tools/net_docs/net_docs.py b/net/tools/net_docs/net_docs.py deleted file mode 100755 index a433a201..0000000 --- a/net/tools/net_docs/net_docs.py +++ /dev/null
@@ -1,123 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -"""Reads, parses, and (optionally) writes as HTML the contents of Markdown -files passed as arguments. Intended for rendering network stack documentation -stored as Markdown in the source tree to a human-readable format.""" - - -import argparse -import os.path -import sys - - -def nth_parent_directory(path, n): - for i in range(n): - path = os.path.dirname(path) - return path - - -# Go up the directory tree from this script and add src/third_party to sys.path -# so "import markdown" can find it in src/third_party/markdown. -SCRIPT_PATH = os.path.abspath(__file__) -SRC_PATH = nth_parent_directory(SCRIPT_PATH, 4) -THIRD_PARTY_PATH = os.path.join(SRC_PATH, 'third_party') -sys.path.insert(0, THIRD_PARTY_PATH) -import markdown - - -def ReadFile(filename): - with open(filename, 'r') as file: - return file.read() - - -def WriteFile(filename, contents): - dir = os.path.dirname(filename) - if not os.path.isdir(dir): - os.mkdir(dir) - with open(filename, 'w') as file: - file.write(contents) - - -TEMPLATE = """ -<html> - <head> - <title>{title}</title> - </head> - <body> - {body} - </body> -</html>""" - - -def FormatPage(markdown_html, title): - # TODO(ttuttle): Add a navigation list / table of contents of available - # Markdown files, perhaps? - return TEMPLATE.format(title=title, body=markdown_html) - - -def ProcessDocs(input_filenames, input_pathname, output_pathname, - extensions=None): - """Processes a list of Markdown documentation files. - - If input_pathname and output_pathname are specified, outputs HTML files - into the corresponding subdirectories of output_pathname. If one or both is - not specified, simply ensures the files exist and contain valid Markdown. - - Args: - input_filenames: A list of filenames (absolute, or relative to $PWD) of - Markdown files to parse and possibly render. - input_pathname: The base directory of the input files. (Needed so they - can be placed in the same relative path in the output path.) - output_pathname: The output directory into which rendered Markdown files - go, using that relative path. - extensions: a list of Markdown.extensions to apply if any. - - Returns: - nothing - - Raises: - IOError: if any of the file operations fail (e.g. input_filenames - contains a non-existent file). - """ - - outputting = (input_pathname is not None) and (output_pathname is not None) - - if extensions: - markdown_parser = markdown.Markdown(extensions) - else: - markdown_parser = markdown.Markdown() - - for input_filename in input_filenames: - markdown_text = ReadFile(input_filename) - markdown_html = markdown_parser.reset().convert(markdown_text) - if not outputting: - continue - - full_html = FormatPage(markdown_html, title=input_filename) - rel_filename = os.path.relpath(input_filename, start=input_pathname) - output_filename = os.path.join(output_pathname, rel_filename) + '.html' - WriteFile(output_filename, full_html) - - -def main(): - parser = argparse.ArgumentParser( - description='Parse and render Markdown documentation') - parser.add_argument('--input_path', default=None, - help="Input path for Markdown; required only if output_path set") - parser.add_argument('--output_path', default=None, - help="Output path for rendered HTML; if unspecified, won't output") - parser.add_argument('filenames', nargs=argparse.REMAINDER) - args = parser.parse_args() - - extensions = ['markdown.extensions.def_list'] - ProcessDocs(args.filenames, args.input_path, args.output_path, extensions) - - return 0 - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 84ad5a0..620d8b8 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -835,7 +835,15 @@ #if !defined(DISABLE_FILE_SUPPORT) TEST_F(URLRequestTest, FileTest) { base::FilePath app_path; + +#if defined(OS_ANDROID) + // Android devices are not guaranteed to be able to read /proc/self/exe + // Use /etc/hosts instead + app_path = base::FilePath("/etc/hosts"); +#else PathService::Get(base::FILE_EXE, &app_path); +#endif // OS_ANDROID + GURL app_url = FilePathToFileURL(app_path); TestDelegate d;
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index a8140d520..b2e7e2b 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc
@@ -8,8 +8,9 @@ #include <stddef.h> #include <winspool.h> +#include <memory> + #include "base/memory/free_deleter.h" -#include "base/memory/scoped_ptr.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" @@ -184,7 +185,7 @@ kLevel, NULL, 0, &bytes_needed, &count_returned); if (!bytes_needed) return false; - scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); + std::unique_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, kLevel, printer_info_buffer.get(), bytes_needed, &bytes_needed, &count_returned); @@ -233,7 +234,7 @@ PrinterSemanticCapsAndDefaults caps; - scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = + std::unique_ptr<DEVMODE, base::FreeDeleter> user_settings = CreateDevMode(printer_handle.Get(), NULL); if (user_settings) { if (user_settings->dmFields & DM_COLOR) @@ -321,7 +322,7 @@ } ScopedPrinterHandle printer_handle; if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { - scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( + std::unique_ptr<DEVMODE, base::FreeDeleter> devmode_out( CreateDevMode(printer_handle.Get(), NULL)); if (!devmode_out) return false;
diff --git a/printing/backend/printing_info_win.cc b/printing/backend/printing_info_win.cc index d5b37cad..ab878c0 100644 --- a/printing/backend/printing_info_win.cc +++ b/printing/backend/printing_info_win.cc
@@ -18,7 +18,7 @@ if (size == 0) { return NULL; } - scoped_ptr<uint8_t[]> buffer(new uint8_t[size]); + std::unique_ptr<uint8_t[]> buffer(new uint8_t[size]); memset(buffer.get(), 0, size); if (!::GetPrinterDriver(printer, NULL, level, buffer.get(), size, &size)) { return NULL; @@ -34,7 +34,7 @@ ", error = " << GetLastError(); return NULL; } - scoped_ptr<uint8_t[]> buffer(new uint8_t[size]); + std::unique_ptr<uint8_t[]> buffer(new uint8_t[size]); memset(buffer.get(), 0, size); if (!::GetPrinter(printer, level, buffer.get(), size, &size)) { LOG(WARNING) << "Failed to get PRINTER_INFO_" << level <<
diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h index 896ed12a..0fd1160 100644 --- a/printing/backend/printing_info_win.h +++ b/printing/backend/printing_info_win.h
@@ -9,7 +9,8 @@ #include <stdint.h> #include <winspool.h> -#include "base/memory/scoped_ptr.h" +#include <memory> + #include "printing/printing_export.h" namespace printing { @@ -34,7 +35,7 @@ } private: - scoped_ptr<uint8_t[]> buffer_; + std::unique_ptr<uint8_t[]> buffer_; }; // This class is designed to work with DRIVER_INFO_X structures @@ -52,7 +53,7 @@ } private: - scoped_ptr<uint8_t[]> buffer_; + std::unique_ptr<uint8_t[]> buffer_; }; } // namespace internal
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc index 5b55ea9..c96e123c 100644 --- a/printing/backend/win_helper.cc +++ b/printing/backend/win_helper.cc
@@ -7,13 +7,13 @@ #include <stddef.h> #include <algorithm> +#include <memory> #include "base/file_version_info.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/free_deleter.h" -#include "base/memory/scoped_ptr.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -370,7 +370,7 @@ info[0] = base::WideToUTF8(info_6.get()->pName); if (info_6.get()->pDriverPath) { - scoped_ptr<FileVersionInfo> version_info( + std::unique_ptr<FileVersionInfo> version_info( FileVersionInfo::CreateFileVersionInfo( base::FilePath(info_6.get()->pDriverPath))); if (version_info.get()) { @@ -389,10 +389,10 @@ return driver_info; } -scoped_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( +std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( const base::string16& printer_name, const std::string& print_ticket) { - scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode; + std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode; printing::ScopedXPSInitializer xps_initializer; if (!xps_initializer.initialized()) { // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) @@ -428,11 +428,11 @@ return dev_mode; } -scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( +std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( HANDLE printer, const base::string16& printer_name, bool color) { - scoped_ptr<DEVMODE, base::FreeDeleter> default_ticket = + std::unique_ptr<DEVMODE, base::FreeDeleter> default_ticket = CreateDevMode(printer, NULL); if (!default_ticket) return default_ticket; @@ -462,7 +462,7 @@ const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome; std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color); - scoped_ptr<DEVMODE, base::FreeDeleter> ticket = + std::unique_ptr<DEVMODE, base::FreeDeleter> ticket = printing::XpsTicketToDevMode(printer_name, xps_ticket); if (!ticket) return default_ticket; @@ -470,24 +470,24 @@ return ticket; } -scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, - DEVMODE* in) { +std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, + DEVMODE* in) { LONG buffer_size = DocumentProperties( NULL, printer, const_cast<wchar_t*>(L""), NULL, NULL, 0); if (buffer_size < static_cast<int>(sizeof(DEVMODE))) - return scoped_ptr<DEVMODE, base::FreeDeleter>(); + return std::unique_ptr<DEVMODE, base::FreeDeleter>(); // Some drivers request buffers with size smaller than dmSize + dmDriverExtra. // crbug.com/421402 buffer_size *= 2; - scoped_ptr<DEVMODE, base::FreeDeleter> out( + std::unique_ptr<DEVMODE, base::FreeDeleter> out( reinterpret_cast<DEVMODE*>(calloc(buffer_size, 1))); DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER; if (DocumentProperties( NULL, printer, const_cast<wchar_t*>(L""), out.get(), in, flags) != IDOK) { - return scoped_ptr<DEVMODE, base::FreeDeleter>(); + return std::unique_ptr<DEVMODE, base::FreeDeleter>(); } int size = out->dmSize; int extra_size = out->dmDriverExtra; @@ -495,7 +495,7 @@ return out; } -scoped_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( +std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( HANDLE printer, const base::string16& printer_name, DEVMODE* in, @@ -509,13 +509,13 @@ NULL, 0); if (buffer_size < static_cast<int>(sizeof(DEVMODE))) - return scoped_ptr<DEVMODE, base::FreeDeleter>(); + return std::unique_ptr<DEVMODE, base::FreeDeleter>(); // Some drivers request buffers with size smaller than dmSize + dmDriverExtra. // crbug.com/421402 buffer_size *= 2; - scoped_ptr<DEVMODE, base::FreeDeleter> out( + std::unique_ptr<DEVMODE, base::FreeDeleter> out( reinterpret_cast<DEVMODE*>(calloc(buffer_size, 1))); DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER | DM_IN_PROMPT; LONG result = DocumentProperties(window, @@ -527,7 +527,7 @@ if (canceled) *canceled = (result == IDCANCEL); if (result != IDOK) - return scoped_ptr<DEVMODE, base::FreeDeleter>(); + return std::unique_ptr<DEVMODE, base::FreeDeleter>(); int size = out->dmSize; int extra_size = out->dmDriverExtra; CHECK_GE(buffer_size, size + extra_size);
diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h index fa39a03..05e0fe9 100644 --- a/printing/backend/win_helper.h +++ b/printing/backend/win_helper.h
@@ -10,11 +10,11 @@ #include <winspool.h> #include <xpsprint.h> +#include <memory> #include <string> #include "base/macros.h" #include "base/memory/free_deleter.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "base/win/scoped_handle.h" #include "printing/printing_export.h" @@ -172,24 +172,24 @@ PRINTING_EXPORT std::string GetDriverInfo(HANDLE printer); -PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( +PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( const base::string16& printer_name, const std::string& print_ticket); // Creates default DEVMODE and sets color option. Some devices need special // workaround for color. -PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( - HANDLE printer, - const base::string16& printer_name, - bool color); +PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> +CreateDevModeWithColor(HANDLE printer, + const base::string16& printer_name, + bool color); // Creates new DEVMODE. If |in| is not NULL copy settings from there. -PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode( +PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode( HANDLE printer, DEVMODE* in); // Prompts for new DEVMODE. If |in| is not NULL copy settings from there. -PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( +PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( HANDLE printer, const base::string16& printer_name, DEVMODE* in,
diff --git a/printing/emf_win.cc b/printing/emf_win.cc index 2e8df76..f00a669c 100644 --- a/printing/emf_win.cc +++ b/printing/emf_win.cc
@@ -6,11 +6,12 @@ #include <stdint.h> +#include <memory> + #include "base/files/file.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/win/scoped_gdi_object.h" #include "base/win/scoped_hdc.h" #include "base/win/scoped_select_object.h" @@ -360,7 +361,7 @@ bool play_normally = true; res = false; HDC hdc = context->hdc; - scoped_ptr<SkBitmap> bitmap; + std::unique_ptr<SkBitmap> bitmap; if (bmih->biCompression == BI_JPEG) { if (!DIBFormatNativelySupported(hdc, CHECKJPEGFORMAT, bits, bmih->biSizeImage)) { @@ -524,7 +525,7 @@ return result; } -scoped_ptr<Emf> Emf::RasterizeMetafile(int raster_area_in_pixels) const { +std::unique_ptr<Emf> Emf::RasterizeMetafile(int raster_area_in_pixels) const { gfx::Rect page_bounds = GetPageBounds(1); gfx::Size page_size(page_bounds.size()); if (page_size.GetArea() <= 0) { @@ -544,7 +545,7 @@ RECT rect = bitmap_rect.ToRECT(); Playback(bitmap.context(), &rect); - scoped_ptr<Emf> result(new Emf); + std::unique_ptr<Emf> result(new Emf); result->Init(); HDC hdc = result->context(); DCHECK(hdc); @@ -572,7 +573,7 @@ return result; } -scoped_ptr<Emf> Emf::RasterizeAlphaBlend() const { +std::unique_ptr<Emf> Emf::RasterizeAlphaBlend() const { gfx::Rect page_bounds = GetPageBounds(1); if (page_bounds.size().GetArea() <= 0) { NOTREACHED() << "Metafile is empty"; @@ -590,7 +591,7 @@ static_cast<float>(-page_bounds.y())}; ::SetWorldTransform(bitmap.context(), &xform); - scoped_ptr<Emf> result(new Emf); + std::unique_ptr<Emf> result(new Emf); result->Init(); HDC hdc = result->context(); DCHECK(hdc);
diff --git a/printing/emf_win.h b/printing/emf_win.h index da14f1c..653fe59 100644 --- a/printing/emf_win.h +++ b/printing/emf_win.h
@@ -5,16 +5,16 @@ #ifndef PRINTING_EMF_WIN_H_ #define PRINTING_EMF_WIN_H_ -#include <windows.h> #include <stddef.h> #include <stdint.h> +#include <windows.h> +#include <memory> #include <vector> #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "printing/metafile.h" namespace base { @@ -88,11 +88,11 @@ // Returns new metafile with only bitmap created by playback of the current // metafile. Returns NULL if fails. - scoped_ptr<Emf> RasterizeMetafile(int raster_area_in_pixels) const; + std::unique_ptr<Emf> RasterizeMetafile(int raster_area_in_pixels) const; // Returns new metafile where AlphaBlend replaced by bitmaps. Returns NULL // if fails. - scoped_ptr<Emf> RasterizeAlphaBlend() const; + std::unique_ptr<Emf> RasterizeAlphaBlend() const; private: FRIEND_TEST_ALL_PREFIXES(EmfTest, DC);
diff --git a/printing/emf_win_unittest.cc b/printing/emf_win_unittest.cc index 316defc..88ad730 100644 --- a/printing/emf_win_unittest.cc +++ b/printing/emf_win_unittest.cc
@@ -9,12 +9,12 @@ #include <wingdi.h> #include <winspool.h> +#include <memory> #include <string> #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" -#include "base/memory/scoped_ptr.h" #include "base/path_service.h" #include "base/win/scoped_hdc.h" #include "printing/printing_context.h" @@ -88,7 +88,7 @@ settings.set_device_name(L"UnitTest Printer"); // Initialize it. - scoped_ptr<PrintingContext> context(PrintingContext::Create(this)); + std::unique_ptr<PrintingContext> context(PrintingContext::Create(this)); EXPECT_EQ(context->InitWithSettings(settings), PrintingContext::OK); base::FilePath emf_file; @@ -218,7 +218,7 @@ } EXPECT_TRUE(emf.FinishDocument()); - scoped_ptr<Emf> raster(emf.RasterizeMetafile(1)); + std::unique_ptr<Emf> raster(emf.RasterizeMetafile(1)); // Just 1px bitmap but should be stretched to the same bounds. EXPECT_EQ(emf.GetPageBounds(1), raster->GetPageBounds(1));
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc index 104970e..d3679c46 100644 --- a/printing/pdf_metafile_skia.cc +++ b/printing/pdf_metafile_skia.cc
@@ -58,7 +58,7 @@ void* buffer, size_t size) { // Calling duplicate() keeps original asset state unchanged. - scoped_ptr<SkStreamAsset> assetCopy(asset->duplicate()); + std::unique_ptr<SkStreamAsset> assetCopy(asset->duplicate()); size_t length = assetCopy->getLength(); if (length > size) return false; @@ -88,7 +88,7 @@ SkPictureRecorder recorder_; // Current recording std::vector<Page> pages_; - scoped_ptr<SkStreamAsset> pdf_data_; + std::unique_ptr<SkStreamAsset> pdf_data_; #if defined(OS_MACOSX) PdfMetafileCg pdf_cg_; @@ -257,7 +257,7 @@ return false; // Calling duplicate() keeps original asset state unchanged. - scoped_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); + std::unique_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); const size_t maximum_buffer_size = 1024 * 1024; std::vector<char> buffer(std::min(maximum_buffer_size, asset->getLength())); @@ -296,10 +296,10 @@ PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) { } -scoped_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { +std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { // If we only ever need the metafile for the last page, should we // only keep a handle on one SkPicture? - scoped_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia); + std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia); if (data_->pages_.size() == 0) return metafile;
diff --git a/printing/pdf_metafile_skia.h b/printing/pdf_metafile_skia.h index dffcc3e..47942eff 100644 --- a/printing/pdf_metafile_skia.h +++ b/printing/pdf_metafile_skia.h
@@ -7,8 +7,9 @@ #include <stdint.h> +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "build/build_config.h" #include "printing/metafile.h" #include "skia/ext/platform_canvas.h" @@ -70,7 +71,7 @@ #endif // if defined(OS_CHROMEOS) || defined(OS_ANDROID) // Return a new metafile containing just the current page in draft mode. - scoped_ptr<PdfMetafileSkia> GetMetafileForCurrentPage(); + std::unique_ptr<PdfMetafileSkia> GetMetafileForCurrentPage(); // This method calls StartPage and then returns an appropriate // PlatformCanvas implementation bound to the context created by @@ -83,7 +84,7 @@ const float& scale_factor); private: - scoped_ptr<PdfMetafileSkiaData> data_; + std::unique_ptr<PdfMetafileSkiaData> data_; DISALLOW_COPY_AND_ASSIGN(PdfMetafileSkia); };
diff --git a/printing/printed_document.cc b/printing/printed_document.cc index c4f2fb7..f77b135 100644 --- a/printing/printed_document.cc +++ b/printing/printed_document.cc
@@ -110,7 +110,7 @@ } void PrintedDocument::SetPage(int page_number, - scoped_ptr<MetafilePlayer> metafile, + std::unique_ptr<MetafilePlayer> metafile, #if defined(OS_WIN) float shrink, #endif // OS_WIN
diff --git a/printing/printed_document.h b/printing/printed_document.h index 2231e9a..6231d2ee 100644 --- a/printing/printed_document.h +++ b/printing/printed_document.h
@@ -6,11 +6,11 @@ #define PRINTING_PRINTED_DOCUMENT_H_ #include <map> +#include <memory> #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "base/synchronization/lock.h" #include "printing/print_settings.h" @@ -47,7 +47,7 @@ // Sets a page's data. 0-based. Takes metafile ownership. // Note: locks for a short amount of time. void SetPage(int page_number, - scoped_ptr<MetafilePlayer> metafile, + std::unique_ptr<MetafilePlayer> metafile, #if defined(OS_WIN) float shrink, #endif // OS_WIN
diff --git a/printing/printed_page.cc b/printing/printed_page.cc index 2c3e7e8..d021126 100644 --- a/printing/printed_page.cc +++ b/printing/printed_page.cc
@@ -9,7 +9,7 @@ namespace printing { PrintedPage::PrintedPage(int page_number, - scoped_ptr<MetafilePlayer> metafile, + std::unique_ptr<MetafilePlayer> metafile, const gfx::Size& page_size, const gfx::Rect& page_content_rect) : page_number_(page_number),
diff --git a/printing/printed_page.h b/printing/printed_page.h index 550d992..5ab1c17 100644 --- a/printing/printed_page.h +++ b/printing/printed_page.h
@@ -5,9 +5,10 @@ #ifndef PRINTING_PRINTED_PAGE_H_ #define PRINTING_PRINTED_PAGE_H_ +#include <memory> + #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "printing/metafile.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -24,7 +25,7 @@ : public base::RefCountedThreadSafe<PrintedPage> { public: PrintedPage(int page_number, - scoped_ptr<MetafilePlayer> metafile, + std::unique_ptr<MetafilePlayer> metafile, const gfx::Size& page_size, const gfx::Rect& page_content_rect); @@ -54,7 +55,7 @@ const int page_number_; // Actual paint data. - const scoped_ptr<MetafilePlayer> metafile_; + const std::unique_ptr<MetafilePlayer> metafile_; #if defined(OS_WIN) // Shrink done in comparison to desired_dpi.
diff --git a/printing/printed_page_unittest.cc b/printing/printed_page_unittest.cc index 795afe48..0a78650 100644 --- a/printing/printed_page_unittest.cc +++ b/printing/printed_page_unittest.cc
@@ -12,10 +12,8 @@ gfx::Rect page_content; // No centering. - page = new PrintedPage(1, - scoped_ptr<MetafilePlayer>(), - gfx::Size(1200, 1200), - gfx::Rect(0, 0, 400, 1100)); + page = new PrintedPage(1, std::unique_ptr<MetafilePlayer>(), + gfx::Size(1200, 1200), gfx::Rect(0, 0, 400, 1100)); page->GetCenteredPageContentRect(gfx::Size(1000, 1000), &page_content); EXPECT_EQ(0, page_content.x()); EXPECT_EQ(0, page_content.y()); @@ -23,10 +21,8 @@ EXPECT_EQ(1100, page_content.height()); // X centered. - page = new PrintedPage(1, - scoped_ptr<MetafilePlayer>(), - gfx::Size(500, 1200), - gfx::Rect(0, 0, 400, 1100)); + page = new PrintedPage(1, std::unique_ptr<MetafilePlayer>(), + gfx::Size(500, 1200), gfx::Rect(0, 0, 400, 1100)); page->GetCenteredPageContentRect(gfx::Size(1000, 1000), &page_content); EXPECT_EQ(250, page_content.x()); EXPECT_EQ(0, page_content.y()); @@ -34,10 +30,8 @@ EXPECT_EQ(1100, page_content.height()); // Y centered. - page = new PrintedPage(1, - scoped_ptr<MetafilePlayer>(), - gfx::Size(1200, 500), - gfx::Rect(0, 0, 400, 1100)); + page = new PrintedPage(1, std::unique_ptr<MetafilePlayer>(), + gfx::Size(1200, 500), gfx::Rect(0, 0, 400, 1100)); page->GetCenteredPageContentRect(gfx::Size(1000, 1000), &page_content); EXPECT_EQ(0, page_content.x()); EXPECT_EQ(250, page_content.y()); @@ -45,10 +39,8 @@ EXPECT_EQ(1100, page_content.height()); // Both X and Y centered. - page = new PrintedPage(1, - scoped_ptr<MetafilePlayer>(), - gfx::Size(500, 500), - gfx::Rect(0, 0, 400, 1100)); + page = new PrintedPage(1, std::unique_ptr<MetafilePlayer>(), + gfx::Size(500, 500), gfx::Rect(0, 0, 400, 1100)); page->GetCenteredPageContentRect(gfx::Size(1000, 1000), &page_content); EXPECT_EQ(250, page_content.x()); EXPECT_EQ(250, page_content.y()); @@ -59,10 +51,8 @@ #if defined(OS_WIN) TEST(PrintedPageTest, Shrink) { scoped_refptr<PrintedPage> page = - new PrintedPage(1, - scoped_ptr<MetafilePlayer>(), - gfx::Size(1200, 1200), - gfx::Rect(0, 0, 400, 1100)); + new PrintedPage(1, std::unique_ptr<MetafilePlayer>(), + gfx::Size(1200, 1200), gfx::Rect(0, 0, 400, 1100)); EXPECT_EQ(0.0f, page->shrink_factor()); page->set_shrink_factor(0.2f); EXPECT_EQ(0.2f, page->shrink_factor());
diff --git a/printing/printing_context.cc b/printing/printing_context.cc index 2e080397..5187cee 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc
@@ -49,7 +49,8 @@ } PrintingContext::Result PrintingContext::UsePdfSettings() { - scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue); + std::unique_ptr<base::DictionaryValue> pdf_settings( + new base::DictionaryValue); pdf_settings->SetBoolean(kSettingHeaderFooterEnabled, false); pdf_settings->SetBoolean(kSettingShouldPrintBackgrounds, false); pdf_settings->SetBoolean(kSettingShouldPrintSelectionOnly, false);
diff --git a/printing/printing_context.h b/printing/printing_context.h index be671ba..9f963848 100644 --- a/printing/printing_context.h +++ b/printing/printing_context.h
@@ -5,11 +5,11 @@ #ifndef PRINTING_PRINTING_CONTEXT_H_ #define PRINTING_PRINTING_CONTEXT_H_ +#include <memory> #include <string> #include "base/callback.h" #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "printing/print_settings.h" #include "ui/gfx/native_widget_types.h" @@ -118,7 +118,7 @@ // Creates an instance of this object. Implementers of this interface should // implement this method to create an object of their implementation. - static scoped_ptr<PrintingContext> Create(Delegate* delegate); + static std::unique_ptr<PrintingContext> Create(Delegate* delegate); void set_margin_type(MarginType type);
diff --git a/printing/printing_context_android.cc b/printing/printing_context_android.cc index 3fabef2..88d76571 100644 --- a/printing/printing_context_android.cc +++ b/printing/printing_context_android.cc
@@ -12,6 +12,7 @@ #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "jni/PrintingContext_jni.h" @@ -63,8 +64,8 @@ namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextAndroid(delegate)); +std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { + return base::WrapUnique(new PrintingContextAndroid(delegate)); } // static
diff --git a/printing/printing_context_linux.cc b/printing/printing_context_linux.cc index 83d321ec..f65f0ae 100644 --- a/printing/printing_context_linux.cc +++ b/printing/printing_context_linux.cc
@@ -5,6 +5,7 @@ #include "printing/printing_context_linux.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/values.h" #include "printing/metafile.h" #include "printing/print_dialog_gtk_interface.h" @@ -27,8 +28,8 @@ namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate)); +std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { + return base::WrapUnique(new PrintingContextLinux(delegate)); } PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm index 36badc3..97a04a6 100644 --- a/printing/printing_context_mac.mm +++ b/printing/printing_context_mac.mm
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_nsautorelease_pool.h" +#include "base/memory/ptr_util.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" @@ -66,8 +67,8 @@ } // namespace // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextMac(delegate)); +std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { + return base::WrapUnique(new PrintingContextMac(delegate)); } PrintingContextMac::PrintingContextMac(Delegate* delegate)
diff --git a/printing/printing_context_no_system_dialog.cc b/printing/printing_context_no_system_dialog.cc index ec8aaaf..5f8db1a 100644 --- a/printing/printing_context_no_system_dialog.cc +++ b/printing/printing_context_no_system_dialog.cc
@@ -8,6 +8,7 @@ #include <unicode/ulocdata.h> #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/values.h" #include "printing/metafile.h" #include "printing/print_job_constants.h" @@ -16,9 +17,8 @@ namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>( - new PrintingContextNoSystemDialog(delegate)); +std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { + return base::WrapUnique(new PrintingContextNoSystemDialog(delegate)); } PrintingContextNoSystemDialog::PrintingContextNoSystemDialog(Delegate* delegate)
diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index ffd2bc0..4ecb814 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/memory/free_deleter.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "printing/backend/print_backend.h" @@ -32,12 +33,11 @@ } // namespace // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { +std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { #if defined(ENABLE_BASIC_PRINTING) - return make_scoped_ptr<PrintingContext>( - new PrintingContextSytemDialogWin(delegate)); + return base::WrapUnique(new PrintingContextSytemDialogWin(delegate)); #else // ENABLE_BASIC_PRINTING - return make_scoped_ptr<PrintingContext>(new PrintingContextWin(delegate)); + return base::WrapUnique(new PrintingContextWin(delegate)); #endif // EENABLE_BASIC_PRINTING } @@ -66,7 +66,7 @@ if (!default_printer.empty()) { ScopedPrinterHandle printer; if (printer.OpenPrinter(default_printer.c_str())) { - scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = + std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode = CreateDevMode(printer.Get(), NULL); if (InitializeSettings(default_printer, dev_mode.get()) == OK) return OK; @@ -82,7 +82,7 @@ NULL, 2, NULL, 0, &bytes_needed, &count_returned); if (bytes_needed) { DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2)); - scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); + std::unique_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 2, printer_info_buffer.get(), bytes_needed, &bytes_needed, @@ -96,7 +96,7 @@ ScopedPrinterHandle printer; if (!printer.OpenPrinter(info_2->pPrinterName)) continue; - scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = + std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode = CreateDevMode(printer.Get(), NULL); if (InitializeSettings(info_2->pPrinterName, dev_mode.get()) == OK) return OK; @@ -152,7 +152,7 @@ // Make printer changes local to Chrome. // See MSDN documentation regarding DocumentProperties. - scoped_ptr<DEVMODE, base::FreeDeleter> scoped_dev_mode = + std::unique_ptr<DEVMODE, base::FreeDeleter> scoped_dev_mode = CreateDevModeWithColor(printer.Get(), settings_.device_name(), settings_.color() != GRAY); if (!scoped_dev_mode) @@ -229,7 +229,7 @@ if (!printer.OpenPrinter(settings_.device_name().c_str())) return FAILED; - scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = + std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode = CreateDevMode(printer.Get(), NULL); return InitializeSettings(settings_.device_name(), dev_mode.get());
diff --git a/printing/printing_context_win.h b/printing/printing_context_win.h index 2d444cce..a4020665 100644 --- a/printing/printing_context_win.h +++ b/printing/printing_context_win.h
@@ -5,10 +5,10 @@ #ifndef PRINTING_PRINTING_CONTEXT_WIN_H_ #define PRINTING_PRINTING_CONTEXT_WIN_H_ +#include <memory> #include <string> #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "printing/printing_context.h" #include "ui/gfx/native_widget_types.h"
diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index b71442b..fc6fee0c 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc
@@ -162,7 +162,7 @@ PrintSettings settings; settings.set_device_name(GetDefaultPrinter()); // Initialize it. - scoped_ptr<PrintingContext> context(PrintingContext::Create(this)); + std::unique_ptr<PrintingContext> context(PrintingContext::Create(this)); EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); // The print may lie to use and may not support world transformation.
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc index acb9603..a3301cf 100644 --- a/remoting/host/client_session.cc +++ b/remoting/host/client_session.cc
@@ -80,9 +80,6 @@ max_duration_(max_duration), audio_task_runner_(audio_task_runner), pairing_registry_(pairing_registry), - is_authenticated_(false), - pause_video_(false), - lossless_video_encode_(false), // Note that |lossless_video_color_| defaults to true, but actually only // controls VP9 video stream color quality. lossless_video_color_(!base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -198,8 +195,6 @@ VLOG(1) << "Client capabilities: " << *client_capabilities_; - // Calculate the set of capabilities enabled by both client and host and - // pass it to the desktop environment if it is available. desktop_environment_->SetCapabilities(capabilities_); } @@ -296,11 +291,34 @@ clipboard_echo_filter_.set_client_stub(connection_->client_stub()); } +void ClientSession::CreateVideoStreams( + protocol::ConnectionToClient* connection) { + DCHECK(CalledOnValidThread()); + DCHECK_EQ(connection_.get(), connection); + + // Create a VideoStream to pump frames from the capturer to the client. + video_stream_ = connection_->StartVideoStream( + desktop_environment_->CreateVideoCapturer()); + + video_stream_->SetSizeCallback( + base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this))); + + // Apply video-control parameters to the new stream. + video_stream_->SetLosslessEncode(lossless_video_encode_); + video_stream_->SetLosslessColor(lossless_video_color_); + + // Pause capturing if necessary. + video_stream_->Pause(pause_video_); +} + void ClientSession::OnConnectionChannelsConnected( protocol::ConnectionToClient* connection) { DCHECK(CalledOnValidThread()); DCHECK_EQ(connection_.get(), connection); + DCHECK(!channels_connected_); + channels_connected_ = true; + // Negotiate capabilities with the client. VLOG(1) << "Host capabilities: " << host_capabilities_; protocol::Capabilities capabilities; @@ -316,20 +334,6 @@ new MouseShapePump(desktop_environment_->CreateMouseCursorMonitor(), connection_->client_stub())); - // Create a VideoStream to pump frames from the capturer to the client. - video_stream_ = connection_->StartVideoStream( - desktop_environment_->CreateVideoCapturer()); - - video_stream_->SetSizeCallback( - base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this))); - - // Apply video-control parameters to the new stream. - video_stream_->SetLosslessEncode(lossless_video_encode_); - video_stream_->SetLosslessColor(lossless_video_color_); - - // Pause capturing if necessary. - video_stream_->Pause(pause_video_); - // Create an AudioPump if audio is enabled, to pump audio samples. if (connection_->session()->config().is_audio_enabled()) { std::unique_ptr<AudioEncoder> audio_encoder = @@ -339,6 +343,11 @@ std::move(audio_encoder), connection_->audio_stub())); } + if (pending_video_layout_message_) { + connection_->client_stub()->SetVideoLayout(*pending_video_layout_message_); + pending_video_layout_message_.reset(); + } + // Notify the event handler that all our channels are now connected. event_handler_->OnSessionChannelsConnected(this); } @@ -449,7 +458,15 @@ video_track->set_height(size.height() * kDefaultDpi / dpi.y()); video_track->set_x_dpi(dpi.x()); video_track->set_y_dpi(dpi.y()); - connection_->client_stub()->SetVideoLayout(layout); + + // VideoLayout can be sent only after the control channel is connected. + // TODO(sergeyu): Change client_stub() implementation to allow queuing while + // connection is being established. + if (channels_connected_) { + connection_->client_stub()->SetVideoLayout(layout); + } else { + pending_video_layout_message_.reset(new protocol::VideoLayout(layout)); + } } }
diff --git a/remoting/host/client_session.h b/remoting/host/client_session.h index a42e91e..8bc2e09 100644 --- a/remoting/host/client_session.h +++ b/remoting/host/client_session.h
@@ -44,13 +44,16 @@ class MouseShapePump; class ScreenControls; +namespace protocol { +class VideoLayout; +} // namespace protocol + // A ClientSession keeps a reference to a connection to a client, and maintains // per-client state. -class ClientSession - : public base::NonThreadSafe, - public protocol::HostStub, - public protocol::ConnectionToClient::EventHandler, - public ClientSessionControl { +class ClientSession : public base::NonThreadSafe, + public protocol::HostStub, + public protocol::ConnectionToClient::EventHandler, + public ClientSessionControl { public: // Callback interface for passing events to the ChromotingHost. class EventHandler { @@ -112,6 +115,7 @@ protocol::ConnectionToClient* connection) override; void OnConnectionAuthenticated( protocol::ConnectionToClient* connection) override; + void CreateVideoStreams(protocol::ConnectionToClient* connection) override; void OnConnectionChannelsConnected( protocol::ConnectionToClient* connection) override; void OnConnectionClosed(protocol::ConnectionToClient* connection, @@ -219,12 +223,19 @@ std::unique_ptr<HostExtensionSessionManager> extension_manager_; // Set to true if the client was authenticated successfully. - bool is_authenticated_; + bool is_authenticated_ = false; + + // Set to true after all data channels have been connected. + bool channels_connected_ = false; // Used to store video channel pause & lossless parameters. - bool pause_video_; - bool lossless_video_encode_; - bool lossless_video_color_; + bool pause_video_ = false; + bool lossless_video_encode_ = false; + bool lossless_video_color_ = false; + + // VideoLayout is sent only after the control channel is connected. Until + // then it's stored in |pending_video_layout_message_|. + std::unique_ptr<protocol::VideoLayout> pending_video_layout_message_; // Used to disable callbacks to |this| once DisconnectSession() has been // called.
diff --git a/remoting/host/client_session_unittest.cc b/remoting/host/client_session_unittest.cc index 3ef301a..b5c2d1bd 100644 --- a/remoting/host/client_session_unittest.cc +++ b/remoting/host/client_session_unittest.cc
@@ -205,6 +205,7 @@ EXPECT_TRUE(connection_->clipboard_stub()); EXPECT_TRUE(connection_->input_stub()); + client_session_->CreateVideoStreams(client_session_->connection()); client_session_->OnConnectionChannelsConnected(client_session_->connection()); }
diff --git a/remoting/protocol/connection_to_client.h b/remoting/protocol/connection_to_client.h index acb48b5..30216ba8 100644 --- a/remoting/protocol/connection_to_client.h +++ b/remoting/protocol/connection_to_client.h
@@ -41,6 +41,10 @@ // Called when the network connection is authenticated. virtual void OnConnectionAuthenticated(ConnectionToClient* connection) = 0; + // Called to request creation of video streams. May be called before or + // after OnConnectionChannelsConnected(). + virtual void CreateVideoStreams(ConnectionToClient* connection) = 0; + // Called when the network connection is authenticated and all // channels are connected. virtual void OnConnectionChannelsConnected(
diff --git a/remoting/protocol/ice_connection_to_client.cc b/remoting/protocol/ice_connection_to_client.cc index 2172ff4..45af7f5 100644 --- a/remoting/protocol/ice_connection_to_client.cc +++ b/remoting/protocol/ice_connection_to_client.cc
@@ -206,6 +206,7 @@ return; } event_handler_->OnConnectionChannelsConnected(this); + event_handler_->CreateVideoStreams(this); } void IceConnectionToClient::CloseChannels() {
diff --git a/remoting/protocol/protocol_mock_objects.h b/remoting/protocol/protocol_mock_objects.h index 8d6a988..4d03025 100644 --- a/remoting/protocol/protocol_mock_objects.h +++ b/remoting/protocol/protocol_mock_objects.h
@@ -43,6 +43,7 @@ MOCK_METHOD1(OnConnectionAuthenticating, void(ConnectionToClient* connection)); MOCK_METHOD1(OnConnectionAuthenticated, void(ConnectionToClient* connection)); + MOCK_METHOD1(CreateVideoStreams, void(ConnectionToClient* connection)); MOCK_METHOD1(OnConnectionChannelsConnected, void(ConnectionToClient* connection)); MOCK_METHOD2(OnConnectionClosed,
diff --git a/remoting/protocol/webrtc_connection_to_client.cc b/remoting/protocol/webrtc_connection_to_client.cc index 0d0ed47..733fd4293 100644 --- a/remoting/protocol/webrtc_connection_to_client.cc +++ b/remoting/protocol/webrtc_connection_to_client.cc
@@ -42,7 +42,8 @@ this), session_(std::move(session)), control_dispatcher_(new HostControlDispatcher()), - event_dispatcher_(new HostEventDispatcher()) { + event_dispatcher_(new HostEventDispatcher()), + weak_factory_(this) { session_->SetEventHandler(this); session_->SetTransport(&transport_); } @@ -81,7 +82,6 @@ return nullptr; } return std::move(stream); - } AudioStub* WebrtcConnectionToClient::audio_stub() { @@ -122,12 +122,22 @@ case Session::ACCEPTED: // Don't care about these events. break; + case Session::AUTHENTICATING: event_handler_->OnConnectionAuthenticating(this); break; - case Session::AUTHENTICATED: + + case Session::AUTHENTICATED: { + base::WeakPtr<WebrtcConnectionToClient> self = weak_factory_.GetWeakPtr(); event_handler_->OnConnectionAuthenticated(this); + + // OnConnectionAuthenticated() call above may result in the connection + // being torn down. + if (self) + event_handler_->CreateVideoStreams(this); break; + } + case Session::CLOSED: case Session::FAILED: control_dispatcher_.reset();
diff --git a/remoting/protocol/webrtc_connection_to_client.h b/remoting/protocol/webrtc_connection_to_client.h index 34f51ba..d5ce65f 100644 --- a/remoting/protocol/webrtc_connection_to_client.h +++ b/remoting/protocol/webrtc_connection_to_client.h
@@ -11,6 +11,7 @@ #include <string> #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "remoting/protocol/channel_dispatcher_base.h" #include "remoting/protocol/connection_to_client.h" @@ -75,6 +76,8 @@ std::unique_ptr<HostControlDispatcher> control_dispatcher_; std::unique_ptr<HostEventDispatcher> event_dispatcher_; + base::WeakPtrFactory<WebrtcConnectionToClient> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(WebrtcConnectionToClient); };
diff --git a/remoting/protocol/webrtc_video_capturer_adapter.cc b/remoting/protocol/webrtc_video_capturer_adapter.cc index 0d5dec0..23df1d9 100644 --- a/remoting/protocol/webrtc_video_capturer_adapter.cc +++ b/remoting/protocol/webrtc_video_capturer_adapter.cc
@@ -226,7 +226,7 @@ cricket::WebRtcVideoFrame video_frame( yuv_frame_, (base::TimeTicks::Now() - base::TimeTicks()) / - base::TimeDelta::FromMicroseconds(1), + base::TimeDelta::FromMicroseconds(1) * 1000, webrtc::kVideoRotation_0); OnFrame(this, &video_frame);
diff --git a/sync/BUILD.gn b/sync/BUILD.gn index 2946c66..1583652 100644 --- a/sync/BUILD.gn +++ b/sync/BUILD.gn
@@ -274,7 +274,6 @@ "internal_api/public/simple_metadata_change_list.h", "internal_api/public/sync_auth_provider.h", "internal_api/public/sync_context.h", - "internal_api/public/sync_context_proxy.h", "internal_api/public/sync_encryption_handler.cc", "internal_api/public/sync_encryption_handler.h", "internal_api/public/sync_manager.cc", @@ -301,8 +300,7 @@ "internal_api/shared_model_type_processor.cc", "internal_api/sync_context.cc", "internal_api/sync_context_proxy.cc", - "internal_api/sync_context_proxy_impl.cc", - "internal_api/sync_context_proxy_impl.h", + "internal_api/sync_context_proxy.h", "internal_api/sync_db_util.cc", "internal_api/sync_encryption_handler_impl.cc", "internal_api/sync_encryption_handler_impl.h", @@ -549,17 +547,17 @@ testonly = true sources = [ "internal_api/public/test/fake_model_type_service.h", + "internal_api/public/test/fake_sync_context.h", "internal_api/public/test/fake_sync_manager.h", "internal_api/public/test/model_type_store_test_util.h", - "internal_api/public/test/null_sync_context_proxy.h", "internal_api/public/test/sync_manager_factory_for_profile_sync_test.h", "internal_api/public/test/test_entry_factory.h", "internal_api/public/test/test_internal_components_factory.h", "internal_api/public/test/test_user_share.h", "internal_api/test/fake_model_type_service.cc", + "internal_api/test/fake_sync_context.cc", "internal_api/test/fake_sync_manager.cc", "internal_api/test/model_type_store_test_util.cc", - "internal_api/test/null_sync_context_proxy.cc", "internal_api/test/sync_manager_factory_for_profile_sync_test.cc", "internal_api/test/sync_manager_for_profile_sync_test.cc", "internal_api/test/sync_manager_for_profile_sync_test.h", @@ -660,7 +658,7 @@ "internal_api/public/util/proto_value_ptr_unittest.cc", "internal_api/public/util/weak_handle_unittest.cc", "internal_api/shared_model_type_processor_unittest.cc", - "internal_api/sync_context_proxy_impl_unittest.cc", + "internal_api/sync_context_proxy_unittest.cc", "internal_api/sync_encryption_handler_impl_unittest.cc", "internal_api/sync_manager_impl_unittest.cc", "internal_api/syncapi_server_connection_manager_unittest.cc",
diff --git a/sync/internal_api/public/sync_context.h b/sync/internal_api/public/sync_context.h index 0d522f91..3f080e4 100644 --- a/sync/internal_api/public/sync_context.h +++ b/sync/internal_api/public/sync_context.h
@@ -11,36 +11,33 @@ namespace syncer_v2 { struct ActivationContext; -// An interface of the core parts of sync. +// An interface of the core parts of sync for USS data types. // // In theory, this is the component that provides off-thread sync types with // functionality to schedule and execute communication with the sync server. In -// practice, this class delegates most of the responsibilty of implemeting this +// practice, this class delegates most of the responsibility of implemeting this // functionality to other classes, and most of the interface is exposed not -// directly here but instead through a per-ModelType class that this class helps -// instantiate. +// directly here but instead through a per-ModelType worker that this class +// helps instantiate. class SYNC_EXPORT SyncContext { public: SyncContext(); virtual ~SyncContext(); - // Initializes the connection between the sync context on the sync thread and - // a proxy for the specified non-blocking sync type that lives on the data - // type's thread. - virtual void ConnectSyncTypeToWorker( + // Connect a worker on the sync thread and |type|'s processor on the model + // thread. Note that in production |activation_context| actually owns a + // processor proxy that forwards calls to the model thread and is safe to call + // from the sync thread. + virtual void ConnectType( syncer::ModelType type, scoped_ptr<ActivationContext> activation_context) = 0; - // Disconnects the syncer from the model and stops syncing the type. - // - // By the time this is called, the model thread should have already - // invalidated the WeakPtr it sent to us in the connect request. Any - // messages sent to that ModelTypeProcessor will not be recived. + // Disconnects the worker from |type|'s processor and stop syncing the type. // // This is the sync thread's chance to clear state associated with the type. // It also causes the syncer to stop requesting updates for this type, and to // abort any in-progress commit requests. - virtual void DisconnectSyncWorker(syncer::ModelType type) = 0; + virtual void DisconnectType(syncer::ModelType type) = 0; }; } // namespace syncer_v2
diff --git a/sync/internal_api/public/sync_context_proxy.h b/sync/internal_api/public/sync_context_proxy.h deleted file mode 100644 index f2eff7e1..0000000 --- a/sync/internal_api/public/sync_context_proxy.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SYNC_INTERNAL_API_PUBLIC_SYNC_CONTEXT_PROXY_H_ -#define SYNC_INTERNAL_API_PUBLIC_SYNC_CONTEXT_PROXY_H_ - -#include "base/memory/scoped_ptr.h" -#include "sync/internal_api/public/base/model_type.h" - -namespace syncer_v2 { -struct ActivationContext; - -// Interface for the datatype integration logic from non-sync threads. -// -// See SyncContextProxyImpl for an actual implementation. -class SYNC_EXPORT SyncContextProxy { - public: - SyncContextProxy(); - virtual ~SyncContextProxy(); - - // Attempts to connect a non-blocking type to the sync context. - virtual void ConnectTypeToSync( - syncer::ModelType type, - scoped_ptr<ActivationContext> activation_context) = 0; - - // Tells the syncer that we're no longer interested in syncing this type. - // - // Once this takes effect, the syncer can assume that it will no longer - // receive commit requests for this type. It should also stop requesting - // and applying updates for this type, too. - virtual void Disconnect(syncer::ModelType type) = 0; - - // Creates a clone of this SyncContextProxy. - virtual scoped_ptr<SyncContextProxy> Clone() const = 0; -}; - -} // namespace syncer_v2 - -#endif // SYNC_INTERNAL_API_PUBLIC_SYNC_CONTEXT_PROXY_H_
diff --git a/sync/internal_api/public/sync_manager.h b/sync/internal_api/public/sync_manager.h index 4be3aeb0..8a3366e 100644 --- a/sync/internal_api/public/sync_manager.h +++ b/sync/internal_api/public/sync_manager.h
@@ -30,7 +30,7 @@ #include "sync/internal_api/public/http_post_provider_factory.h" #include "sync/internal_api/public/internal_components_factory.h" #include "sync/internal_api/public/shutdown_reason.h" -#include "sync/internal_api/public/sync_context_proxy.h" +#include "sync/internal_api/public/sync_context.h" #include "sync/internal_api/public/sync_encryption_handler.h" #include "sync/internal_api/public/util/weak_handle.h" #include "sync/protocol/sync_protocol_error.h" @@ -359,7 +359,7 @@ virtual UserShare* GetUserShare() = 0; // Returns an instance of the main interface for non-blocking sync types. - virtual syncer_v2::SyncContextProxy* GetSyncContextProxy() = 0; + virtual scoped_ptr<syncer_v2::SyncContext> GetSyncContextProxy() = 0; // Returns the cache_guid of the currently open database. // Requires that the SyncManager be initialized.
diff --git a/sync/internal_api/public/test/fake_sync_context.h b/sync/internal_api/public/test/fake_sync_context.h new file mode 100644 index 0000000..5eb4937 --- /dev/null +++ b/sync/internal_api/public/test/fake_sync_context.h
@@ -0,0 +1,25 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SYNC_INTERNAL_API_PUBLIC_TEST_FAKE_SYNC_CONTEXT_H_ +#define SYNC_INTERNAL_API_PUBLIC_TEST_FAKE_SYNC_CONTEXT_H_ + +#include "sync/internal_api/public/sync_context.h" + +namespace syncer_v2 { + +// A non-functional implementation of SyncContext for testing. +class FakeSyncContext : public SyncContext { + public: + FakeSyncContext(); + ~FakeSyncContext() override; + + void ConnectType(syncer::ModelType type, + scoped_ptr<ActivationContext> activation_context) override; + void DisconnectType(syncer::ModelType type) override; +}; + +} // namespace syncer_v2 + +#endif // SYNC_INTERNAL_API_PUBLIC_TEST_FAKE_SYNC_CONTEXT_H_
diff --git a/sync/internal_api/public/test/fake_sync_manager.h b/sync/internal_api/public/test/fake_sync_manager.h index 9bdde3f..0b4c810 100644 --- a/sync/internal_api/public/test/fake_sync_manager.h +++ b/sync/internal_api/public/test/fake_sync_manager.h
@@ -11,7 +11,6 @@ #include "base/memory/ref_counted.h" #include "base/observer_list.h" #include "sync/internal_api/public/sync_manager.h" -#include "sync/internal_api/public/test/null_sync_context_proxy.h" #include "sync/internal_api/public/test/test_user_share.h" class GURL; @@ -99,7 +98,7 @@ void SaveChanges() override; void ShutdownOnSyncThread(ShutdownReason reason) override; UserShare* GetUserShare() override; - syncer_v2::SyncContextProxy* GetSyncContextProxy() override; + scoped_ptr<syncer_v2::SyncContext> GetSyncContextProxy() override; const std::string cache_guid() override; bool ReceivedExperiment(Experiments* experiments) override; bool HasUnsyncedItems() override; @@ -148,8 +147,6 @@ TestUserShare test_user_share_; - syncer_v2::NullSyncContextProxy null_sync_context_proxy_; - // Number of invalidations received since startup. int num_invalidations_received_;
diff --git a/sync/internal_api/public/test/null_sync_context_proxy.h b/sync/internal_api/public/test/null_sync_context_proxy.h deleted file mode 100644 index aae38e9..0000000 --- a/sync/internal_api/public/test/null_sync_context_proxy.h +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SYNC_INTERNAL_API_PUBLIC_TEST_NULL_SYNC_CONTEXT_PROXY_H_ -#define SYNC_INTERNAL_API_PUBLIC_TEST_NULL_SYNC_CONTEXT_PROXY_H_ - -#include "sync/internal_api/public/sync_context_proxy.h" - -namespace syncer_v2 { - -// A non-functional implementation of SyncContextProxy. -// -// It supports Clone(), but not much else. Useful for testing. -class NullSyncContextProxy : public SyncContextProxy { - public: - NullSyncContextProxy(); - ~NullSyncContextProxy() override; - - void ConnectTypeToSync( - syncer::ModelType type, - scoped_ptr<ActivationContext> activation_context) override; - void Disconnect(syncer::ModelType type) override; - scoped_ptr<SyncContextProxy> Clone() const override; -}; - -} // namespace syncer_v2 - -#endif // SYNC_INTERNAL_API_PUBLIC_TEST_NULL_SYNC_CONTEXT_PROXY_H_
diff --git a/sync/internal_api/public/util/weak_handle.h b/sync/internal_api/public/util/weak_handle.h index 52f2b4f..ed92b2d 100644 --- a/sync/internal_api/public/util/weak_handle.h +++ b/sync/internal_api/public/util/weak_handle.h
@@ -50,6 +50,7 @@ #include <cstddef> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/callback_forward.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" @@ -57,6 +58,7 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" #include "sync/base/sync_export.h" @@ -85,14 +87,14 @@ typedef T& ForwardType; }; -template <typename T, size_t n> -struct ParamTraits<T[n]> { - typedef const T* ForwardType; -}; - template <typename T> -struct ParamTraits<T[]> { - typedef const T* ForwardType; +// scoped_ptr<T> is the type the target function will accept; PassedWrapper is +// the type that gets passed into Call and through to base::Bind. It would be +// better to support movable types in a generic way but this was the simplest +// fix for supporting scoped_ptr. Using base::internal is unfortunate but since +// this class is basically a wrapper around base::Bind it makes sense. +struct ParamTraits<scoped_ptr<T>> { + typedef base::internal::PassedWrapper<scoped_ptr<T>> ForwardType; }; // Base class for WeakHandleCore<T> to avoid template bloat. Handles @@ -142,19 +144,14 @@ template <typename U> void Call(const tracked_objects::Location& from_here, void (U::*fn)(void)) const { - PostToOwnerThread( - from_here, - Bind(&WeakHandleCore::template DoCall0<U>, this, fn)); + PostToOwnerThread(from_here, Bind(fn, ptr_)); } template <typename U, typename A1> void Call(const tracked_objects::Location& from_here, void (U::*fn)(A1), typename ParamTraits<A1>::ForwardType a1) const { - PostToOwnerThread( - from_here, - Bind(&WeakHandleCore::template DoCall1<U, A1>, - this, fn, a1)); + PostToOwnerThread(from_here, Bind(fn, ptr_, a1)); } template <typename U, typename A1, typename A2> @@ -162,10 +159,7 @@ void (U::*fn)(A1, A2), typename ParamTraits<A1>::ForwardType a1, typename ParamTraits<A2>::ForwardType a2) const { - PostToOwnerThread( - from_here, - Bind(&WeakHandleCore::template DoCall2<U, A1, A2>, - this, fn, a1, a2)); + PostToOwnerThread(from_here, Bind(fn, ptr_, a1, a2)); } template <typename U, typename A1, typename A2, typename A3> @@ -174,10 +168,7 @@ typename ParamTraits<A1>::ForwardType a1, typename ParamTraits<A2>::ForwardType a2, typename ParamTraits<A3>::ForwardType a3) const { - PostToOwnerThread( - from_here, - Bind(&WeakHandleCore::template DoCall3<U, A1, A2, A3>, - this, fn, a1, a2, a3)); + PostToOwnerThread(from_here, Bind(fn, ptr_, a1, a2, a3)); } template <typename U, typename A1, typename A2, typename A3, typename A4> @@ -187,10 +178,7 @@ typename ParamTraits<A2>::ForwardType a2, typename ParamTraits<A3>::ForwardType a3, typename ParamTraits<A4>::ForwardType a4) const { - PostToOwnerThread( - from_here, - Bind(&WeakHandleCore::template DoCall4<U, A1, A2, A3, A4>, - this, fn, a1, a2, a3, a4)); + PostToOwnerThread(from_here, Bind(fn, ptr_, a1, a2, a3, a4)); } private: @@ -199,64 +187,6 @@ // May be destroyed on any thread. ~WeakHandleCore() {} - // GCC 4.2.1 on OS X gets confused if all the DoCall functions are - // named the same, so we distinguish them. - - template <typename U> - void DoCall0(void (U::*fn)(void)) const { - CHECK(IsOnOwnerThread()); - if (!Get()) { - return; - } - (Get().get()->*fn)(); - } - - template <typename U, typename A1> - void DoCall1(void (U::*fn)(A1), - typename ParamTraits<A1>::ForwardType a1) const { - CHECK(IsOnOwnerThread()); - if (!Get()) { - return; - } - (Get().get()->*fn)(a1); - } - - template <typename U, typename A1, typename A2> - void DoCall2(void (U::*fn)(A1, A2), - typename ParamTraits<A1>::ForwardType a1, - typename ParamTraits<A2>::ForwardType a2) const { - CHECK(IsOnOwnerThread()); - if (!Get()) { - return; - } - (Get().get()->*fn)(a1, a2); - } - - template <typename U, typename A1, typename A2, typename A3> - void DoCall3(void (U::*fn)(A1, A2, A3), - typename ParamTraits<A1>::ForwardType a1, - typename ParamTraits<A2>::ForwardType a2, - typename ParamTraits<A3>::ForwardType a3) const { - CHECK(IsOnOwnerThread()); - if (!Get()) { - return; - } - (Get().get()->*fn)(a1, a2, a3); - } - - template <typename U, typename A1, typename A2, typename A3, typename A4> - void DoCall4(void (U::*fn)(A1, A2, A3, A4), - typename ParamTraits<A1>::ForwardType a1, - typename ParamTraits<A2>::ForwardType a2, - typename ParamTraits<A3>::ForwardType a3, - typename ParamTraits<A4>::ForwardType a4) const { - CHECK(IsOnOwnerThread()); - if (!Get()) { - return; - } - (Get().get()->*fn)(a1, a2, a3, a4); - } - // Must be dereferenced only on the owner thread. May be destroyed // from any thread. base::WeakPtr<T> ptr_;
diff --git a/sync/internal_api/sync_context.cc b/sync/internal_api/sync_context.cc index 5e7326c..c38db9a 100644 --- a/sync/internal_api/sync_context.cc +++ b/sync/internal_api/sync_context.cc
@@ -6,10 +6,8 @@ namespace syncer_v2 { -SyncContext::SyncContext() { -} +SyncContext::SyncContext() {} -SyncContext::~SyncContext() { -} +SyncContext::~SyncContext() {} } // namespace syncer_v2
diff --git a/sync/internal_api/sync_context_proxy.cc b/sync/internal_api/sync_context_proxy.cc index 8f90122..64618e5 100644 --- a/sync/internal_api/sync_context_proxy.cc +++ b/sync/internal_api/sync_context_proxy.cc
@@ -2,14 +2,34 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "sync/internal_api/public/sync_context_proxy.h" +#include "sync/internal_api/sync_context_proxy.h" + +#include "base/bind.h" +#include "base/location.h" +#include "base/single_thread_task_runner.h" +#include "sync/internal_api/public/activation_context.h" +#include "sync/internal_api/public/sync_context.h" namespace syncer_v2 { -SyncContextProxy::SyncContextProxy() { +SyncContextProxy::SyncContextProxy( + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + const base::WeakPtr<SyncContext>& sync_context) + : task_runner_(task_runner), sync_context_(sync_context) {} + +SyncContextProxy::~SyncContextProxy() {} + +void SyncContextProxy::ConnectType( + syncer::ModelType type, + scoped_ptr<ActivationContext> activation_context) { + task_runner_->PostTask( + FROM_HERE, base::Bind(&SyncContext::ConnectType, sync_context_, type, + base::Passed(&activation_context))); } -SyncContextProxy::~SyncContextProxy() { +void SyncContextProxy::DisconnectType(syncer::ModelType type) { + task_runner_->PostTask( + FROM_HERE, base::Bind(&SyncContext::DisconnectType, sync_context_, type)); } } // namespace syncer_v2
diff --git a/sync/internal_api/sync_context_proxy.h b/sync/internal_api/sync_context_proxy.h new file mode 100644 index 0000000..ea014285 --- /dev/null +++ b/sync/internal_api/sync_context_proxy.h
@@ -0,0 +1,41 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_H_ +#define SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_H_ + +#include "sync/internal_api/public/sync_context.h" + +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" +#include "sync/base/sync_export.h" +#include "sync/internal_api/public/base/model_type.h" + +namespace syncer_v2 { + +// Encapsulates a reference to the sync context and the thread it's running on. +// Used by sync's data types to connect with the sync context. +class SYNC_EXPORT SyncContextProxy : public SyncContext { + public: + SyncContextProxy(const scoped_refptr<base::SequencedTaskRunner>& task_runner, + const base::WeakPtr<SyncContext>& sync_context); + ~SyncContextProxy() override; + + // SyncContext implementation + void ConnectType(syncer::ModelType type, + scoped_ptr<ActivationContext> activation_context) override; + void DisconnectType(syncer::ModelType type) override; + + private: + // A SequencedTaskRunner representing the thread where the SyncContext lives. + scoped_refptr<base::SequencedTaskRunner> task_runner_; + + // The SyncContext this object is wrapping. + base::WeakPtr<SyncContext> sync_context_; +}; + +} // namespace syncer_v2 + +#endif // SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_H_
diff --git a/sync/internal_api/sync_context_proxy_impl.cc b/sync/internal_api/sync_context_proxy_impl.cc deleted file mode 100644 index 0f1fd22..0000000 --- a/sync/internal_api/sync_context_proxy_impl.cc +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "sync/internal_api/sync_context_proxy_impl.h" - -#include "base/bind.h" -#include "base/location.h" -#include "base/single_thread_task_runner.h" -#include "sync/internal_api/public/activation_context.h" -#include "sync/internal_api/public/sync_context.h" - -namespace syncer_v2 { - -SyncContextProxyImpl::SyncContextProxyImpl( - const scoped_refptr<base::SequencedTaskRunner>& sync_task_runner, - const base::WeakPtr<SyncContext>& sync_context) - : sync_task_runner_(sync_task_runner), sync_context_(sync_context) { -} - -SyncContextProxyImpl::~SyncContextProxyImpl() { -} - -void SyncContextProxyImpl::ConnectTypeToSync( - syncer::ModelType type, - scoped_ptr<ActivationContext> activation_context) { - VLOG(1) << "ConnectTypeToSync: " << ModelTypeToString(type); - sync_task_runner_->PostTask( - FROM_HERE, - base::Bind(&SyncContext::ConnectSyncTypeToWorker, sync_context_, type, - base::Passed(&activation_context))); -} - -void SyncContextProxyImpl::Disconnect(syncer::ModelType type) { - sync_task_runner_->PostTask( - FROM_HERE, - base::Bind(&SyncContext::DisconnectSyncWorker, sync_context_, type)); -} - -scoped_ptr<SyncContextProxy> SyncContextProxyImpl::Clone() const { - return scoped_ptr<SyncContextProxy>( - new SyncContextProxyImpl(sync_task_runner_, sync_context_)); -} - -} // namespace syncer_v2
diff --git a/sync/internal_api/sync_context_proxy_impl.h b/sync/internal_api/sync_context_proxy_impl.h deleted file mode 100644 index bde38e4..0000000 --- a/sync/internal_api/sync_context_proxy_impl.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_IMPL_H_ -#define SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_IMPL_H_ - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/sequenced_task_runner.h" -#include "sync/base/sync_export.h" -#include "sync/internal_api/public/base/model_type.h" -#include "sync/internal_api/public/sync_context_proxy.h" - -namespace syncer_v2 { -class SyncContext; - -// Encapsulates a reference to the sync context and the thread it's running on. -// Used by sync's data types to connect with the sync context. -// -// It is expected that this object will be copied to and used on many different -// threads. It is small and safe to pass by value. -class SYNC_EXPORT SyncContextProxyImpl : public SyncContextProxy { - public: - SyncContextProxyImpl( - const scoped_refptr<base::SequencedTaskRunner>& sync_task_runner, - const base::WeakPtr<SyncContext>& sync_context); - ~SyncContextProxyImpl() override; - - // Attempts to connect a non-blocking type to the sync context. - // - // This may fail under some unusual circumstances, like shutdown. Due to the - // nature of WeakPtrs and cross-thread communication, the caller will be - // unable to distinguish a slow success from failure. - void ConnectTypeToSync( - syncer::ModelType type, - scoped_ptr<ActivationContext> activation_context) override; - - // Disables syncing for the given type on the sync thread. - void Disconnect(syncer::ModelType type) override; - - scoped_ptr<SyncContextProxy> Clone() const override; - - private: - // A SequencedTaskRunner representing the thread where the SyncContext lives. - scoped_refptr<base::SequencedTaskRunner> sync_task_runner_; - - // The SyncContext this object is wrapping. - base::WeakPtr<SyncContext> sync_context_; -}; - -} // namespace syncer_v2 - -#endif // SYNC_INTERNAL_API_SYNC_CONTEXT_PROXY_IMPL_H_
diff --git a/sync/internal_api/sync_context_proxy_impl_unittest.cc b/sync/internal_api/sync_context_proxy_unittest.cc similarity index 84% rename from sync/internal_api/sync_context_proxy_impl_unittest.cc rename to sync/internal_api/sync_context_proxy_unittest.cc index 6058d67..0648cfd8 100644 --- a/sync/internal_api/sync_context_proxy_impl_unittest.cc +++ b/sync/internal_api/sync_context_proxy_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "sync/internal_api/sync_context_proxy_impl.h" +#include "sync/internal_api/sync_context_proxy.h" #include <utility> #include <vector> @@ -24,9 +24,9 @@ namespace syncer_v2 { -class SyncContextProxyImplTest : public ::testing::Test, FakeModelTypeService { +class SyncContextProxyTest : public ::testing::Test, FakeModelTypeService { public: - SyncContextProxyImplTest() + SyncContextProxyTest() : sync_task_runner_(base::ThreadTaskRunnerHandle::Get()), type_task_runner_(base::ThreadTaskRunnerHandle::Get()) {} @@ -35,7 +35,7 @@ registry_.reset(new syncer::ModelTypeRegistry( workers_, dir_maker_.directory(), &nudge_handler_)); context_proxy_.reset( - new SyncContextProxyImpl(sync_task_runner_, registry_->AsWeakPtr())); + new SyncContextProxy(sync_task_runner_, registry_->AsWeakPtr())); } void TearDown() override { @@ -50,12 +50,12 @@ void OnSyncStarting(SharedModelTypeProcessor* processor) { processor->OnSyncStarting(base::Bind( - &SyncContextProxyImplTest::OnReadyToConnect, base::Unretained(this))); + &SyncContextProxyTest::OnReadyToConnect, base::Unretained(this))); } void OnReadyToConnect(syncer::SyncError error, scoped_ptr<ActivationContext> context) { - context_proxy_->ConnectTypeToSync(syncer::THEMES, std::move(context)); + context_proxy_->ConnectType(syncer::THEMES, std::move(context)); } scoped_ptr<SharedModelTypeProcessor> CreateModelTypeProcessor() { @@ -75,11 +75,11 @@ syncer::MockNudgeHandler nudge_handler_; scoped_ptr<syncer::ModelTypeRegistry> registry_; - scoped_ptr<SyncContextProxyImpl> context_proxy_; + scoped_ptr<SyncContextProxy> context_proxy_; }; // Try to connect a type to a SyncContext that has already shut down. -TEST_F(SyncContextProxyImplTest, FailToConnect1) { +TEST_F(SyncContextProxyTest, FailToConnect1) { scoped_ptr<SharedModelTypeProcessor> processor = CreateModelTypeProcessor(); DisableSync(); OnSyncStarting(processor.get()); @@ -90,7 +90,7 @@ } // Try to connect a type to a SyncContext as it shuts down. -TEST_F(SyncContextProxyImplTest, FailToConnect2) { +TEST_F(SyncContextProxyTest, FailToConnect2) { scoped_ptr<SharedModelTypeProcessor> processor = CreateModelTypeProcessor(); OnSyncStarting(processor.get()); DisableSync(); @@ -101,7 +101,7 @@ } // Tests the case where the type's sync proxy shuts down first. -TEST_F(SyncContextProxyImplTest, TypeDisconnectsFirst) { +TEST_F(SyncContextProxyTest, TypeDisconnectsFirst) { scoped_ptr<SharedModelTypeProcessor> processor = CreateModelTypeProcessor(); OnSyncStarting(processor.get()); @@ -113,7 +113,7 @@ } // Tests the case where the sync thread shuts down first. -TEST_F(SyncContextProxyImplTest, SyncDisconnectsFirst) { +TEST_F(SyncContextProxyTest, SyncDisconnectsFirst) { scoped_ptr<SharedModelTypeProcessor> processor = CreateModelTypeProcessor(); OnSyncStarting(processor.get());
diff --git a/sync/internal_api/sync_manager_impl.cc b/sync/internal_api/sync_manager_impl.cc index fae8446..edb8a00 100644 --- a/sync/internal_api/sync_manager_impl.cc +++ b/sync/internal_api/sync_manager_impl.cc
@@ -33,13 +33,11 @@ #include "sync/internal_api/public/internal_components_factory.h" #include "sync/internal_api/public/read_node.h" #include "sync/internal_api/public/read_transaction.h" -#include "sync/internal_api/public/sync_context.h" -#include "sync/internal_api/public/sync_context_proxy.h" #include "sync/internal_api/public/user_share.h" #include "sync/internal_api/public/util/experiments.h" #include "sync/internal_api/public/write_node.h" #include "sync/internal_api/public/write_transaction.h" -#include "sync/internal_api/sync_context_proxy_impl.h" +#include "sync/internal_api/sync_context_proxy.h" #include "sync/internal_api/syncapi_internal.h" #include "sync/internal_api/syncapi_server_connection_manager.h" #include "sync/protocol/proto_value_conversions.h" @@ -313,15 +311,6 @@ new ModelTypeRegistry(args->workers, directory(), this)); sync_encryption_handler_->AddObserver(model_type_registry_.get()); - // Bind the SyncContext WeakPtr to this thread. This helps us crash earlier - // if the pointer is misused in debug mode. - base::WeakPtr<syncer_v2::SyncContext> weak_core = - model_type_registry_->AsWeakPtr(); - weak_core.get(); - - sync_context_proxy_.reset(new syncer_v2::SyncContextProxyImpl( - base::ThreadTaskRunnerHandle::Get(), weak_core)); - // Build a SyncSessionContext and store the worker in it. DVLOG(1) << "Sync is bringing up SyncSessionContext."; std::vector<SyncEngineEventListener*> listeners; @@ -938,9 +927,10 @@ return &share_; } -syncer_v2::SyncContextProxy* SyncManagerImpl::GetSyncContextProxy() { +scoped_ptr<syncer_v2::SyncContext> SyncManagerImpl::GetSyncContextProxy() { DCHECK(initialized_); - return sync_context_proxy_.get(); + return make_scoped_ptr(new syncer_v2::SyncContextProxy( + base::ThreadTaskRunnerHandle::Get(), model_type_registry_->AsWeakPtr())); } const std::string SyncManagerImpl::cache_guid() {
diff --git a/sync/internal_api/sync_manager_impl.h b/sync/internal_api/sync_manager_impl.h index 2c51a48..a4d282dd 100644 --- a/sync/internal_api/sync_manager_impl.h +++ b/sync/internal_api/sync_manager_impl.h
@@ -25,7 +25,6 @@ #include "sync/internal_api/js_sync_encryption_handler_observer.h" #include "sync/internal_api/js_sync_manager_observer.h" #include "sync/internal_api/protocol_event_buffer.h" -#include "sync/internal_api/public/sync_context_proxy.h" #include "sync/internal_api/public/sync_manager.h" #include "sync/internal_api/public/user_share.h" #include "sync/internal_api/sync_encryption_handler_impl.h" @@ -36,10 +35,6 @@ class GURL; -namespace syncer_v2 { -class SyncContext; -} - namespace syncer { class ModelTypeRegistry; @@ -102,7 +97,7 @@ void SaveChanges() override; void ShutdownOnSyncThread(ShutdownReason reason) override; UserShare* GetUserShare() override; - syncer_v2::SyncContextProxy* GetSyncContextProxy() override; + scoped_ptr<syncer_v2::SyncContext> GetSyncContextProxy() override; const std::string cache_guid() override; bool ReceivedExperiment(Experiments* experiments) override; bool HasUnsyncedItems() override; @@ -295,9 +290,6 @@ // This state changes when entering or exiting a configuration cycle. scoped_ptr<ModelTypeRegistry> model_type_registry_; - // Thread-safe wrapper for main interface for non-blocking sync types. - scoped_ptr<syncer_v2::SyncContextProxy> sync_context_proxy_; - // A container of various bits of information used by the SyncScheduler to // create SyncSessions. Must outlive the SyncScheduler. scoped_ptr<sessions::SyncSessionContext> session_context_;
diff --git a/sync/internal_api/test/fake_sync_context.cc b/sync/internal_api/test/fake_sync_context.cc new file mode 100644 index 0000000..4022fe3d --- /dev/null +++ b/sync/internal_api/test/fake_sync_context.cc
@@ -0,0 +1,25 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "sync/internal_api/public/test/fake_sync_context.h" + +#include "sync/internal_api/public/activation_context.h" + +namespace syncer_v2 { + +FakeSyncContext::FakeSyncContext() {} + +FakeSyncContext::~FakeSyncContext() {} + +void FakeSyncContext::ConnectType( + syncer::ModelType type, + scoped_ptr<ActivationContext> activation_context) { + NOTREACHED() << "FakeSyncContext is not meant to be used"; +} + +void FakeSyncContext::DisconnectType(syncer::ModelType type) { + NOTREACHED() << "FakeSyncContext is not meant to be used"; +} + +} // namespace syncer_v2
diff --git a/sync/internal_api/test/fake_sync_manager.cc b/sync/internal_api/test/fake_sync_manager.cc index 2f02a18..90ffa1b 100644 --- a/sync/internal_api/test/fake_sync_manager.cc +++ b/sync/internal_api/test/fake_sync_manager.cc
@@ -16,6 +16,7 @@ #include "base/thread_task_runner_handle.h" #include "sync/internal_api/public/http_post_provider_factory.h" #include "sync/internal_api/public/internal_components_factory.h" +#include "sync/internal_api/public/test/fake_sync_context.h" #include "sync/internal_api/public/util/weak_handle.h" #include "sync/syncable/directory.h" #include "sync/test/fake_sync_encryption_handler.h" @@ -200,8 +201,8 @@ return test_user_share_.user_share(); } -syncer_v2::SyncContextProxy* FakeSyncManager::GetSyncContextProxy() { - return &null_sync_context_proxy_; +scoped_ptr<syncer_v2::SyncContext> FakeSyncManager::GetSyncContextProxy() { + return make_scoped_ptr(new syncer_v2::FakeSyncContext()); } const std::string FakeSyncManager::cache_guid() {
diff --git a/sync/internal_api/test/null_sync_context_proxy.cc b/sync/internal_api/test/null_sync_context_proxy.cc deleted file mode 100644 index 3695b1c..0000000 --- a/sync/internal_api/test/null_sync_context_proxy.cc +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "sync/internal_api/public/test/null_sync_context_proxy.h" - -#include "sync/internal_api/public/activation_context.h" - -namespace syncer_v2 { - -NullSyncContextProxy::NullSyncContextProxy() { -} - -NullSyncContextProxy::~NullSyncContextProxy() { -} - -void NullSyncContextProxy::ConnectTypeToSync( - syncer::ModelType type, - scoped_ptr<ActivationContext> activation_context) { - NOTREACHED() << "NullSyncContextProxy is not meant to be used"; -} - -void NullSyncContextProxy::Disconnect(syncer::ModelType type) { - NOTREACHED() << "NullSyncContextProxy is not meant to be used"; -} - -scoped_ptr<SyncContextProxy> NullSyncContextProxy::Clone() const { - return scoped_ptr<SyncContextProxy>(new NullSyncContextProxy()); -} - -} // namespace syncer_v2
diff --git a/sync/sessions/model_type_registry.cc b/sync/sessions/model_type_registry.cc index f80f693..c85940ae 100644 --- a/sync/sessions/model_type_registry.cc +++ b/sync/sessions/model_type_registry.cc
@@ -137,7 +137,7 @@ GetEnabledNonBlockingTypes()).Empty()); } -void ModelTypeRegistry::ConnectSyncTypeToWorker( +void ModelTypeRegistry::ConnectType( ModelType type, scoped_ptr<syncer_v2::ActivationContext> activation_context) { DVLOG(1) << "Enabling an off-thread sync type: " << ModelTypeToString(type); @@ -174,7 +174,7 @@ GetEnabledNonBlockingTypes()).Empty()); } -void ModelTypeRegistry::DisconnectSyncWorker(ModelType type) { +void ModelTypeRegistry::DisconnectType(ModelType type) { DVLOG(1) << "Disabling an off-thread sync type: " << ModelTypeToString(type); DCHECK(update_handler_map_.find(type) != update_handler_map_.end()); DCHECK(commit_contributor_map_.find(type) != commit_contributor_map_.end());
diff --git a/sync/sessions/model_type_registry.h b/sync/sessions/model_type_registry.h index 576535a8..3e38fa3 100644 --- a/sync/sessions/model_type_registry.h +++ b/sync/sessions/model_type_registry.h
@@ -62,7 +62,7 @@ // and its task_runner to the newly created worker. // // Expects that the proxy's ModelType is not currently enabled. - void ConnectSyncTypeToWorker( + void ConnectType( syncer::ModelType type, scoped_ptr<syncer_v2::ActivationContext> activation_context) override; @@ -70,7 +70,7 @@ // // Expects that the type is currently enabled. // Deletes the worker associated with the type. - void DisconnectSyncWorker(syncer::ModelType type) override; + void DisconnectType(syncer::ModelType type) override; // Implementation of SyncEncryptionHandler::Observer. void OnPassphraseRequired(
diff --git a/sync/sessions/model_type_registry_unittest.cc b/sync/sessions/model_type_registry_unittest.cc index 1b5763c..239dc62 100644 --- a/sync/sessions/model_type_registry_unittest.cc +++ b/sync/sessions/model_type_registry_unittest.cc
@@ -181,20 +181,20 @@ EXPECT_TRUE(registry()->GetEnabledTypes().Empty()); - registry()->ConnectSyncTypeToWorker( + registry()->ConnectType( syncer::THEMES, MakeActivationContext(MakeInitialDataTypeState(THEMES), std::move(themes_sync_processor))); EXPECT_TRUE(registry()->GetEnabledTypes().Equals( ModelTypeSet(syncer::THEMES))); - registry()->ConnectSyncTypeToWorker( + registry()->ConnectType( syncer::SESSIONS, MakeActivationContext(MakeInitialDataTypeState(SESSIONS), std::move(sessions_sync_processor))); EXPECT_TRUE(registry()->GetEnabledTypes().Equals( ModelTypeSet(syncer::THEMES, syncer::SESSIONS))); - registry()->DisconnectSyncWorker(syncer::THEMES); + registry()->DisconnectType(syncer::THEMES); EXPECT_TRUE(registry()->GetEnabledTypes().Equals( ModelTypeSet(syncer::SESSIONS))); @@ -221,7 +221,7 @@ EXPECT_TRUE(registry()->GetEnabledTypes().Empty()); // Add the themes non-blocking type. - registry()->ConnectSyncTypeToWorker( + registry()->ConnectType( syncer::THEMES, MakeActivationContext(MakeInitialDataTypeState(THEMES), std::move(themes_sync_processor))); current_types.Put(syncer::THEMES); @@ -233,7 +233,7 @@ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types)); // Add sessions non-blocking type. - registry()->ConnectSyncTypeToWorker( + registry()->ConnectType( syncer::SESSIONS, MakeActivationContext(MakeInitialDataTypeState(SESSIONS), std::move(sessions_sync_processor))); @@ -241,7 +241,7 @@ EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types)); // Remove themes non-blocking type. - registry()->DisconnectSyncWorker(syncer::THEMES); + registry()->DisconnectType(syncer::THEMES); current_types.Remove(syncer::THEMES); EXPECT_TRUE(registry()->GetEnabledTypes().Equals(current_types));
diff --git a/sync/sync.gyp b/sync/sync.gyp index 2b8383c..e6725824 100644 --- a/sync/sync.gyp +++ b/sync/sync.gyp
@@ -356,8 +356,6 @@ 'internal_api/shared_model_type_processor.cc', 'internal_api/sync_context.cc', 'internal_api/sync_context_proxy.cc', - 'internal_api/sync_context_proxy_impl.cc', - 'internal_api/sync_context_proxy_impl.h', 'internal_api/sync_db_util.cc', 'internal_api/sync_encryption_handler_impl.cc', 'internal_api/sync_encryption_handler_impl.h',
diff --git a/sync/sync_tests.gypi b/sync/sync_tests.gypi index 06c82f2..a0ab854 100644 --- a/sync/sync_tests.gypi +++ b/sync/sync_tests.gypi
@@ -184,17 +184,17 @@ ], 'sources': [ 'internal_api/public/test/fake_model_type_service.h', + 'internal_api/public/test/fake_sync_context.h', 'internal_api/public/test/fake_sync_manager.h', 'internal_api/public/test/model_type_store_test_util.h', - 'internal_api/public/test/null_sync_context_proxy.h', 'internal_api/public/test/sync_manager_factory_for_profile_sync_test.h', 'internal_api/public/test/test_entry_factory.h', 'internal_api/public/test/test_internal_components_factory.h', 'internal_api/public/test/test_user_share.h', 'internal_api/test/fake_model_type_service.cc', + 'internal_api/test/fake_sync_context.cc', 'internal_api/test/fake_sync_manager.cc', 'internal_api/test/model_type_store_test_util.cc', - 'internal_api/test/null_sync_context_proxy.cc', 'internal_api/test/sync_manager_factory_for_profile_sync_test.cc', 'internal_api/test/sync_manager_for_profile_sync_test.cc', 'internal_api/test/sync_manager_for_profile_sync_test.h', @@ -321,7 +321,7 @@ 'internal_api/public/util/proto_value_ptr_unittest.cc', 'internal_api/public/util/weak_handle_unittest.cc', 'internal_api/shared_model_type_processor_unittest.cc', - 'internal_api/sync_context_proxy_impl_unittest.cc', + 'internal_api/sync_context_proxy_unittest.cc', 'internal_api/sync_encryption_handler_impl_unittest.cc', 'internal_api/sync_manager_impl_unittest.cc', 'internal_api/syncapi_server_connection_manager_unittest.cc',
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 89e5b99..d447513 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -863,9 +863,6 @@ "test": "net_unittests" }, { - "test": "network_service_unittests" - }, - { "swarming": { "can_use_on_swarming_builders": true },
diff --git a/testing/buildbot/chromium.mojo.json b/testing/buildbot/chromium.mojo.json index 459b044a..d6235de 100644 --- a/testing/buildbot/chromium.mojo.json +++ b/testing/buildbot/chromium.mojo.json
@@ -45,6 +45,7 @@ "gtest_tests": [ { "args": [ + "--override-use-gl-with-osmesa-for-tests", "--run-in-mash", "--test-launcher-filter-file=src/testing/buildbot/filters/mojo.fyi.browser_tests.filter" ],
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index f35f59a..df96890 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -2194,9 +2194,6 @@ "test": "mus_ws_unittests" }, { - "test": "network_service_unittests" - }, - { "test": "resource_provider_unittests" }, {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 641d182d..97e3b63 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -342,7 +342,7 @@ "label_type": "group", "type": "windowed_test_launcher", "executable": "browser_tests", - "args": ["--run-in-mash", "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.browser_tests.filter"], + "args": ["--override-use-gl-with-osmesa-for-tests", "--run-in-mash", "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.browser_tests.filter"], }, "media_unittests": { "label": "//media:media_unittests", @@ -421,10 +421,6 @@ "label": "//net:net_unittests", "type": "console_test_launcher", }, - "network_service_unittests": { - "label": "//mojo/services/network:unittests", - "type": "unknown", - }, "ozone_unittests": { "label": "//ui/ozone:ozone_unittests", "type": "unknown",
diff --git a/testing/libfuzzer/README.md b/testing/libfuzzer/README.md index 3d06f1e..5c08a77 100644 --- a/testing/libfuzzer/README.md +++ b/testing/libfuzzer/README.md
@@ -14,7 +14,7 @@ engineers to uncover potential security & stability problems earlier. *** note -**Requirements:** libFuzzer in chrome is supported with GN on Linux only. +**Requirements:** libFuzzer in Chrome is supported with GN on Linux only. *** ## Integration Status
diff --git a/testing/libfuzzer/clusterfuzz.md b/testing/libfuzzer/clusterfuzz.md index 7332355..b8e785e8 100644 --- a/testing/libfuzzer/clusterfuzz.md +++ b/testing/libfuzzer/clusterfuzz.md
@@ -10,7 +10,7 @@ ## Status Links -* [Buildbot] - status of all libFuzzer builds +* [Buildbot] - status of all libFuzzer builds. * [ClusterFuzz Fuzzer Status] - fuzzing metrics, links to crashes and coverage reports. * [Corpus GCS Bucket] - current corpus for each fuzzer. Can be used to upload @@ -20,7 +20,7 @@ The integration between libFuzzer and ClusterFuzz consists of: -* Build rules definition in [fuzzer_test.gni] +* Build rules definition in [fuzzer_test.gni]. * [Buildbot] that automatically discovers fuzzers using `gn refs` facility, builds fuzzers with multiple sanitizers and uploads binaries to a special GCS bucket. Build bot recipe is defined in [chromium_libfuzzer.py]. @@ -30,7 +30,7 @@ parasitic coverage. * [ClusterFuzz Fuzzer Status] displays fuzzer runtime metrics as well as provides links to crashes and coverage reports. The information -is collected once a day. +is collected every 30 minutes. [Buildbot]: https://goto.google.com/libfuzzer-clusterfuzz-buildbot
diff --git a/testing/libfuzzer/efficient_fuzzer.md b/testing/libfuzzer/efficient_fuzzer.md index cd8cf74..5eb0b6e 100644 --- a/testing/libfuzzer/efficient_fuzzer.md +++ b/testing/libfuzzer/efficient_fuzzer.md
@@ -13,9 +13,9 @@ There are several metrics you should look at to determine your fuzzer effectiveness: -* fuzzer speed (exec/s) -* corpus size -* coverage +* [fuzzer speed](#Fuzzer-Speed) (exec/s) +* [corpus size](#Corpus-Size) +* [coverage](#Coverage) You can collect these metrics manually or take them from [ClusterFuzz status] pages. @@ -32,6 +32,7 @@ as possible. You should try to get to at least 1,000 exec/s. Profile the fuzzer using any standard tool to see where it spends its time. + ### Initialization/Cleanup Try to keep your fuzzing function as simple as possible. Prefer to use static @@ -41,11 +42,39 @@ Fuzzers don't have to shutdown gracefully (we either kill them or they crash because sanitizer has found a problem). You can skip freeing static resource. -Of course all resources allocated withing `LLVMFuzzerTestOneInput` function +Of course all resources allocated within `LLVMFuzzerTestOneInput` function should be deallocated since this function is called millions of times during one fuzzing session. +### Memory Usage + +Avoid allocation of dynamic memory wherever possible. Instrumentation works +faster for stack-based and static objects than for heap allocated ones. + +It is always a good idea to play with different versions of a fuzzer to find the +fastest implementation. + + +### Maximum Testcase Length + +Experiment with different values of `-max_len` parameter. This parameter often +significantly affects execution speed, but not always. + +1) Define which `-max_len` value is reasonable for your target. For example, it +may be useless to fuzz an image decoder with too small value of testcase length. + +2) Increase the value defined on previous step. Check its influence on execution +speed of fuzzer. If speed doesn't drop significantly for long inputs, it is fine +to have some bigger value for `-max_len`. + +In general, bigger `-max_len` value gives better coverage. Coverage is main +priority for fuzzing. However, low execution speed may result in waste of +resources used for fuzzing. If large inputs make fuzzer too slow you have to +adjust value of `-max_len` and find a trade-off between coverage and execution +speed. + + ## Corpus Size After running for a while the fuzzer would reach a plateau and won't discover @@ -58,7 +87,7 @@ [coverage report](#Coverage). To fix the issue you can: * change the code (e.g. disable crc checks while fuzzing) -* prepare [corpus seed](#Corpus-Seed). +* prepare [corpus seed](#Corpus-Seed) * prepare [fuzzer dictionary](#Fuzzer-Dictionary) ## Coverage @@ -76,7 +105,7 @@ `sancov_path` can be omitted by adding llvm bin directory to `PATH` environment variable. -## Corpus Seed +### Corpus Seed You can pass a corpus directory to a fuzzer that you run manually: @@ -87,12 +116,15 @@ The directory can initially be empty. The fuzzer would store all the interesting items it finds in the directory. You can help the fuzzer by "seeding" the corpus: simply copy interesting inputs for your function to the corpus directory before -running. This works especially well for file-parsing functionality: just -use some valid files from your test suite. +running. This works especially well for strictly defined file formats or data +transmission protocols. +* For file-parsing functionality just use some valid files from your test suite. +* For protocol processing targets put raw streams from test suite into separate +files. After discovering new and interesting items, [upload corpus to ClusterFuzz]. -## Fuzzer Dictionary +### Fuzzer Dictionary It is very useful to provide fuzzer a set of common words/values that you expect to find in the input. This greatly improves efficiency of finding new units and
diff --git a/testing/libfuzzer/getting_started.md b/testing/libfuzzer/getting_started.md index f7db0dd6..62863dc 100644 --- a/testing/libfuzzer/getting_started.md +++ b/testing/libfuzzer/getting_started.md
@@ -1,7 +1,7 @@ # Getting Started with libFuzzer in Chrome *** note -**Prerequisites:** libFuzzer in chrome is supported with GN on Linux only. +**Prerequisites:** libFuzzer in Chrome is supported with GN on Linux only. *** This document will walk you through: @@ -70,7 +70,7 @@ ```bash ninja -C out/libfuzzer url_parse_fuzzer -./out/libfuzzer url_parse_fuzzer +./out/libfuzzer/url_parse_fuzzer ``` Your fuzzer should produce output like this:
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process index 42b4d5cd..ddad0d04 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process +++ b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
@@ -80,6 +80,14 @@ http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ] http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ] +# https://crbug.com/601584 - No OOPIF support for UserGestureIndicator triggers +# cross-origin-iframe.html layout test failure +http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Failure ] + +# https://crbug.com/601581 - m_persistedPluginWidget->isFrameView() assert +# fails in --site-per-process mode +http/tests/security/xss-DENIED-object-element.html [ Crash ] + # TODO(alexmos,lukasza): Triage these failures and assign more specific bugs. # No repro (maybe flaky? maybe really fixed? maybe repros only in debug build?):
diff --git a/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash-expected.txt new file mode 100644 index 0000000..9c314504 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash-expected.txt
@@ -0,0 +1,3 @@ +PASS if no crash or assertion failure. + +
diff --git a/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash.html b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash.html new file mode 100644 index 0000000..c63a174b --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-crash.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<p>PASS if no crash or assertion failure.</p> +<dialog id="dialog"> + <div id="dialogChild"> + <div style="transform:rotatey(0deg);"></div> + <div style="position:absolute;"></div> + </div> +</dialog> +<script src="../../resources/run-after-layout-and-paint.js"></script> +<script> + if (window.testRunner) + testRunner.dumpAsText(); + document.getElementById("dialog").showModal(); + runAfterLayoutAndPaint(function() { + document.body.style.overflowY = "-webkit-paged-x"; + document.getElementById("dialog").style.overflowY = "-webkit-paged-x"; + document.getElementById("dialogChild").style.overflowY = "-webkit-paged-x"; + }, true); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-expected.html b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-expected.html new file mode 100644 index 0000000..01e24279 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog-expected.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<p>There should be a modal dialog on this page, with the word "PASS" inside.</p> +<dialog id="dialog">PASS</dialog> +<script> + document.getElementById("dialog").showModal(); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog.html b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog.html new file mode 100644 index 0000000..e7bebb9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/pagination/modal-dialog.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<style>html { overflow:-webkit-paged-x; }</style> +<p>There should be a modal dialog on this page, with the word "PASS" inside.</p> +<dialog id="dialog">PASS</dialog> +<script> + document.getElementById("dialog").showModal(); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/command-line-api-inspect.html b/third_party/WebKit/LayoutTests/http/tests/inspector/command-line-api-inspect.html index 38320ea..8ee9b7d4 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/command-line-api-inspect.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/command-line-api-inspect.html
@@ -11,7 +11,7 @@ function test() { - InspectorTest.addSniffer(WebInspector.Main.prototype, "inspect", sniffInspect, true); + InspectorTest.addSniffer(WebInspector.RuntimeModel.prototype, "_inspectRequested", sniffInspect, true); function sniffInspect(objectId, hints) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/media/media-source/mediasource-avtracks.html b/third_party/WebKit/LayoutTests/http/tests/media/media-source/mediasource-avtracks.html index 4fbc52b..131e1d05 100644 --- a/third_party/WebKit/LayoutTests/http/tests/media/media-source/mediasource-avtracks.html +++ b/third_party/WebKit/LayoutTests/http/tests/media/media-source/mediasource-avtracks.html
@@ -14,37 +14,40 @@ { var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); test.expectEvent(sourceBuffer, 'updateend', 'initSegment append ended.'); + test.expectEvent(sourceBuffer.audioTracks, 'addtrack', 'sourceBuffer.videoTracks addtrack event'); + test.expectEvent(sourceBuffer.videoTracks, 'addtrack', 'sourceBuffer.videoTracks addtrack event'); + test.expectEvent(mediaElement.audioTracks, 'addtrack', 'mediaElement.videoTracks addtrack event'); + test.expectEvent(mediaElement.videoTracks, 'addtrack', 'mediaElement.videoTracks addtrack event'); sourceBuffer.appendBuffer(initSegment); test.waitForExpectedEvents(function() { - // TODO(servolk): Find a way to make tests more concise in JS - assert_equals(mediaElement.videoTracks.length, 1, "videoTracks.length"); - assert_equals(mediaElement.videoTracks[0].id, "1", "videoTrack.id"); - assert_equals(mediaElement.videoTracks[0].kind, "main", "videoTrack.kind"); - assert_equals(mediaElement.videoTracks[0].label, "", "videoTrack.label"); - assert_equals(mediaElement.videoTracks[0].language, "eng", "videoTrack.language"); - - assert_equals(mediaElement.audioTracks.length, 1, "audioTracks.length"); - assert_equals(mediaElement.audioTracks[0].id, "2", "audioTrack.id"); - assert_equals(mediaElement.audioTracks[0].kind, "main", "audioTrack.kind"); - assert_equals(mediaElement.audioTracks[0].label, "", "audioTrack.label"); - assert_equals(mediaElement.audioTracks[0].language, "eng", "audioTrack.language"); - assert_equals(sourceBuffer.videoTracks.length, 1, "videoTracks.length"); assert_equals(sourceBuffer.videoTracks[0].id, "1", "videoTrack.id"); assert_equals(sourceBuffer.videoTracks[0].kind, "main", "videoTrack.kind"); assert_equals(sourceBuffer.videoTracks[0].label, "", "videoTrack.label"); assert_equals(sourceBuffer.videoTracks[0].language, "eng", "videoTrack.language"); + assert_equals(sourceBuffer.videoTracks[0].sourceBuffer, sourceBuffer, "videoTrack.sourceBuffer"); + // The first video track is selected by default. + assert_true(sourceBuffer.videoTracks[0].selected, "sourceBuffer.videoTracks[0].selected"); assert_equals(sourceBuffer.audioTracks.length, 1, "audioTracks.length"); assert_equals(sourceBuffer.audioTracks[0].id, "2", "audioTrack.id"); assert_equals(sourceBuffer.audioTracks[0].kind, "main", "audioTrack.kind"); assert_equals(sourceBuffer.audioTracks[0].label, "", "audioTrack.label"); assert_equals(sourceBuffer.audioTracks[0].language, "eng", "audioTrack.language"); + assert_equals(sourceBuffer.audioTracks[0].sourceBuffer, sourceBuffer, "audioTrack.sourceBuffer"); + // The first audio track is enabled by default. + assert_true(sourceBuffer.audioTracks[0].enabled, "sourceBuffer.audioTracks[0].enabled"); + + assert_equals(mediaElement.videoTracks.length, 1, "videoTracks.length"); + assert_equals(mediaElement.videoTracks[0], sourceBuffer.videoTracks[0], "mediaElement.videoTrack == sourceBuffer.videoTrack"); + + assert_equals(mediaElement.audioTracks.length, 1, "audioTracks.length"); + assert_equals(mediaElement.audioTracks[0], sourceBuffer.audioTracks[0], "mediaElement.audioTrack == sourceBuffer.audioTrack"); test.done(); }); - }, "MediaSource audio tracks"); + }, "MediaSource media track properties"); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js index 0e645a1f..2be0db2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js
@@ -5,5 +5,5 @@ }); self.addEventListener('foreignfetch', function(event) { - event.respondWith(new Response('Foreign Fetch')); + event.respondWith({response: new Response('Foreign Fetch')}); });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index 8bb2beb..7f0881a 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -251,6 +251,10 @@ method readAsBinaryString method readAsDataURL method readAsText +interface ForeignFetchEvent : ExtendableEvent + getter request + method constructor + method respondWith interface FormData method append method constructor
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero-expected.txt new file mode 100644 index 0000000..e25e8a5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero-expected.txt
@@ -0,0 +1,9 @@ +Tests that DevTools doesn't crash on Runtime.evaluate with contextId equals 0. +{ + error : { + code : -32000 + message : Cannot find context with specified id + } + id : 0 +} +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero.html b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero.html new file mode 100644 index 0000000..e2e2b98 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-with-context-id-equal-zero.html
@@ -0,0 +1,22 @@ +<html> +<head> +<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script> +<script> + +function test() +{ + InspectorTest.sendCommand("Runtime.evaluate", { "contextId": 0, "expression": "" }, evaluateCallback); + + function evaluateCallback(result) + { + result.id = 0; + InspectorTest.logObject(result); + InspectorTest.completeTest(); + } +} +</script> +</head> +<body onLoad="runTest();"> +Tests that DevTools doesn't crash on Runtime.evaluate with contextId equals 0. +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-without-enabling-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-without-enabling-expected.txt index d10064f..f640692a 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-without-enabling-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/runtime/runtime-evaluate-without-enabling-expected.txt
@@ -3,7 +3,7 @@ { error : { code : -32000 - message : Inspected frame has gone + message : Cannot find context with specified id } id : 0 }
diff --git a/third_party/WebKit/LayoutTests/inspector/agents-enable-disable-expected.txt b/third_party/WebKit/LayoutTests/inspector/agents-enable-disable-expected.txt index 737f428..8dba83c1 100644 --- a/third_party/WebKit/LayoutTests/inspector/agents-enable-disable-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/agents-enable-disable-expected.txt
@@ -9,7 +9,6 @@ Debugger.disable finished successfully HeapProfiler.disable finished successfully IndexedDB.disable finished successfully -Inspector.disable finished successfully LayerTree.disable finished successfully Network.disable finished successfully Page.disable finished successfully @@ -44,9 +43,6 @@ IndexedDB.enable finished successfully IndexedDB.disable finished successfully -Inspector.enable finished successfully -Inspector.disable finished successfully - LayerTree.enable finished successfully LayerTree.disable finished successfully
diff --git a/third_party/WebKit/LayoutTests/inspector/agents-enable-disable.html b/third_party/WebKit/LayoutTests/inspector/agents-enable-disable.html index 2b69627..c121d0c 100644 --- a/third_party/WebKit/LayoutTests/inspector/agents-enable-disable.html +++ b/third_party/WebKit/LayoutTests/inspector/agents-enable-disable.html
@@ -25,7 +25,7 @@ targets.forEach(function(target) { var agentNames = Object.keys(target._agentsMap).filter(function(agentName) { var agent = target._agentsMap[agentName]; - return agent["enable"] && agent["disable"] && agentName !== "ServiceWorker" && agentName !== "Security"; // async wrt others. + return agent["enable"] && agent["disable"] && agentName !== "ServiceWorker" && agentName !== "Security" && agentName !== "Inspector"; // async wrt others. }).sort(); function disableAgent(agentName)
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection.html b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection.html index 3a11b68..7dd3b13f 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection.html +++ b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection.html
@@ -97,7 +97,7 @@ function testScrollSelectionAwayDown(next) { consoleView._immediatelyScrollToBottom(); - viewport.refresh(); + viewport._innerRefresh(true); dumpSelectionModel(); dumpViewportRenderedItems(); next(); @@ -204,21 +204,21 @@ function dumpSelectionModel() { - viewport.refresh(); + viewport._innerRefresh(true); var text = String.sprintf("anchor = %s, head = %s", dumpSelectionModelElement(viewport._anchorSelection), dumpSelectionModelElement(viewport._headSelection)); InspectorTest.addResult(text); } function dumpSelectionText() { - viewport.refresh(); + viewport._innerRefresh(true); var text = viewport._selectedText(); InspectorTest.addResult("Selected text:<<<EOL\n" + text + "\nEOL"); } function dumpViewportRenderedItems() { - viewport.refresh(); + viewport._innerRefresh(true); var firstVisibleIndex = viewport.firstVisibleIndex(); var lastVisibleIndex = viewport.lastVisibleIndex(); InspectorTest.addResult("first visible message index: " + firstVisibleIndex); @@ -226,7 +226,7 @@ function emulateShiftClickOnMessage(messageIndex) { - viewport.refresh(); + viewport._innerRefresh(true); var selection = window.getSelection(); if (!selection || !selection.rangeCount) { InspectorTest.addResult("FAILURE: There's no selection"); @@ -235,7 +235,7 @@ viewport.forceScrollItemToBeFirst(Math.max(messageIndex - minimumViewportMessagesCount / 2, 0)); var element = consoleView.itemElement(messageIndex).element(); selection.setBaseAndExtent(selection.anchorNode, selection.anchorOffset, element, 0); - viewport.refresh(); + viewport._innerRefresh(true); } function selectionContainerAndOffset(container, offset) @@ -267,7 +267,7 @@ var from = selectionContainerAndOffset(consoleView.itemElement(fromMessage).element(), fromTextOffset); var to = selectionContainerAndOffset(consoleView.itemElement(toMessage).element(), toTextOffset); window.getSelection().setBaseAndExtent(from.container, from.offset, to.container, to.offset); - viewport.refresh(); + viewport._innerRefresh(true); } } </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom-expected.txt index 999b585..e3888ae 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom-expected.txt
@@ -1,302 +1,600 @@ -CONSOLE MESSAGE: line 9: Message #0 -CONSOLE MESSAGE: line 9: Message #1 -CONSOLE MESSAGE: line 9: Message #2 -CONSOLE MESSAGE: line 9: Message #3 -CONSOLE MESSAGE: line 9: Message #4 -CONSOLE MESSAGE: line 9: Message #5 -CONSOLE MESSAGE: line 9: Message #6 -CONSOLE MESSAGE: line 9: Message #7 -CONSOLE MESSAGE: line 9: Message #8 -CONSOLE MESSAGE: line 9: Message #9 -CONSOLE MESSAGE: line 9: Message #10 -CONSOLE MESSAGE: line 9: Message #11 -CONSOLE MESSAGE: line 9: Message #12 -CONSOLE MESSAGE: line 9: Message #13 -CONSOLE MESSAGE: line 9: Message #14 -CONSOLE MESSAGE: line 9: Message #15 -CONSOLE MESSAGE: line 9: Message #16 -CONSOLE MESSAGE: line 9: Message #17 -CONSOLE MESSAGE: line 9: Message #18 -CONSOLE MESSAGE: line 9: Message #19 -CONSOLE MESSAGE: line 9: Message #20 -CONSOLE MESSAGE: line 9: Message #21 -CONSOLE MESSAGE: line 9: Message #22 -CONSOLE MESSAGE: line 9: Message #23 -CONSOLE MESSAGE: line 9: Message #24 -CONSOLE MESSAGE: line 9: Message #25 -CONSOLE MESSAGE: line 9: Message #26 -CONSOLE MESSAGE: line 9: Message #27 -CONSOLE MESSAGE: line 9: Message #28 -CONSOLE MESSAGE: line 9: Message #29 -CONSOLE MESSAGE: line 9: Message #30 -CONSOLE MESSAGE: line 9: Message #31 -CONSOLE MESSAGE: line 9: Message #32 -CONSOLE MESSAGE: line 9: Message #33 -CONSOLE MESSAGE: line 9: Message #34 -CONSOLE MESSAGE: line 9: Message #35 -CONSOLE MESSAGE: line 9: Message #36 -CONSOLE MESSAGE: line 9: Message #37 -CONSOLE MESSAGE: line 9: Message #38 -CONSOLE MESSAGE: line 9: Message #39 -CONSOLE MESSAGE: line 9: Message #40 -CONSOLE MESSAGE: line 9: Message #41 -CONSOLE MESSAGE: line 9: Message #42 -CONSOLE MESSAGE: line 9: Message #43 -CONSOLE MESSAGE: line 9: Message #44 -CONSOLE MESSAGE: line 9: Message #45 -CONSOLE MESSAGE: line 9: Message #46 -CONSOLE MESSAGE: line 9: Message #47 -CONSOLE MESSAGE: line 9: Message #48 -CONSOLE MESSAGE: line 9: Message #49 -CONSOLE MESSAGE: line 9: Message #50 -CONSOLE MESSAGE: line 9: Message #51 -CONSOLE MESSAGE: line 9: Message #52 -CONSOLE MESSAGE: line 9: Message #53 -CONSOLE MESSAGE: line 9: Message #54 -CONSOLE MESSAGE: line 9: Message #55 -CONSOLE MESSAGE: line 9: Message #56 -CONSOLE MESSAGE: line 9: Message #57 -CONSOLE MESSAGE: line 9: Message #58 -CONSOLE MESSAGE: line 9: Message #59 -CONSOLE MESSAGE: line 9: Message #60 -CONSOLE MESSAGE: line 9: Message #61 -CONSOLE MESSAGE: line 9: Message #62 -CONSOLE MESSAGE: line 9: Message #63 -CONSOLE MESSAGE: line 9: Message #64 -CONSOLE MESSAGE: line 9: Message #65 -CONSOLE MESSAGE: line 9: Message #66 -CONSOLE MESSAGE: line 9: Message #67 -CONSOLE MESSAGE: line 9: Message #68 -CONSOLE MESSAGE: line 9: Message #69 -CONSOLE MESSAGE: line 9: Message #70 -CONSOLE MESSAGE: line 9: Message #71 -CONSOLE MESSAGE: line 9: Message #72 -CONSOLE MESSAGE: line 9: Message #73 -CONSOLE MESSAGE: line 9: Message #74 -CONSOLE MESSAGE: line 9: Message #75 -CONSOLE MESSAGE: line 9: Message #76 -CONSOLE MESSAGE: line 9: Message #77 -CONSOLE MESSAGE: line 9: Message #78 -CONSOLE MESSAGE: line 9: Message #79 -CONSOLE MESSAGE: line 9: Message #80 -CONSOLE MESSAGE: line 9: Message #81 -CONSOLE MESSAGE: line 9: Message #82 -CONSOLE MESSAGE: line 9: Message #83 -CONSOLE MESSAGE: line 9: Message #84 -CONSOLE MESSAGE: line 9: Message #85 -CONSOLE MESSAGE: line 9: Message #86 -CONSOLE MESSAGE: line 9: Message #87 -CONSOLE MESSAGE: line 9: Message #88 -CONSOLE MESSAGE: line 9: Message #89 -CONSOLE MESSAGE: line 9: Message #90 -CONSOLE MESSAGE: line 9: Message #91 -CONSOLE MESSAGE: line 9: Message #92 -CONSOLE MESSAGE: line 9: Message #93 -CONSOLE MESSAGE: line 9: Message #94 -CONSOLE MESSAGE: line 9: Message #95 -CONSOLE MESSAGE: line 9: Message #96 -CONSOLE MESSAGE: line 9: Message #97 -CONSOLE MESSAGE: line 9: Message #98 -CONSOLE MESSAGE: line 9: Message #99 -CONSOLE MESSAGE: line 9: Message #100 -CONSOLE MESSAGE: line 9: Message #101 -CONSOLE MESSAGE: line 9: Message #102 -CONSOLE MESSAGE: line 9: Message #103 -CONSOLE MESSAGE: line 9: Message #104 -CONSOLE MESSAGE: line 9: Message #105 -CONSOLE MESSAGE: line 9: Message #106 -CONSOLE MESSAGE: line 9: Message #107 -CONSOLE MESSAGE: line 9: Message #108 -CONSOLE MESSAGE: line 9: Message #109 -CONSOLE MESSAGE: line 9: Message #110 -CONSOLE MESSAGE: line 9: Message #111 -CONSOLE MESSAGE: line 9: Message #112 -CONSOLE MESSAGE: line 9: Message #113 -CONSOLE MESSAGE: line 9: Message #114 -CONSOLE MESSAGE: line 9: Message #115 -CONSOLE MESSAGE: line 9: Message #116 -CONSOLE MESSAGE: line 9: Message #117 -CONSOLE MESSAGE: line 9: Message #118 -CONSOLE MESSAGE: line 9: Message #119 -CONSOLE MESSAGE: line 9: Message #120 -CONSOLE MESSAGE: line 9: Message #121 -CONSOLE MESSAGE: line 9: Message #122 -CONSOLE MESSAGE: line 9: Message #123 -CONSOLE MESSAGE: line 9: Message #124 -CONSOLE MESSAGE: line 9: Message #125 -CONSOLE MESSAGE: line 9: Message #126 -CONSOLE MESSAGE: line 9: Message #127 -CONSOLE MESSAGE: line 9: Message #128 -CONSOLE MESSAGE: line 9: Message #129 -CONSOLE MESSAGE: line 9: Message #130 -CONSOLE MESSAGE: line 9: Message #131 -CONSOLE MESSAGE: line 9: Message #132 -CONSOLE MESSAGE: line 9: Message #133 -CONSOLE MESSAGE: line 9: Message #134 -CONSOLE MESSAGE: line 9: Message #135 -CONSOLE MESSAGE: line 9: Message #136 -CONSOLE MESSAGE: line 9: Message #137 -CONSOLE MESSAGE: line 9: Message #138 -CONSOLE MESSAGE: line 9: Message #139 -CONSOLE MESSAGE: line 9: Message #140 -CONSOLE MESSAGE: line 9: Message #141 -CONSOLE MESSAGE: line 9: Message #142 -CONSOLE MESSAGE: line 9: Message #143 -CONSOLE MESSAGE: line 9: Message #144 -CONSOLE MESSAGE: line 9: Message #145 -CONSOLE MESSAGE: line 9: Message #146 -CONSOLE MESSAGE: line 9: Message #147 -CONSOLE MESSAGE: line 9: Message #148 +CONSOLE MESSAGE: line 9: Multiline +Message #0 +CONSOLE MESSAGE: line 9: Multiline +Message #1 +CONSOLE MESSAGE: line 9: Multiline +Message #2 +CONSOLE MESSAGE: line 9: Multiline +Message #3 +CONSOLE MESSAGE: line 9: Multiline +Message #4 +CONSOLE MESSAGE: line 9: Multiline +Message #5 +CONSOLE MESSAGE: line 9: Multiline +Message #6 +CONSOLE MESSAGE: line 9: Multiline +Message #7 +CONSOLE MESSAGE: line 9: Multiline +Message #8 +CONSOLE MESSAGE: line 9: Multiline +Message #9 +CONSOLE MESSAGE: line 9: Multiline +Message #10 +CONSOLE MESSAGE: line 9: Multiline +Message #11 +CONSOLE MESSAGE: line 9: Multiline +Message #12 +CONSOLE MESSAGE: line 9: Multiline +Message #13 +CONSOLE MESSAGE: line 9: Multiline +Message #14 +CONSOLE MESSAGE: line 9: Multiline +Message #15 +CONSOLE MESSAGE: line 9: Multiline +Message #16 +CONSOLE MESSAGE: line 9: Multiline +Message #17 +CONSOLE MESSAGE: line 9: Multiline +Message #18 +CONSOLE MESSAGE: line 9: Multiline +Message #19 +CONSOLE MESSAGE: line 9: Multiline +Message #20 +CONSOLE MESSAGE: line 9: Multiline +Message #21 +CONSOLE MESSAGE: line 9: Multiline +Message #22 +CONSOLE MESSAGE: line 9: Multiline +Message #23 +CONSOLE MESSAGE: line 9: Multiline +Message #24 +CONSOLE MESSAGE: line 9: Multiline +Message #25 +CONSOLE MESSAGE: line 9: Multiline +Message #26 +CONSOLE MESSAGE: line 9: Multiline +Message #27 +CONSOLE MESSAGE: line 9: Multiline +Message #28 +CONSOLE MESSAGE: line 9: Multiline +Message #29 +CONSOLE MESSAGE: line 9: Multiline +Message #30 +CONSOLE MESSAGE: line 9: Multiline +Message #31 +CONSOLE MESSAGE: line 9: Multiline +Message #32 +CONSOLE MESSAGE: line 9: Multiline +Message #33 +CONSOLE MESSAGE: line 9: Multiline +Message #34 +CONSOLE MESSAGE: line 9: Multiline +Message #35 +CONSOLE MESSAGE: line 9: Multiline +Message #36 +CONSOLE MESSAGE: line 9: Multiline +Message #37 +CONSOLE MESSAGE: line 9: Multiline +Message #38 +CONSOLE MESSAGE: line 9: Multiline +Message #39 +CONSOLE MESSAGE: line 9: Multiline +Message #40 +CONSOLE MESSAGE: line 9: Multiline +Message #41 +CONSOLE MESSAGE: line 9: Multiline +Message #42 +CONSOLE MESSAGE: line 9: Multiline +Message #43 +CONSOLE MESSAGE: line 9: Multiline +Message #44 +CONSOLE MESSAGE: line 9: Multiline +Message #45 +CONSOLE MESSAGE: line 9: Multiline +Message #46 +CONSOLE MESSAGE: line 9: Multiline +Message #47 +CONSOLE MESSAGE: line 9: Multiline +Message #48 +CONSOLE MESSAGE: line 9: Multiline +Message #49 +CONSOLE MESSAGE: line 9: Multiline +Message #50 +CONSOLE MESSAGE: line 9: Multiline +Message #51 +CONSOLE MESSAGE: line 9: Multiline +Message #52 +CONSOLE MESSAGE: line 9: Multiline +Message #53 +CONSOLE MESSAGE: line 9: Multiline +Message #54 +CONSOLE MESSAGE: line 9: Multiline +Message #55 +CONSOLE MESSAGE: line 9: Multiline +Message #56 +CONSOLE MESSAGE: line 9: Multiline +Message #57 +CONSOLE MESSAGE: line 9: Multiline +Message #58 +CONSOLE MESSAGE: line 9: Multiline +Message #59 +CONSOLE MESSAGE: line 9: Multiline +Message #60 +CONSOLE MESSAGE: line 9: Multiline +Message #61 +CONSOLE MESSAGE: line 9: Multiline +Message #62 +CONSOLE MESSAGE: line 9: Multiline +Message #63 +CONSOLE MESSAGE: line 9: Multiline +Message #64 +CONSOLE MESSAGE: line 9: Multiline +Message #65 +CONSOLE MESSAGE: line 9: Multiline +Message #66 +CONSOLE MESSAGE: line 9: Multiline +Message #67 +CONSOLE MESSAGE: line 9: Multiline +Message #68 +CONSOLE MESSAGE: line 9: Multiline +Message #69 +CONSOLE MESSAGE: line 9: Multiline +Message #70 +CONSOLE MESSAGE: line 9: Multiline +Message #71 +CONSOLE MESSAGE: line 9: Multiline +Message #72 +CONSOLE MESSAGE: line 9: Multiline +Message #73 +CONSOLE MESSAGE: line 9: Multiline +Message #74 +CONSOLE MESSAGE: line 9: Multiline +Message #75 +CONSOLE MESSAGE: line 9: Multiline +Message #76 +CONSOLE MESSAGE: line 9: Multiline +Message #77 +CONSOLE MESSAGE: line 9: Multiline +Message #78 +CONSOLE MESSAGE: line 9: Multiline +Message #79 +CONSOLE MESSAGE: line 9: Multiline +Message #80 +CONSOLE MESSAGE: line 9: Multiline +Message #81 +CONSOLE MESSAGE: line 9: Multiline +Message #82 +CONSOLE MESSAGE: line 9: Multiline +Message #83 +CONSOLE MESSAGE: line 9: Multiline +Message #84 +CONSOLE MESSAGE: line 9: Multiline +Message #85 +CONSOLE MESSAGE: line 9: Multiline +Message #86 +CONSOLE MESSAGE: line 9: Multiline +Message #87 +CONSOLE MESSAGE: line 9: Multiline +Message #88 +CONSOLE MESSAGE: line 9: Multiline +Message #89 +CONSOLE MESSAGE: line 9: Multiline +Message #90 +CONSOLE MESSAGE: line 9: Multiline +Message #91 +CONSOLE MESSAGE: line 9: Multiline +Message #92 +CONSOLE MESSAGE: line 9: Multiline +Message #93 +CONSOLE MESSAGE: line 9: Multiline +Message #94 +CONSOLE MESSAGE: line 9: Multiline +Message #95 +CONSOLE MESSAGE: line 9: Multiline +Message #96 +CONSOLE MESSAGE: line 9: Multiline +Message #97 +CONSOLE MESSAGE: line 9: Multiline +Message #98 +CONSOLE MESSAGE: line 9: Multiline +Message #99 +CONSOLE MESSAGE: line 9: Multiline +Message #100 +CONSOLE MESSAGE: line 9: Multiline +Message #101 +CONSOLE MESSAGE: line 9: Multiline +Message #102 +CONSOLE MESSAGE: line 9: Multiline +Message #103 +CONSOLE MESSAGE: line 9: Multiline +Message #104 +CONSOLE MESSAGE: line 9: Multiline +Message #105 +CONSOLE MESSAGE: line 9: Multiline +Message #106 +CONSOLE MESSAGE: line 9: Multiline +Message #107 +CONSOLE MESSAGE: line 9: Multiline +Message #108 +CONSOLE MESSAGE: line 9: Multiline +Message #109 +CONSOLE MESSAGE: line 9: Multiline +Message #110 +CONSOLE MESSAGE: line 9: Multiline +Message #111 +CONSOLE MESSAGE: line 9: Multiline +Message #112 +CONSOLE MESSAGE: line 9: Multiline +Message #113 +CONSOLE MESSAGE: line 9: Multiline +Message #114 +CONSOLE MESSAGE: line 9: Multiline +Message #115 +CONSOLE MESSAGE: line 9: Multiline +Message #116 +CONSOLE MESSAGE: line 9: Multiline +Message #117 +CONSOLE MESSAGE: line 9: Multiline +Message #118 +CONSOLE MESSAGE: line 9: Multiline +Message #119 +CONSOLE MESSAGE: line 9: Multiline +Message #120 +CONSOLE MESSAGE: line 9: Multiline +Message #121 +CONSOLE MESSAGE: line 9: Multiline +Message #122 +CONSOLE MESSAGE: line 9: Multiline +Message #123 +CONSOLE MESSAGE: line 9: Multiline +Message #124 +CONSOLE MESSAGE: line 9: Multiline +Message #125 +CONSOLE MESSAGE: line 9: Multiline +Message #126 +CONSOLE MESSAGE: line 9: Multiline +Message #127 +CONSOLE MESSAGE: line 9: Multiline +Message #128 +CONSOLE MESSAGE: line 9: Multiline +Message #129 +CONSOLE MESSAGE: line 9: Multiline +Message #130 +CONSOLE MESSAGE: line 9: Multiline +Message #131 +CONSOLE MESSAGE: line 9: Multiline +Message #132 +CONSOLE MESSAGE: line 9: Multiline +Message #133 +CONSOLE MESSAGE: line 9: Multiline +Message #134 +CONSOLE MESSAGE: line 9: Multiline +Message #135 +CONSOLE MESSAGE: line 9: Multiline +Message #136 +CONSOLE MESSAGE: line 9: Multiline +Message #137 +CONSOLE MESSAGE: line 9: Multiline +Message #138 +CONSOLE MESSAGE: line 9: Multiline +Message #139 +CONSOLE MESSAGE: line 9: Multiline +Message #140 +CONSOLE MESSAGE: line 9: Multiline +Message #141 +CONSOLE MESSAGE: line 9: Multiline +Message #142 +CONSOLE MESSAGE: line 9: Multiline +Message #143 +CONSOLE MESSAGE: line 9: Multiline +Message #144 +CONSOLE MESSAGE: line 9: Multiline +Message #145 +CONSOLE MESSAGE: line 9: Multiline +Message #146 +CONSOLE MESSAGE: line 9: Multiline +Message #147 +CONSOLE MESSAGE: line 9: Multiline +Message #148 CONSOLE MESSAGE: line 10: hello %cworld -CONSOLE MESSAGE: line 9: Message #0 -CONSOLE MESSAGE: line 9: Message #1 -CONSOLE MESSAGE: line 9: Message #2 -CONSOLE MESSAGE: line 9: Message #3 -CONSOLE MESSAGE: line 9: Message #4 -CONSOLE MESSAGE: line 9: Message #5 -CONSOLE MESSAGE: line 9: Message #6 -CONSOLE MESSAGE: line 9: Message #7 -CONSOLE MESSAGE: line 9: Message #8 -CONSOLE MESSAGE: line 9: Message #9 -CONSOLE MESSAGE: line 9: Message #10 -CONSOLE MESSAGE: line 9: Message #11 -CONSOLE MESSAGE: line 9: Message #12 -CONSOLE MESSAGE: line 9: Message #13 -CONSOLE MESSAGE: line 9: Message #14 -CONSOLE MESSAGE: line 9: Message #15 -CONSOLE MESSAGE: line 9: Message #16 -CONSOLE MESSAGE: line 9: Message #17 -CONSOLE MESSAGE: line 9: Message #18 -CONSOLE MESSAGE: line 9: Message #19 -CONSOLE MESSAGE: line 9: Message #20 -CONSOLE MESSAGE: line 9: Message #21 -CONSOLE MESSAGE: line 9: Message #22 -CONSOLE MESSAGE: line 9: Message #23 -CONSOLE MESSAGE: line 9: Message #24 -CONSOLE MESSAGE: line 9: Message #25 -CONSOLE MESSAGE: line 9: Message #26 -CONSOLE MESSAGE: line 9: Message #27 -CONSOLE MESSAGE: line 9: Message #28 -CONSOLE MESSAGE: line 9: Message #29 -CONSOLE MESSAGE: line 9: Message #30 -CONSOLE MESSAGE: line 9: Message #31 -CONSOLE MESSAGE: line 9: Message #32 -CONSOLE MESSAGE: line 9: Message #33 -CONSOLE MESSAGE: line 9: Message #34 -CONSOLE MESSAGE: line 9: Message #35 -CONSOLE MESSAGE: line 9: Message #36 -CONSOLE MESSAGE: line 9: Message #37 -CONSOLE MESSAGE: line 9: Message #38 -CONSOLE MESSAGE: line 9: Message #39 -CONSOLE MESSAGE: line 9: Message #40 -CONSOLE MESSAGE: line 9: Message #41 -CONSOLE MESSAGE: line 9: Message #42 -CONSOLE MESSAGE: line 9: Message #43 -CONSOLE MESSAGE: line 9: Message #44 -CONSOLE MESSAGE: line 9: Message #45 -CONSOLE MESSAGE: line 9: Message #46 -CONSOLE MESSAGE: line 9: Message #47 -CONSOLE MESSAGE: line 9: Message #48 -CONSOLE MESSAGE: line 9: Message #49 -CONSOLE MESSAGE: line 9: Message #50 -CONSOLE MESSAGE: line 9: Message #51 -CONSOLE MESSAGE: line 9: Message #52 -CONSOLE MESSAGE: line 9: Message #53 -CONSOLE MESSAGE: line 9: Message #54 -CONSOLE MESSAGE: line 9: Message #55 -CONSOLE MESSAGE: line 9: Message #56 -CONSOLE MESSAGE: line 9: Message #57 -CONSOLE MESSAGE: line 9: Message #58 -CONSOLE MESSAGE: line 9: Message #59 -CONSOLE MESSAGE: line 9: Message #60 -CONSOLE MESSAGE: line 9: Message #61 -CONSOLE MESSAGE: line 9: Message #62 -CONSOLE MESSAGE: line 9: Message #63 -CONSOLE MESSAGE: line 9: Message #64 -CONSOLE MESSAGE: line 9: Message #65 -CONSOLE MESSAGE: line 9: Message #66 -CONSOLE MESSAGE: line 9: Message #67 -CONSOLE MESSAGE: line 9: Message #68 -CONSOLE MESSAGE: line 9: Message #69 -CONSOLE MESSAGE: line 9: Message #70 -CONSOLE MESSAGE: line 9: Message #71 -CONSOLE MESSAGE: line 9: Message #72 -CONSOLE MESSAGE: line 9: Message #73 -CONSOLE MESSAGE: line 9: Message #74 -CONSOLE MESSAGE: line 9: Message #75 -CONSOLE MESSAGE: line 9: Message #76 -CONSOLE MESSAGE: line 9: Message #77 -CONSOLE MESSAGE: line 9: Message #78 -CONSOLE MESSAGE: line 9: Message #79 -CONSOLE MESSAGE: line 9: Message #80 -CONSOLE MESSAGE: line 9: Message #81 -CONSOLE MESSAGE: line 9: Message #82 -CONSOLE MESSAGE: line 9: Message #83 -CONSOLE MESSAGE: line 9: Message #84 -CONSOLE MESSAGE: line 9: Message #85 -CONSOLE MESSAGE: line 9: Message #86 -CONSOLE MESSAGE: line 9: Message #87 -CONSOLE MESSAGE: line 9: Message #88 -CONSOLE MESSAGE: line 9: Message #89 -CONSOLE MESSAGE: line 9: Message #90 -CONSOLE MESSAGE: line 9: Message #91 -CONSOLE MESSAGE: line 9: Message #92 -CONSOLE MESSAGE: line 9: Message #93 -CONSOLE MESSAGE: line 9: Message #94 -CONSOLE MESSAGE: line 9: Message #95 -CONSOLE MESSAGE: line 9: Message #96 -CONSOLE MESSAGE: line 9: Message #97 -CONSOLE MESSAGE: line 9: Message #98 -CONSOLE MESSAGE: line 9: Message #99 -CONSOLE MESSAGE: line 9: Message #100 -CONSOLE MESSAGE: line 9: Message #101 -CONSOLE MESSAGE: line 9: Message #102 -CONSOLE MESSAGE: line 9: Message #103 -CONSOLE MESSAGE: line 9: Message #104 -CONSOLE MESSAGE: line 9: Message #105 -CONSOLE MESSAGE: line 9: Message #106 -CONSOLE MESSAGE: line 9: Message #107 -CONSOLE MESSAGE: line 9: Message #108 -CONSOLE MESSAGE: line 9: Message #109 -CONSOLE MESSAGE: line 9: Message #110 -CONSOLE MESSAGE: line 9: Message #111 -CONSOLE MESSAGE: line 9: Message #112 -CONSOLE MESSAGE: line 9: Message #113 -CONSOLE MESSAGE: line 9: Message #114 -CONSOLE MESSAGE: line 9: Message #115 -CONSOLE MESSAGE: line 9: Message #116 -CONSOLE MESSAGE: line 9: Message #117 -CONSOLE MESSAGE: line 9: Message #118 -CONSOLE MESSAGE: line 9: Message #119 -CONSOLE MESSAGE: line 9: Message #120 -CONSOLE MESSAGE: line 9: Message #121 -CONSOLE MESSAGE: line 9: Message #122 -CONSOLE MESSAGE: line 9: Message #123 -CONSOLE MESSAGE: line 9: Message #124 -CONSOLE MESSAGE: line 9: Message #125 -CONSOLE MESSAGE: line 9: Message #126 -CONSOLE MESSAGE: line 9: Message #127 -CONSOLE MESSAGE: line 9: Message #128 -CONSOLE MESSAGE: line 9: Message #129 -CONSOLE MESSAGE: line 9: Message #130 -CONSOLE MESSAGE: line 9: Message #131 -CONSOLE MESSAGE: line 9: Message #132 -CONSOLE MESSAGE: line 9: Message #133 -CONSOLE MESSAGE: line 9: Message #134 -CONSOLE MESSAGE: line 9: Message #135 -CONSOLE MESSAGE: line 9: Message #136 -CONSOLE MESSAGE: line 9: Message #137 -CONSOLE MESSAGE: line 9: Message #138 -CONSOLE MESSAGE: line 9: Message #139 -CONSOLE MESSAGE: line 9: Message #140 -CONSOLE MESSAGE: line 9: Message #141 -CONSOLE MESSAGE: line 9: Message #142 -CONSOLE MESSAGE: line 9: Message #143 -CONSOLE MESSAGE: line 9: Message #144 -CONSOLE MESSAGE: line 9: Message #145 -CONSOLE MESSAGE: line 9: Message #146 -CONSOLE MESSAGE: line 9: Message #147 -CONSOLE MESSAGE: line 9: Message #148 +CONSOLE MESSAGE: line 9: Multiline +Message #0 +CONSOLE MESSAGE: line 9: Multiline +Message #1 +CONSOLE MESSAGE: line 9: Multiline +Message #2 +CONSOLE MESSAGE: line 9: Multiline +Message #3 +CONSOLE MESSAGE: line 9: Multiline +Message #4 +CONSOLE MESSAGE: line 9: Multiline +Message #5 +CONSOLE MESSAGE: line 9: Multiline +Message #6 +CONSOLE MESSAGE: line 9: Multiline +Message #7 +CONSOLE MESSAGE: line 9: Multiline +Message #8 +CONSOLE MESSAGE: line 9: Multiline +Message #9 +CONSOLE MESSAGE: line 9: Multiline +Message #10 +CONSOLE MESSAGE: line 9: Multiline +Message #11 +CONSOLE MESSAGE: line 9: Multiline +Message #12 +CONSOLE MESSAGE: line 9: Multiline +Message #13 +CONSOLE MESSAGE: line 9: Multiline +Message #14 +CONSOLE MESSAGE: line 9: Multiline +Message #15 +CONSOLE MESSAGE: line 9: Multiline +Message #16 +CONSOLE MESSAGE: line 9: Multiline +Message #17 +CONSOLE MESSAGE: line 9: Multiline +Message #18 +CONSOLE MESSAGE: line 9: Multiline +Message #19 +CONSOLE MESSAGE: line 9: Multiline +Message #20 +CONSOLE MESSAGE: line 9: Multiline +Message #21 +CONSOLE MESSAGE: line 9: Multiline +Message #22 +CONSOLE MESSAGE: line 9: Multiline +Message #23 +CONSOLE MESSAGE: line 9: Multiline +Message #24 +CONSOLE MESSAGE: line 9: Multiline +Message #25 +CONSOLE MESSAGE: line 9: Multiline +Message #26 +CONSOLE MESSAGE: line 9: Multiline +Message #27 +CONSOLE MESSAGE: line 9: Multiline +Message #28 +CONSOLE MESSAGE: line 9: Multiline +Message #29 +CONSOLE MESSAGE: line 9: Multiline +Message #30 +CONSOLE MESSAGE: line 9: Multiline +Message #31 +CONSOLE MESSAGE: line 9: Multiline +Message #32 +CONSOLE MESSAGE: line 9: Multiline +Message #33 +CONSOLE MESSAGE: line 9: Multiline +Message #34 +CONSOLE MESSAGE: line 9: Multiline +Message #35 +CONSOLE MESSAGE: line 9: Multiline +Message #36 +CONSOLE MESSAGE: line 9: Multiline +Message #37 +CONSOLE MESSAGE: line 9: Multiline +Message #38 +CONSOLE MESSAGE: line 9: Multiline +Message #39 +CONSOLE MESSAGE: line 9: Multiline +Message #40 +CONSOLE MESSAGE: line 9: Multiline +Message #41 +CONSOLE MESSAGE: line 9: Multiline +Message #42 +CONSOLE MESSAGE: line 9: Multiline +Message #43 +CONSOLE MESSAGE: line 9: Multiline +Message #44 +CONSOLE MESSAGE: line 9: Multiline +Message #45 +CONSOLE MESSAGE: line 9: Multiline +Message #46 +CONSOLE MESSAGE: line 9: Multiline +Message #47 +CONSOLE MESSAGE: line 9: Multiline +Message #48 +CONSOLE MESSAGE: line 9: Multiline +Message #49 +CONSOLE MESSAGE: line 9: Multiline +Message #50 +CONSOLE MESSAGE: line 9: Multiline +Message #51 +CONSOLE MESSAGE: line 9: Multiline +Message #52 +CONSOLE MESSAGE: line 9: Multiline +Message #53 +CONSOLE MESSAGE: line 9: Multiline +Message #54 +CONSOLE MESSAGE: line 9: Multiline +Message #55 +CONSOLE MESSAGE: line 9: Multiline +Message #56 +CONSOLE MESSAGE: line 9: Multiline +Message #57 +CONSOLE MESSAGE: line 9: Multiline +Message #58 +CONSOLE MESSAGE: line 9: Multiline +Message #59 +CONSOLE MESSAGE: line 9: Multiline +Message #60 +CONSOLE MESSAGE: line 9: Multiline +Message #61 +CONSOLE MESSAGE: line 9: Multiline +Message #62 +CONSOLE MESSAGE: line 9: Multiline +Message #63 +CONSOLE MESSAGE: line 9: Multiline +Message #64 +CONSOLE MESSAGE: line 9: Multiline +Message #65 +CONSOLE MESSAGE: line 9: Multiline +Message #66 +CONSOLE MESSAGE: line 9: Multiline +Message #67 +CONSOLE MESSAGE: line 9: Multiline +Message #68 +CONSOLE MESSAGE: line 9: Multiline +Message #69 +CONSOLE MESSAGE: line 9: Multiline +Message #70 +CONSOLE MESSAGE: line 9: Multiline +Message #71 +CONSOLE MESSAGE: line 9: Multiline +Message #72 +CONSOLE MESSAGE: line 9: Multiline +Message #73 +CONSOLE MESSAGE: line 9: Multiline +Message #74 +CONSOLE MESSAGE: line 9: Multiline +Message #75 +CONSOLE MESSAGE: line 9: Multiline +Message #76 +CONSOLE MESSAGE: line 9: Multiline +Message #77 +CONSOLE MESSAGE: line 9: Multiline +Message #78 +CONSOLE MESSAGE: line 9: Multiline +Message #79 +CONSOLE MESSAGE: line 9: Multiline +Message #80 +CONSOLE MESSAGE: line 9: Multiline +Message #81 +CONSOLE MESSAGE: line 9: Multiline +Message #82 +CONSOLE MESSAGE: line 9: Multiline +Message #83 +CONSOLE MESSAGE: line 9: Multiline +Message #84 +CONSOLE MESSAGE: line 9: Multiline +Message #85 +CONSOLE MESSAGE: line 9: Multiline +Message #86 +CONSOLE MESSAGE: line 9: Multiline +Message #87 +CONSOLE MESSAGE: line 9: Multiline +Message #88 +CONSOLE MESSAGE: line 9: Multiline +Message #89 +CONSOLE MESSAGE: line 9: Multiline +Message #90 +CONSOLE MESSAGE: line 9: Multiline +Message #91 +CONSOLE MESSAGE: line 9: Multiline +Message #92 +CONSOLE MESSAGE: line 9: Multiline +Message #93 +CONSOLE MESSAGE: line 9: Multiline +Message #94 +CONSOLE MESSAGE: line 9: Multiline +Message #95 +CONSOLE MESSAGE: line 9: Multiline +Message #96 +CONSOLE MESSAGE: line 9: Multiline +Message #97 +CONSOLE MESSAGE: line 9: Multiline +Message #98 +CONSOLE MESSAGE: line 9: Multiline +Message #99 +CONSOLE MESSAGE: line 9: Multiline +Message #100 +CONSOLE MESSAGE: line 9: Multiline +Message #101 +CONSOLE MESSAGE: line 9: Multiline +Message #102 +CONSOLE MESSAGE: line 9: Multiline +Message #103 +CONSOLE MESSAGE: line 9: Multiline +Message #104 +CONSOLE MESSAGE: line 9: Multiline +Message #105 +CONSOLE MESSAGE: line 9: Multiline +Message #106 +CONSOLE MESSAGE: line 9: Multiline +Message #107 +CONSOLE MESSAGE: line 9: Multiline +Message #108 +CONSOLE MESSAGE: line 9: Multiline +Message #109 +CONSOLE MESSAGE: line 9: Multiline +Message #110 +CONSOLE MESSAGE: line 9: Multiline +Message #111 +CONSOLE MESSAGE: line 9: Multiline +Message #112 +CONSOLE MESSAGE: line 9: Multiline +Message #113 +CONSOLE MESSAGE: line 9: Multiline +Message #114 +CONSOLE MESSAGE: line 9: Multiline +Message #115 +CONSOLE MESSAGE: line 9: Multiline +Message #116 +CONSOLE MESSAGE: line 9: Multiline +Message #117 +CONSOLE MESSAGE: line 9: Multiline +Message #118 +CONSOLE MESSAGE: line 9: Multiline +Message #119 +CONSOLE MESSAGE: line 9: Multiline +Message #120 +CONSOLE MESSAGE: line 9: Multiline +Message #121 +CONSOLE MESSAGE: line 9: Multiline +Message #122 +CONSOLE MESSAGE: line 9: Multiline +Message #123 +CONSOLE MESSAGE: line 9: Multiline +Message #124 +CONSOLE MESSAGE: line 9: Multiline +Message #125 +CONSOLE MESSAGE: line 9: Multiline +Message #126 +CONSOLE MESSAGE: line 9: Multiline +Message #127 +CONSOLE MESSAGE: line 9: Multiline +Message #128 +CONSOLE MESSAGE: line 9: Multiline +Message #129 +CONSOLE MESSAGE: line 9: Multiline +Message #130 +CONSOLE MESSAGE: line 9: Multiline +Message #131 +CONSOLE MESSAGE: line 9: Multiline +Message #132 +CONSOLE MESSAGE: line 9: Multiline +Message #133 +CONSOLE MESSAGE: line 9: Multiline +Message #134 +CONSOLE MESSAGE: line 9: Multiline +Message #135 +CONSOLE MESSAGE: line 9: Multiline +Message #136 +CONSOLE MESSAGE: line 9: Multiline +Message #137 +CONSOLE MESSAGE: line 9: Multiline +Message #138 +CONSOLE MESSAGE: line 9: Multiline +Message #139 +CONSOLE MESSAGE: line 9: Multiline +Message #140 +CONSOLE MESSAGE: line 9: Multiline +Message #141 +CONSOLE MESSAGE: line 9: Multiline +Message #142 +CONSOLE MESSAGE: line 9: Multiline +Message #143 +CONSOLE MESSAGE: line 9: Multiline +Message #144 +CONSOLE MESSAGE: line 9: Multiline +Message #145 +CONSOLE MESSAGE: line 9: Multiline +Message #146 +CONSOLE MESSAGE: line 9: Multiline +Message #147 +CONSOLE MESSAGE: line 9: Multiline +Message #148 CONSOLE MESSAGE: line 10: hello %cworld Verifies viewport stick-to-bottom behavior.
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom.html b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom.html index 1d62c5a..9a5004ec 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom.html +++ b/third_party/WebKit/LayoutTests/inspector/console/console-viewport-stick-to-bottom.html
@@ -6,7 +6,7 @@ function populateConsoleWithMessages(count) { for (var i = 0; i < count - 1; ++i) - console.log("Message #" + i); + console.log("Multiline\nMessage #" + i); console.log("hello %cworld", "color: blue"); } @@ -66,11 +66,12 @@ function testManualScrollDoesNotStickToBottom(next) { + const manualScrollValue = 3; var initialScrollTop = viewport.element.scrollTop; - viewport.element.scrollTop = initialScrollTop - 1; - viewport.refresh(); + viewport.element.scrollTop = initialScrollTop - manualScrollValue; + viewport._innerRefresh(true); var newScrollTop = viewport.element.scrollTop; - var isScrollPreserved = initialScrollTop - newScrollTop === 1; + var isScrollPreserved = initialScrollTop - newScrollTop === manualScrollValue; InspectorTest.addResult("Scroll preserved: " + isScrollPreserved); next(); },
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-console/debugger-command-line-api.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-console/debugger-command-line-api.html index 61995fc..c736202 100644 --- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-console/debugger-command-line-api.html +++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-console/debugger-command-line-api.html
@@ -12,7 +12,7 @@ var test = function() { - InspectorTest.addSniffer(WebInspector.Main.prototype, "inspect", inspect); + InspectorTest.addSniffer(WebInspector.RuntimeModel.prototype, "_inspectRequested", inspect); InspectorTest.addSniffer(WebInspector.Revealer, "revealPromise", oneRevealPromise, true); function oneRevealPromise(node, revealPromise)
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt index c2465ea..a0c8cab 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -10,6 +10,7 @@ CONSOLE WARNING: 'webkitIDBDatabase' is deprecated. Please use 'IDBDatabase' instead. CONSOLE WARNING: 'webkitIDBCursor' is deprecated. Please use 'IDBCursor' instead. CONSOLE WARNING: 'webkitIndexedDB' is deprecated. Please use 'indexedDB' instead. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. CONSOLE WARNING: 'webkitURL' is deprecated. Please use 'URL' instead. This test documents all interface attributes and methods on the global window object and element instances. @@ -3330,6 +3331,7 @@ getter appCodeName getter appName getter appVersion + getter bluetooth getter cookieEnabled getter credentials getter doNotTrack @@ -6416,6 +6418,13 @@ setter search setter username [GLOBAL OBJECT] + attribute BluetoothAdvertisingData + attribute BluetoothCharacteristicProperties + attribute BluetoothDevice + attribute BluetoothRemoteGATTCharacteristic + attribute BluetoothRemoteGATTServer + attribute BluetoothRemoteGATTService + attribute BluetoothUUID attribute GCController attribute accessibilityController attribute applicationCache
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 30984411..c43d1cc 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -250,6 +250,7 @@ getter kind getter label getter language + getter sourceBuffer method constructor setter enabled interface AudioTrackList : EventTarget @@ -6366,6 +6367,7 @@ getter label getter language getter selected + getter sourceBuffer method constructor setter selected interface VideoTrackList : EventTarget
diff --git a/third_party/WebKit/Source/config.gni b/third_party/WebKit/Source/config.gni index e8e0050..a0bed4e 100644 --- a/third_party/WebKit/Source/config.gni +++ b/third_party/WebKit/Source/config.gni
@@ -28,6 +28,9 @@ # If true, enables blink logging macros (WTF_LOG and friends) unconditionally. # When false, blink logging macros are enabled only if assertions are enabled. blink_logging_always_on = false + + # If true, defaults image interpolation to low quality. + use_low_quality_image_interpolation = is_android } # Whether Android build uses OpenMAX DL FFT. Currently supported only on @@ -66,9 +69,11 @@ feature_defines_list += [ "ENABLE_INPUT_MULTIPLE_FIELDS_UI=1" ] } -if (is_android) { +if (use_low_quality_image_interpolation) { feature_defines_list += [ "WTF_USE_LOW_QUALITY_IMAGE_INTERPOLATION=1" ] -} else { +} + +if (!is_android) { feature_defines_list += [ "WTF_USE_ICCJPEG=1", "WTF_USE_QCMSLIB=1",
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 60cee51..19b88af 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -246,14 +246,12 @@ 'html/TimeRanges.idl', 'html/ValidityState.idl', 'html/VoidCallback.idl', - 'html/track/AudioTrack.idl', 'html/track/AudioTrackList.idl', 'html/track/TextTrack.idl', 'html/track/TextTrackCue.idl', 'html/track/TextTrackCueList.idl', 'html/track/TextTrackList.idl', 'html/track/TrackEvent.idl', - 'html/track/VideoTrack.idl', 'html/track/VideoTrackList.idl', 'html/track/vtt/VTTCue.idl', 'html/track/vtt/VTTRegion.idl', @@ -410,6 +408,8 @@ 'html/HTMLInputElement.idl', 'html/HTMLMediaElement.idl', 'html/HTMLVideoElement.idl', + 'html/track/AudioTrack.idl', + 'html/track/VideoTrack.idl', 'inspector/DevToolsHost.idl', 'workers/DedicatedWorkerGlobalScope.idl', 'workers/SharedWorkerGlobalScope.idl', @@ -1825,7 +1825,6 @@ 'inspector/InspectorHistory.h', 'inspector/InspectorInputAgent.cpp', 'inspector/InspectorInputAgent.h', - 'inspector/InspectorInspectorAgent.cpp', 'inspector/InspectorInstrumentation.cpp', 'inspector/InspectorInstrumentation.h', 'inspector/InspectorInstrumentationCustomInl.h',
diff --git a/third_party/WebKit/Source/core/dom/DocumentParserTiming.cpp b/third_party/WebKit/Source/core/dom/DocumentParserTiming.cpp index 19c489f3..f02c037 100644 --- a/third_party/WebKit/Source/core/dom/DocumentParserTiming.cpp +++ b/third_party/WebKit/Source/core/dom/DocumentParserTiming.cpp
@@ -46,11 +46,14 @@ m_parserDetached = true; } -void DocumentParserTiming::recordParserBlockedOnScriptLoadDuration(double duration) +void DocumentParserTiming::recordParserBlockedOnScriptLoadDuration( + double duration, bool scriptInsertedViaDocumentWrite) { if (m_parserDetached || m_parserStart == 0.0 || m_parserStop > 0.0) return; m_parserBlockedOnScriptLoadDuration += duration; + if (scriptInsertedViaDocumentWrite) + m_parserBlockedOnScriptLoadFromDocumentWriteDuration += duration; notifyDocumentParserTimingChanged(); }
diff --git a/third_party/WebKit/Source/core/dom/DocumentParserTiming.h b/third_party/WebKit/Source/core/dom/DocumentParserTiming.h index 6a2134ee..647eb34d 100644 --- a/third_party/WebKit/Source/core/dom/DocumentParserTiming.h +++ b/third_party/WebKit/Source/core/dom/DocumentParserTiming.h
@@ -44,9 +44,12 @@ void markParserDetached(); // Record a duration of time that the parser yielded due to loading a - // script, in seconds. This may be called multiple times, once for each time - // the parser yields on a script load. - void recordParserBlockedOnScriptLoadDuration(double duration); + // script, in seconds. scriptInsertedViaDocumentWrite indicates whether the + // script causing blocking was inserted via document.write. This may be + // called multiple times, once for each time the parser yields on a script + // load. + void recordParserBlockedOnScriptLoadDuration( + double duration, bool scriptInsertedViaDocumentWrite); // The getters below return monotonically-increasing seconds, or zero if the // given parser event has not yet occurred. See the comments for @@ -59,6 +62,12 @@ // recordParseBlockedOnScriptLoadDuration. double parserBlockedOnScriptLoadDuration() const { return m_parserBlockedOnScriptLoadDuration; } + // Returns the sum of all blocking script load durations due to + // document.write reported via recordParseBlockedOnScriptLoadDuration. Note + // that some uncommon cases are not currently covered by this method. See + // crbug/600711 for details. + double parserBlockedOnScriptLoadFromDocumentWriteDuration() const { return m_parserBlockedOnScriptLoadFromDocumentWriteDuration; } + DECLARE_VIRTUAL_TRACE(); private: @@ -68,6 +77,7 @@ double m_parserStart = 0.0; double m_parserStop = 0.0; double m_parserBlockedOnScriptLoadDuration = 0.0; + double m_parserBlockedOnScriptLoadFromDocumentWriteDuration = 0.0; bool m_parserDetached = false; Member<Document> m_document;
diff --git a/third_party/WebKit/Source/core/dom/Fullscreen.cpp b/third_party/WebKit/Source/core/dom/Fullscreen.cpp index 8c710b2..d4015b7 100644 --- a/third_party/WebKit/Source/core/dom/Fullscreen.cpp +++ b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
@@ -228,7 +228,7 @@ // An algorithm is allowed to show a pop-up if, in the task in which the algorithm is running, either: // - an activation behavior is currently being processed whose click event was trusted, or // - the event listener for a trusted click event is being handled. - if (!UserGestureIndicator::processingUserGesture()) { + if (!UserGestureIndicator::utilizeUserGesture()) { String message = ExceptionMessages::failedToExecute("requestFullScreen", "Element", "API can only be initiated by a user gesture."); document()->getExecutionContext()->addConsoleMessage(
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp index 69c0d67..423475a 100644 --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -383,9 +383,12 @@ if (!anchor.anchorNode()->isInShadowTree()) return m_frame->selection().firstRange(); + Node* node = shadowAdjustedNode(anchor); + if (!node) // crbug.com/595100 + return nullptr; if (!visibleSelection().isBaseFirst()) - return Range::create(*anchor.document(), focusNode(), focusOffset(), shadowAdjustedNode(anchor), anchorOffset()); - return Range::create(*anchor.document(), shadowAdjustedNode(anchor), anchorOffset(), focusNode(), focusOffset()); + return Range::create(*anchor.document(), focusNode(), focusOffset(), node, anchorOffset()); + return Range::create(*anchor.document(), node, anchorOffset(), focusNode(), focusOffset()); } void DOMSelection::removeAllRanges()
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp index 587d7ab..3b8f1bb 100644 --- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -301,7 +301,7 @@ if (source == CommandFromMenuOrKeyBinding) return true; Settings* settings = frame.settings(); - bool defaultValue = (settings && settings->javaScriptCanAccessClipboard()) || UserGestureIndicator::processingUserGesture(); + bool defaultValue = (settings && settings->javaScriptCanAccessClipboard()) || UserGestureIndicator::utilizeUserGesture(); return frame.editor().client().canCopyCut(&frame, defaultValue); }
diff --git a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp index 251ff35..8aa33d1 100644 --- a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp +++ b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
@@ -52,11 +52,6 @@ CSSStyleSheetResource::CSSStyleSheetResource(const ResourceRequest& resourceRequest, const ResourceLoaderOptions& options, const String& charset) : StyleSheetResource(resourceRequest, CSSStyleSheet, options, "text/css", charset) { - DEFINE_STATIC_LOCAL(const AtomicString, acceptCSS, ("text/css,*/*;q=0.1")); - - // Prefer text/css but accept any type (dell.com serves a stylesheet - // as text/html; see <http://bugs.webkit.org/show_bug.cgi?id=11451>). - setAccept(acceptCSS); } CSSStyleSheetResource::~CSSStyleSheetResource()
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp index 0b1d213..7226477 100644 --- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp +++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -65,7 +65,6 @@ , m_hasDevicePixelRatioHeaderValue(false) { WTF_LOG(Timers, "new ImageResource(ResourceRequest) %p", this); - setCustomAcceptHeader(); } ImageResource::ImageResource(blink::Image* image, const ResourceLoaderOptions& options) @@ -76,7 +75,6 @@ { WTF_LOG(Timers, "new ImageResource(Image) %p", this); setStatus(Cached); - setCustomAcceptHeader(); } ImageResource::ImageResource(const ResourceRequest& resourceRequest, blink::Image* image, const ResourceLoaderOptions& options) @@ -85,7 +83,6 @@ { WTF_LOG(Timers, "new ImageResource(ResourceRequest, Image) %p", this); setStatus(Cached); - setCustomAcceptHeader(); } ImageResource::~ImageResource() @@ -313,12 +310,6 @@ setEncodedSize(0); } -void ImageResource::setCustomAcceptHeader() -{ - DEFINE_STATIC_LOCAL(const AtomicString, acceptImages, ("image/webp,image/*,*/*;q=0.8")); - setAccept(acceptImages); -} - inline void ImageResource::createImage() { // Create the image if it doesn't yet exist.
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.h b/third_party/WebKit/Source/core/fetch/ImageResource.h index 4e9c37f..fec8c7c 100644 --- a/third_party/WebKit/Source/core/fetch/ImageResource.h +++ b/third_party/WebKit/Source/core/fetch/ImageResource.h
@@ -152,7 +152,6 @@ void clear(); - void setCustomAcceptHeader(); void createImage(); void updateImage(bool allDataReceived); void clearImage();
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp index aa6e1f8..7071893 100644 --- a/third_party/WebKit/Source/core/fetch/Resource.cpp +++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -261,8 +261,6 @@ ResourceRequest& request(m_revalidatingRequest.isNull() ? m_resourceRequest : m_revalidatingRequest); KURL url = request.url(); - if (!accept().isEmpty()) - request.setHTTPAccept(accept()); request.setAllowStoredCredentials(m_options.allowCredentials == AllowStoredCredentials); m_loader = ResourceLoader::create(fetcher, this);
diff --git a/third_party/WebKit/Source/core/fetch/Resource.h b/third_party/WebKit/Source/core/fetch/Resource.h index e532c1a..75897eb 100644 --- a/third_party/WebKit/Source/core/fetch/Resource.h +++ b/third_party/WebKit/Source/core/fetch/Resource.h
@@ -198,11 +198,6 @@ String reasonNotDeletable() const; - // List of acceptable MIME types separated by ",". - // A MIME type may contain a wildcard, e.g. "text/*". - AtomicString accept() const { return m_accept; } - void setAccept(const AtomicString& accept) { m_accept = accept; } - AtomicString httpContentType() const; bool wasCanceled() const { return m_error.isCancellation(); } @@ -303,7 +298,6 @@ ResourceRequest m_resourceRequest; ResourceRequest m_revalidatingRequest; - AtomicString m_accept; Member<ResourceLoader> m_loader; ResourceLoaderOptions m_options;
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp index 27db48b..036617aa 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -1056,15 +1056,10 @@ void ResourceFetcher::updateAllImageResourcePriorities() { - if (!m_loaders) - return; - TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities"); - for (const auto& loader : m_loaders->hashSet()) { - ASSERT(loader); - Resource* resource = loader->cachedResource(); - ASSERT(resource); - if (!resource->isImage()) + for (const auto& documentResource : m_documentResources) { + Resource* resource = documentResource.value.get(); + if (!resource || !resource->isImage() || !resource->isLoading()) continue; ResourcePriority resourcePriority = resource->priorityFromObservers();
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoaderSet.h b/third_party/WebKit/Source/core/fetch/ResourceLoaderSet.h index 44787c8f..7353cc0 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceLoaderSet.h +++ b/third_party/WebKit/Source/core/fetch/ResourceLoaderSet.h
@@ -50,7 +50,6 @@ void cancelAll(); void setAllDefersLoading(bool); int size() const { return m_set.size(); } - const SetType& hashSet() const { return m_set; } private: SetType m_set;
diff --git a/third_party/WebKit/Source/core/fetch/ScriptResource.cpp b/third_party/WebKit/Source/core/fetch/ScriptResource.cpp index a8f61a5b..9ce2ada 100644 --- a/third_party/WebKit/Source/core/fetch/ScriptResource.cpp +++ b/third_party/WebKit/Source/core/fetch/ScriptResource.cpp
@@ -50,12 +50,6 @@ : TextResource(resourceRequest, Script, options, "application/javascript", charset) , m_integrityDisposition(ScriptIntegrityDisposition::NotChecked) { - DEFINE_STATIC_LOCAL(const AtomicString, acceptScript, ("*/*")); - - // It's javascript we want. - // But some websites think their scripts are <some wrong mimetype here> - // and refuse to serve them if we only accept application/x-javascript. - setAccept(acceptScript); } ScriptResource::~ScriptResource()
diff --git a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp index 1abd498..4f352d8 100644 --- a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp +++ b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp
@@ -35,10 +35,22 @@ namespace blink { +static void applyXSLRequestProperties(ResourceRequest& request) +{ + request.setRequestContext(WebURLRequest::RequestContextXSLT); + // TODO(japhet): Accept: headers can be set manually on XHRs from script, + // in the browser process, and... here. The browser process can't tell the + // difference between an XSL stylesheet and a CSS stylesheet, so it assumes + // stylesheets are all CSS unless they already have an Accept: header set. + // Should we teach the browser process the difference? + DEFINE_STATIC_LOCAL(const AtomicString, acceptXSLT, ("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml")); + request.setHTTPAccept(acceptXSLT); +} + XSLStyleSheetResource* XSLStyleSheetResource::fetchSynchronously(FetchRequest& request, ResourceFetcher* fetcher) { + applyXSLRequestProperties(request.mutableResourceRequest()); request.mutableResourceRequest().setTimeoutInterval(10); - request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextXSLT); ResourceLoaderOptions options(request.options()); options.synchronousPolicy = RequestSynchronously; request.setOptions(options); @@ -51,19 +63,13 @@ XSLStyleSheetResource* XSLStyleSheetResource::fetch(FetchRequest& request, ResourceFetcher* fetcher) { ASSERT(RuntimeEnabledFeatures::xsltEnabled()); - request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextXSLT); + applyXSLRequestProperties(request.mutableResourceRequest()); return toXSLStyleSheetResource(fetcher->requestResource(request, XSLStyleSheetResourceFactory())); } XSLStyleSheetResource::XSLStyleSheetResource(const ResourceRequest& resourceRequest, const ResourceLoaderOptions& options, const String& charset) : StyleSheetResource(resourceRequest, XSLStyleSheet, options, "text/xsl", charset) { - ASSERT(RuntimeEnabledFeatures::xsltEnabled()); - DEFINE_STATIC_LOCAL(const AtomicString, acceptXSLT, ("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml")); - - // It's XML we want. - // FIXME: This should accept more general xml formats */*+xml, image/svg+xml for example. - setAccept(acceptXSLT); } void XSLStyleSheetResource::didAddClient(ResourceClient* c)
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp index efb1874..c55347d 100644 --- a/third_party/WebKit/Source/core/frame/Deprecation.cpp +++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -148,11 +148,8 @@ Deprecation::countDeprecation(context, feature); } -void Deprecation::countDeprecationCrossOriginIframe(const Document& document, UseCounter::Feature feature) +void Deprecation::countDeprecationCrossOriginIframe(const LocalFrame* frame, UseCounter::Feature feature) { - LocalFrame* frame = document.frame(); - if (!frame) - return; // Check to see if the frame can script into the top level document. SecurityOrigin* securityOrigin = frame->securityContext()->getSecurityOrigin(); Frame* top = frame->tree().top(); @@ -160,6 +157,14 @@ countDeprecation(frame, feature); } +void Deprecation::countDeprecationCrossOriginIframe(const Document& document, UseCounter::Feature feature) +{ + LocalFrame* frame = document.frame(); + if (!frame) + return; + countDeprecationCrossOriginIframe(frame, feature); +} + String Deprecation::deprecationMessage(UseCounter::Feature feature) { switch (feature) { @@ -362,6 +367,9 @@ case UseCounter::ResultsAttribute: return willBeRemoved("'results' attribute", 53, "5738199536107520"); + case UseCounter::TouchDragUserGestureUsedCrossOrigin: + return willBeRemoved("Performing sensitive operations in iframes on touch events which don't represent a tap gesture", 52, "https://www.chromestatus.com/features/5649871251963904"); + // Features that aren't deprecated don't have a deprecation message. default: return String();
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.h b/third_party/WebKit/Source/core/frame/Deprecation.h index c6d992a1..acd458ba 100644 --- a/third_party/WebKit/Source/core/frame/Deprecation.h +++ b/third_party/WebKit/Source/core/frame/Deprecation.h
@@ -43,6 +43,7 @@ static void countDeprecationIfNotPrivateScript(v8::Isolate*, ExecutionContext*, UseCounter::Feature); // Count only features if they're being used in an iframe which does not // have script access into the top level document. + static void countDeprecationCrossOriginIframe(const LocalFrame*, UseCounter::Feature); static void countDeprecationCrossOriginIframe(const Document&, UseCounter::Feature); static String deprecationMessage(UseCounter::Feature);
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp index 3359b22..a9450a2 100644 --- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -272,7 +272,7 @@ bool LocalDOMWindow::allowPopUp(LocalFrame& firstFrame) { - if (UserGestureIndicator::processingUserGesture()) + if (UserGestureIndicator::utilizeUserGesture()) return true; Settings* settings = firstFrame.settings();
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h index ba5f141..273a10d 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.h +++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1099,6 +1099,9 @@ InvalidReportUriDirectiveInMetaCSP = 1281, InvalidSandboxDirectiveInMetaCSP = 1282, InvalidFrameAncestorsDirectiveInMetaCSP = 1283, + TouchDragUserGestureUsed = 1284, + TouchDragUserGestureUsedCrossOrigin = 1285, + DocumentCreateEventForeignFetchEvent = 1286, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp index 4fc3f31..92f9d5a 100644 --- a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp +++ b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp
@@ -83,7 +83,7 @@ // Having this set is okay. m_playPending = true; - if (!UserGestureIndicator::processingUserGesture()) { + if (!UserGestureIndicator::utilizeUserGesture()) { autoplayMediaEncountered(); if (isEligible()) { @@ -121,7 +121,7 @@ void AutoplayExperimentHelper::loadMethodCalled() { - if (UserGestureIndicator::processingUserGesture() && isUserGestureRequiredForPlay()) { + if (isUserGestureRequiredForPlay() && UserGestureIndicator::utilizeUserGesture()) { recordAutoplayMetric(AutoplayEnabledThroughLoad); removeUserGestureRequirement(GesturelessPlaybackEnabledByLoad); }
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp index 6140e825..4f35e88 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -417,7 +417,7 @@ Frame* targetFrame = document().frame()->findFrameForNavigation(submission->target(), *document().frame()); if (!targetFrame) { - if (!LocalDOMWindow::allowPopUp(*document().frame()) && !UserGestureIndicator::processingUserGesture()) + if (!LocalDOMWindow::allowPopUp(*document().frame()) && !UserGestureIndicator::utilizeUserGesture()) return; targetFrame = document().frame(); } else { @@ -465,7 +465,7 @@ errorMessage = "requestAutocomplete: form is not owned by a displayed document."; else if (!shouldAutocomplete()) errorMessage = "requestAutocomplete: form autocomplete attribute is set to off."; - else if (!UserGestureIndicator::processingUserGesture()) + else if (!UserGestureIndicator::utilizeUserGesture()) errorMessage = "requestAutocomplete: must be called in response to a user gesture."; if (!errorMessage.isEmpty()) {
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp index b63151e..9532e3b6 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -2048,6 +2048,7 @@ return NotAllowedError; } } else { + UserGestureIndicator::utilizeUserGesture(); // We ask the helper to remove the gesture requirement for us, so that // it can record the reason. Platform::current()->recordAction(UserMetricsAction("Media_Play_WithGesture")); @@ -2107,7 +2108,7 @@ // Only buffer aggressively on a user-initiated pause. Other types of pauses // (which go directly to pauseInternal()) should not cause this behavior. - if (webMediaPlayer() && UserGestureIndicator::processingUserGesture()) + if (webMediaPlayer() && UserGestureIndicator::utilizeUserGesture()) webMediaPlayer()->setBufferingStrategy(WebMediaPlayer::BufferingStrategy::Aggressive); pauseInternal();
diff --git a/third_party/WebKit/Source/core/html/forms/ColorInputType.cpp b/third_party/WebKit/Source/core/html/forms/ColorInputType.cpp index 5af128b47..30924ee2 100644 --- a/third_party/WebKit/Source/core/html/forms/ColorInputType.cpp +++ b/third_party/WebKit/Source/core/html/forms/ColorInputType.cpp
@@ -160,7 +160,7 @@ if (element().isDisabledFormControl() || !element().layoutObject()) return; - if (!UserGestureIndicator::processingUserGesture()) + if (!UserGestureIndicator::utilizeUserGesture()) return; ChromeClient* chromeClient = this->chromeClient();
diff --git a/third_party/WebKit/Source/core/html/forms/FileInputType.cpp b/third_party/WebKit/Source/core/html/forms/FileInputType.cpp index 67b0a53..d76ced7 100644 --- a/third_party/WebKit/Source/core/html/forms/FileInputType.cpp +++ b/third_party/WebKit/Source/core/html/forms/FileInputType.cpp
@@ -134,7 +134,7 @@ if (element().isDisabledFormControl()) return; - if (!UserGestureIndicator::processingUserGesture()) + if (!UserGestureIndicator::utilizeUserGesture()) return; if (ChromeClient* chromeClient = this->chromeClient()) {
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp index 6b2b0eb..4ca64b9 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
@@ -217,7 +217,7 @@ } else { ASSERT(isExecutingScript()); if (scriptParserBlockingTime > 0.0) { - DocumentParserTiming::from(*m_document).recordParserBlockedOnScriptLoadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime); + DocumentParserTiming::from(*m_document).recordParserBlockedOnScriptLoadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime, scriptLoader->wasCreatedDuringDocumentWrite()); } if (!doExecuteScript(element.get(), sourceCode, scriptStartPosition)) { scriptLoader->dispatchErrorEvent();
diff --git a/third_party/WebKit/Source/core/html/track/TrackBase.cpp b/third_party/WebKit/Source/core/html/track/TrackBase.cpp index 735987d..d4eb750e 100644 --- a/third_party/WebKit/Source/core/html/track/TrackBase.cpp +++ b/third_party/WebKit/Source/core/html/track/TrackBase.cpp
@@ -64,6 +64,7 @@ DEFINE_TRACE(TrackBase) { + Supplementable<TrackBase>::trace(visitor); visitor->trace(m_mediaElement); }
diff --git a/third_party/WebKit/Source/core/html/track/TrackBase.h b/third_party/WebKit/Source/core/html/track/TrackBase.h index fd1f47f..fd37f1d 100644 --- a/third_party/WebKit/Source/core/html/track/TrackBase.h +++ b/third_party/WebKit/Source/core/html/track/TrackBase.h
@@ -27,6 +27,7 @@ #define TrackBase_h #include "core/CoreExport.h" +#include "platform/Supplementable.h" #include "platform/heap/Handle.h" #include "public/platform/WebMediaPlayer.h" #include "wtf/RefCounted.h" @@ -36,7 +37,7 @@ class HTMLMediaElement; -class CORE_EXPORT TrackBase : public GarbageCollectedMixin { +class CORE_EXPORT TrackBase : public Supplementable<TrackBase> { public: virtual ~TrackBase();
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp index f0ab67f..7d09eae 100644 --- a/third_party/WebKit/Source/core/input/EventHandler.cpp +++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -50,11 +50,13 @@ #include "core/events/TouchEvent.h" #include "core/events/WheelEvent.h" #include "core/fetch/ImageResource.h" +#include "core/frame/Deprecation.h" #include "core/frame/EventHandlerRegistry.h" #include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" +#include "core/frame/UseCounter.h" #include "core/frame/VisualViewport.h" #include "core/html/HTMLCanvasElement.h" #include "core/html/HTMLDialogElement.h" @@ -992,7 +994,7 @@ return WebInputEventResult::HandledSuppressed; UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); - m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.currentToken(); + m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken = UserGestureIndicator::currentToken(); cancelFakeMouseMoveEvent(); if (m_eventHandlerWillResetCapturingMouseEventsNode) @@ -3759,15 +3761,6 @@ m_touchSequenceUserGestureToken.clear(); } - OwnPtr<UserGestureIndicator> gestureIndicator; - - if (m_touchSequenceUserGestureToken) - gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUserGestureToken.release())); - else - gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture)); - - m_touchSequenceUserGestureToken = gestureIndicator->currentToken(); - ASSERT(m_frame->view()); if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touchSequenceDocument->frame()->view())) { // If the active touch document has no frame or view, it's probably being destroyed @@ -3845,6 +3838,26 @@ return WebInputEventResult::NotHandled; } + // Whether a touch should be considered a "user gesture" or not is a tricky question. + // https://docs.google.com/document/d/1oF1T3O7_E4t1PYHV6gyCwHxOi3ystm0eSL5xZu7nvOg/edit# + // TODO(rbyers): Disable user gesture in some cases but retain logging for now (crbug.com/582140). + OwnPtr<UserGestureIndicator> gestureIndicator; + if (event.touchPoints().size() == 1 + && event.touchPoints()[0].state() == PlatformTouchPoint::TouchReleased + && !event.causesScrollingIfUncanceled()) { + // This is a touchend corresponding to a tap, definitely a user gesture. So don't supply + // a UserGestureUtilizedCallback. + gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture)); + } else { + // This is some other touch event that perhaps shouldn't be considered a user gesture. So + // use a UserGestureUtilizedCallback to get metrics / deprecation warnings. + if (m_touchSequenceUserGestureToken) + gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUserGestureToken.release(), &m_touchSequenceDocument->frame()->eventHandler())); + else + gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture, &m_touchSequenceDocument->frame()->eventHandler())); + m_touchSequenceUserGestureToken = UserGestureIndicator::currentToken(); + } + // Compute and store the common info used by both PointerEvent and TouchEvent. HeapVector<TouchInfo> touchInfos(points.size()); @@ -3942,6 +3955,14 @@ return eventResult; } +void EventHandler::userGestureUtilized() +{ + // This is invoked for UserGestureIndicators created in handleTouchEvent which perhaps represent + // touch actions which shouldn't be considered a user-gesture. + UseCounter::count(m_frame, UseCounter::TouchDragUserGestureUsed); + Deprecation::countDeprecationCrossOriginIframe(m_frame, UseCounter::TouchDragUserGestureUsedCrossOrigin); +} + void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event) { m_mousePositionIsUnknown = false;
diff --git a/third_party/WebKit/Source/core/input/EventHandler.h b/third_party/WebKit/Source/core/input/EventHandler.h index a6ba68b..64676ad 100644 --- a/third_party/WebKit/Source/core/input/EventHandler.h +++ b/third_party/WebKit/Source/core/input/EventHandler.h
@@ -86,7 +86,9 @@ enum class DragInitiator; -class CORE_EXPORT EventHandler final : public GarbageCollectedFinalized<EventHandler> { +class CORE_EXPORT EventHandler final : public GarbageCollectedFinalized<EventHandler> + , public UserGestureUtilizedCallback { + WTF_MAKE_NONCOPYABLE(EventHandler); public: explicit EventHandler(LocalFrame*); @@ -207,6 +209,7 @@ void capsLockStateMayHaveChanged(); // Only called by FrameSelection WebInputEventResult handleTouchEvent(const PlatformTouchEvent&); + void userGestureUtilized() override; bool useHandCursor(Node*, bool isOverLink);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp deleted file mode 100644 index e88b11b5..0000000 --- a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp +++ /dev/null
@@ -1,73 +0,0 @@ -/* - * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "core/inspector/InspectorInspectorAgent.h" - -#include "bindings/core/v8/DOMWrapperWorld.h" -#include "bindings/core/v8/ScriptController.h" -#include "core/dom/Document.h" -#include "core/frame/LocalFrame.h" -#include "core/loader/DocumentLoader.h" -#include "core/page/Page.h" -#include "platform/weborigin/SecurityOrigin.h" -#include "wtf/text/StringBuilder.h" - -namespace blink { - -namespace InspectorAgentState { -static const char inspectorAgentEnabled[] = "inspectorAgentEnabled"; -} - -InspectorInspectorAgent::InspectorInspectorAgent() - : InspectorBaseAgent<InspectorInspectorAgent, protocol::Frontend::Inspector>("Inspector") -{ -} - -InspectorInspectorAgent::~InspectorInspectorAgent() -{ -} - -void InspectorInspectorAgent::enable(ErrorString*) -{ - m_state->setBoolean(InspectorAgentState::inspectorAgentEnabled, true); -} - -void InspectorInspectorAgent::disable(ErrorString*) -{ - m_state->setBoolean(InspectorAgentState::inspectorAgentEnabled, false); -} - -void InspectorInspectorAgent::inspect(PassOwnPtr<protocol::Runtime::RemoteObject> objectToInspect, PassOwnPtr<protocol::DictionaryValue> hints) -{ - if (frontend() && m_state->booleanProperty(InspectorAgentState::inspectorAgentEnabled, false)) - frontend()->inspect(objectToInspect, hints); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.h b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.h deleted file mode 100644 index 3c57da30..0000000 --- a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.h +++ /dev/null
@@ -1,66 +0,0 @@ -/* - * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef InspectorInspectorAgent_h -#define InspectorInspectorAgent_h - -#include "core/CoreExport.h" -#include "core/inspector/InspectorBaseAgent.h" -#include "wtf/PassOwnPtr.h" -#include "wtf/Vector.h" - -namespace blink { - -namespace protocol { -class DictionaryValue; -} - -class CORE_EXPORT InspectorInspectorAgent final : public InspectorBaseAgent<InspectorInspectorAgent, protocol::Frontend::Inspector>, public protocol::Backend::Inspector { - WTF_MAKE_NONCOPYABLE(InspectorInspectorAgent); -public: - static RawPtr<InspectorInspectorAgent> create() - { - return new InspectorInspectorAgent(); - } - - ~InspectorInspectorAgent() override; - - // Inspector front-end API. - void enable(ErrorString*) override; - void disable(ErrorString*) override; - - void inspect(PassOwnPtr<protocol::Runtime::RemoteObject> objectToInspect, PassOwnPtr<protocol::DictionaryValue> hints); - -private: - InspectorInspectorAgent(); -}; - -} // namespace blink - -#endif // !defined(InspectorInspectorAgent_h)
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index 9655aac..631059e 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -958,21 +958,18 @@ return flooredIntSize(getScrollableArea()->scrollOffset()); } -void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const +bool LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect, ApplyOverflowClipFlag applyOverflowClip, VisualRectFlags visualRectFlags) const { - ASSERT(hasLayer()); - ASSERT(hasOverflowClip()); + if (!hasOverflowClip()) + return true; LayoutSize offset = LayoutSize(-scrolledContentOffset()); if (UNLIKELY(hasFlippedBlocksWritingMode())) offset.setWidth(-offset.width()); rect.move(offset); -} -bool LayoutBox::applyOverflowClip(LayoutRect& rect, VisualRectFlags visualRectFlags) const -{ - ASSERT(hasLayer()); - ASSERT(hasOverflowClip()); + if (applyOverflowClip == ApplyNonScrollOverflowClip && scrollsOverflow()) + return true; flipForWritingMode(rect); @@ -1986,12 +1983,9 @@ // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout, // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer. rect.setLocation(topLeft); - if (container->hasOverflowClip()) { - LayoutBox* containerBox = toLayoutBox(container); - containerBox->mapScrollingContentsRectToBoxSpace(rect); - if (container != ancestor && !containerBox->applyOverflowClip(rect, visualRectFlags)) - return false; - } + + if (container->isBox() && !toLayoutBox(container)->mapScrollingContentsRectToBoxSpace(rect, container == ancestor ? ApplyNonScrollOverflowClip : ApplyOverflowClip, visualRectFlags)) + return false; if (ancestorSkipped) { // If the ancestor is below o, then we need to map the rect into ancestor's coordinates.
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h index 1b1cb84..73beb76 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -49,6 +49,11 @@ ScrollOffsetClamped }; +enum ApplyOverflowClipFlag { + ApplyOverflowClip, + ApplyNonScrollOverflowClip +}; + struct LayoutBoxRareData { WTF_MAKE_NONCOPYABLE(LayoutBoxRareData); USING_FAST_MALLOC(LayoutBoxRareData); public: @@ -835,12 +840,12 @@ virtual bool needsPreferredWidthsRecalculation() const; IntSize scrolledContentOffset() const; - void mapScrollingContentsRectToBoxSpace(LayoutRect&) const; - // Returns true if the rect actually intersects the clipping region. + // Maps a rect in scrolling contents space to box space and apply overflow clip if needed. + // Returns true if no clipping applied or the rect actually intersects the clipping region. // If edgeInclusive is true, then this method may return true even // if the resulting rect has zero area. - bool applyOverflowClip(LayoutRect&, VisualRectFlags = DefaultVisualRectFlags) const; + bool mapScrollingContentsRectToBoxSpace(LayoutRect&, ApplyOverflowClipFlag, VisualRectFlags = DefaultVisualRectFlags) const; virtual bool hasRelativeLogicalWidth() const; virtual bool hasRelativeLogicalHeight() const;
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp index 25fcb4d..3fac8ec 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -1101,12 +1101,9 @@ // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout, // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer. rect.setLocation(topLeft); - if (container->hasOverflowClip()) { - LayoutBox* containerBox = toLayoutBox(container); - containerBox->mapScrollingContentsRectToBoxSpace(rect); - if (container != ancestor && !containerBox->applyOverflowClip(rect, visualRectFlags)) - return false; - } + + if (container->isBox() && !toLayoutBox(container)->mapScrollingContentsRectToBoxSpace(rect, container == ancestor ? ApplyNonScrollOverflowClip : ApplyOverflowClip, visualRectFlags)) + return false; if (ancestorSkipped) { // If the paintInvalidationContainer is below o, then we need to map the rect into paintInvalidationContainer's coordinates.
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp index 07d286d..d80c768 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1624,12 +1624,8 @@ return true; if (LayoutObject* parent = this->parent()) { - if (parent->hasOverflowClip()) { - LayoutBox* parentBox = toLayoutBox(parent); - parentBox->mapScrollingContentsRectToBoxSpace(rect); - if (parent != ancestor && !parentBox->applyOverflowClip(rect, visualRectFlags)) - return false; - } + if (parent->isBox() && !toLayoutBox(parent)->mapScrollingContentsRectToBoxSpace(rect, parent == ancestor ? ApplyNonScrollOverflowClip : ApplyOverflowClip, visualRectFlags)) + return false; return parent->mapToVisualRectInAncestorSpace(ancestor, rect, visualRectFlags); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h index 2c3fd82..fbbb1ee 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.h +++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -1150,7 +1150,7 @@ // output as if |ancestor| was the root of the page: the rect is modified by any intervening clips, transforms // and scrolls between |this| and |ancestor|, but not any above |ancestor|. // The output is in the physical, painted coordinate pixel space of |ancestor|. - // Overflow clipping is *not* applied for |ancestor| itself. + // Overflow clipping is *not* applied for |ancestor| itself if |ancestor| scrolls overflow. // The output rect is suitable for purposes such as paint invalidation. // // If visualRectFlags has the EdgeInclusive bit set, clipping operations will use
diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp index 2178eb5..574c7c5e 100644 --- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp +++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
@@ -321,8 +321,8 @@ // Do not clip scroll layer contents because the compositor expects the whole layer // to be always invalidated in-time. - if (box.usesCompositedScrolling()) - ASSERT(!m_clipped); // The box should establish paint invalidation container, so no m_clipped inherited. + if (box == m_paintInvalidationContainer && box.scrollsOverflow()) + ASSERT(!m_clipped); // The box establishes paint invalidation container, so no m_clipped inherited. else addClipRectRelativeToPaintOffset(box.overflowClipRect(LayoutPoint())); @@ -385,10 +385,7 @@ if (m_clipped) rect.intersect(m_clipRect); #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH - // TODO(crbug.com/597902): Slow path misses clipping of paintInvalidationContainer. LayoutRect slowPathRect = SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(m_currentObject, *m_paintInvalidationContainer); - if (m_clipped) - slowPathRect.intersect(m_clipRect); assertRectsEqual(m_currentObject, m_paintInvalidationContainer, rect, slowPathRect); #endif } else { @@ -404,11 +401,10 @@ static void slowMapToVisualRectInAncestorSpace(const LayoutObject& object, const LayoutBoxModelObject& ancestor, LayoutRect& rect) { - if (object.isLayoutView()) { + if (object.isLayoutView()) toLayoutView(object).mapToVisualRectInAncestorSpace(&ancestor, rect, InputIsInFrameCoordinates, DefaultVisualRectFlags); - } else { + else object.mapToVisualRectInAncestorSpace(&ancestor, rect); - } } void PaintInvalidationState::mapLocalRectToPaintInvalidationContainer(LayoutRect& rect) const @@ -424,9 +420,6 @@ if (m_clipped) rect.intersect(m_clipRect); #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH - // TODO(crbug.com/597902): Slow path misses clipping of paintInvalidationContainer. - if (m_clipped) - slowPathRect.intersect(m_clipRect); assertRectsEqual(m_currentObject, *m_paintInvalidationContainer, rect, slowPathRect); #endif } else {
diff --git a/third_party/WebKit/Source/core/layout/VisualRectMappingTest.cpp b/third_party/WebKit/Source/core/layout/VisualRectMappingTest.cpp index 07fc9d6..0ebd400 100644 --- a/third_party/WebKit/Source/core/layout/VisualRectMappingTest.cpp +++ b/third_party/WebKit/Source/core/layout/VisualRectMappingTest.cpp
@@ -222,11 +222,11 @@ checkPaintInvalidationStateRectMapping(rect, containerOverflowRect, *container, layoutView(), layoutView()); } -TEST_F(VisualRectMappingTest, ContainerOverflowClip) +TEST_F(VisualRectMappingTest, ContainerOverflowScroll) { setBodyInnerHTML( "<div id='container' style='position: absolute; top: 111px; left: 222px;" - " border: 10px solid red; overflow: hidden; width: 50px; height: 80px;'>" + " border: 10px solid red; overflow: scroll; width: 50px; height: 80px;'>" " <div id='target' style='box-shadow: 40px 20px black; width: 100px; height: 90px'></div>" "</div>"); @@ -250,7 +250,7 @@ EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); // 2 = target_x(0) + container_border_left(10) - scroll_left(8) // 3 = target_y(0) + container_border_top(10) - scroll_top(7) - // Rect is not clipped by container's overflow clip. + // Rect is not clipped by container's overflow clip because of overflow:scroll. EXPECT_EQ(LayoutRect(2, 3, 140, 110), rect); rect = targetOverflowRect; @@ -276,12 +276,12 @@ checkPaintInvalidationStateRectMapping(rect, containerOverflowRect, *container, layoutView(), layoutView()); } -TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowClip) +TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowScroll) { setBodyInnerHTML( "<div id='container' style='writing-mode: vertical-rl; position: absolute; top: 111px; left: 222px;" " border: solid red; border-width: 10px 20px 30px 40px;" - " overflow: hidden; width: 50px; height: 80px'>" + " overflow: scroll; width: 50px; height: 80px'>" " <div id='target' style='box-shadow: 40px 20px black; width: 100px; height: 90px'></div>" " <div style='width: 100px; height: 100px'></div>" "</div>"); @@ -311,7 +311,7 @@ EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); // -2 = target_physical_x(100) + container_border_left(40) - scroll_left(142) // 3 = target_y(0) + container_border_top(10) - scroll_top(7) - // Rect is not clipped by container's overflow clip. + // Rect is clipped by container's overflow clip because of overflow:scroll. EXPECT_EQ(LayoutRect(-2, 3, 140, 110), rect); rect = targetOverflowRect; @@ -341,6 +341,74 @@ checkPaintInvalidationStateRectMapping(rect, containerOverflowRect, *container, layoutView(), layoutView()); } +TEST_F(VisualRectMappingTest, ContainerOverflowHidden) +{ + setBodyInnerHTML( + "<div id='container' style='position: absolute; top: 111px; left: 222px;" + " border: 10px solid red; overflow: hidden; width: 50px; height: 80px;'>" + " <div id='target' style='box-shadow: 40px 20px black; width: 100px; height: 90px'></div>" + "</div>"); + + LayoutBlock* container = toLayoutBlock(getLayoutObjectByElementId("container")); + EXPECT_EQ(LayoutUnit(0), container->scrollTop()); + EXPECT_EQ(LayoutUnit(0), container->scrollLeft()); + container->setScrollTop(LayoutUnit(27)); + container->setScrollLeft(LayoutUnit(28)); + document().view()->updateAllLifecyclePhases(); + + LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); + LayoutRect targetOverflowRect = target->localOverflowRectForPaintInvalidation(); + // 140 = width(100) + box_shadow_offset_x(40) + // 110 = height(90) + box_shadow_offset_y(20) + EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetOverflowRect); + LayoutRect rect = targetOverflowRect; + EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); + EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); + + rect = targetOverflowRect; + EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); + // Rect is clipped by container's overflow clip. + EXPECT_EQ(LayoutRect(10, 10, 50, 80), rect); +} + +TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowHidden) +{ + setBodyInnerHTML( + "<div id='container' style='writing-mode: vertical-rl; position: absolute; top: 111px; left: 222px;" + " border: solid red; border-width: 10px 20px 30px 40px;" + " overflow: hidden; width: 50px; height: 80px'>" + " <div id='target' style='box-shadow: 40px 20px black; width: 100px; height: 90px'></div>" + " <div style='width: 100px; height: 100px'></div>" + "</div>"); + + LayoutBlock* container = toLayoutBlock(getLayoutObjectByElementId("container")); + EXPECT_EQ(LayoutUnit(0), container->scrollTop()); + // The initial scroll offset is to the left-most because of flipped blocks writing mode. + // 150 = total_layout_overflow(100 + 100) - width(50) + EXPECT_EQ(LayoutUnit(150), container->scrollLeft()); + container->setScrollTop(LayoutUnit(7)); + container->setScrollLeft(LayoutUnit(82)); // Scroll to the right by 8 pixels. + document().view()->updateAllLifecyclePhases(); + + LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); + LayoutRect targetOverflowRect = target->localOverflowRectForPaintInvalidation(); + // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the origin) + // 140 = width(100) + box_shadow_offset_x(40) + // 110 = height(90) + box_shadow_offset_y(20) + EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetOverflowRect); + + LayoutRect rect = targetOverflowRect; + EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); + // This rect is in physical coordinates of target. + EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); + + rect = targetOverflowRect; + EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); + // 58 = target_physical_x(100) + container_border_left(40) - scroll_left(58) + // The other sides of the rect are clipped by container's overflow clip. + EXPECT_EQ(LayoutRect(58, 10, 32, 80), rect); +} + TEST_F(VisualRectMappingTest, DifferentPaintInvalidaitionContainerForAbsolutePosition) { enableCompositing();
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp index fb327978..352d0af 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -39,7 +39,7 @@ #include "core/inspector/InspectorInstrumentation.h" #include "core/layout/LayoutPart.h" #include "core/layout/LayoutVideo.h" -#include "core/layout/LayoutView.h" +#include "core/layout/api/LayoutViewItem.h" #include "core/layout/compositing/CompositedLayerMapping.h" #include "core/layout/compositing/CompositingInputsUpdater.h" #include "core/layout/compositing/CompositingLayerAssigner.h" @@ -213,8 +213,8 @@ // It's possible for trusted Pepper plugins to force hit testing in situations where // the frame tree is in an inconsistent state, such as in the middle of frame detach. // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (localFrame->document()->isActive() && localFrame->contentLayoutObject()) - localFrame->contentLayoutObject()->compositor()->updateIfNeededRecursiveInternal(); + if (localFrame->document()->isActive() && !localFrame->contentLayoutItem().isNull()) + localFrame->contentLayoutItem().compositor()->updateIfNeededRecursiveInternal(); } TRACE_EVENT0("blink", "PaintLayerCompositor::updateIfNeededRecursive"); @@ -253,9 +253,9 @@ if (!child->isLocalFrame()) continue; LocalFrame* localFrame = toLocalFrame(child); - if (localFrame->shouldThrottleRendering() || !localFrame->contentLayoutObject()) + if (localFrame->shouldThrottleRendering() || localFrame->contentLayoutItem().isNull()) continue; - localFrame->contentLayoutObject()->compositor()->assertNoUnresolvedDirtyBits(); + localFrame->contentLayoutItem().compositor()->assertNoUnresolvedDirtyBits(); } #endif }
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp index 143a8f5..655059a 100644 --- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp +++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -1355,7 +1355,7 @@ m_progressTracker->progressStarted(); return false; } - if (!LocalDOMWindow::allowPopUp(*m_frame) && !UserGestureIndicator::processingUserGesture()) + if (!LocalDOMWindow::allowPopUp(*m_frame) && !UserGestureIndicator::utilizeUserGesture()) return false; client()->loadURLExternally(request, policy, String(), replacesCurrentHistoryItem); return false;
diff --git a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp index 8921e669..81d26fd1 100644 --- a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp +++ b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
@@ -96,42 +96,41 @@ const WebURLRequest::RequestContext context; const bool linkLoaderShouldLoadValue; const bool expectingLoad; - const char* accept; } cases[] = { - {"http://example.test/cat.jpg", "image", "", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true, "image/webp,image/*,*/*;q=0.8"}, - {"http://example.test/cat.js", "script", "", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextScript, true, true, "*/*"}, - {"http://example.test/cat.css", "style", "", "", ResourceLoadPriorityHigh, WebURLRequest::RequestContextStyle, true, true, "text/css,*/*;q=0.1"}, + {"http://example.test/cat.jpg", "image", "", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true}, + {"http://example.test/cat.js", "script", "", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextScript, true, true}, + {"http://example.test/cat.css", "style", "", "", ResourceLoadPriorityHigh, WebURLRequest::RequestContextStyle, true, true}, // TODO(yoav): It doesn't seem like the audio context is ever used. That should probably be fixed (or we can consolidate audio and video). - {"http://example.test/cat.wav", "media", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ""}, - {"http://example.test/cat.mp4", "media", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ""}, - {"http://example.test/cat.vtt", "track", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true, ""}, - {"http://example.test/cat.woff", "font", "", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextFont, true, true, ""}, + {"http://example.test/cat.wav", "media", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true}, + {"http://example.test/cat.mp4", "media", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true}, + {"http://example.test/cat.vtt", "track", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true}, + {"http://example.test/cat.woff", "font", "", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextFont, true, true}, // TODO(yoav): subresource should be *very* low priority (rather than low). - {"http://example.test/cat.empty", "", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, true, true, ""}, - {"http://example.test/cat.blob", "blabla", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, false, ""}, - {"bla://example.test/cat.gif", "image", "", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, false, false, ""}, + {"http://example.test/cat.empty", "", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, true, true}, + {"http://example.test/cat.blob", "blabla", "", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, false}, + {"bla://example.test/cat.gif", "image", "", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, false, false}, // MIME type tests - {"http://example.test/cat.webp", "image", "image/webp", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true, "image/webp,image/*,*/*;q=0.8"}, - {"http://example.test/cat.svg", "image", "image/svg+xml", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true, "image/webp,image/*,*/*;q=0.8"}, - {"http://example.test/cat.jxr", "image", "image/jxr", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, false, false, ""}, - {"http://example.test/cat.js", "script", "text/javascript", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextScript, true, true, "*/*"}, - {"http://example.test/cat.js", "script", "text/coffeescript", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextScript, false, false, ""}, - {"http://example.test/cat.css", "style", "text/css", "", ResourceLoadPriorityHigh, WebURLRequest::RequestContextStyle, true, true, "text/css,*/*;q=0.1"}, - {"http://example.test/cat.css", "style", "text/sass", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextStyle, false, false, ""}, - {"http://example.test/cat.wav", "media", "audio/wav", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ""}, - {"http://example.test/cat.wav", "media", "audio/mp57", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextVideo, false, false, ""}, - {"http://example.test/cat.webm", "media", "video/webm", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ""}, - {"http://example.test/cat.mp199", "media", "video/mp199", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextVideo, false, false, ""}, - {"http://example.test/cat.vtt", "track", "text/vtt", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true, ""}, - {"http://example.test/cat.vtt", "track", "text/subtitlething", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextTrack, false, false, ""}, - {"http://example.test/cat.woff", "font", "font/woff2", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextFont, true, true, ""}, - {"http://example.test/cat.woff", "font", "font/woff84", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextFont, false, false, ""}, - {"http://example.test/cat.empty", "", "foo/bar", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, true, true, ""}, - {"http://example.test/cat.blob", "blabla", "foo/bar", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, false, ""}, + {"http://example.test/cat.webp", "image", "image/webp", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true}, + {"http://example.test/cat.svg", "image", "image/svg+xml", "", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true}, + {"http://example.test/cat.jxr", "image", "image/jxr", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, false, false}, + {"http://example.test/cat.js", "script", "text/javascript", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextScript, true, true}, + {"http://example.test/cat.js", "script", "text/coffeescript", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextScript, false, false}, + {"http://example.test/cat.css", "style", "text/css", "", ResourceLoadPriorityHigh, WebURLRequest::RequestContextStyle, true, true}, + {"http://example.test/cat.css", "style", "text/sass", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextStyle, false, false}, + {"http://example.test/cat.wav", "media", "audio/wav", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true}, + {"http://example.test/cat.wav", "media", "audio/mp57", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextVideo, false, false}, + {"http://example.test/cat.webm", "media", "video/webm", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true}, + {"http://example.test/cat.mp199", "media", "video/mp199", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextVideo, false, false}, + {"http://example.test/cat.vtt", "track", "text/vtt", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true}, + {"http://example.test/cat.vtt", "track", "text/subtitlething", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextTrack, false, false}, + {"http://example.test/cat.woff", "font", "font/woff2", "", ResourceLoadPriorityMedium, WebURLRequest::RequestContextFont, true, true}, + {"http://example.test/cat.woff", "font", "font/woff84", "", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextFont, false, false}, + {"http://example.test/cat.empty", "", "foo/bar", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, true, true}, + {"http://example.test/cat.blob", "blabla", "foo/bar", "", ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, false}, // Media tests - {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true, "image/webp,image/*,*/*;q=0.8"}, - {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 400px)", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, true, false, ""}, - {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, false, false, "image/webp,image/*,*/*;q=0.8"}, + {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, true, true}, + {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 400px)", ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, true, false}, + {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", ResourceLoadPriorityVeryLow, WebURLRequest::RequestContextImage, false, false}, }; // Test the cases with a single header @@ -168,7 +167,6 @@ Resource* resource = preloads->begin().get()->get(); ASSERT_EQ(testCase.priority, resource->resourceRequest().priority()); ASSERT_EQ(testCase.context, resource->resourceRequest().requestContext()); - ASSERT_STREQ(testCase.accept, resource->accept().getString().ascii().data()); } } dummyPageHolder->document().fetcher()->clearPreloads();
diff --git a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp index 94e7e6fc..e46878f 100644 --- a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp +++ b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
@@ -323,7 +323,7 @@ { // Non-user navigation before the page has finished firing onload should not create a new back/forward item. // See https://webkit.org/b/42861 for the original motivation for this. - if (!UserGestureIndicator::processingUserGesture() && !targetFrame->document()->loadEventFinished()) + if (!targetFrame->document()->loadEventFinished() && !UserGestureIndicator::utilizeUserGesture()) return true; // Navigation of a subframe during loading of an ancestor frame does not create a new back/forward item.
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerStackingNode.cpp b/third_party/WebKit/Source/core/paint/PaintLayerStackingNode.cpp index a37c621..8489a69 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerStackingNode.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerStackingNode.cpp
@@ -43,6 +43,7 @@ #include "core/paint/PaintLayerStackingNode.h" +#include "core/layout/LayoutMultiColumnFlowThread.h" #include "core/layout/LayoutView.h" #include "core/layout/compositing/PaintLayerCompositor.h" #include "core/paint/PaintLayer.h" @@ -136,8 +137,12 @@ // Append layers for top layer elements after normal layer collection, to ensure they are on top regardless of z-indexes. // The layoutObjects of top layer elements are children of the view, sorted in top layer stacking order. if (layer()->isRootLayer()) { - LayoutView* view = layoutObject()->view(); - for (LayoutObject* child = view->firstChild(); child; child = child->nextSibling()) { + LayoutBlockFlow* rootBlock = layoutObject()->view(); + // If the viewport is paginated, everything (including "top-layer" elements) gets + // redirected to the flow thread. So that's where we have to look, in that case. + if (LayoutBlockFlow* multiColumnFlowThread = rootBlock->multiColumnFlowThread()) + rootBlock = multiColumnFlowThread; + for (LayoutObject* child = rootBlock->firstChild(); child; child = child->nextSibling()) { Element* childElement = (child->node() && child->node()->isElementNode()) ? toElement(child->node()) : 0; if (childElement && childElement->isInTopLayer()) { PaintLayer* layer = toLayoutBoxModelObject(child)->layer();
diff --git a/third_party/WebKit/Source/core/timing/PerformanceTiming.cpp b/third_party/WebKit/Source/core/timing/PerformanceTiming.cpp index 8392c7e..4f7cb4c 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceTiming.cpp +++ b/third_party/WebKit/Source/core/timing/PerformanceTiming.cpp
@@ -388,6 +388,15 @@ return toIntegerMilliseconds(timing->parserBlockedOnScriptLoadDuration()); } +unsigned long long PerformanceTiming::parseBlockedOnScriptLoadFromDocumentWriteDuration() const +{ + const DocumentParserTiming* timing = documentParserTiming(); + if (!timing) + return 0; + + return toIntegerMilliseconds(timing->parserBlockedOnScriptLoadFromDocumentWriteDuration()); +} + DocumentLoader* PerformanceTiming::documentLoader() const { if (!m_frame)
diff --git a/third_party/WebKit/Source/core/timing/PerformanceTiming.h b/third_party/WebKit/Source/core/timing/PerformanceTiming.h index 99eba79a..2ebabc9 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceTiming.h +++ b/third_party/WebKit/Source/core/timing/PerformanceTiming.h
@@ -96,6 +96,7 @@ unsigned long long parseStart() const; unsigned long long parseStop() const; unsigned long long parseBlockedOnScriptLoadDuration() const; + unsigned long long parseBlockedOnScriptLoadFromDocumentWriteDuration() const; ScriptValue toJSONForBinding(ScriptState*) const;
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 5e75ce97..4af1079 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -544,42 +544,6 @@ /** * @override - * @param {!RuntimeAgent.RemoteObject} payload - * @param {!Object=} hints - */ - inspect: function(payload, hints) - { - var object = this._mainTarget.runtimeModel.createRemoteObject(payload); - if (object.isNode()) { - WebInspector.Revealer.revealPromise(object).then(object.release.bind(object)); - return; - } - - if (object.type === "function") { - WebInspector.RemoteFunction.objectAsFunction(object).targetFunctionDetails().then(didGetDetails); - return; - } - - /** - * @param {?WebInspector.DebuggerModel.FunctionDetails} response - */ - function didGetDetails(response) - { - object.release(); - - if (!response || !response.location) - return; - - WebInspector.Revealer.reveal(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(response.location)); - } - - if (hints.copyToClipboard) - InspectorFrontendHost.copyText(object.value); - object.release(); - }, - - /** - * @override * @param {string} reason */ detached: function(reason)
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js index 93efddd4..5d3a91ff 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js
@@ -218,6 +218,40 @@ } }, + /** + * @param {!RuntimeAgent.RemoteObject} payload + * @param {!Object=} hints + */ + _inspectRequested: function(payload, hints) + { + var object = this.createRemoteObject(payload); + + if (object.isNode()) { + WebInspector.Revealer.revealPromise(object).then(object.release.bind(object)); + return; + } + + if (object.type === "function") { + WebInspector.RemoteFunction.objectAsFunction(object).targetFunctionDetails().then(didGetDetails); + return; + } + + /** + * @param {?WebInspector.DebuggerModel.FunctionDetails} response + */ + function didGetDetails(response) + { + object.release(); + if (!response || !response.location) + return; + WebInspector.Revealer.reveal(response.location); + } + + if (hints.copyToClipboard) + InspectorFrontendHost.copyText(object.value); + object.release(); + }, + __proto__: WebInspector.SDKModel.prototype } @@ -256,8 +290,17 @@ executionContextsCleared: function() { this._runtimeModel._executionContextsCleared(); - } + }, + /** + * @override + * @param {!RuntimeAgent.RemoteObject} payload + * @param {!Object=} hints + */ + inspectRequested: function(payload, hints) + { + this._runtimeModel._inspectRequested(payload, hints); + } } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/ViewportControl.js b/third_party/WebKit/Source/devtools/front_end/ui/ViewportControl.js index fb920efd..c8db4db 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/ViewportControl.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/ViewportControl.js
@@ -61,6 +61,7 @@ this._headSelection = null; this._stickToBottom = false; this._scrolledToBottom = true; + this._itemCount = 0; } /** @@ -195,7 +196,8 @@ { delete this._cumulativeHeights; delete this._cachedProviderElements; - this.refresh(); + this._itemCount = this._provider.itemCount(); + this._innerRefresh(false); }, /** @@ -205,7 +207,7 @@ _providerElement: function(index) { if (!this._cachedProviderElements) - this._cachedProviderElements = new Array(this._provider.itemCount()); + this._cachedProviderElements = new Array(this._itemCount); var element = this._cachedProviderElements[index]; if (!element) { element = this._provider.itemElement(index); @@ -218,14 +220,13 @@ { if (this._cumulativeHeights) return; - var itemCount = this._provider.itemCount(); - if (!itemCount) + if (!this._itemCount) return; var firstVisibleIndex = this._firstVisibleIndex; var lastVisibleIndex = this._lastVisibleIndex; var height = 0; - this._cumulativeHeights = new Int32Array(itemCount); - for (var i = 0; i < itemCount; ++i) { + this._cumulativeHeights = new Int32Array(this._itemCount); + for (var i = 0; i < this._itemCount; ++i) { if (firstVisibleIndex <= i && i <= lastVisibleIndex) height += this._renderedItems[i - firstVisibleIndex].element().offsetHeight; else @@ -310,7 +311,7 @@ if (!this._anchorSelection || !this._headSelection) { this._anchorSelection = this._createSelectionModel(0, this.element, 0); - this._headSelection = this._createSelectionModel(this._provider.itemCount() - 1, this.element, this.element.children.length); + this._headSelection = this._createSelectionModel(this._itemCount - 1, this.element, this.element.children.length); this._selectionIsBackward = false; } @@ -375,10 +376,18 @@ refresh: function() { + this._innerRefresh(false); + }, + + /** + * @param {boolean} isUserGesture + */ + _innerRefresh: function(isUserGesture) + { if (!this._visibleHeight()) return; // Do nothing for invisible controls. - if (!this._provider.itemCount()) { + if (!this._itemCount) { for (var i = 0; i < this._renderedItems.length; ++i) this._renderedItems[i].willHide(); this._renderedItems = []; @@ -404,20 +413,19 @@ delete this._cumulativeHeights; } this._rebuildCumulativeHeightsIfNeeded(); - var itemCount = this._cumulativeHeights.length; var oldFirstVisibleIndex = this._firstVisibleIndex; var oldLastVisibleIndex = this._lastVisibleIndex; - var shouldStickToBottom = isInvalidating && this._stickToBottom && this._scrolledToBottom; + var shouldStickToBottom = !isUserGesture && this._stickToBottom && this._scrolledToBottom; if (shouldStickToBottom) { - this._lastVisibleIndex = itemCount - 1; - this._firstVisibleIndex = Math.max(itemCount - Math.ceil(visibleHeight / this._provider.minimumRowHeight()), 0); + this._lastVisibleIndex = this._itemCount - 1; + this._firstVisibleIndex = Math.max(this._itemCount - Math.ceil(visibleHeight / this._provider.minimumRowHeight()), 0); } else { this._firstVisibleIndex = Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights, visibleFrom + 1), 0); // Proactively render more rows in case some of them will be collapsed without triggering refresh. @see crbug.com/390169 this._lastVisibleIndex = this._firstVisibleIndex + Math.ceil(visibleHeight / this._provider.minimumRowHeight()) - 1; - this._lastVisibleIndex = Math.min(this._lastVisibleIndex, itemCount - 1); + this._lastVisibleIndex = Math.min(this._lastVisibleIndex, this._itemCount - 1); } var topGapHeight = this._cumulativeHeights[this._firstVisibleIndex - 1] || 0; var bottomGapHeight = this._cumulativeHeights[this._cumulativeHeights.length - 1] - this._cumulativeHeights[this._lastVisibleIndex]; @@ -443,7 +451,7 @@ if (shouldRestoreSelection) this._restoreSelection(selection); if (shouldStickToBottom) - this.element.scrollTop = this.element.scrollHeight; + this.element.scrollTop = 10000000; }, /** @@ -560,7 +568,7 @@ */ _onScroll: function(event) { - this.refresh(); + this._innerRefresh(event.isTrusted); }, /** @@ -614,7 +622,7 @@ { this._rebuildCumulativeHeightsIfNeeded(); this.element.scrollTop = index > 0 ? this._cumulativeHeights[index - 1] : 0; - this.refresh(); + this._innerRefresh(false); }, /** @@ -624,7 +632,7 @@ { this._rebuildCumulativeHeightsIfNeeded(); this.element.scrollTop = this._cumulativeHeights[index] - this._visibleHeight(); - this.refresh(); + this._innerRefresh(false); }, /**
diff --git a/third_party/WebKit/Source/devtools/protocol.json b/third_party/WebKit/Source/devtools/protocol.json index 73f4357..e069b4d 100644 --- a/third_party/WebKit/Source/devtools/protocol.json +++ b/third_party/WebKit/Source/devtools/protocol.json
@@ -8,22 +8,16 @@ { "name": "enable", "description": "Enables inspector domain notifications.", - "handlers": ["browser", "renderer"] + "handlers": ["browser"] }, { "name": "disable", - "description": "Disables inspector domain notifications." + "description": "Disables inspector domain notifications.", + "handlers": ["browser"] } ], "events": [ { - "name": "inspect", - "parameters": [ - { "name": "object", "$ref": "Runtime.RemoteObject" }, - { "name": "hints", "type": "object" } - ] - }, - { "name": "detached", "description": "Fired when remote debugging connection is about to be terminated. Contains detach reason.", "parameters": [ @@ -1045,6 +1039,14 @@ { "name": "executionContextsCleared", "description": "Issued when all executionContexts were cleared in browser" + }, + { + "name": "inspectRequested", + "parameters": [ + { "name": "object", "$ref": "RemoteObject" }, + { "name": "hints", "type": "object" } + ], + "hidden": true } ] },
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp index c2b6821..989bbe1 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
@@ -129,15 +129,12 @@ // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetooth-requestdevice ScriptPromise Bluetooth::requestDevice(ScriptState* scriptState, const RequestDeviceOptions& options, ExceptionState& exceptionState) { - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // Restore this logic when re-enabling the experiment: - // // By adding the "OriginTrialEnabled" extended binding, we enable the // requestDevice function on all platforms for whitelisted domains. Since we // only support Chrome OS and Android for this experiment we reject any // promises from other platforms unless they have the enable-web-bluetooth // flag on. -#if 0 // !OS(CHROMEOS) && !OS(ANDROID) +#if !OS(CHROMEOS) && !OS(ANDROID) if (!RuntimeEnabledFeatures::webBluetoothEnabled()) { return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "Web Bluetooth is not enabled on this platform. To find out how to enable it and the current implementation status visit https://goo.gl/HKa2If")); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.idl b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.idl index 4055338..88f0d2e 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.idl +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.idl
@@ -8,8 +8,7 @@ GarbageCollected, NoInterfaceObject, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface Bluetooth { [CallWith=ScriptState, RaisesException] Promise<BluetoothDevice> requestDevice ( RequestDeviceOptions options
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothAdvertisingData.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothAdvertisingData.idl index 818e5b4..5b24c37 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothAdvertisingData.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothAdvertisingData.idl
@@ -9,8 +9,7 @@ [ GarbageCollected, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothAdvertisingData { // readonly attribute unsigned short? appearance; readonly attribute byte? txPower;
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothCharacteristicProperties.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothCharacteristicProperties.idl index ca87d7d..b848b3a7 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothCharacteristicProperties.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothCharacteristicProperties.idl
@@ -9,8 +9,7 @@ [ GarbageCollected, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothCharacteristicProperties { readonly attribute boolean broadcast; readonly attribute boolean read;
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl index 13ac479..3a10f7c 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl
@@ -15,8 +15,7 @@ GarbageCollected, DependentLifetime, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothDevice : EventTarget // Implement ServiceEventHandlers interface: http://crbug.com/421670 // : ServiceEventHandlers
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.idl index 16c2dd2..7f3d77c 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.idl
@@ -10,8 +10,7 @@ GarbageCollected, DependentLifetime, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothRemoteGATTCharacteristic : EventTarget {//: CharacteristicEventHandlers { // TODO(ortuno): Add test to make sure service matches the service // used to call getCharacteristic.
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.idl index 5e26954..fee90a2b 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.idl
@@ -9,8 +9,7 @@ [ GarbageCollected, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothRemoteGATTServer { readonly attribute BluetoothDevice device;
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl index 85ce907..281e5bb 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl
@@ -9,8 +9,7 @@ [ GarbageCollected, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothRemoteGATTService { // : ServiceEventHandlers { readonly attribute UUID uuid; readonly attribute boolean isPrimary;
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.idl index a064b3d..f36b616 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.idl
@@ -10,8 +10,7 @@ [ GarbageCollected, RuntimeEnabled=WebBluetooth, - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth, + OriginTrialEnabled=WebBluetooth, ] interface BluetoothUUID { [RaisesException] static UUID getService((DOMString or unsigned long) name); [RaisesException] static UUID getCharacteristic((DOMString or unsigned long) name);
diff --git a/third_party/WebKit/Source/modules/bluetooth/NavigatorBluetooth.idl b/third_party/WebKit/Source/modules/bluetooth/NavigatorBluetooth.idl index e7c777c..4c33b72 100644 --- a/third_party/WebKit/Source/modules/bluetooth/NavigatorBluetooth.idl +++ b/third_party/WebKit/Source/modules/bluetooth/NavigatorBluetooth.idl
@@ -10,8 +10,5 @@ // Experimental Framework doesn't support adding bindings to partial // interfaces yet, so we add it to the bluetooth attribute instead. // https://crbug.com/585656 - [ - // TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. - // OriginTrialEnabled=WebBluetooth - ] readonly attribute Bluetooth bluetooth; + [OriginTrialEnabled=WebBluetooth] readonly attribute Bluetooth bluetooth; };
diff --git a/third_party/WebKit/Source/modules/mediasource/AudioTrackSourceBuffer.idl b/third_party/WebKit/Source/modules/mediasource/AudioTrackSourceBuffer.idl new file mode 100644 index 0000000..35f26b9 --- /dev/null +++ b/third_party/WebKit/Source/modules/mediasource/AudioTrackSourceBuffer.idl
@@ -0,0 +1,12 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://w3c.github.io/media-source/#audio-track-extensions +[ + GarbageCollected, + ImplementedAs=SourceBufferTrackBaseSupplement, + RuntimeEnabled=AudioVideoTracks +] partial interface AudioTrack { + readonly attribute SourceBuffer? sourceBuffer; +};
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp index f9f5201..9edf22ea 100644 --- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp +++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp
@@ -48,6 +48,7 @@ #include "core/html/track/VideoTrackList.h" #include "core/streams/Stream.h" #include "modules/mediasource/MediaSource.h" +#include "modules/mediasource/SourceBufferTrackBaseSupplement.h" #include "platform/Logging.h" #include "platform/TraceEvent.h" #include "public/platform/WebSourceBuffer.h" @@ -532,6 +533,7 @@ AudioTrack* audioTrack = nullptr; if (!m_firstInitializationSegmentReceived) { audioTrack = AudioTrack::create(id, kind, label, language, false); + SourceBufferTrackBaseSupplement::setSourceBuffer(*audioTrack, this); audioTracks().add(audioTrack); m_source->mediaElement()->audioTracks().add(audioTrack); } else { @@ -544,6 +546,7 @@ VideoTrack* videoTrack = nullptr; if (!m_firstInitializationSegmentReceived) { videoTrack = VideoTrack::create(id, kind, label, language, false); + SourceBufferTrackBaseSupplement::setSourceBuffer(*videoTrack, this); videoTracks().add(videoTrack); m_source->mediaElement()->videoTracks().add(videoTrack); } else {
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.cpp new file mode 100644 index 0000000..186335e --- /dev/null +++ b/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.cpp
@@ -0,0 +1,52 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "modules/mediasource/SourceBufferTrackBaseSupplement.h" + +#include "core/html/track/TrackBase.h" +#include "modules/mediasource/SourceBuffer.h" + +namespace blink { + +static const char* kSupplementName = "SourceBufferTrackBaseSupplement"; + +// static +SourceBufferTrackBaseSupplement* SourceBufferTrackBaseSupplement::fromIfExists(TrackBase& track) +{ + return static_cast<SourceBufferTrackBaseSupplement*>(Supplement<TrackBase>::from(track, kSupplementName)); +} + +// static +SourceBufferTrackBaseSupplement& SourceBufferTrackBaseSupplement::from(TrackBase& track) +{ + SourceBufferTrackBaseSupplement* supplement = fromIfExists(track); + if (!supplement) { + supplement = new SourceBufferTrackBaseSupplement(); + Supplement<TrackBase>::provideTo(track, kSupplementName, supplement); + } + return *supplement; +} + +// static +SourceBuffer* SourceBufferTrackBaseSupplement::sourceBuffer(TrackBase& track) +{ + SourceBufferTrackBaseSupplement* supplement = fromIfExists(track); + if (supplement) + return supplement->m_sourceBuffer; + return nullptr; +} + +void SourceBufferTrackBaseSupplement::setSourceBuffer(TrackBase& track, SourceBuffer* sourceBuffer) +{ + from(track).m_sourceBuffer = sourceBuffer; +} + +DEFINE_TRACE(SourceBufferTrackBaseSupplement) +{ + visitor->trace(m_sourceBuffer); + Supplement<TrackBase>::trace(visitor); +} + +} // namespace blink +
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.h b/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.h new file mode 100644 index 0000000..e2ef6b7 --- /dev/null +++ b/third_party/WebKit/Source/modules/mediasource/SourceBufferTrackBaseSupplement.h
@@ -0,0 +1,34 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SourceBufferTrackBaseSupplement_h +#define SourceBufferTrackBaseSupplement_h + +#include "platform/Supplementable.h" +#include "wtf/Allocator.h" + +namespace blink { + +class TrackBase; +class SourceBuffer; + +class SourceBufferTrackBaseSupplement : public GarbageCollected<SourceBufferTrackBaseSupplement>, public Supplement<TrackBase> { + USING_GARBAGE_COLLECTED_MIXIN(SourceBufferTrackBaseSupplement); +public: + static SourceBuffer* sourceBuffer(TrackBase&); + static void setSourceBuffer(TrackBase&, SourceBuffer*); + + DECLARE_VIRTUAL_TRACE(); + +private: + static SourceBufferTrackBaseSupplement& from(TrackBase&); + static SourceBufferTrackBaseSupplement* fromIfExists(TrackBase&); + + Member<SourceBuffer> m_sourceBuffer; +}; + +} // namespace blink + +#endif +
diff --git a/third_party/WebKit/Source/modules/mediasource/VideoTrackSourceBuffer.idl b/third_party/WebKit/Source/modules/mediasource/VideoTrackSourceBuffer.idl new file mode 100644 index 0000000..2f6662c69 --- /dev/null +++ b/third_party/WebKit/Source/modules/mediasource/VideoTrackSourceBuffer.idl
@@ -0,0 +1,12 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://w3c.github.io/media-source/#video-track-extensions +[ + GarbageCollected, + ImplementedAs=SourceBufferTrackBaseSupplement, + RuntimeEnabled=AudioVideoTracks +] partial interface VideoTrack { + readonly attribute SourceBuffer? sourceBuffer; +};
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaDeviceInfo.cpp b/third_party/WebKit/Source/modules/mediastream/MediaDeviceInfo.cpp index 11e9110..547f804f 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaDeviceInfo.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaDeviceInfo.cpp
@@ -34,7 +34,7 @@ MediaDeviceInfo* MediaDeviceInfo::create(const WebMediaDeviceInfo& webMediaDeviceInfo) { - ASSERT(!webMediaDeviceInfo.isNull()); + DCHECK(!webMediaDeviceInfo.isNull()); return new MediaDeviceInfo(webMediaDeviceInfo); } @@ -59,7 +59,7 @@ return "videoinput"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp b/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp index 556ec89..cdde579 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp
@@ -102,7 +102,7 @@ MediaErrorState errorState; UserMediaRequest* request = UserMediaRequest::create(document, userMedia, options, successCallback, errorCallback, errorState); if (!request) { - ASSERT(errorState.hadException()); + DCHECK(errorState.hadException()); if (errorState.canGenerateException()) { errorState.raiseException(exceptionState); return exceptionState.reject(scriptState);
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp b/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp index 20b61f0d..fc728c24 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp
@@ -63,7 +63,7 @@ ScriptPromise MediaDevicesRequest::start() { - ASSERT(m_controller); + DCHECK(m_controller); m_resolver->keepAliveWhilePending(); m_controller->requestMediaDevices(this); return m_resolver->promise();
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaErrorState.cpp b/third_party/WebKit/Source/modules/mediastream/MediaErrorState.cpp index 1480b0e..8763bad 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaErrorState.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaErrorState.cpp
@@ -80,7 +80,7 @@ { switch (m_errorType) { case NoError: - ASSERT_NOT_REACHED(); + NOTREACHED(); break; case TypeError: target.throwTypeError(m_message); @@ -97,7 +97,7 @@ target.throwDOMException(NotSupportedError, "Unsatisfiable constraint " + m_constraint); break; default: - ASSERT_NOT_REACHED(); + NOTREACHED(); } } @@ -105,7 +105,7 @@ { switch (m_errorType) { case NoError: - ASSERT_NOT_REACHED(); + NOTREACHED(); break; case TypeError: case DOMException: @@ -118,7 +118,7 @@ // TODO(hta): Remove this code. https://crbug.com/576581 return "Unsatisfiable constraint " + m_constraint; default: - ASSERT_NOT_REACHED(); + NOTREACHED(); } return String(); @@ -126,7 +126,7 @@ NavigatorUserMediaError* MediaErrorState::createError() { - ASSERT(m_errorType == ConstraintError); + DCHECK(m_errorType == ConstraintError); return NavigatorUserMediaError::create(NavigatorUserMediaError::NameConstraintNotSatisfied, m_message, m_constraint); }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp index 1f8b443..06bf3e57 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp
@@ -63,7 +63,7 @@ MediaStream* MediaStream::create(ExecutionContext* context, MediaStream* stream) { - ASSERT(stream); + DCHECK(stream); MediaStreamTrackVector audioTracks; MediaStreamTrackVector videoTracks; @@ -319,7 +319,7 @@ void MediaStream::addRemoteTrack(MediaStreamComponent* component) { - ASSERT(component); + DCHECK(component); if (m_stopped) return; @@ -345,7 +345,7 @@ void MediaStream::removeRemoteTrack(MediaStreamComponent* component) { - ASSERT(component); + DCHECK(component); if (m_stopped) return;
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamRegistry.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamRegistry.cpp index a1f6580..f90f9a9 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamRegistry.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamRegistry.cpp
@@ -33,33 +33,33 @@ MediaStreamRegistry& MediaStreamRegistry::registry() { // Since WebWorkers cannot obtain MediaStream objects, we should be on the main thread. - ASSERT(isMainThread()); + DCHECK(isMainThread()); DEFINE_STATIC_LOCAL(MediaStreamRegistry, instance, ()); return instance; } void MediaStreamRegistry::registerURL(SecurityOrigin*, const KURL& url, URLRegistrable* stream) { - ASSERT(&stream->registry() == this); - ASSERT(isMainThread()); + DCHECK(&stream->registry() == this); + DCHECK(isMainThread()); m_streamDescriptors.set(url.getString(), static_cast<MediaStream*>(stream)->descriptor()); } void MediaStreamRegistry::unregisterURL(const KURL& url) { - ASSERT(isMainThread()); + DCHECK(isMainThread()); m_streamDescriptors.remove(url.getString()); } bool MediaStreamRegistry::contains(const String& url) { - ASSERT(isMainThread()); + DCHECK(isMainThread()); return m_streamDescriptors.contains(url); } MediaStreamDescriptor* MediaStreamRegistry::lookupMediaStreamDescriptor(const String& url) { - ASSERT(isMainThread()); + DCHECK(isMainThread()); return m_streamDescriptors.get(url); }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp index 927181a..2c97b65 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp
@@ -75,7 +75,7 @@ return videoKind; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return audioKind; } @@ -134,7 +134,7 @@ return "ended"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -199,6 +199,7 @@ void MediaStreamTrack::propagateTrackEnded() { + // TODO(mcasas): Substitute with CHECK, see https://crbug.com/599867. RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams); m_isIteratingRegisteredMediaStreams = true; for (HeapHashSet<Member<MediaStream>>::iterator iter = m_registeredMediaStreams.begin(); iter != m_registeredMediaStreams.end(); ++iter) @@ -235,6 +236,7 @@ void MediaStreamTrack::registerMediaStream(MediaStream* mediaStream) { + // TODO(mcasas): Substitute with CHECK, see https://crbug.com/599867. RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams); RELEASE_ASSERT(!m_registeredMediaStreams.contains(mediaStream)); m_registeredMediaStreams.add(mediaStream); @@ -242,6 +244,7 @@ void MediaStreamTrack::unregisterMediaStream(MediaStream* mediaStream) { + // TODO(mcasas): Substitute with CHECK, see https://crbug.com/599867. RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams); HeapHashSet<Member<MediaStream>>::iterator iter = m_registeredMediaStreams.find(mediaStream); RELEASE_ASSERT(iter != m_registeredMediaStreams.end());
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp index da496985..5ac92a7 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
@@ -58,7 +58,7 @@ void MediaStreamTrackSourcesRequestImpl::requestSucceeded(const WebVector<WebSourceInfo>& webSourceInfos) { - ASSERT(m_callback); + DCHECK(m_callback); for (size_t i = 0; i < webSourceInfos.size(); ++i) m_sourceInfos.append(SourceInfo::create(webSourceInfos[i]));
diff --git a/third_party/WebKit/Source/modules/mediastream/NavigatorMediaStream.cpp b/third_party/WebKit/Source/modules/mediastream/NavigatorMediaStream.cpp index b2291b3b..20b5464 100644 --- a/third_party/WebKit/Source/modules/mediastream/NavigatorMediaStream.cpp +++ b/third_party/WebKit/Source/modules/mediastream/NavigatorMediaStream.cpp
@@ -54,7 +54,7 @@ MediaErrorState errorState; UserMediaRequest* request = UserMediaRequest::create(navigator.frame()->document(), userMedia, options, successCallback, errorCallback, errorState); if (!request) { - ASSERT(errorState.hadException()); + DCHECK(errorState.hadException()); if (errorState.canGenerateException()) { errorState.raiseException(exceptionState); } else {
diff --git a/third_party/WebKit/Source/modules/mediastream/NavigatorUserMediaError.h b/third_party/WebKit/Source/modules/mediastream/NavigatorUserMediaError.h index e6a856e..ec23a7b 100644 --- a/third_party/WebKit/Source/modules/mediastream/NavigatorUserMediaError.h +++ b/third_party/WebKit/Source/modules/mediastream/NavigatorUserMediaError.h
@@ -54,7 +54,7 @@ NavigatorUserMediaError(const String& name, const String& message, const String& constraintName) : m_name(name), m_message(message), m_constraintName(constraintName) { - ASSERT(!name.isEmpty()); + DCHECK(!name.isEmpty()); } String m_name;
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDTMFToneChangeEvent.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDTMFToneChangeEvent.cpp index d2fd38cc..ccc70846 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDTMFToneChangeEvent.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDTMFToneChangeEvent.cpp
@@ -39,7 +39,7 @@ RTCDTMFToneChangeEvent* RTCDTMFToneChangeEvent::create(const AtomicString& type, const RTCDTMFToneChangeEventInit& initializer) { - ASSERT(type == EventTypeNames::tonechange); + DCHECK(type == EventTypeNames::tonechange); return new RTCDTMFToneChangeEvent(initializer); }
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp index 905b242..e0101c9 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp
@@ -53,7 +53,7 @@ RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, PassOwnPtr<WebRTCDataChannelHandler> handler) { - ASSERT(handler); + DCHECK(handler); return new RTCDataChannel(context, handler); } @@ -142,7 +142,7 @@ return "closed"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -169,7 +169,7 @@ case BinaryTypeArrayBuffer: return "arraybuffer"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -276,7 +276,7 @@ scheduleDispatchEvent(MessageEvent::create(buffer.release())); return; } - ASSERT_NOT_REACHED(); + NOTREACHED(); } void RTCDataChannel::didDetectError()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp index ace817ff..88d6d3b 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
@@ -108,7 +108,7 @@ void asyncCallErrorCallback(RTCPeerConnectionErrorCallback* errorCallback, DOMException* exception) { - ASSERT(errorCallback); + DCHECK(errorCallback); Microtask::enqueueMicrotask(bind(&RTCPeerConnectionErrorCallback::handleEvent, errorCallback, exception)); } @@ -131,7 +131,7 @@ return !iceCandidateInit.hasSdpMid() && !iceCandidateInit.hasSdpMLineIndex(); } - ASSERT(candidate.isRTCIceCandidate()); + DCHECK(candidate.isRTCIceCandidate()); return false; } @@ -156,7 +156,7 @@ return WebRTCICECandidate(iceCandidateInit.candidate(), iceCandidateInit.sdpMid(), iceCandidateInit.sdpMLineIndex()); } - ASSERT(candidate.isRTCIceCandidate()); + DCHECK(candidate.isRTCIceCandidate()); return candidate.getAsRTCIceCandidate()->webCandidate(); } @@ -445,7 +445,7 @@ { // This checks that close() or stop() is called before the destructor. // We are assuming that a wrapper is always created when RTCPeerConnection is created. - ASSERT(m_closed || m_stopped); + DCHECK(m_closed || m_stopped); } ScriptPromise RTCPeerConnection::createOffer(ScriptState* scriptState, const RTCOfferOptions& options) @@ -462,8 +462,8 @@ ScriptPromise RTCPeerConnection::createOffer(ScriptState* scriptState, RTCSessionDescriptionCallback* successCallback, RTCPeerConnectionErrorCallback* errorCallback, const Dictionary& rtcOfferOptions) { - ASSERT(successCallback); - ASSERT(errorCallback); + DCHECK(successCallback); + DCHECK(errorCallback); ExecutionContext* context = scriptState->getExecutionContext(); UseCounter::count(context, UseCounter::RTCPeerConnectionCreateOfferLegacyFailureCallback); if (callErrorCallbackIfSignalingStateClosed(m_signalingState, errorCallback)) @@ -515,8 +515,8 @@ ScriptPromise RTCPeerConnection::createAnswer(ScriptState* scriptState, RTCSessionDescriptionCallback* successCallback, RTCPeerConnectionErrorCallback* errorCallback, const Dictionary& mediaConstraints) { - ASSERT(successCallback); - ASSERT(errorCallback); + DCHECK(successCallback); + DCHECK(errorCallback); ExecutionContext* context = scriptState->getExecutionContext(); UseCounter::count(context, UseCounter::RTCPeerConnectionCreateAnswerLegacyFailureCallback); if (mediaConstraints.isObject()) @@ -569,7 +569,7 @@ if (callErrorCallbackIfSignalingStateClosed(m_signalingState, errorCallback)) return ScriptPromise::castUndefined(scriptState); - ASSERT(sessionDescription); + DCHECK(sessionDescription); RTCVoidRequest* request = RTCVoidRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); m_peerHandler->setLocalDescription(request, sessionDescription->webSessionDescription()); @@ -612,7 +612,7 @@ if (callErrorCallbackIfSignalingStateClosed(m_signalingState, errorCallback)) return ScriptPromise::castUndefined(scriptState); - ASSERT(sessionDescription); + DCHECK(sessionDescription); RTCVoidRequest* request = RTCVoidRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); m_peerHandler->setRemoteDescription(request, sessionDescription->webSessionDescription()); @@ -692,7 +692,7 @@ return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "The 1st argument provided is an AlgorithmIdentifier, but the algorithm is not supported.")); break; } - ASSERT(!keyParams.isNull()); + DCHECK(!keyParams.isNull()); OwnPtr<WebRTCCertificateGenerator> certificateGenerator = adoptPtr( Platform::current()->createRTCCertificateGenerator()); @@ -739,9 +739,9 @@ ScriptPromise RTCPeerConnection::addIceCandidate(ScriptState* scriptState, RTCIceCandidate* iceCandidate, VoidCallback* successCallback, RTCPeerConnectionErrorCallback* errorCallback) { - ASSERT(iceCandidate); - ASSERT(successCallback); - ASSERT(errorCallback); + DCHECK(iceCandidate); + DCHECK(successCallback); + DCHECK(errorCallback); if (callErrorCallbackIfSignalingStateClosed(m_signalingState, errorCallback)) return ScriptPromise::castUndefined(scriptState); @@ -771,7 +771,7 @@ return "closed"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -786,7 +786,7 @@ return "complete"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -809,7 +809,7 @@ return "closed"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -938,7 +938,7 @@ if (throwExceptionIfSignalingStateClosed(m_signalingState, exceptionState)) return nullptr; - ASSERT(track); + DCHECK(track); if (!hasLocalStreamWithTrackId(track->id())) { exceptionState.throwDOMException(SyntaxError, "No local stream is available for the track provided."); @@ -961,14 +961,14 @@ void RTCPeerConnection::negotiationNeeded() { - ASSERT(!m_closed); + DCHECK(!m_closed); scheduleDispatchEvent(Event::create(EventTypeNames::negotiationneeded)); } void RTCPeerConnection::didGenerateICECandidate(const WebRTCICECandidate& webCandidate) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); if (webCandidate.isNull()) scheduleDispatchEvent(RTCIceCandidateEvent::create(false, false, nullptr)); else { @@ -979,29 +979,29 @@ void RTCPeerConnection::didChangeSignalingState(SignalingState newState) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); changeSignalingState(newState); } void RTCPeerConnection::didChangeICEGatheringState(ICEGatheringState newState) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); changeIceGatheringState(newState); } void RTCPeerConnection::didChangeICEConnectionState(ICEConnectionState newState) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); changeIceConnectionState(newState); } void RTCPeerConnection::didAddRemoteStream(const WebMediaStream& remoteStream) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); if (m_signalingState == SignalingStateClosed) return; @@ -1014,11 +1014,11 @@ void RTCPeerConnection::didRemoveRemoteStream(const WebMediaStream& remoteStream) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); MediaStreamDescriptor* streamDescriptor = remoteStream; - ASSERT(streamDescriptor->client()); + DCHECK(streamDescriptor->client()); MediaStream* stream = static_cast<MediaStream*>(streamDescriptor->client()); stream->streamEnded(); @@ -1027,7 +1027,7 @@ return; size_t pos = m_remoteStreams.find(stream); - ASSERT(pos != kNotFound); + DCHECK(pos != kNotFound); m_remoteStreams.remove(pos); scheduleDispatchEvent(MediaStreamEvent::create(EventTypeNames::removestream, false, false, stream)); @@ -1035,8 +1035,8 @@ void RTCPeerConnection::didAddRemoteDataChannel(WebRTCDataChannelHandler* handler) { - ASSERT(!m_closed); - ASSERT(getExecutionContext()->isContextThread()); + DCHECK(!m_closed); + DCHECK(getExecutionContext()->isContextThread()); if (m_signalingState == SignalingStateClosed) return; @@ -1052,7 +1052,7 @@ void RTCPeerConnection::closePeerConnection() { - ASSERT(m_signalingState != RTCPeerConnection::SignalingStateClosed); + DCHECK(m_signalingState != RTCPeerConnection::SignalingStateClosed); closeInternal(); } @@ -1122,7 +1122,7 @@ void RTCPeerConnection::closeInternal() { - ASSERT(m_signalingState != RTCPeerConnection::SignalingStateClosed); + DCHECK(m_signalingState != RTCPeerConnection::SignalingStateClosed); m_peerHandler->stop(); m_closed = true;
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestImpl.cpp index 29463de..4909b4f 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestImpl.cpp
@@ -54,7 +54,7 @@ , m_errorCallback(errorCallback) , m_requester(requester) { - ASSERT(m_requester); + DCHECK(m_requester); } RTCSessionDescriptionRequestImpl::~RTCSessionDescriptionRequestImpl()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestPromiseImpl.cpp b/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestPromiseImpl.cpp index 99147b01..e4fe55a 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestPromiseImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCSessionDescriptionRequestPromiseImpl.cpp
@@ -22,13 +22,13 @@ : m_requester(requester) , m_resolver(resolver) { - ASSERT(m_requester); - ASSERT(m_resolver); + DCHECK(m_requester); + DCHECK(m_resolver); } RTCSessionDescriptionRequestPromiseImpl::~RTCSessionDescriptionRequestPromiseImpl() { - ASSERT(!m_requester); + DCHECK(!m_requester); } void RTCSessionDescriptionRequestPromiseImpl::requestSucceeded(const WebRTCSessionDescription& webSessionDescription)
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCStatsRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/RTCStatsRequestImpl.cpp index 0c2e38b..5773de1f 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCStatsRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCStatsRequestImpl.cpp
@@ -43,7 +43,7 @@ , m_component(selector ? selector->component() : 0) , m_requester(requester) { - ASSERT(m_requester); + DCHECK(m_requester); } RTCStatsRequestImpl::~RTCStatsRequestImpl()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCStatsResponse.cpp b/third_party/WebKit/Source/modules/mediastream/RTCStatsResponse.cpp index b859246..5130a4f8 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCStatsResponse.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCStatsResponse.cpp
@@ -51,7 +51,7 @@ void RTCStatsResponse::addStatistic(size_t report, const String& name, const String& value) { - ASSERT_WITH_SECURITY_IMPLICATION(report >= 0 && report < m_result.size()); + SECURITY_DCHECK(report >= 0 && report < m_result.size()); m_result[report]->addStatistic(name, value); }
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestImpl.cpp index 7222aa2..d20e8c2b 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestImpl.cpp
@@ -51,7 +51,7 @@ , m_errorCallback(errorCallback) , m_requester(requester) { - ASSERT(m_requester); + DCHECK(m_requester); } RTCVoidRequestImpl::~RTCVoidRequestImpl()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestPromiseImpl.cpp b/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestPromiseImpl.cpp index 9609ee8e..c70f0aae 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestPromiseImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCVoidRequestPromiseImpl.cpp
@@ -20,13 +20,13 @@ : m_requester(requester) , m_resolver(resolver) { - ASSERT(m_requester); - ASSERT(m_resolver); + DCHECK(m_requester); + DCHECK(m_resolver); } RTCVoidRequestPromiseImpl::~RTCVoidRequestPromiseImpl() { - ASSERT(!m_requester); + DCHECK(!m_requester); } void RTCVoidRequestPromiseImpl::requestSucceeded()
diff --git a/third_party/WebKit/Source/modules/mediastream/SourceInfo.cpp b/third_party/WebKit/Source/modules/mediastream/SourceInfo.cpp index b020fb2..8af41ed3 100644 --- a/third_party/WebKit/Source/modules/mediastream/SourceInfo.cpp +++ b/third_party/WebKit/Source/modules/mediastream/SourceInfo.cpp
@@ -31,7 +31,7 @@ SourceInfo* SourceInfo::create(const WebSourceInfo& webSourceInfo) { - ASSERT(!webSourceInfo.isNull()); + DCHECK(!webSourceInfo.isNull()); return new SourceInfo(webSourceInfo); } @@ -56,7 +56,7 @@ return "none"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); } @@ -76,7 +76,7 @@ return "environment"; } - ASSERT_NOT_REACHED(); + NOTREACHED(); return String(); }
diff --git a/third_party/WebKit/Source/modules/mediastream/URLMediaStream.cpp b/third_party/WebKit/Source/modules/mediastream/URLMediaStream.cpp index 997cc55..8f10116 100644 --- a/third_party/WebKit/Source/modules/mediastream/URLMediaStream.cpp +++ b/third_party/WebKit/Source/modules/mediastream/URLMediaStream.cpp
@@ -38,7 +38,7 @@ String URLMediaStream::createObjectURL(ExecutionContext* executionContext, MediaStream* stream) { // Since WebWorkers cannot obtain Stream objects, we should be on the main thread. - ASSERT(isMainThread()); + DCHECK(isMainThread()); if (!executionContext || !stream) return String();
diff --git a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp index f2947fa..58bfe79 100644 --- a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
@@ -58,7 +58,7 @@ } else if (options.isMediaTrackConstraintSet()) { constraints = MediaConstraintsImpl::create(context, options.getAsMediaTrackConstraintSet(), errorState); } else { - ASSERT(options.isBoolean()); + DCHECK(options.isBoolean()); if (options.getAsBoolean()) { constraints = MediaConstraintsImpl::create(); } @@ -187,7 +187,7 @@ void UserMediaRequest::failConstraint(const String& constraintName, const String& message) { - ASSERT(!constraintName.isEmpty()); + DCHECK(!constraintName.isEmpty()); if (!getExecutionContext()) return; m_errorCallback->handleEvent(NavigatorUserMediaError::create(NavigatorUserMediaError::NameConstraintNotSatisfied, message, constraintName)); @@ -195,7 +195,7 @@ void UserMediaRequest::failUASpecific(const String& name, const String& message, const String& constraintName) { - ASSERT(!name.isEmpty()); + DCHECK(!name.isEmpty()); if (!getExecutionContext()) return; m_errorCallback->handleEvent(NavigatorUserMediaError::create(name, message, constraintName));
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi index 257865b..23c88c78 100644 --- a/third_party/WebKit/Source/modules/modules.gypi +++ b/third_party/WebKit/Source/modules/modules.gypi
@@ -187,6 +187,7 @@ 'serviceworkers/ExtendableEvent.idl', 'serviceworkers/ExtendableMessageEvent.idl', 'serviceworkers/FetchEvent.idl', + 'serviceworkers/ForeignFetchEvent.idl', 'serviceworkers/InstallEvent.idl', 'serviceworkers/ServiceWorker.idl', 'serviceworkers/ServiceWorkerContainer.idl', @@ -368,6 +369,8 @@ 'mediacapturefromelement/HTMLCanvasElementCapture.idl', 'mediacapturefromelement/HTMLMediaElementCapture.idl', 'mediasession/HTMLMediaElementMediaSession.idl', + 'mediasource/AudioTrackSourceBuffer.idl', + 'mediasource/VideoTrackSourceBuffer.idl', 'mediasource/HTMLVideoElementMediaSource.idl', 'mediasource/URLMediaSource.idl', 'mediastream/NavigatorMediaStream.idl', @@ -430,6 +433,7 @@ 'serviceworkers/ExtendableEvent.idl', 'serviceworkers/ExtendableMessageEvent.idl', 'serviceworkers/FetchEvent.idl', + 'serviceworkers/ForeignFetchEvent.idl', 'serviceworkers/InstallEvent.idl', 'serviceworkers/ServiceWorkerMessageEvent.idl', 'speech/SpeechRecognitionError.idl', @@ -514,7 +518,9 @@ 'serviceworkers/ExtendableEventInit.idl', 'serviceworkers/ExtendableMessageEventInit.idl', 'serviceworkers/FetchEventInit.idl', + 'serviceworkers/ForeignFetchEventInit.idl', 'serviceworkers/ForeignFetchOptions.idl', + 'serviceworkers/ForeignFetchResponse.idl', 'serviceworkers/RegistrationOptions.idl', 'serviceworkers/ServiceWorkerMessageEventInit.idl', 'speech/SpeechRecognitionErrorInit.idl', @@ -684,8 +690,12 @@ '<(blink_modules_output_dir)/serviceworkers/ExtendableMessageEventInit.h', '<(blink_modules_output_dir)/serviceworkers/FetchEventInit.cpp', '<(blink_modules_output_dir)/serviceworkers/FetchEventInit.h', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchEventInit.cpp', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchEventInit.h', '<(blink_modules_output_dir)/serviceworkers/ForeignFetchOptions.cpp', '<(blink_modules_output_dir)/serviceworkers/ForeignFetchOptions.h', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchResponse.cpp', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchResponse.h', '<(blink_modules_output_dir)/serviceworkers/RegistrationOptions.cpp', '<(blink_modules_output_dir)/serviceworkers/RegistrationOptions.h', '<(blink_modules_output_dir)/serviceworkers/ServiceWorkerMessageEventInit.cpp', @@ -1206,6 +1216,8 @@ 'mediasource/SourceBuffer.h', 'mediasource/SourceBufferList.cpp', 'mediasource/SourceBufferList.h', + 'mediasource/SourceBufferTrackBaseSupplement.cpp', + 'mediasource/SourceBufferTrackBaseSupplement.h', 'mediasource/TrackDefault.cpp', 'mediasource/TrackDefault.h', 'mediasource/TrackDefaultList.cpp', @@ -1446,6 +1458,10 @@ 'serviceworkers/ExtendableMessageEvent.h', 'serviceworkers/FetchEvent.cpp', 'serviceworkers/FetchEvent.h', + 'serviceworkers/ForeignFetchEvent.cpp', + 'serviceworkers/ForeignFetchEvent.h', + 'serviceworkers/ForeignFetchRespondWithObserver.cpp', + 'serviceworkers/ForeignFetchRespondWithObserver.h', 'serviceworkers/InstallEvent.cpp', 'serviceworkers/InstallEvent.h', 'serviceworkers/NavigatorServiceWorker.cpp',
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp index 17981fea..bd57629 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp
@@ -97,7 +97,7 @@ Settings* contextSettings = settings(getExecutionContext()); bool isUserGestureRequired = !contextSettings || contextSettings->presentationRequiresUserGesture(); - if (isUserGestureRequired && !UserGestureIndicator::processingUserGesture()) { + if (isUserGestureRequired && !UserGestureIndicator::utilizeUserGesture()) { resolver->reject(DOMException::create(InvalidAccessError, "PresentationRequest::start() requires user gesture.")); return promise; }
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp index e65532efe73..bfa460c 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -101,7 +101,7 @@ // TODO(avayvod): should we have a separate flag to disable the user gesture // requirement (for tests) or reuse the one for the PresentationRequest::start()? - if (!UserGestureIndicator::processingUserGesture()) { + if (!UserGestureIndicator::utilizeUserGesture()) { resolver->reject(DOMException::create(InvalidAccessError, "RemotePlayback::connect() requires user gesture.")); return promise; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.cpp new file mode 100644 index 0000000..e2a1814 --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.cpp
@@ -0,0 +1,64 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "modules/serviceworkers/ForeignFetchEvent.h" + +#include "modules/fetch/Request.h" +#include "modules/serviceworkers/ServiceWorkerGlobalScope.h" +#include "wtf/RefPtr.h" + +namespace blink { + +ForeignFetchEvent* ForeignFetchEvent::create() +{ + return new ForeignFetchEvent(); +} + +ForeignFetchEvent* ForeignFetchEvent::create(const AtomicString& type, const ForeignFetchEventInit& initializer) +{ + return new ForeignFetchEvent(type, initializer, nullptr); +} + +ForeignFetchEvent* ForeignFetchEvent::create(const AtomicString& type, const ForeignFetchEventInit& initializer, ForeignFetchRespondWithObserver* observer) +{ + return new ForeignFetchEvent(type, initializer, observer); +} + +Request* ForeignFetchEvent::request() const +{ + return m_request; +} + +void ForeignFetchEvent::respondWith(ScriptState* scriptState, ScriptPromise scriptPromise, ExceptionState& exceptionState) +{ + stopImmediatePropagation(); + if (m_observer) + m_observer->respondWith(scriptState, scriptPromise, exceptionState); +} + +const AtomicString& ForeignFetchEvent::interfaceName() const +{ + return EventNames::ForeignFetchEvent; +} + +ForeignFetchEvent::ForeignFetchEvent() +{ +} + +ForeignFetchEvent::ForeignFetchEvent(const AtomicString& type, const ForeignFetchEventInit& initializer, ForeignFetchRespondWithObserver* observer) + : ExtendableEvent(type, initializer) + , m_observer(observer) +{ + if (initializer.hasRequest()) + m_request = initializer.request(); +} + +DEFINE_TRACE(ForeignFetchEvent) +{ + visitor->trace(m_observer); + visitor->trace(m_request); + ExtendableEvent::trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.h b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.h new file mode 100644 index 0000000..aac162e2 --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.h
@@ -0,0 +1,51 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ForeignFetchEvent_h +#define ForeignFetchEvent_h + +#include "bindings/core/v8/ScriptPromise.h" +#include "modules/EventModules.h" +#include "modules/ModulesExport.h" +#include "modules/fetch/Request.h" +#include "modules/serviceworkers/ExtendableEvent.h" +#include "modules/serviceworkers/ForeignFetchEventInit.h" +#include "modules/serviceworkers/ForeignFetchRespondWithObserver.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class ExceptionState; +class Request; + +// A foreignfetch event is dispatched by the client to a service worker's script +// context. ForeignFetchRespondWithObserver can be used to notify the client +// about the service worker's response. +class MODULES_EXPORT ForeignFetchEvent final : public ExtendableEvent { + DEFINE_WRAPPERTYPEINFO(); +public: + static ForeignFetchEvent* create(); + static ForeignFetchEvent* create(const AtomicString& type, const ForeignFetchEventInit&); + static ForeignFetchEvent* create(const AtomicString& type, const ForeignFetchEventInit&, ForeignFetchRespondWithObserver*); + + Request* request() const; + + void respondWith(ScriptState*, ScriptPromise, ExceptionState&); + + const AtomicString& interfaceName() const override; + + DECLARE_VIRTUAL_TRACE(); + +protected: + ForeignFetchEvent(); + ForeignFetchEvent(const AtomicString& type, const ForeignFetchEventInit&, ForeignFetchRespondWithObserver*); + +private: + Member<ForeignFetchRespondWithObserver> m_observer; + Member<Request> m_request; +}; + +} // namespace blink + +#endif // ForeignFetchEvent_h
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.idl b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.idl new file mode 100644 index 0000000..c3a256d77 --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEvent.idl
@@ -0,0 +1,14 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#foreign-fetch-event-section +[ + Constructor(DOMString type, ForeignFetchEventInit eventInitDict), + Exposed=ServiceWorker, + RuntimeEnabled=ForeignFetch, +] interface ForeignFetchEvent : ExtendableEvent { + [SameObject] readonly attribute Request request; + + [CallWith=ScriptState, RaisesException] void respondWith(Promise<ForeignFetchResponse> r); +};
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEventInit.idl b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEventInit.idl new file mode 100644 index 0000000..d8426fe --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchEventInit.idl
@@ -0,0 +1,9 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#dictdef-foreignfetchevent-foreignfetcheventinit + +dictionary ForeignFetchEventInit : ExtendableEventInit { + required Request request; +};
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.cpp new file mode 100644 index 0000000..a707f716 --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.cpp
@@ -0,0 +1,36 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "modules/serviceworkers/ForeignFetchRespondWithObserver.h" + +#include "modules/serviceworkers/ForeignFetchResponse.h" + +namespace blink { + +ForeignFetchRespondWithObserver* ForeignFetchRespondWithObserver::create(ExecutionContext* context, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode requestMode, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext) +{ + return new ForeignFetchRespondWithObserver(context, eventID, requestURL, requestMode, frameType, requestContext); +} + +void ForeignFetchRespondWithObserver::responseWasFulfilled(const ScriptValue& value) +{ + ASSERT(getExecutionContext()); + TrackExceptionState exceptionState; + ForeignFetchResponse foreignFetchResponse = ScriptValue::to<ForeignFetchResponse>(toIsolate(getExecutionContext()), value, exceptionState); + if (exceptionState.hadException()) { + responseWasRejected(WebServiceWorkerResponseErrorNoForeignFetchResponse); + return; + } + + // TODO(mek): Handle foreign fetch specific response parameters. + Response* response = foreignFetchResponse.response(); + RespondWithObserver::responseWasFulfilled(ScriptValue::from(value.getScriptState(), response)); +} + +ForeignFetchRespondWithObserver::ForeignFetchRespondWithObserver(ExecutionContext* context, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode requestMode, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext) + : RespondWithObserver(context, eventID, requestURL, requestMode, frameType, requestContext) +{ +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.h b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.h new file mode 100644 index 0000000..f7e61cb34 --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchRespondWithObserver.h
@@ -0,0 +1,26 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ForeignFetchRespondWithObserver_h +#define ForeignFetchRespondWithObserver_h + +#include "modules/serviceworkers/RespondWithObserver.h" + +namespace blink { + +// This class observes the service worker's handling of a ForeignFetchEvent and +// notifies the client. +class MODULES_EXPORT ForeignFetchRespondWithObserver final : public RespondWithObserver { +public: + static ForeignFetchRespondWithObserver* create(ExecutionContext*, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode, WebURLRequest::FrameType, WebURLRequest::RequestContext); + + void responseWasFulfilled(const ScriptValue&) override; + +private: + ForeignFetchRespondWithObserver(ExecutionContext*, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode, WebURLRequest::FrameType, WebURLRequest::RequestContext); +}; + +} // namespace blink + +#endif // ForeignFetchRespondWithObserver_h
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchResponse.idl b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchResponse.idl new file mode 100644 index 0000000..629bd1a --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchResponse.idl
@@ -0,0 +1,11 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#dictdef-foreignfetchevent-foreignfetchresponse + +dictionary ForeignFetchResponse { + required Response response; + USVString origin; + sequence<ByteString> headers; +};
diff --git a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp index 5c3f91d..0651903 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
@@ -59,6 +59,9 @@ case WebServiceWorkerResponseErrorBodyLocked: errorMessage = errorMessage + "a Response whose \"body\" is locked cannot be used to respond to a request."; break; + case WebServiceWorkerResponseErrorNoForeignFetchResponse: + errorMessage = errorMessage + "an object that was not a ForeignFetchResponse was passed to respondWith()."; + break; case WebServiceWorkerResponseErrorUnknown: default: errorMessage = errorMessage + "an unexpected error occurred."; @@ -134,6 +137,8 @@ ResolveType m_resolveType; }; +RespondWithObserver::~RespondWithObserver() {} + RespondWithObserver* RespondWithObserver::create(ExecutionContext* context, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode requestMode, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext) { return new RespondWithObserver(context, eventID, requestURL, requestMode, frameType, requestContext);
diff --git a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.h b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.h index 7fc8a51..b87cd8b 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.h +++ b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.h
@@ -22,9 +22,11 @@ // This class observes the service worker's handling of a FetchEvent and // notifies the client. -class MODULES_EXPORT RespondWithObserver final : public GarbageCollectedFinalized<RespondWithObserver>, public ContextLifecycleObserver { +class MODULES_EXPORT RespondWithObserver : public GarbageCollectedFinalized<RespondWithObserver>, public ContextLifecycleObserver { USING_GARBAGE_COLLECTED_MIXIN(RespondWithObserver); public: + virtual ~RespondWithObserver(); + static RespondWithObserver* create(ExecutionContext*, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode, WebURLRequest::FrameType, WebURLRequest::RequestContext); void contextDestroyed() override; @@ -36,15 +38,16 @@ void respondWith(ScriptState*, ScriptPromise, ExceptionState&); void responseWasRejected(WebServiceWorkerResponseError); - void responseWasFulfilled(const ScriptValue&); + virtual void responseWasFulfilled(const ScriptValue&); DECLARE_VIRTUAL_TRACE(); +protected: + RespondWithObserver(ExecutionContext*, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode, WebURLRequest::FrameType, WebURLRequest::RequestContext); + private: class ThenFunction; - RespondWithObserver(ExecutionContext*, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode, WebURLRequest::FrameType, WebURLRequest::RequestContext); - int m_eventID; KURL m_requestURL; WebURLRequest::FetchRequestMode m_requestMode;
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in index f50181b..56c1455 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -212,9 +212,7 @@ UserSelectAll status=experimental WebAnimationsAPI status=experimental WebAnimationsSVG status=experimental -// TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. -// WebBluetooth origin_trial_feature_name=WebBluetooth -WebBluetooth +WebBluetooth origin_trial_feature_name=WebBluetooth WebGLDraftExtensions status=experimental WebGLImageChromium WebUSB status=experimental
diff --git a/third_party/WebKit/Source/platform/UserGestureIndicator.cpp b/third_party/WebKit/Source/platform/UserGestureIndicator.cpp index 5b4c436..26619046 100644 --- a/third_party/WebKit/Source/platform/UserGestureIndicator.cpp +++ b/third_party/WebKit/Source/platform/UserGestureIndicator.cpp
@@ -128,8 +128,9 @@ UserGestureIndicator* UserGestureIndicator::s_topmostIndicator = 0; bool UserGestureIndicator::s_processedUserGestureSinceLoad = false; -UserGestureIndicator::UserGestureIndicator(ProcessingUserGestureState state) +UserGestureIndicator::UserGestureIndicator(ProcessingUserGestureState state, UserGestureUtilizedCallback* usageCallback) : m_previousState(DefinitelyNotProcessingUserGesture) + , m_usageCallback(usageCallback) { // Silently ignore UserGestureIndicators on non-main threads. if (!isMainThread()) @@ -158,8 +159,9 @@ ASSERT(isDefinite(s_state)); } -UserGestureIndicator::UserGestureIndicator(PassRefPtr<UserGestureToken> token) +UserGestureIndicator::UserGestureIndicator(PassRefPtr<UserGestureToken> token, UserGestureUtilizedCallback* usageCallback) : m_previousState(DefinitelyNotProcessingUserGesture) + , m_usageCallback(usageCallback) { // Silently ignore UserGestureIndicators on non-main threads. if (!isMainThread()) @@ -196,6 +198,18 @@ } // static +bool UserGestureIndicator::utilizeUserGesture() +{ + if (UserGestureIndicator::processingUserGesture()) { + if (s_topmostIndicator->m_usageCallback) { + s_topmostIndicator->m_usageCallback->userGestureUtilized(); + s_topmostIndicator->m_usageCallback = nullptr; + } + return true; + } + return false; +} + bool UserGestureIndicator::processingUserGesture() { if (auto* token = currentToken()) { @@ -211,9 +225,14 @@ { if (auto* token = currentToken()) { ASSERT(isMainThread()); - return static_cast<GestureToken*>(token)->consumeGesture(); + if (static_cast<GestureToken*>(token)->consumeGesture()) { + if (s_topmostIndicator->m_usageCallback) { + s_topmostIndicator->m_usageCallback->userGestureUtilized(); + s_topmostIndicator->m_usageCallback = nullptr; + } + return true; + } } - return false; }
diff --git a/third_party/WebKit/Source/platform/UserGestureIndicator.h b/third_party/WebKit/Source/platform/UserGestureIndicator.h index aa94520..3a35cb1 100644 --- a/third_party/WebKit/Source/platform/UserGestureIndicator.h +++ b/third_party/WebKit/Source/platform/UserGestureIndicator.h
@@ -51,18 +51,53 @@ virtual void setPauseInDebugger() = 0; }; +// Callback to be invoked when the state of a UserGestureIndicator is +// used (only during the scope of a UserGestureIndicator, does +// not flow with the UserGestureToken). It's the responsibility of the +// caller to ensure the UserGestureUtilizedCallback is kept alive as long +// as the UserGestureIndicator it's used in. +// Note that this doesn't currently track EVERY way in which the +// state of a UserGesture can be read (sometimes it's just propagated +// elsewhere, or otherwise read in a way that's hard to know if it will +// actually be used), but should include the primary use cases. Therefore +// this is suitable mainly for diagnostics and measurement purposes. +class PLATFORM_EXPORT UserGestureUtilizedCallback { +public: + virtual ~UserGestureUtilizedCallback() = default; + virtual void userGestureUtilized() = 0; +}; + class PLATFORM_EXPORT UserGestureIndicator final { USING_FAST_MALLOC(UserGestureIndicator); WTF_MAKE_NONCOPYABLE(UserGestureIndicator); public: + // Returns whether a user gesture is currently in progress. + // Does not invoke the UserGestureUtilizedCallback. Consider calling + // utilizeUserGesture instead if you know for sure that the return value + // will have an effect. static bool processingUserGesture(); + + // Indicates that a user gesture (if any) is being used, without preventing it + // from being used again. Returns whether a user gesture is currently in progress. + // If true, invokes (and then clears) any UserGestureUtilizedCallback. + static bool utilizeUserGesture(); + + // Mark the current user gesture (if any) as having been used, such that + // it cannot be used again. This is done only for very security-sensitive + // operations like creating a new process. + // Like utilizeUserGesture, may invoke/clear any UserGestureUtilizedCallback. static bool consumeUserGesture(); + static UserGestureToken* currentToken(); + + // Reset the notion of "since load". static void clearProcessedUserGestureSinceLoad(); + + // Returns whether a user gesture has occurred since page load. static bool processedUserGestureSinceLoad(); - explicit UserGestureIndicator(ProcessingUserGestureState); - explicit UserGestureIndicator(PassRefPtr<UserGestureToken>); + explicit UserGestureIndicator(ProcessingUserGestureState, UserGestureUtilizedCallback* = 0); + explicit UserGestureIndicator(PassRefPtr<UserGestureToken>, UserGestureUtilizedCallback* = 0); ~UserGestureIndicator(); private: @@ -71,6 +106,7 @@ static bool s_processedUserGestureSinceLoad; ProcessingUserGestureState m_previousState; RefPtr<UserGestureToken> m_token; + UserGestureUtilizedCallback* m_usageCallback; }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/UserGestureIndicatorTest.cpp b/third_party/WebKit/Source/platform/UserGestureIndicatorTest.cpp index d3dcde9d..c02e468 100644 --- a/third_party/WebKit/Source/platform/UserGestureIndicatorTest.cpp +++ b/third_party/WebKit/Source/platform/UserGestureIndicatorTest.cpp
@@ -11,7 +11,7 @@ // Checks for the initial state of UserGestureIndicator. TEST(UserGestureIndicatorTest, InitialState) { - EXPECT_FALSE(UserGestureIndicator::processingUserGesture()); + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); EXPECT_FALSE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_EQ(nullptr, UserGestureIndicator::currentToken()); EXPECT_FALSE(UserGestureIndicator::consumeUserGesture()); @@ -22,7 +22,7 @@ UserGestureIndicator::clearProcessedUserGestureSinceLoad(); UserGestureIndicator userGestureScope(DefinitelyProcessingNewUserGesture); - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_TRUE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); @@ -34,7 +34,7 @@ UserGestureIndicator::clearProcessedUserGestureSinceLoad(); UserGestureIndicator userGestureScope(DefinitelyProcessingUserGesture); - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_TRUE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); @@ -46,7 +46,7 @@ UserGestureIndicator::clearProcessedUserGestureSinceLoad(); UserGestureIndicator userGestureScope(DefinitelyNotProcessingUserGesture); - EXPECT_FALSE(UserGestureIndicator::processingUserGesture()); + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); EXPECT_FALSE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); @@ -59,12 +59,12 @@ { UserGestureIndicator userGestureScope(DefinitelyProcessingUserGesture); - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_TRUE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); } - EXPECT_FALSE(UserGestureIndicator::processingUserGesture()); + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); EXPECT_EQ(nullptr, UserGestureIndicator::currentToken()); EXPECT_FALSE(UserGestureIndicator::consumeUserGesture()); } @@ -75,7 +75,7 @@ // Root GestureIndicator and GestureToken. UserGestureIndicator userGestureScope(DefinitelyProcessingNewUserGesture); - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_TRUE(UserGestureIndicator::processedUserGestureSinceLoad()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); { @@ -83,20 +83,94 @@ // It should share GestureToken with the root indicator. UserGestureIndicator innerUserGesture(DefinitelyProcessingNewUserGesture); - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); // Consume inner gesture. EXPECT_TRUE(UserGestureIndicator::consumeUserGesture()); } - EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); // Consume root gesture. EXPECT_TRUE(UserGestureIndicator::consumeUserGesture()); - EXPECT_FALSE(UserGestureIndicator::processingUserGesture()); + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); EXPECT_NE(nullptr, UserGestureIndicator::currentToken()); } +class UsedCallback : public UserGestureUtilizedCallback { +public: + UsedCallback() : m_usedCount(0) + { + } + + void userGestureUtilized() override + { + m_usedCount++; + } + + unsigned getAndResetUsedCount() + { + unsigned curCount = m_usedCount; + m_usedCount = 0; + return curCount; + } + +private: + unsigned m_usedCount; +}; + +// Tests callback invocation. +TEST(UserGestureIndicatorTest, Callback) +{ + UsedCallback cb; + + { + UserGestureIndicator userGestureScope(DefinitelyProcessingUserGesture, &cb); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + + // Untracked doesn't invoke the callback + EXPECT_TRUE(UserGestureIndicator::processingUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + + // But processingUserGesture does + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); + EXPECT_EQ(1u, cb.getAndResetUsedCount()); + + // But only the first time + EXPECT_TRUE(UserGestureIndicator::utilizeUserGesture()); + EXPECT_TRUE(UserGestureIndicator::consumeUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + } + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + + { + UserGestureIndicator userGestureScope(DefinitelyProcessingUserGesture, &cb); + + // Consume also invokes the callback + EXPECT_TRUE(UserGestureIndicator::consumeUserGesture()); + EXPECT_EQ(1u, cb.getAndResetUsedCount()); + + // But only once + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); + EXPECT_FALSE(UserGestureIndicator::consumeUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + } + + { + UserGestureIndicator userGestureScope(DefinitelyNotProcessingUserGesture, &cb); + + // Callback not invoked when there isn't actually a user gesture + EXPECT_FALSE(UserGestureIndicator::processingUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + } + + // The callback isn't invoked outside the scope of the UGI + EXPECT_FALSE(UserGestureIndicator::utilizeUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); + EXPECT_FALSE(UserGestureIndicator::consumeUserGesture()); + EXPECT_EQ(0u, cb.getAndResetUsedCount()); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index fa9b042..d007d0e 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -650,6 +650,8 @@ 'graphics/StaticBitmapImage.h', 'graphics/StrokeData.cpp', 'graphics/StrokeData.h', + 'graphics/ThreadSafeDataTransport.cpp', + 'graphics/ThreadSafeDataTransport.h', 'graphics/UnacceleratedImageBufferSurface.cpp', 'graphics/UnacceleratedImageBufferSurface.h', 'graphics/compositing/PaintArtifactCompositor.cpp', @@ -795,8 +797,6 @@ 'image-decoders/ImageDecoder.h', 'image-decoders/ImageFrame.cpp', 'image-decoders/ImageFrame.h', - 'image-decoders/SegmentReader.cpp', - 'image-decoders/SegmentReader.h', 'image-decoders/bmp/BMPImageDecoder.cpp', 'image-decoders/bmp/BMPImageDecoder.h', 'image-decoders/bmp/BMPImageReader.cpp', @@ -1173,6 +1173,7 @@ 'graphics/ContiguousContainerTest.cpp', 'graphics/GraphicsContextTest.cpp', 'graphics/RecordingImageBufferSurfaceTest.cpp', + 'graphics/ThreadSafeDataTransportTest.cpp', 'graphics/compositing/PaintArtifactCompositorTest.cpp', 'graphics/filters/FilterOperationsTest.cpp', 'graphics/filters/ImageFilterBuilderTest.cpp',
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp index dbcf9c1..d857ae67 100644 --- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp +++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
@@ -30,16 +30,13 @@ #include "platform/TraceEvent.h" #include "platform/graphics/ImageFrameGenerator.h" #include "platform/image-decoders/ImageDecoder.h" -#include "platform/image-decoders/SegmentReader.h" #include "third_party/skia/include/core/SkData.h" namespace blink { -DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, PassRefPtr<SegmentReader> data, bool allDataReceived, size_t index) +DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, size_t index) : SkImageGenerator(info) , m_frameGenerator(frameGenerator) - , m_data(data) - , m_allDataReceived(allDataReceived) , m_frameIndex(index) , m_generationId(0) , m_canYUVDecode(false) @@ -54,7 +51,7 @@ { TRACE_EVENT0("blink", "DecodingImageGenerator::refEncodedData"); - return m_allDataReceived ? m_data->getAsSkData().leakRef() : nullptr; + return m_frameGenerator->refEncodedData(); } bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor table[], int* tableCount) @@ -72,7 +69,7 @@ } PlatformInstrumentation::willDecodeLazyPixelRef(m_generationId); - bool decoded = m_frameGenerator->decodeAndScale(m_data.get(), m_allDataReceived, m_frameIndex, getInfo(), pixels, rowBytes); + bool decoded = m_frameGenerator->decodeAndScale(m_frameIndex, getInfo(), pixels, rowBytes); PlatformInstrumentation::didDecodeLazyPixelRef(); return decoded; @@ -80,8 +77,7 @@ bool DecodingImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const { - // YUV decoding does not currently support progressive decoding. See comment in ImageFrameGenerator.h. - if (!m_canYUVDecode || !m_allDataReceived) + if (!m_canYUVDecode) return false; TRACE_EVENT1("blink", "DecodingImageGenerator::queryYUV8", "sizes", static_cast<int>(m_frameIndex)); @@ -89,18 +85,17 @@ if (colorSpace) *colorSpace = kJPEG_SkYUVColorSpace; - return m_frameGenerator->getYUVComponentSizes(m_data.get(), sizeInfo); + return m_frameGenerator->getYUVComponentSizes(sizeInfo); } bool DecodingImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) { - // YUV decoding does not currently support progressive decoding. See comment in ImageFrameGenerator.h. - ASSERT(m_canYUVDecode && m_allDataReceived); + ASSERT(m_canYUVDecode); TRACE_EVENT1("blink", "DecodingImageGenerator::getYUV8Planes", "frame index", static_cast<int>(m_frameIndex)); PlatformInstrumentation::willDecodeLazyPixelRef(m_generationId); - bool decoded = m_frameGenerator->decodeToYUV(m_data.get(), m_frameIndex, sizeInfo.fSizes, planes, sizeInfo.fWidthBytes); + bool decoded = m_frameGenerator->decodeToYUV(m_frameIndex, sizeInfo.fSizes, planes, sizeInfo.fWidthBytes); PlatformInstrumentation::didDecodeLazyPixelRef(); return decoded; @@ -108,26 +103,26 @@ SkImageGenerator* DecodingImageGenerator::create(SkData* data) { + RefPtr<SharedBuffer> buffer = SharedBuffer::create(data->bytes(), data->size()); + // We just need the size of the image, so we have to temporarily create an ImageDecoder. Since // we only need the size, it doesn't really matter about premul or not, or gamma settings. - OwnPtr<ImageDecoder> decoder = ImageDecoder::create(static_cast<const char*>(data->data()), data->size(), - ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); + OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*buffer.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); if (!decoder) return 0; - RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkData(data); - decoder->setData(segmentReader.get(), true); + decoder->setData(buffer.get(), true); if (!decoder->isSizeAvailable()) return 0; const IntSize size = decoder->size(); const SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height()); - RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), false); + RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), buffer, true, false); if (!frame) return 0; - return new DecodingImageGenerator(frame, info, segmentReader.release(), true, 0); + return new DecodingImageGenerator(frame, info, 0); } } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.h b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.h index bc338d0..65407af 100644 --- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.h +++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.h
@@ -27,12 +27,10 @@ #define DecodingImageGenerator_h #include "platform/PlatformExport.h" -#include "platform/image-decoders/SegmentReader.h" #include "third_party/skia/include/core/SkImageGenerator.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "wtf/Allocator.h" #include "wtf/Noncopyable.h" -#include "wtf/PassRefPtr.h" #include "wtf/RefPtr.h" class SkData; @@ -50,7 +48,7 @@ public: static SkImageGenerator* create(SkData*); - DecodingImageGenerator(PassRefPtr<ImageFrameGenerator>, const SkImageInfo&, PassRefPtr<SegmentReader>, bool allDataReceived, size_t index); + DecodingImageGenerator(PassRefPtr<ImageFrameGenerator>, const SkImageInfo&, size_t index); ~DecodingImageGenerator() override; void setGenerationId(size_t id) { m_generationId = id; } @@ -67,9 +65,7 @@ private: RefPtr<ImageFrameGenerator> m_frameGenerator; - const RefPtr<SegmentReader> m_data; // Data source. - const bool m_allDataReceived; - const size_t m_frameIndex; + size_t m_frameIndex; size_t m_generationId; bool m_canYUVDecode; };
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp index 6cebd8a..f1d76fd8 100644 --- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
@@ -26,12 +26,10 @@ #include "platform/graphics/DeferredImageDecoder.h" #include "platform/RuntimeEnabledFeatures.h" -#include "platform/SharedBuffer.h" #include "platform/graphics/DecodingImageGenerator.h" #include "platform/graphics/FrameData.h" #include "platform/graphics/ImageDecodingStore.h" #include "platform/graphics/ImageFrameGenerator.h" -#include "platform/image-decoders/SegmentReader.h" #include "third_party/skia/include/core/SkImage.h" #include "wtf/PassOwnPtr.h" @@ -56,6 +54,7 @@ DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecoder) : m_allDataReceived(false) + , m_lastDataSize(0) , m_actualDecoder(std::move(actualDecoder)) , m_repetitionCount(cAnimationNone) , m_hasColorProfile(false) @@ -115,20 +114,15 @@ void DeferredImageDecoder::setData(SharedBuffer& data, bool allDataReceived) { if (m_actualDecoder) { + m_data = RefPtr<SharedBuffer>(data); + m_lastDataSize = data.size(); m_allDataReceived = allDataReceived; m_actualDecoder->setData(&data, allDataReceived); prepareLazyDecodedFrames(); } - if (m_frameGenerator) { - if (!m_rwBuffer) - m_rwBuffer = adoptPtr(new SkRWBuffer(data.size())); - - const char* segment = 0; - for (size_t length = data.getSomeData(segment, m_rwBuffer->size()); - length; length = data.getSomeData(segment, m_rwBuffer->size())) - m_rwBuffer->append(segment, length); - } + if (m_frameGenerator) + m_frameGenerator->setData(&data, allDataReceived); } bool DeferredImageDecoder::isSizeAvailable() @@ -236,8 +230,7 @@ m_hasColorProfile = m_actualDecoder->hasColorProfile(); const bool isSingleFrame = m_actualDecoder->repetitionCount() == cAnimationNone || (m_allDataReceived && m_actualDecoder->frameCount() == 1u); - const SkISize decodedSize = SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()); - m_frameGenerator = ImageFrameGenerator::create(decodedSize, !isSingleFrame); + m_frameGenerator = ImageFrameGenerator::create(SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()), m_data, m_allDataReceived, !isSingleFrame); } void DeferredImageDecoder::prepareLazyDecodedFrames() @@ -274,7 +267,7 @@ if (m_allDataReceived) { m_repetitionCount = m_actualDecoder->repetitionCount(); m_actualDecoder.clear(); - // Hold on to m_rwBuffer, which is still needed by createFrameAtIndex. + m_data = nullptr; } } @@ -289,9 +282,7 @@ ASSERT(decodedSize.width() > 0); ASSERT(decodedSize.height() > 0); - RefPtr<SkROBuffer> roBuffer = adoptRef(m_rwBuffer->newRBufferSnapshot()); - RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkROBuffer(roBuffer.release()); - DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), segmentReader.release(), m_allDataReceived, index); + DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), index); RefPtr<SkImage> image = adoptRef(SkImage::NewFromGenerator(generator)); // SkImage takes ownership of the generator. if (!image) return nullptr;
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h index d6084c91..3338d4a 100644 --- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h +++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
@@ -31,7 +31,6 @@ #include "platform/image-decoders/ImageDecoder.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkPixelRef.h" -#include "third_party/skia/include/core/SkRWBuffer.h" #include "wtf/Allocator.h" #include "wtf/Forward.h" #include "wtf/OwnPtr.h" @@ -89,10 +88,9 @@ PassRefPtr<SkImage> createFrameImageAtIndex(size_t index, bool knownToBeOpaque) const; - // Copy of the data that is passed in, used by deferred decoding. - // Allows creating readonly snapshots that may be read in another thread. - OwnPtr<SkRWBuffer> m_rwBuffer; + RefPtr<SharedBuffer> m_data; bool m_allDataReceived; + unsigned m_lastDataSize; OwnPtr<ImageDecoder> m_actualDecoder; String m_filenameExtension;
diff --git a/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp index 1fa2cce..bfea0da 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageDecodingStoreTest.cpp
@@ -25,6 +25,7 @@ #include "platform/graphics/ImageDecodingStore.h" +#include "platform/SharedBuffer.h" #include "platform/graphics/ImageFrameGenerator.h" #include "platform/graphics/test/MockImageDecoder.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,7 +37,8 @@ void SetUp() override { ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024); - m_generator = ImageFrameGenerator::create(SkISize::Make(100, 100), true); + m_data = SharedBuffer::create(); + m_generator = ImageFrameGenerator::create(SkISize::Make(100, 100), m_data, true); m_decodersDestroyed = 0; } @@ -75,6 +77,7 @@ ImageDecodingStore::instance().setCacheLimitInBytes(0); } + RefPtr<SharedBuffer> m_data; RefPtr<ImageFrameGenerator> m_generator; int m_decodersDestroyed; };
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp index 1decd0f7..312dba24 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
@@ -26,6 +26,7 @@ #include "platform/graphics/ImageFrameGenerator.h" #include "SkData.h" +#include "platform/SharedBuffer.h" #include "platform/TraceEvent.h" #include "platform/graphics/ImageDecodingStore.h" #include "platform/image-decoders/ImageDecoder.h" @@ -51,7 +52,7 @@ // Creates a SkPixelRef such that the memory for pixels is given by an external body. // This is used to write directly to the memory given by Skia during decoding. -class ExternalMemoryAllocator final : public SkBitmap::Allocator { +class ImageFrameGenerator::ExternalMemoryAllocator final : public SkBitmap::Allocator { USING_FAST_MALLOC(ExternalMemoryAllocator); WTF_MAKE_NONCOPYABLE(ExternalMemoryAllocator); public: @@ -100,39 +101,105 @@ return true; } -ImageFrameGenerator::ImageFrameGenerator(const SkISize& fullSize, bool isMultiFrame) +ImageFrameGenerator::ImageFrameGenerator(const SkISize& fullSize, PassRefPtr<SharedBuffer> data, bool allDataReceived, bool isMultiFrame) : m_fullSize(fullSize) + , m_data(adoptRef(new ThreadSafeDataTransport())) , m_isMultiFrame(isMultiFrame) , m_decodeFailed(false) , m_yuvDecodingFailed(false) , m_frameCount(0) + , m_encodedData(nullptr) { + setData(data.get(), allDataReceived); } ImageFrameGenerator::~ImageFrameGenerator() { + if (m_encodedData) + m_encodedData->unref(); ImageDecodingStore::instance().removeCacheIndexedByGenerator(this); } -bool ImageFrameGenerator::decodeAndScale(SegmentReader* data, bool allDataReceived, size_t index, const SkImageInfo& info, void* pixels, size_t rowBytes) +void ImageFrameGenerator::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) { + m_data->setData(data.get(), allDataReceived); +} + +static void sharedSkDataReleaseCallback(const void* address, void* context) +{ + // This gets called when m_encodedData reference count becomes 0 - and it could happen in + // ImageFrameGenerator destructor or later when m_encodedData gets dereferenced. + // In this method, we deref ThreadSafeDataTransport, as ThreadSafeDataTransport is the owner + // of data returned via refEncodedData. + + ThreadSafeDataTransport* dataTransport = static_cast<ThreadSafeDataTransport*>(context); +#if ENABLE(ASSERT) + ASSERT(dataTransport); + SharedBuffer* buffer = 0; + bool allDataReceived = false; + dataTransport->data(&buffer, &allDataReceived); + ASSERT(allDataReceived && buffer && buffer->data() == address); +#endif + // Dereference m_data now. + dataTransport->deref(); +} + +SkData* ImageFrameGenerator::refEncodedData() +{ + // SkData is returned only when full image (encoded) data is received. This is important + // since DeferredImageDecoder::setData is called only once with allDataReceived set to true, + // and after that m_data->m_readBuffer.data() is not changed. See also RELEASE_ASSERT used in + // ThreadSafeDataTransport::data(). + SharedBuffer* buffer = 0; + bool allDataReceived = false; + m_data->data(&buffer, &allDataReceived); + if (!allDataReceived) + return nullptr; + + { + // Prevents concurrent access to m_encodedData creation. + MutexLocker lock(m_decodeMutex); + if (m_encodedData) { + m_encodedData->ref(); + return m_encodedData; + } + // m_encodedData is created with initial reference count == 1. ImageFrameGenerator always holds one + // reference to m_encodedData, as it prevents write access in SkData::writable_data. + m_encodedData = SkData::NewWithProc(buffer->data(), buffer->size(), sharedSkDataReleaseCallback, m_data.get()); + // While m_encodedData is referenced, prevent disposing m_data and its content. + // it is dereferenced in sharedSkDataReleaseCallback, called when m_encodedData gets dereferenced. + m_data->ref(); + } + // Increase the reference, caller must decrease it. One reference is always kept by ImageFrameGenerator and released + // in destructor. + m_encodedData->ref(); + return m_encodedData; +} + +bool ImageFrameGenerator::decodeAndScale(size_t index, const SkImageInfo& info, void* pixels, size_t rowBytes) +{ + // Prevent concurrent decode or scale operations on the same image data. + MutexLocker lock(m_decodeMutex); + if (m_decodeFailed) return false; TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index", static_cast<int>(index)); - RefPtr<ExternalMemoryAllocator> externalAllocator = adoptRef(new ExternalMemoryAllocator(info, pixels, rowBytes)); + m_externalAllocator = adoptPtr(new ExternalMemoryAllocator(info, pixels, rowBytes)); // This implementation does not support scaling so check the requested size. SkISize scaledSize = SkISize::Make(info.width(), info.height()); ASSERT(m_fullSize == scaledSize); - // TODO (scroggo): Convert tryToResumeDecode() and decode() to take a - // PassRefPtr<SkBitmap::Allocator> instead of a bare pointer. - SkBitmap bitmap = tryToResumeDecode(data, allDataReceived, index, scaledSize, externalAllocator.get()); + SkBitmap bitmap = tryToResumeDecode(index, scaledSize); if (bitmap.isNull()) return false; + // Don't keep the allocator because it contains a pointer to memory + // that we do not own. + m_externalAllocator.clear(); + // Check to see if the decoder has written directly to the pixel memory // provided. If not, make a copy. ASSERT(bitmap.width() == scaledSize.width()); @@ -143,10 +210,11 @@ return true; } -bool ImageFrameGenerator::decodeToYUV(SegmentReader* data, size_t index, const SkISize componentSizes[3], void* planes[3], const size_t rowBytes[3]) +bool ImageFrameGenerator::decodeToYUV(size_t index, const SkISize componentSizes[3], void* planes[3], const size_t rowBytes[3]) { - // TODO (scroggo): The only interesting thing this uses from the ImageFrameGenerator is m_decodeFailed. - // Move this into DecodingImageGenerator, which is the only class that calls it. + // Prevent concurrent decode or scale operations on the same image data. + MutexLocker lock(m_decodeMutex); + if (m_decodeFailed) return false; @@ -157,11 +225,18 @@ return false; } - OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); - // getYUVComponentSizes was already called and was successful, so ImageDecoder::create must succeed. - ASSERT(decoder); + SharedBuffer* data = 0; + bool allDataReceived = false; + m_data->data(&data, &allDataReceived); - decoder->setData(data, true); + // FIXME: YUV decoding does not currently support progressive decoding. + ASSERT(allDataReceived); + + OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); + if (!decoder) + return false; + + decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> imagePlanes = adoptPtr(new ImagePlanes(planes, rowBytes)); decoder->setImagePlanes(imagePlanes.release()); @@ -178,19 +253,16 @@ return false; } -SkBitmap ImageFrameGenerator::tryToResumeDecode(SegmentReader* data, bool allDataReceived, size_t index, const SkISize& scaledSize, SkBitmap::Allocator* allocator) +SkBitmap ImageFrameGenerator::tryToResumeDecode(size_t index, const SkISize& scaledSize) { TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecode", "frame index", static_cast<int>(index)); ImageDecoder* decoder = 0; - - // Lock the mutex, so only one thread can use the decoder at once. - MutexLocker lock(m_decodeMutex); const bool resumeDecoding = ImageDecodingStore::instance().lockDecoder(this, m_fullSize, &decoder); ASSERT(!resumeDecoding || decoder); SkBitmap fullSizeImage; - bool complete = decode(data, allDataReceived, index, &decoder, &fullSizeImage, allocator); + bool complete = decode(index, &decoder, &fullSizeImage); if (!decoder) return SkBitmap(); @@ -250,11 +322,14 @@ m_hasAlpha[index] = hasAlpha; } -bool ImageFrameGenerator::decode(SegmentReader* data, bool allDataReceived, size_t index, ImageDecoder** decoder, SkBitmap* bitmap, SkBitmap::Allocator* allocator) +bool ImageFrameGenerator::decode(size_t index, ImageDecoder** decoder, SkBitmap* bitmap) { - ASSERT(m_decodeMutex.locked()); TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width", m_fullSize.width(), "height", m_fullSize.height()); + SharedBuffer* data = 0; + bool allDataReceived = false; + m_data->data(&data, &allDataReceived); + // Try to create an ImageDecoder if we are not given one. ASSERT(decoder); bool newDecoder = false; @@ -273,8 +348,8 @@ if (!m_isMultiFrame && newDecoder && allDataReceived) { // If we're using an external memory allocator that means we're decoding // directly into the output memory and we can save one memcpy. - ASSERT(allocator); - (*decoder)->setMemoryAllocator(allocator); + ASSERT(m_externalAllocator.get()); + (*decoder)->setMemoryAllocator(m_externalAllocator.get()); } (*decoder)->setData(data, allDataReceived); @@ -287,7 +362,7 @@ if (allDataReceived) m_frameCount = (*decoder)->frameCount(); - (*decoder)->setData(PassRefPtr<SegmentReader>(nullptr), false); // Unref SegmentReader from ImageDecoder. + (*decoder)->setData(0, false); // Unref SharedBuffer from ImageDecoder. (*decoder)->clearCacheExceptFrame(index); (*decoder)->setMemoryAllocator(0); @@ -317,19 +392,27 @@ return true; } -bool ImageFrameGenerator::getYUVComponentSizes(SegmentReader* data, SkYUVSizeInfo* sizeInfo) +bool ImageFrameGenerator::getYUVComponentSizes(SkYUVSizeInfo* sizeInfo) { TRACE_EVENT2("blink", "ImageFrameGenerator::getYUVComponentSizes", "width", m_fullSize.width(), "height", m_fullSize.height()); if (m_yuvDecodingFailed) return false; + SharedBuffer* data = 0; + bool allDataReceived = false; + m_data->data(&data, &allDataReceived); + + // FIXME: YUV decoding does not currently support progressive decoding. + if (!allDataReceived) + return false; + OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); if (!decoder) return false; // Setting a dummy ImagePlanes object signals to the decoder that we want to do YUV decoding. - decoder->setData(data, true); + decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes); decoder->setImagePlanes(dummyImagePlanes.release());
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.h b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.h index 4b31634..73ac628 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.h +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.h
@@ -27,7 +27,7 @@ #define ImageFrameGenerator_h #include "platform/PlatformExport.h" -#include "platform/image-decoders/SegmentReader.h" +#include "platform/graphics/ThreadSafeDataTransport.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkSize.h" #include "third_party/skia/include/core/SkTypes.h" @@ -47,6 +47,7 @@ namespace blink { class ImageDecoder; +class SharedBuffer; class PLATFORM_EXPORT ImageDecoderFactory { USING_FAST_MALLOC(ImageDecoderFactory); @@ -60,23 +61,27 @@ class PLATFORM_EXPORT ImageFrameGenerator final : public ThreadSafeRefCounted<ImageFrameGenerator> { WTF_MAKE_NONCOPYABLE(ImageFrameGenerator); public: - static PassRefPtr<ImageFrameGenerator> create(const SkISize& fullSize, bool isMultiFrame = false) + static PassRefPtr<ImageFrameGenerator> create(const SkISize& fullSize, PassRefPtr<SharedBuffer> data, bool allDataReceived, bool isMultiFrame = false) { - return adoptRef(new ImageFrameGenerator(fullSize, isMultiFrame)); + return adoptRef(new ImageFrameGenerator(fullSize, data, allDataReceived, isMultiFrame)); } ~ImageFrameGenerator(); + void setData(PassRefPtr<SharedBuffer>, bool allDataReceived); + + // Return our encoded image data. Caller takes ownership and must unref the data + // according to the contract SkImageGenerator::refEncodedData. Returns null if + // the data is has not been fully received. + SkData* refEncodedData(); + // Decodes and scales the specified frame at |index|. The dimensions and output // format are given in SkImageInfo. Decoded pixels are written into |pixels| with // a stride of |rowBytes|. Returns true if decoding was successful. - bool decodeAndScale(SegmentReader*, bool allDataReceived, size_t index, const SkImageInfo&, void* pixels, size_t rowBytes); + bool decodeAndScale(size_t index, const SkImageInfo&, void* pixels, size_t rowBytes); // Decodes YUV components directly into the provided memory planes. - // Must not be called unless getYUVComponentSizes has been called and returned true. - // YUV decoding does not currently support progressive decoding. In order to support it, ImageDecoder needs something - // analagous to its ImageFrame cache to hold partial planes, and the GPU code needs to handle them. - bool decodeToYUV(SegmentReader*, size_t index, const SkISize componentSizes[3], void* planes[3], const size_t rowBytes[3]); + bool decodeToYUV(size_t index, const SkISize componentSizes[3], void* planes[3], const size_t rowBytes[3]); const SkISize& getFullSize() const { return m_fullSize; } @@ -85,12 +90,10 @@ bool hasAlpha(size_t index); - // Must not be called unless the SkROBuffer has all the data. - // YUV decoding does not currently support progressive decoding. See comment above on decodeToYUV. - bool getYUVComponentSizes(SegmentReader*, SkYUVSizeInfo*); + bool getYUVComponentSizes(SkYUVSizeInfo*); private: - ImageFrameGenerator(const SkISize& fullSize, bool isMultiFrame); + ImageFrameGenerator(const SkISize& fullSize, PassRefPtr<SharedBuffer>, bool allDataReceived, bool isMultiFrame); friend class ImageFrameGeneratorTest; friend class DeferredImageDecoderTest; @@ -99,18 +102,26 @@ void setHasAlpha(size_t index, bool hasAlpha); - SkBitmap tryToResumeDecode(SegmentReader*, bool allDataReceived, size_t index, const SkISize& scaledSize, SkBitmap::Allocator*); - // This method should only be called while m_decodeMutex is locked. - bool decode(SegmentReader*, bool allDataReceived, size_t index, ImageDecoder**, SkBitmap*, SkBitmap::Allocator*); + // These methods are called while m_decodeMutex is locked. + SkBitmap tryToResumeDecode(size_t index, const SkISize& scaledSize); + bool decode(size_t index, ImageDecoder**, SkBitmap*); - const SkISize m_fullSize; + SkISize m_fullSize; - const bool m_isMultiFrame; + // ThreadSafeDataTransport is referenced by this class and m_encodedData. + // In case that ImageFrameGenerator get's deleted before m_encodedData, + // m_encodedData would hold the reference to it (and underlying data). + RefPtr<ThreadSafeDataTransport> m_data; + + bool m_isMultiFrame; bool m_decodeFailed; bool m_yuvDecodingFailed; size_t m_frameCount; Vector<bool> m_hasAlpha; + class ExternalMemoryAllocator; + OwnPtr<ExternalMemoryAllocator> m_externalAllocator; + OwnPtr<ImageDecoderFactory> m_imageDecoderFactory; // Prevents multiple decode operations on the same data. @@ -118,6 +129,13 @@ // Protect concurrent access to m_hasAlpha. Mutex m_alphaMutex; + + // Our encoded image data returned in refEncodedData. + SkData* m_encodedData; + +#if COMPILER(MSVC) + friend struct ::WTF::OwnedPtrDeleter<ExternalMemoryAllocator>; +#endif }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp index 4b9d1b7..aef5863c 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
@@ -29,7 +29,6 @@ #include "platform/ThreadSafeFunctional.h" #include "platform/graphics/ImageDecodingStore.h" #include "platform/graphics/test/MockImageDecoder.h" -#include "platform/image-decoders/SegmentReader.h" #include "public/platform/Platform.h" #include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" @@ -55,9 +54,8 @@ void SetUp() override { ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024); - m_generator = ImageFrameGenerator::create(fullSize(), false); m_data = SharedBuffer::create(); - m_segmentReader = SegmentReader::createFromSharedBuffer(m_data); + m_generator = ImageFrameGenerator::create(fullSize(), m_data, false); useMockImageDecoderFactory(); m_decodersDestroyed = 0; m_decodeRequestCount = 0; @@ -103,9 +101,10 @@ m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize())); } - void addNewData() + void addNewData(bool allDataReceived = false) { m_data->append("g", 1u); + m_generator->setData(m_data, allDataReceived); } void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; } @@ -115,13 +114,12 @@ m_frameCount = count; if (count > 1) { m_generator.clear(); - m_generator = ImageFrameGenerator::create(fullSize(), true); + m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true); useMockImageDecoderFactory(); } } RefPtr<SharedBuffer> m_data; - RefPtr<SegmentReader> m_segmentReader; RefPtr<ImageFrameGenerator> m_generator; int m_decodersDestroyed; int m_decodeRequestCount; @@ -136,11 +134,11 @@ setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); addNewData(); - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); } @@ -150,26 +148,35 @@ setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); setFrameStatus(ImageFrame::FrameComplete); addNewData(); - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); } -static void decodeThreadMain(ImageFrameGenerator* generator, SegmentReader* segmentReader) +static void decodeThreadMain(ImageFrameGenerator* generator) { char buffer[100 * 100 * 4]; - generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 100 * 4); + generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); +} + +static void decodeThreadWithRefEncodedMain(ImageFrameGenerator* generator) +{ + // Image must be complete - refEncodedData otherwise returns null. + char buffer[100 * 100 * 4]; + SkData* data = generator->refEncodedData(); + generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); + data->unref(); } TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) @@ -177,27 +184,52 @@ setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); + SkData* data = m_generator->refEncodedData(); + EXPECT_EQ(nullptr, data); // LocalFrame can now be decoded completely. setFrameStatus(ImageFrame::FrameComplete); addNewData(); + // addNewData is calling m_generator->setData with allDataReceived == false, which means that + // refEncodedData should return null. + data = m_generator->refEncodedData(); + EXPECT_EQ(nullptr, data); OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread")); - thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()), AllowCrossThreadAccess(m_segmentReader.get()))); + thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()))); thread.clear(); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); - addNewData(); + addNewData(true); + data = m_generator->refEncodedData(); + ASSERT_TRUE(data); + // To prevent data writting, SkData::unique() should be false. + ASSERT_TRUE(!data->unique()); - // Delete generator. + // Thread will also ref and unref the data. + thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread")); + thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get()))); + thread.clear(); + EXPECT_EQ(4, m_decodeRequestCount); + + data->unref(); + // m_generator is holding the only reference to SkData now. + ASSERT_TRUE(data->unique()); + + data = m_generator->refEncodedData(); + ASSERT_TRUE(data && !data->unique()); + + // Delete generator, and SkData should have the only reference. m_generator = nullptr; + ASSERT_TRUE(data->unique()); + data->unref(); } TEST_F(ImageFrameGeneratorTest, frameHasAlpha) @@ -205,7 +237,7 @@ setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_TRUE(m_generator->hasAlpha(0)); EXPECT_EQ(1, m_decodeRequestCount); @@ -217,7 +249,7 @@ EXPECT_EQ(2, m_decodeRequestCount); setFrameStatus(ImageFrame::FrameComplete); - m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); EXPECT_FALSE(m_generator->hasAlpha(0)); } @@ -228,14 +260,14 @@ setFrameStatus(ImageFrame::FrameComplete); char buffer[100 * 100 * 4]; - m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); EXPECT_EQ(0U, m_requestedClearExceptFrame); setFrameStatus(ImageFrame::FrameComplete); - m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(1, imageInfo(), buffer, 100 * 4); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); EXPECT_EQ(1U, m_requestedClearExceptFrame); @@ -245,7 +277,7 @@ // Decoding the last frame of a multi-frame images should trigger clearing // all the frame data, but not destroying the decoder. See comments in // ImageFrameGenerator::tryToResumeDecode(). - m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(), buffer, 100 * 4); + m_generator->decodeAndScale(2, imageInfo(), buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); EXPECT_EQ(kNotFound, m_requestedClearExceptFrame);
diff --git a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp index 5a4d008..e5ff225 100644 --- a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp +++ b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp
@@ -38,9 +38,7 @@ #include "platform/graphics/skia/ImagePixelLocker.h" #include "platform/image-decoders/ImageDecoder.h" #include "platform/image-decoders/ImageFrame.h" -#include "platform/image-decoders/SegmentReader.h" #include "platform/image-encoders/skia/PNGImageEncoder.h" -#include "third_party/skia/include/core/SkData.h" #include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkStream.h" @@ -58,14 +56,11 @@ static bool decodeBitmap(const void* data, size_t length, SkBitmap* result) { - OwnPtr<ImageDecoder> imageDecoder = ImageDecoder::create(static_cast<const char*>(data), length, - ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored); + RefPtr<SharedBuffer> buffer = SharedBuffer::create(static_cast<const char*>(data), length); + OwnPtr<ImageDecoder> imageDecoder = ImageDecoder::create(*buffer, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored); if (!imageDecoder) return false; - - // No need to copy the data; this decodes immediately. - RefPtr<SegmentReader> segmentReader = SegmentReader::createFromSkData(adoptRef(SkData::NewWithoutCopy(data, length))); - imageDecoder->setData(segmentReader.release(), true); + imageDecoder->setData(buffer.get(), true); ImageFrame* frame = imageDecoder->frameBufferAtIndex(0); if (!frame) return true;
diff --git a/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.cpp b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.cpp new file mode 100644 index 0000000..f191017a --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.cpp
@@ -0,0 +1,85 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform/graphics/ThreadSafeDataTransport.h" + +#include "platform/SharedBuffer.h" + +namespace blink { + +ThreadSafeDataTransport::ThreadSafeDataTransport() + : m_readBuffer(SharedBuffer::create()) + , m_allDataReceived(false) + , m_readPosition(0) +{ +} + +ThreadSafeDataTransport::~ThreadSafeDataTransport() +{ +} + +void ThreadSafeDataTransport::setData(SharedBuffer* buffer, bool allDataReceived) +{ + ASSERT(buffer->size() >= m_readPosition); + Vector<RefPtr<SharedBuffer>> newBufferQueue; + + const char* segment = 0; + while (size_t length = buffer->getSomeData(segment, m_readPosition)) { + m_readPosition += length; + newBufferQueue.append(SharedBuffer::create(segment, length)); + } + + MutexLocker locker(m_mutex); + + // If all data was previously received, don't append more to it. + RELEASE_ASSERT(!(m_allDataReceived && newBufferQueue.size())); + + m_newBufferQueue.appendVector(newBufferQueue); + newBufferQueue.clear(); + m_allDataReceived = allDataReceived; +} + +void ThreadSafeDataTransport::data(SharedBuffer** buffer, bool* allDataReceived) +{ + ASSERT(buffer); + ASSERT(allDataReceived); + Vector<RefPtr<SharedBuffer>> newBufferQueue; + { + MutexLocker lock(m_mutex); + m_newBufferQueue.swap(newBufferQueue); + *allDataReceived = m_allDataReceived; + } + for (size_t i = 0; i < newBufferQueue.size(); ++i) + m_readBuffer->append(newBufferQueue[i].get()); + *buffer = m_readBuffer.get(); +} + +bool ThreadSafeDataTransport::hasNewData() +{ + MutexLocker lock(m_mutex); + return !m_newBufferQueue.isEmpty(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.h b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.h new file mode 100644 index 0000000..3aae947 --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransport.h
@@ -0,0 +1,78 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ThreadSafeDataTransport_h +#define ThreadSafeDataTransport_h + +#include "platform/PlatformExport.h" +#include "wtf/Allocator.h" +#include "wtf/Noncopyable.h" +#include "wtf/OwnPtr.h" +#include "wtf/PassOwnPtr.h" +#include "wtf/RefPtr.h" +#include "wtf/ThreadSafeRefCounted.h" +#include "wtf/ThreadingPrimitives.h" +#include "wtf/Vector.h" + +namespace blink { + +class SharedBuffer; + +// The purpose of this class is to allow the transfer of data stored in +// SharedBuffer in a thread-safe manner, and to minimize memory copies +// and thread contention. +// +// This class is designed such that there is only one producer and +// one consumer. + +class PLATFORM_EXPORT ThreadSafeDataTransport final : public ThreadSafeRefCounted<ThreadSafeDataTransport> { + WTF_MAKE_NONCOPYABLE(ThreadSafeDataTransport); +public: + ThreadSafeDataTransport(); + ~ThreadSafeDataTransport(); + + // This method is being called subsequently with an expanding + // SharedBuffer. + void setData(SharedBuffer*, bool allDataReceived); + + // Get the data submitted to this class so far. + void data(SharedBuffer**, bool* allDataReceived); + + // Return true of there is new data submitted to this class + // since last time data() was called. + bool hasNewData(); + +private: + Mutex m_mutex; + + Vector<RefPtr<SharedBuffer>> m_newBufferQueue; + RefPtr<SharedBuffer> m_readBuffer; + bool m_allDataReceived; + size_t m_readPosition; +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransportTest.cpp b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransportTest.cpp new file mode 100644 index 0000000..69462ec --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/ThreadSafeDataTransportTest.cpp
@@ -0,0 +1,75 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform/graphics/ThreadSafeDataTransport.h" + +#include "platform/SharedBuffer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +TEST(ThreadSafeDataTransportTest, hasNewData) +{ + ThreadSafeDataTransport transport; + + const char testString[] = "123456789"; + RefPtr<SharedBuffer> buffer = SharedBuffer::create(testString, sizeof(testString)); + + transport.setData(buffer.get(), false); + EXPECT_TRUE(transport.hasNewData()); + + SharedBuffer* tempBuffer = 0; + bool allDataReceived = false; + transport.data(&tempBuffer, &allDataReceived); + EXPECT_FALSE(transport.hasNewData()); + + transport.setData(buffer.get(), false); + EXPECT_FALSE(transport.hasNewData()); +} + +TEST(ThreadSafeDataTransportTest, setData) +{ + ThreadSafeDataTransport transport; + + const char testString1[] = "123"; + RefPtr<SharedBuffer> buffer1 = SharedBuffer::create(testString1, sizeof(testString1) - 1); + const char testString2[] = "12345"; + RefPtr<SharedBuffer> buffer2 = SharedBuffer::create(testString2, sizeof(testString2) - 1); + const char testString3[] = "1234567890"; + RefPtr<SharedBuffer> buffer3 = SharedBuffer::create(testString3, sizeof(testString3) - 1); + + transport.setData(buffer1.get(), false); + transport.setData(buffer2.get(), false); + transport.setData(buffer3.get(), true); + EXPECT_TRUE(transport.hasNewData()); + + SharedBuffer* tempBuffer = 0; + bool allDataReceived = false; + transport.data(&tempBuffer, &allDataReceived); + EXPECT_TRUE(allDataReceived); + EXPECT_FALSE(memcmp(testString3, tempBuffer->data(), tempBuffer->size())); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.cpp b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.cpp index ba2f2390..63a380a 100644 --- a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.cpp
@@ -32,7 +32,7 @@ namespace blink { -FastSharedBufferReader::FastSharedBufferReader(PassRefPtr<SegmentReader> data) +FastSharedBufferReader::FastSharedBufferReader(PassRefPtr<SharedBuffer> data) : m_data(data) , m_segment(0) , m_segmentLength(0) @@ -40,7 +40,7 @@ { } -void FastSharedBufferReader::setData(PassRefPtr<SegmentReader> data) +void FastSharedBufferReader::setData(PassRefPtr<SharedBuffer> data) { if (data == m_data) return;
diff --git a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.h b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.h index e82beaa..c1bf3f91 100644 --- a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.h +++ b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReader.h
@@ -32,7 +32,7 @@ #define FastSharedBufferReader_h #include "platform/PlatformExport.h" -#include "platform/image-decoders/SegmentReader.h" +#include "platform/SharedBuffer.h" #include "wtf/Allocator.h" #include "wtf/Noncopyable.h" #include "wtf/PassRefPtr.h" @@ -48,9 +48,9 @@ DISALLOW_NEW(); WTF_MAKE_NONCOPYABLE(FastSharedBufferReader); public: - FastSharedBufferReader(PassRefPtr<SegmentReader> data); + FastSharedBufferReader(PassRefPtr<SharedBuffer> data); - void setData(PassRefPtr<SegmentReader>); + void setData(PassRefPtr<SharedBuffer>); // Returns a consecutive buffer that carries the data starting // at |dataPosition| with |length| bytes. @@ -60,7 +60,7 @@ // Caller must ensure there are enough bytes in |m_data| and |buffer|. const char* getConsecutiveData(size_t dataPosition, size_t length, char* buffer) const; - // Wraps SegmentReader::getSomeData(). + // Wraps SharedBuffer::getSomeData(). size_t getSomeData(const char*& someData, size_t dataPosition) const; // Returns a byte at |dataPosition|. @@ -76,14 +76,14 @@ } // This class caches the last access for faster subsequent reads. This - // method clears that cache in case the SegmentReader has been modified - // (e.g. with mergeSegmentsIntoBuffer on a wrapped SharedBuffer). + // method clears that cache in case the SharedBuffer has been modified + // (i.e. with mergeSegmentsIntoBuffer). void clearCache(); private: void getSomeDataInternal(size_t dataPosition) const; - RefPtr<SegmentReader> m_data; + RefPtr<SharedBuffer> m_data; // Caches the last segment of |m_data| accessed, since subsequent reads are // likely to re-access it.
diff --git a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp index 2e74a89..3ea9aa0 100644 --- a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp
@@ -29,7 +29,6 @@ */ #include "platform/image-decoders/FastSharedBufferReader.h" -#include "platform/image-decoders/SegmentReader.h" #include "testing/gtest/include/gtest/gtest.h" @@ -45,34 +44,6 @@ buffer[i] = static_cast<char>(i); } -PassRefPtr<SegmentReader> copyToROBufferSegmentReader(PassRefPtr<SegmentReader> input) -{ - SkRWBuffer rwBuffer; - const char* segment = 0; - size_t position = 0; - while (size_t length = input->getSomeData(segment, position)) { - rwBuffer.append(segment, length); - position += length; - } - return SegmentReader::createFromSkROBuffer(adoptRef(rwBuffer.newRBufferSnapshot())); -} - -PassRefPtr<SegmentReader> copyToDataSegmentReader(PassRefPtr<SegmentReader> input) -{ - return SegmentReader::createFromSkData(input->getAsSkData()); -} - -struct SegmentReaders { - RefPtr<SegmentReader> segmentReaders[3]; - - SegmentReaders(PassRefPtr<SharedBuffer> input) - { - segmentReaders[0] = SegmentReader::createFromSharedBuffer(input); - segmentReaders[1] = copyToROBufferSegmentReader(segmentReaders[0]); - segmentReaders[2] = copyToDataSegmentReader(segmentReaders[0]); - } -}; - } // namespace TEST(FastSharedBufferReaderTest, nonSequentialReads) @@ -82,17 +53,15 @@ RefPtr<SharedBuffer> data = SharedBuffer::create(); data->append(referenceData, sizeof(referenceData)); - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - FastSharedBufferReader reader(segmentReader); - // Read size is prime such there will be a segment-spanning - // read eventually. - char tempBuffer[17]; - for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(referenceData); dataPosition += sizeof(tempBuffer)) { - const char* block = reader.getConsecutiveData( - dataPosition, sizeof(tempBuffer), tempBuffer); - ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuffer))); - } + FastSharedBufferReader reader(data); + + // Read size is prime such there will be a segment-spanning + // read eventually. + char tempBuffer[17]; + for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(referenceData); dataPosition += sizeof(tempBuffer)) { + const char* block = reader.getConsecutiveData( + dataPosition, sizeof(tempBuffer), tempBuffer); + ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuffer))); } } @@ -103,17 +72,15 @@ RefPtr<SharedBuffer> data = SharedBuffer::create(); data->append(referenceData, sizeof(referenceData)); - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - FastSharedBufferReader reader(segmentReader); - // Read size is prime such there will be a segment-spanning - // read eventually. - char tempBuffer[17]; - for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceData); dataOffset += sizeof(tempBuffer)) { - const char* block = reader.getConsecutiveData( - sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer); - ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataOffset, sizeof(tempBuffer))); - } + FastSharedBufferReader reader(data); + + // Read size is prime such there will be a segment-spanning + // read eventually. + char tempBuffer[17]; + for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceData); dataOffset += sizeof(tempBuffer)) { + const char* block = reader.getConsecutiveData( + sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer); + ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataOffset, sizeof(tempBuffer))); } } @@ -124,12 +91,9 @@ RefPtr<SharedBuffer> data = SharedBuffer::create(); data->append(referenceData, sizeof(referenceData)); - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - FastSharedBufferReader reader(segmentReader); - for (size_t i = 0; i < sizeof(referenceData); ++i) { - ASSERT_EQ(referenceData[i], reader.getOneByte(i)); - } + FastSharedBufferReader reader(data); + for (size_t i = 0; i < sizeof(referenceData); ++i) { + ASSERT_EQ(referenceData[i], reader.getOneByte(i)); } } @@ -143,97 +107,11 @@ RefPtr<SharedBuffer> data = SharedBuffer::create(); data->append(referenceData, dataSize); - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - FastSharedBufferReader reader(segmentReader); - char buffer[dataSize]; - reader.getConsecutiveData(0, dataSize, buffer); - ASSERT_FALSE(memcmp(buffer, referenceData, dataSize)); - } -} + char buffer[dataSize]; + FastSharedBufferReader reader(data); + reader.getConsecutiveData(0, dataSize, buffer); -// Verify that reading past the end of the buffer does not break future reads. -TEST(SegmentReaderTest, readPastEndThenRead) -{ - const unsigned dataSize = 2 * SharedBuffer::kSegmentSize; - char referenceData[dataSize]; - prepareReferenceData(referenceData, dataSize); - RefPtr<SharedBuffer> data = SharedBuffer::create(); - data->append(referenceData, dataSize); - - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - const char* contents; - size_t length = segmentReader->getSomeData(contents, dataSize); - EXPECT_EQ(0u, length); - - length = segmentReader->getSomeData(contents, 0); - EXPECT_LE(SharedBuffer::kSegmentSize, length); - } -} - -TEST(SegmentReaderTest, getAsSkData) -{ - const unsigned dataSize = 4 * SharedBuffer::kSegmentSize; - char referenceData[dataSize]; - prepareReferenceData(referenceData, dataSize); - RefPtr<SharedBuffer> data = SharedBuffer::create(); - data->append(referenceData, dataSize); - - SegmentReaders readerStruct(data); - for (auto segmentReader : readerStruct.segmentReaders) { - RefPtr<SkData> skdata = segmentReader->getAsSkData(); - EXPECT_EQ(data->size(), skdata->size()); - - const char* segment; - size_t position = 0; - for (size_t length = segmentReader->getSomeData(segment, position); - length; length = segmentReader->getSomeData(segment, position)) { - ASSERT_FALSE(memcmp(segment, skdata->bytes() + position, length)); - position += length; - } - EXPECT_EQ(position, dataSize); - } -} - -TEST(SegmentReaderTest, variableSegments) -{ - const size_t dataSize = 3.5 * SharedBuffer::kSegmentSize; - char referenceData[dataSize]; - prepareReferenceData(referenceData, dataSize); - - RefPtr<SegmentReader> segmentReader; - { - // Create a SegmentReader with difference sized segments, to test that - // the SkROBuffer implementation works when two consecutive segments - // are not the same size. This test relies on knowledge of the - // internals of SkRWBuffer: it ensures that each segment is at least - // 4096 (though the actual data may be smaller, if it has not been - // written to yet), but when appending a larger amount it may create a - // larger segment. - SkRWBuffer rwBuffer; - rwBuffer.append(referenceData, SharedBuffer::kSegmentSize); - rwBuffer.append(referenceData + SharedBuffer::kSegmentSize, 2 * SharedBuffer::kSegmentSize); - rwBuffer.append(referenceData + 3 * SharedBuffer::kSegmentSize, .5 * SharedBuffer::kSegmentSize); - - segmentReader = SegmentReader::createFromSkROBuffer(adoptRef(rwBuffer.newRBufferSnapshot())); - } - - const char* segment; - size_t position = 0; - size_t lastLength = 0; - for (size_t length = segmentReader->getSomeData(segment, position); - length; length = segmentReader->getSomeData(segment, position)) { - // It is not a bug to have consecutive segments of the same length, but - // it does mean that the following test does not actually test what it - // is intended to test. - ASSERT_NE(length, lastLength); - lastLength = length; - - ASSERT_FALSE(memcmp(segment, referenceData + position, length)); - position += length; - } - EXPECT_EQ(position, dataSize); + ASSERT_FALSE(memcmp(buffer, referenceData, dataSize)); } } // namespace blink
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp index c008c4b..663f0d5d 100644 --- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -32,51 +32,67 @@ namespace blink { -inline bool matchesJPEGSignature(const char* contents) +static size_t copyFromSharedBuffer(char* buffer, size_t bufferLength, const SharedBuffer& sharedBuffer, size_t offset) +{ + size_t bytesExtracted = 0; + const char* moreData; + while (size_t moreDataLength = sharedBuffer.getSomeData(moreData, offset)) { + size_t bytesToCopy = std::min(bufferLength - bytesExtracted, moreDataLength); + memcpy(buffer + bytesExtracted, moreData, bytesToCopy); + bytesExtracted += bytesToCopy; + if (bytesExtracted == bufferLength) + break; + offset += bytesToCopy; + } + return bytesExtracted; +} + +inline bool matchesJPEGSignature(char* contents) { return !memcmp(contents, "\xFF\xD8\xFF", 3); } -inline bool matchesPNGSignature(const char* contents) +inline bool matchesPNGSignature(char* contents) { return !memcmp(contents, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", 8); } -inline bool matchesGIFSignature(const char* contents) +inline bool matchesGIFSignature(char* contents) { return !memcmp(contents, "GIF87a", 6) || !memcmp(contents, "GIF89a", 6); } -inline bool matchesWebPSignature(const char* contents) +inline bool matchesWebPSignature(char* contents) { return !memcmp(contents, "RIFF", 4) && !memcmp(contents + 8, "WEBPVP", 6); } -inline bool matchesICOSignature(const char* contents) +inline bool matchesICOSignature(char* contents) { return !memcmp(contents, "\x00\x00\x01\x00", 4); } -inline bool matchesCURSignature(const char* contents) +inline bool matchesCURSignature(char* contents) { return !memcmp(contents, "\x00\x00\x02\x00", 4); } -inline bool matchesBMPSignature(const char* contents) +inline bool matchesBMPSignature(char* contents) { return !memcmp(contents, "BM", 2); } -PassOwnPtr<ImageDecoder> ImageDecoder::create(const char* contents, size_t length, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions) +PassOwnPtr<ImageDecoder> ImageDecoder::create(const SharedBuffer& data, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions) { const size_t longestSignatureLength = sizeof("RIFF????WEBPVP") - 1; ASSERT(longestSignatureLength == 14); - if (length < longestSignatureLength) - return nullptr; - size_t maxDecodedBytes = Platform::current() ? Platform::current()->maxDecodedImageBytes() : noDecodedImageByteLimit; + char contents[longestSignatureLength]; + if (copyFromSharedBuffer(contents, longestSignatureLength, data, 0) < longestSignatureLength) + return nullptr; + if (matchesJPEGSignature(contents)) return adoptPtr(new JPEGImageDecoder(alphaOption, colorOptions, maxDecodedBytes)); @@ -98,20 +114,6 @@ return nullptr; } -PassOwnPtr<ImageDecoder> ImageDecoder::create(const SharedBuffer& data, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions) -{ - const char* contents; - const size_t length = data.getSomeData<size_t>(contents); - return create(contents, length, alphaOption, colorOptions); -} - -PassOwnPtr<ImageDecoder> ImageDecoder::create(const SegmentReader& data, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions) -{ - const char* contents; - const size_t length = data.getSomeData(contents, 0); - return create(contents, length, alphaOption, colorOptions); -} - size_t ImageDecoder::frameCount() { const size_t oldSize = m_frameBufferCache.size();
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h index 7da3b9b..55eec65 100644 --- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
@@ -33,7 +33,6 @@ #include "platform/graphics/ImageOrientation.h" #include "platform/image-decoders/ImageAnimation.h" #include "platform/image-decoders/ImageFrame.h" -#include "platform/image-decoders/SegmentReader.h" #include "public/platform/Platform.h" #include "wtf/Assertions.h" #include "wtf/PassOwnPtr.h" @@ -123,29 +122,22 @@ // we can't sniff a supported type from the provided data (possibly // because there isn't enough data yet). // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes(). - static PassOwnPtr<ImageDecoder> create(const char* data, size_t length, AlphaOption, GammaAndColorProfileOption); - static PassOwnPtr<ImageDecoder> create(const SharedBuffer&, AlphaOption, GammaAndColorProfileOption); - static PassOwnPtr<ImageDecoder> create(const SegmentReader&, AlphaOption, GammaAndColorProfileOption); + static PassOwnPtr<ImageDecoder> create(const SharedBuffer& data, AlphaOption, GammaAndColorProfileOption); virtual String filenameExtension() const = 0; bool isAllDataReceived() const { return m_isAllDataReceived; } - void setData(PassRefPtr<SegmentReader> data, bool allDataReceived) + void setData(SharedBuffer* data, bool allDataReceived) { if (m_failed) return; m_data = data; m_isAllDataReceived = allDataReceived; - onSetData(m_data.get()); + onSetData(data); } - void setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) - { - setData(SegmentReader::createFromSharedBuffer(data), allDataReceived); - } - - virtual void onSetData(SegmentReader* data) { } + virtual void onSetData(SharedBuffer* data) { } bool isSizeAvailable() { @@ -318,7 +310,7 @@ // Decodes the requested frame. virtual void decode(size_t) = 0; - RefPtr<SegmentReader> m_data; // The encoded data. + RefPtr<SharedBuffer> m_data; // The encoded data. Vector<ImageFrame, 1> m_frameBufferCache; bool m_premultiplyAlpha; bool m_ignoreGammaAndColorProfile;
diff --git a/third_party/WebKit/Source/platform/image-decoders/SegmentReader.cpp b/third_party/WebKit/Source/platform/image-decoders/SegmentReader.cpp deleted file mode 100644 index e412952..0000000 --- a/third_party/WebKit/Source/platform/image-decoders/SegmentReader.cpp +++ /dev/null
@@ -1,182 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/image-decoders/SegmentReader.h" - -#include "platform/SharedBuffer.h" -#include "third_party/skia/include/core/SkData.h" -#include "wtf/Assertions.h" -#include "wtf/Noncopyable.h" -#include "wtf/PassRefPtr.h" -#include "wtf/RefPtr.h" - -namespace blink { - -// SharedBufferSegmentReader --------------------------------------------------- - -// Interface for ImageDecoder to read a SharedBuffer. -class SharedBufferSegmentReader final : public SegmentReader { - WTF_MAKE_NONCOPYABLE(SharedBufferSegmentReader); -public: - SharedBufferSegmentReader(PassRefPtr<SharedBuffer>); - size_t size() const override; - size_t getSomeData(const char*& data, size_t position) const override; - PassRefPtr<SkData> getAsSkData() const override; -private: - RefPtr<SharedBuffer> m_sharedBuffer; -}; - -SharedBufferSegmentReader::SharedBufferSegmentReader(PassRefPtr<SharedBuffer> buffer) - : m_sharedBuffer(buffer) {} - -size_t SharedBufferSegmentReader::size() const -{ - return m_sharedBuffer->size(); -} - -size_t SharedBufferSegmentReader::getSomeData(const char*& data, size_t position) const -{ - return m_sharedBuffer->getSomeData(data, position); -} - -PassRefPtr<SkData> SharedBufferSegmentReader::getAsSkData() const -{ - return m_sharedBuffer->getAsSkData(); -} - -// DataSegmentReader ----------------------------------------------------------- - -// Interface for ImageDecoder to read an SkData. -class DataSegmentReader final : public SegmentReader { - WTF_MAKE_NONCOPYABLE(DataSegmentReader); -public: - DataSegmentReader(PassRefPtr<SkData>); - size_t size() const override; - size_t getSomeData(const char*& data, size_t position) const override; - PassRefPtr<SkData> getAsSkData() const override; -private: - RefPtr<SkData> m_data; -}; - -DataSegmentReader::DataSegmentReader(PassRefPtr<SkData> data) - : m_data(data) {} - -size_t DataSegmentReader::size() const -{ - return m_data->size(); -} - -size_t DataSegmentReader::getSomeData(const char*& data, size_t position) const -{ - if (position >= m_data->size()) - return 0; - - data = reinterpret_cast<const char*>(m_data->bytes() + position); - return m_data->size() - position; -} - -PassRefPtr<SkData> DataSegmentReader::getAsSkData() const -{ - return m_data.get(); -} - -// ROBufferSegmentReader ------------------------------------------------------- - -class ROBufferSegmentReader final : public SegmentReader { - WTF_MAKE_NONCOPYABLE(ROBufferSegmentReader); -public: - ROBufferSegmentReader(PassRefPtr<SkROBuffer>); - - size_t size() const override; - size_t getSomeData(const char*& data, size_t position) const override; - PassRefPtr<SkData> getAsSkData() const override; - -private: - RefPtr<SkROBuffer> m_roBuffer; -}; - -ROBufferSegmentReader::ROBufferSegmentReader(PassRefPtr<SkROBuffer> buffer) - : m_roBuffer(buffer) - {} - -size_t ROBufferSegmentReader::size() const -{ - return m_roBuffer ? m_roBuffer->size() : 0; -} - -size_t ROBufferSegmentReader::getSomeData(const char*& data, size_t position) const -{ - if (!m_roBuffer) - return 0; - - SkROBuffer::Iter iter(m_roBuffer.get()); - for (size_t sizeOfBlock = iter.size(), positionOfBlock = 0; sizeOfBlock != 0; positionOfBlock += sizeOfBlock, sizeOfBlock = iter.size()) { - ASSERT(positionOfBlock <= position); - - if (positionOfBlock + sizeOfBlock > position) { - // |position| is in this block. - const size_t positionInBlock = position - positionOfBlock; - data = static_cast<const char*>(iter.data()) + positionInBlock; - return sizeOfBlock - positionInBlock; - } - - // Move to next block. - if (!iter.next()) { - return 0; - } - } - - return 0; -} - -static void unrefROBuffer(const void* ptr, void* context) -{ - static_cast<SkROBuffer*>(context)->unref(); -} - -PassRefPtr<SkData> ROBufferSegmentReader::getAsSkData() const -{ - if (!m_roBuffer) - return nullptr; - - // Check to see if the data is already contiguous. - SkROBuffer::Iter iter(m_roBuffer.get()); - const bool multipleBlocks = iter.next(); - iter.reset(m_roBuffer.get()); - - if (!multipleBlocks) { - // Contiguous data. No need to copy. - m_roBuffer->ref(); - return adoptRef(SkData::NewWithProc(iter.data(), iter.size(), &unrefROBuffer, m_roBuffer.get())); - } - - RefPtr<SkData> data = adoptRef(SkData::NewUninitialized(m_roBuffer->size())); - char* dst = static_cast<char*>(data->writable_data()); - do { - size_t size = iter.size(); - memcpy(dst, iter.data(), size); - dst += size; - } while (iter.next()); - return data.release(); -} - -// SegmentReader --------------------------------------------------------------- - -PassRefPtr<SegmentReader> SegmentReader::createFromSharedBuffer(PassRefPtr<SharedBuffer> buffer) -{ - return adoptRef(new SharedBufferSegmentReader(buffer)); -} - -PassRefPtr<SegmentReader> SegmentReader::createFromSkData(PassRefPtr<SkData> data) -{ - return adoptRef(new DataSegmentReader(data)); -} - -PassRefPtr<SegmentReader> SegmentReader::createFromSkROBuffer(PassRefPtr<SkROBuffer> buffer) -{ - return adoptRef(new ROBufferSegmentReader(buffer)); -} - -} // namespace blink -
diff --git a/third_party/WebKit/Source/platform/image-decoders/SegmentReader.h b/third_party/WebKit/Source/platform/image-decoders/SegmentReader.h deleted file mode 100644 index 13c28ce..0000000 --- a/third_party/WebKit/Source/platform/image-decoders/SegmentReader.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SegmentReader_h -#define SegmentReader_h - -#include "platform/SharedBuffer.h" -#include "third_party/skia/include/core/SkData.h" -#include "third_party/skia/include/core/SkRWBuffer.h" -#include "wtf/Noncopyable.h" -#include "wtf/PassRefPtr.h" -#include "wtf/ThreadSafeRefCounted.h" - -namespace blink { - -// Interface that looks like SharedBuffer. Used by ImageDecoders to use various -// sources of input including: -// - SharedBuffer -// - for when the caller already has a SharedBuffer -// - SkData -// - for when the caller already has an SkData -// - SkROBuffer -// - for when the caller wants to read/write in different threads -// -// Unlike SharedBuffer, this is a read-only interface. There is no way to -// modify the underlying data source. -class PLATFORM_EXPORT SegmentReader : public ThreadSafeRefCounted<SegmentReader> { - WTF_MAKE_NONCOPYABLE(SegmentReader); -public: - // This version is thread-safe so long as no thread is modifying the - // underlying SharedBuffer. This class does not modify it, so that would - // mean modifying it in another way. - static PassRefPtr<SegmentReader> createFromSharedBuffer(PassRefPtr<SharedBuffer>); - - // These versions use thread-safe input, so they are always thread-safe. - static PassRefPtr<SegmentReader> createFromSkData(PassRefPtr<SkData>); - static PassRefPtr<SegmentReader> createFromSkROBuffer(PassRefPtr<SkROBuffer>); - - SegmentReader() {} - virtual ~SegmentReader() {} - virtual size_t size() const = 0; - virtual size_t getSomeData(const char*& data, size_t position) const = 0; - virtual PassRefPtr<SkData> getAsSkData() const = 0; -}; - -} // namespace blink -#endif // SegmentReader_h
diff --git a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.cpp index 01815ab..998faac6 100644 --- a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.cpp
@@ -46,7 +46,7 @@ { } -void BMPImageDecoder::onSetData(SegmentReader* data) +void BMPImageDecoder::onSetData(SharedBuffer* data) { if (m_reader) m_reader->setData(data);
diff --git a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.h index e4a6bd1..c2053a5 100644 --- a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageDecoder.h
@@ -43,7 +43,7 @@ // ImageDecoder: String filenameExtension() const override { return "bmp"; } - void onSetData(SegmentReader*) override; + void onSetData(SharedBuffer*) override; // CAUTION: setFailed() deletes |m_reader|. Be careful to avoid // accessing deleted memory, especially when calling this from inside // BMPImageReader!
diff --git a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.h b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.h index d150a56..7bfa563 100644 --- a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.h +++ b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.h
@@ -65,7 +65,7 @@ BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool isInICO); void setBuffer(ImageFrame* buffer) { m_buffer = buffer; } - void setData(SegmentReader* data) + void setData(SharedBuffer* data) { m_data = data; m_fastReader.setData(data); @@ -290,7 +290,7 @@ ImageFrame* m_buffer; // The file to decode. - RefPtr<SegmentReader> m_data; + RefPtr<SharedBuffer> m_data; FastSharedBufferReader m_fastReader; // An index into |m_data| representing how much we've already decoded.
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp index 457666d2..824764c5 100644 --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp
@@ -42,7 +42,7 @@ { } -void GIFImageDecoder::onSetData(SegmentReader* data) +void GIFImageDecoder::onSetData(SharedBuffer* data) { if (m_reader) m_reader->setData(data);
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h index 98941e68..f9aa02c4 100644 --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.h
@@ -47,7 +47,7 @@ // ImageDecoder: String filenameExtension() const override { return "gif"; } - void onSetData(SegmentReader* data) override; + void onSetData(SharedBuffer* data) override; int repetitionCount() const override; bool frameIsCompleteAtIndex(size_t) const override; float frameDurationAtIndex(size_t) const override;
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageReader.h b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageReader.h index bfa9897..6172377 100644 --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageReader.h +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageReader.h
@@ -40,6 +40,7 @@ // Define ourselves as the clientPtr. Mozilla just hacked their C++ callback class into this old C decoder, // so we will too. +#include "platform/SharedBuffer.h" #include "platform/image-decoders/FastSharedBufferReader.h" #include "platform/image-decoders/gif/GIFImageDecoder.h" #include "wtf/Allocator.h" @@ -298,7 +299,7 @@ { } - void setData(PassRefPtr<blink::SegmentReader> data) { m_data = data; } + void setData(PassRefPtr<blink::SharedBuffer> data) { m_data = data; } bool parse(blink::GIFImageDecoder::GIFParseQuery); bool decode(size_t frameIndex); @@ -355,7 +356,7 @@ Vector<OwnPtr<GIFFrameContext>> m_frames; - RefPtr<blink::SegmentReader> m_data; + RefPtr<blink::SharedBuffer> m_data; bool m_parseCompleted; };
diff --git a/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.cpp index a189f81..592eb96 100644 --- a/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.cpp
@@ -54,7 +54,7 @@ { } -void ICOImageDecoder::onSetData(SegmentReader* data) +void ICOImageDecoder::onSetData(SharedBuffer* data) { m_fastReader.setData(data);
diff --git a/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.h index 3df9ba1..73759ba 100644 --- a/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/ico/ICOImageDecoder.h
@@ -46,7 +46,7 @@ // ImageDecoder: String filenameExtension() const override { return "ico"; } - void onSetData(SegmentReader*) override; + void onSetData(SharedBuffer*) override; IntSize size() const override; IntSize frameSizeAtIndex(size_t) const override; bool setSize(unsigned width, unsigned height) override;
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp index 03b465d8..79434ab 100644 --- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -361,19 +361,19 @@ return true; } - void setData(SegmentReader* data) + void setData(SharedBuffer* data) { if (m_data.get() == data) return; m_data = data; - // If a restart is needed, the next call to fillBuffer will read from the new SegmentReader. + // If a restart is needed, the next call to fillBuffer will read from the new SharedBuffer. if (m_needsRestart) return; // Otherwise, empty the buffer, and leave the position the same, so fillBuffer continues - // reading from the same position in the new SegmentReader. + // reading from the same position in the new SharedBuffer. m_nextReadPosition -= m_info.src->bytes_in_buffer; clearBuffer(); } @@ -637,7 +637,7 @@ m_lastSetByte = nullptr; } - RefPtr<SegmentReader> m_data; + RefPtr<SharedBuffer> m_data; JPEGImageDecoder* m_decoder; // Input reading: True if we need to back up to m_restartPosition. @@ -723,7 +723,7 @@ return true; } -void JPEGImageDecoder::onSetData(SegmentReader* data) +void JPEGImageDecoder::onSetData(SharedBuffer* data) { if (m_reader) m_reader->setData(data);
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.h index 74a0681..704a7cca 100644 --- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.h
@@ -40,7 +40,7 @@ // ImageDecoder: String filenameExtension() const override { return "jpg"; } - void onSetData(SegmentReader* data) override; + void onSetData(SharedBuffer* data) override; IntSize decodedSize() const override { return m_decodedSize; } bool setSize(unsigned width, unsigned height) override; IntSize decodedYUVSize(int component) const override;
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp index 5f787b5..bff97c2 100644 --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -110,7 +110,7 @@ m_readOffset = 0; } - bool decode(const SegmentReader& data, bool sizeOnly) + bool decode(const SharedBuffer& data, bool sizeOnly) { m_decodingSizeOnly = sizeOnly;
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp index fae908a7..2672862d 100644 --- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
@@ -144,7 +144,6 @@ { WebPDemuxDelete(m_demux); m_demux = 0; - m_consolidatedData.clear(); clearDecoder(); } @@ -156,7 +155,7 @@ m_frameBackgroundHasAlpha = false; } -void WEBPImageDecoder::onSetData(SegmentReader*) +void WEBPImageDecoder::onSetData(SharedBuffer*) { m_haveAlreadyParsedThisData = false; } @@ -196,14 +195,10 @@ return false; // Await VP8X header so WebPDemuxPartial succeeds. WebPDemuxDelete(m_demux); - m_consolidatedData = m_data->getAsSkData(); - WebPData inputData = { reinterpret_cast<const uint8_t*>(m_consolidatedData->data()), m_consolidatedData->size() }; + WebPData inputData = { reinterpret_cast<const uint8_t*>(m_data->data()), m_data->size() }; m_demux = WebPDemuxPartial(&inputData, &m_demuxState); - if (!m_demux || (isAllDataReceived() && m_demuxState != WEBP_DEMUX_DONE)) { - if (!m_demux) - m_consolidatedData.clear(); + if (!m_demux || (isAllDataReceived() && m_demuxState != WEBP_DEMUX_DONE)) return setFailed(); - } ASSERT(m_demuxState > WEBP_DEMUX_PARSING_HEADER); if (!WebPDemuxGetI(m_demux, WEBP_FF_FRAME_COUNT))
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h index 718ae30..c991671 100644 --- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.h
@@ -30,10 +30,8 @@ #define WEBPImageDecoder_h #include "platform/image-decoders/ImageDecoder.h" -#include "third_party/skia/include/core/SkData.h" #include "webp/decode.h" #include "webp/demux.h" -#include "wtf/RefPtr.h" namespace blink { @@ -45,7 +43,7 @@ // ImageDecoder: String filenameExtension() const override { return "webp"; } - void onSetData(SegmentReader* data) override; + void onSetData(SharedBuffer* data) override; int repetitionCount() const override; bool frameIsCompleteAtIndex(size_t) const override; float frameDurationAtIndex(size_t) const override; @@ -85,9 +83,6 @@ void clear(); void clearDecoder(); - - // FIXME: Update libwebp's API so it does not require copying the data on each update. - RefPtr<SkData> m_consolidatedData; }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequest.h b/third_party/WebKit/Source/platform/network/ResourceRequest.h index 3594ce1..c47898a 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequest.h +++ b/third_party/WebKit/Source/platform/network/ResourceRequest.h
@@ -148,7 +148,6 @@ void setHTTPUserAgent(const AtomicString& httpUserAgent) { setHTTPHeaderField(HTTPNames::User_Agent, httpUserAgent); } void clearHTTPUserAgent(); - const AtomicString& httpAccept() const { return httpHeaderField(HTTPNames::Accept); } void setHTTPAccept(const AtomicString& httpAccept) { setHTTPHeaderField(HTTPNames::Accept, httpAccept); } EncodedFormData* httpBody() const;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.cpp b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.cpp index 193b646..a301b38 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.cpp
@@ -34,6 +34,7 @@ #include "platform/inspector_protocol/Values.h" #include "platform/v8_inspector/V8DebuggerAgentImpl.h" #include "platform/v8_inspector/V8InspectorSessionImpl.h" +#include "platform/v8_inspector/V8RuntimeAgentImpl.h" #include "platform/v8_inspector/public/V8Debugger.h" namespace blink { @@ -53,25 +54,16 @@ { } -void InjectedScriptHost::disconnect() -{ - m_debugger = nullptr; - m_session = nullptr; - m_inspectedObjects.clear(); -} - void InjectedScriptHost::inspectImpl(PassOwnPtr<protocol::Value> object, PassOwnPtr<protocol::Value> hints) { - if (m_session && m_session->inspectCallback()) { - protocol::ErrorSupport errors; - OwnPtr<protocol::Runtime::RemoteObject> remoteObject = protocol::Runtime::RemoteObject::parse(object.get(), &errors); - (*m_session->inspectCallback())(remoteObject.release(), protocol::DictionaryValue::cast(hints)); - } + protocol::ErrorSupport errors; + OwnPtr<protocol::Runtime::RemoteObject> remoteObject = protocol::Runtime::RemoteObject::parse(object.get(), &errors); + m_session->runtimeAgentImpl()->inspect(remoteObject.release(), protocol::DictionaryValue::cast(hints)); } void InjectedScriptHost::clearConsoleMessages() { - if (m_session && m_session->clearConsoleCallback()) + if (m_session->clearConsoleCallback()) (*m_session->clearConsoleCallback())(); } @@ -96,14 +88,12 @@ void InjectedScriptHost::debugFunction(const String16& scriptId, int lineNumber, int columnNumber) { - if (m_session) - m_session->debuggerAgentImpl()->setBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::DebugCommandBreakpointSource); + m_session->debuggerAgentImpl()->setBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::DebugCommandBreakpointSource); } void InjectedScriptHost::undebugFunction(const String16& scriptId, int lineNumber, int columnNumber) { - if (m_session) - m_session->debuggerAgentImpl()->removeBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::DebugCommandBreakpointSource); + m_session->debuggerAgentImpl()->removeBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::DebugCommandBreakpointSource); } void InjectedScriptHost::monitorFunction(const String16& scriptId, int lineNumber, int columnNumber, const String16& functionName) @@ -115,14 +105,12 @@ else builder.append(functionName); builder.append(" called\" + (arguments.length > 0 ? \" with arguments: \" + Array.prototype.join.call(arguments, \", \") : \"\")) && false"); - if (m_session) - m_session->debuggerAgentImpl()->setBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::MonitorCommandBreakpointSource, builder.toString()); + m_session->debuggerAgentImpl()->setBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::MonitorCommandBreakpointSource, builder.toString()); } void InjectedScriptHost::unmonitorFunction(const String16& scriptId, int lineNumber, int columnNumber) { - if (m_session) - m_session->debuggerAgentImpl()->removeBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::MonitorCommandBreakpointSource); + m_session->debuggerAgentImpl()->removeBreakpointAt(scriptId, lineNumber, columnNumber, V8DebuggerAgentImpl::MonitorCommandBreakpointSource); } } // namespace blink
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.h b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.h index 46300f5..19ccc041f 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.h +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptHost.h
@@ -56,8 +56,6 @@ static PassOwnPtr<InjectedScriptHost> create(V8DebuggerImpl*, V8InspectorSessionImpl*); ~InjectedScriptHost(); - void disconnect(); - void addInspectedObject(PassOwnPtr<V8RuntimeAgent::Inspectable>); void clearInspectedObjects(); V8RuntimeAgent::Inspectable* inspectedObject(unsigned num); @@ -81,8 +79,6 @@ V8DebuggerImpl* m_debugger; V8InspectorSessionImpl* m_session; - OwnPtr<V8RuntimeAgent::InspectCallback> m_inspectCallback; - OwnPtr<V8RuntimeAgent::ClearConsoleCallback> m_clearConsoleCallback; protocol::Vector<OwnPtr<V8RuntimeAgent::Inspectable>> m_inspectedObjects; v8::Global<v8::FunctionTemplate> m_wrapperTemplate; };
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp index 70eeef74..8856807 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp
@@ -32,7 +32,6 @@ , m_debuggerAgent(adoptPtr(new V8DebuggerAgentImpl(this))) , m_heapProfilerAgent(adoptPtr(new V8HeapProfilerAgentImpl(this))) , m_profilerAgent(adoptPtr(new V8ProfilerAgentImpl(this))) - , m_inspectCallback(nullptr) , m_clearConsoleCallback(nullptr) { } @@ -89,9 +88,14 @@ InjectedScript* V8InspectorSessionImpl::findInjectedScript(ErrorString* errorString, int contextId) { + if (!contextId) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + const V8DebuggerImpl::ContextByIdMap* contexts = m_debugger->contextGroup(m_contextGroupId); if (!contexts || !contexts->contains(contextId)) { - *errorString = "Inspected frame has gone"; + *errorString = "Cannot find context with specified id"; return nullptr; }
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h index c8b47ce..1915382a 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h +++ b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h
@@ -54,8 +54,6 @@ void setClearConsoleCallback(PassOwnPtr<V8RuntimeAgent::ClearConsoleCallback> callback) { m_clearConsoleCallback = callback; } V8RuntimeAgent::ClearConsoleCallback* clearConsoleCallback() { return m_clearConsoleCallback.get(); } - void setInspectObjectCallback(PassOwnPtr<V8RuntimeAgent::InspectCallback> callback) { m_inspectCallback = callback; } - V8RuntimeAgent::InspectCallback* inspectCallback() { return m_inspectCallback.get(); } private: V8InspectorSessionImpl(V8DebuggerImpl*, int contextGroupId); @@ -70,7 +68,6 @@ OwnPtr<V8HeapProfilerAgentImpl> m_heapProfilerAgent; OwnPtr<V8ProfilerAgentImpl> m_profilerAgent; - OwnPtr<V8RuntimeAgent::InspectCallback> m_inspectCallback; OwnPtr<V8RuntimeAgent::ClearConsoleCallback> m_clearConsoleCallback; };
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp index e7b111aa..af523eff 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp
@@ -469,11 +469,6 @@ m_session->setClearConsoleCallback(callback); } -void V8RuntimeAgentImpl::setInspectObjectCallback(PassOwnPtr<V8RuntimeAgent::InspectCallback> callback) -{ - m_session->setInspectObjectCallback(callback); -} - PassOwnPtr<RemoteObject> V8RuntimeAgentImpl::wrapObject(v8::Local<v8::Context> context, v8::Local<v8::Value> value, const String16& groupName, bool generatePreview) { ErrorString errorString; @@ -555,4 +550,10 @@ } } +void V8RuntimeAgentImpl::inspect(PassOwnPtr<protocol::Runtime::RemoteObject> objectToInspect, PassOwnPtr<protocol::DictionaryValue> hints) +{ + if (m_enabled) + m_frontend->inspectRequested(objectToInspect, hints); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.h b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.h index 935af12b..1eccf5e 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.h +++ b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.h
@@ -117,9 +117,9 @@ void reset(); void reportExecutionContextCreated(InspectedContext*); void reportExecutionContextDestroyed(InspectedContext*); + void inspect(PassOwnPtr<protocol::Runtime::RemoteObject> objectToInspect, PassOwnPtr<protocol::DictionaryValue> hints); void setClearConsoleCallback(PassOwnPtr<ClearConsoleCallback>) override; - void setInspectObjectCallback(PassOwnPtr<InspectCallback>) override; PassOwnPtr<protocol::Runtime::RemoteObject> wrapObject(v8::Local<v8::Context>, v8::Local<v8::Value>, const String16& groupName, bool generatePreview = false) override; PassOwnPtr<protocol::Runtime::RemoteObject> wrapTable(v8::Local<v8::Context>, v8::Local<v8::Value> table, v8::Local<v8::Value> columns) override; void disposeObjectGroup(const String16&) override;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/public/V8RuntimeAgent.h b/third_party/WebKit/Source/platform/v8_inspector/public/V8RuntimeAgent.h index 4beef808..c3b0d59 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/public/V8RuntimeAgent.h +++ b/third_party/WebKit/Source/platform/v8_inspector/public/V8RuntimeAgent.h
@@ -31,8 +31,6 @@ // Embedder API. using ClearConsoleCallback = Function<void()>; virtual void setClearConsoleCallback(PassOwnPtr<ClearConsoleCallback>) = 0; - using InspectCallback = Function<void(PassOwnPtr<protocol::Runtime::RemoteObject>, PassOwnPtr<protocol::DictionaryValue>)>; - virtual void setInspectObjectCallback(PassOwnPtr<InspectCallback>) = 0; virtual PassOwnPtr<protocol::Runtime::RemoteObject> wrapObject(v8::Local<v8::Context>, v8::Local<v8::Value>, const String16& groupName, bool generatePreview = false) = 0; // FIXME: remove when console.table moves into V8 inspector. virtual PassOwnPtr<protocol::Runtime::RemoteObject> wrapTable(v8::Local<v8::Context>, v8::Local<v8::Value> table, v8::Local<v8::Value> columns) = 0;
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn index 5f5dc1c..149c162 100644 --- a/third_party/WebKit/Source/web/BUILD.gn +++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -96,6 +96,7 @@ "//base/test:test_support", "//content/test:test_support", "//gpu:test_support", + "//mojo/edk/system:system", "//testing/gmock", "//testing/gtest", "//third_party/WebKit/Source/core",
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp index 3628ab9..6cc85ee 100644 --- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp +++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -51,6 +51,7 @@ #include "modules/serviceworkers/ExtendableEvent.h" #include "modules/serviceworkers/ExtendableMessageEvent.h" #include "modules/serviceworkers/FetchEvent.h" +#include "modules/serviceworkers/ForeignFetchEvent.h" #include "modules/serviceworkers/InstallEvent.h" #include "modules/serviceworkers/ServiceWorkerClient.h" #include "modules/serviceworkers/ServiceWorkerGlobalScope.h" @@ -138,12 +139,30 @@ void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent(int eventID, const WebServiceWorkerRequest& webRequest) { - dispatchFetchEventImpl(eventID, webRequest, EventTypeNames::fetch); + RespondWithObserver* observer = RespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); + Request* request = Request::create(workerGlobalScope(), webRequest); + request->getHeaders()->setGuard(Headers::ImmutableGuard); + FetchEventInit eventInit; + eventInit.setCancelable(true); + eventInit.setRequest(request); + eventInit.setClientId(webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId()); + eventInit.setIsReload(webRequest.isReload()); + FetchEvent* fetchEvent = FetchEvent::create(EventTypeNames::fetch, eventInit, observer); + DispatchEventResult dispatchResult = workerGlobalScope()->dispatchEvent(fetchEvent); + observer->didDispatchEvent(dispatchResult); } void ServiceWorkerGlobalScopeProxy::dispatchForeignFetchEvent(int eventID, const WebServiceWorkerRequest& webRequest) { - dispatchFetchEventImpl(eventID, webRequest, EventTypeNames::foreignfetch); + ForeignFetchRespondWithObserver* observer = ForeignFetchRespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); + Request* request = Request::create(workerGlobalScope(), webRequest); + request->getHeaders()->setGuard(Headers::ImmutableGuard); + ForeignFetchEventInit eventInit; + eventInit.setCancelable(true); + eventInit.setRequest(request); + ForeignFetchEvent* fetchEvent = ForeignFetchEvent::create(EventTypeNames::foreignfetch, eventInit, observer); + DispatchEventResult dispatchResult = workerGlobalScope()->dispatchEvent(fetchEvent); + observer->didDispatchEvent(dispatchResult); } void ServiceWorkerGlobalScopeProxy::dispatchGeofencingEvent(int eventID, WebGeofencingEventType eventType, const WebString& regionID, const WebCircularGeofencingRegion& region) @@ -295,19 +314,4 @@ return m_workerGlobalScope; } -void ServiceWorkerGlobalScopeProxy::dispatchFetchEventImpl(int eventID, const WebServiceWorkerRequest& webRequest, const AtomicString& eventTypeName) -{ - RespondWithObserver* observer = RespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); - Request* request = Request::create(workerGlobalScope(), webRequest); - request->getHeaders()->setGuard(Headers::ImmutableGuard); - FetchEventInit eventInit; - eventInit.setCancelable(true); - eventInit.setRequest(request); - eventInit.setClientId(webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId()); - eventInit.setIsReload(webRequest.isReload()); - RawPtr<FetchEvent> fetchEvent(FetchEvent::create(eventTypeName, eventInit, observer)); - DispatchEventResult dispatchResult = workerGlobalScope()->dispatchEvent(fetchEvent.release()); - observer->didDispatchEvent(dispatchResult); -} - } // namespace blink
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h index 3061e95..7ad55ea 100644 --- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h +++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
@@ -112,8 +112,6 @@ Document& document() const; ServiceWorkerGlobalScope* workerGlobalScope() const; - void dispatchFetchEventImpl(int eventID, const WebServiceWorkerRequest&, const AtomicString& eventTypeName); - // Non-null until the WebEmbeddedWorkerImpl explicitly detach()es // as part of its finalization. WebEmbeddedWorkerImpl* m_embeddedWorker;
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp index aa6b0d6b..5b838784 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -44,7 +44,6 @@ #include "core/inspector/InspectorDebuggerAgent.h" #include "core/inspector/InspectorHeapProfilerAgent.h" #include "core/inspector/InspectorInputAgent.h" -#include "core/inspector/InspectorInspectorAgent.h" #include "core/inspector/InspectorInstrumentation.h" #include "core/inspector/InspectorLayerTreeAgent.h" #include "core/inspector/InspectorMemoryAgent.h" @@ -396,10 +395,6 @@ m_v8Session = mainThreadDebugger->debugger()->connect(mainThreadDebugger->contextGroupId(m_inspectedFrames->root())); V8RuntimeAgent* runtimeAgent = m_v8Session->runtimeAgent(); - RawPtr<InspectorInspectorAgent> inspectorAgent = InspectorInspectorAgent::create(); - InspectorInspectorAgent* inspectorAgentPtr = inspectorAgent.get(); - m_agents.append(inspectorAgent.release()); - m_agents.append(PageRuntimeAgent::create(this, runtimeAgent, m_inspectedFrames.get())); RawPtr<InspectorDOMAgent> domAgent = InspectorDOMAgent::create(isolate, m_inspectedFrames.get(), runtimeAgent, m_overlay.get()); @@ -455,7 +450,6 @@ m_agents.append(pageAgent.release()); runtimeAgent->setClearConsoleCallback(bind<>(&InspectorConsoleAgent::clearAllMessages, pageConsoleAgentPtr)); - runtimeAgent->setInspectObjectCallback(bind<PassOwnPtr<protocol::Runtime::RemoteObject>, PassOwnPtr<protocol::DictionaryValue>>(&InspectorInspectorAgent::inspect, inspectorAgentPtr)); m_tracingAgent->setLayerTreeId(m_layerTreeId); if (m_overlay) m_overlay->init(cssAgentPtr, debuggerAgentPtr, m_domAgent);
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index 9166284..821bc348 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1526,8 +1526,7 @@ bool enableWebBluetooth = RuntimeEnabledFeatures::webBluetoothEnabled(); #if OS(CHROMEOS) || OS(ANDROID) -// TODO(https://crbug.com/584113) Enable Web Bluetooth Experiment. -// enableWebBluetooth = true; + enableWebBluetooth = true; #endif if (enableWebBluetooth)
diff --git a/third_party/WebKit/Source/web/WebPerformance.cpp b/third_party/WebKit/Source/web/WebPerformance.cpp index 7d7bfe5..45d2a685 100644 --- a/third_party/WebKit/Source/web/WebPerformance.cpp +++ b/third_party/WebKit/Source/web/WebPerformance.cpp
@@ -205,6 +205,11 @@ return millisecondsToSeconds(m_private->timing()->parseBlockedOnScriptLoadDuration()); } +double WebPerformance::parseBlockedOnScriptLoadFromDocumentWriteDuration() const +{ + return millisecondsToSeconds(m_private->timing()->parseBlockedOnScriptLoadFromDocumentWriteDuration()); +} + WebPerformance::WebPerformance(const RawPtr<Performance>& performance) : m_private(performance) {
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp index f650f41..869fcb38 100644 --- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp +++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
@@ -694,7 +694,7 @@ setWantsWheelEvents(false); if (m_webPlugin) { - CHECK(!m_webPlugin->container() || m_webPlugin->container() == this); + CHECK(m_webPlugin->container() == this); m_webPlugin->destroy(); m_webPlugin = nullptr; }
diff --git a/third_party/WebKit/Source/web/tests/DEPS b/third_party/WebKit/Source/web/tests/DEPS index 54af370..304aca3 100644 --- a/third_party/WebKit/Source/web/tests/DEPS +++ b/third_party/WebKit/Source/web/tests/DEPS
@@ -7,4 +7,5 @@ "+base/test/launcher/unit_test_launcher.h", "+base/test/test_suite.h", "+content/test/blink_test_environment.h", + "+mojo/edk/embedder/embedder.h", ]
diff --git a/third_party/WebKit/Source/web/tests/RunAllTests.cpp b/third_party/WebKit/Source/web/tests/RunAllTests.cpp index b23f3df..ebd49150 100644 --- a/third_party/WebKit/Source/web/tests/RunAllTests.cpp +++ b/third_party/WebKit/Source/web/tests/RunAllTests.cpp
@@ -35,6 +35,7 @@ #include "base/test/test_suite.h" #include "bindings/core/v8/V8GCController.h" #include "content/test/blink_test_environment.h" +#include "mojo/edk/embedder/embedder.h" #include "platform/weborigin/SchemeRegistry.h" #include <v8.h> @@ -65,6 +66,8 @@ int main(int argc, char** argv) { + mojo::edk::Init(); + base::TestSuite testSuite(argc, argv); return base::LaunchUnitTests(argc, argv, base::Bind(&runHelper, base::Unretained(&testSuite))); }
diff --git a/third_party/WebKit/Source/wtf/Assertions.h b/third_party/WebKit/Source/wtf/Assertions.h index d609fa3..a6917d6 100644 --- a/third_party/WebKit/Source/wtf/Assertions.h +++ b/third_party/WebKit/Source/wtf/Assertions.h
@@ -51,14 +51,12 @@ // Users must test "#if ENABLE(ASSERT)", which helps ensure that code // testing this macro has included this header. #ifndef ENABLE_ASSERT -#if DCHECK_IS_ON() && !defined(DCHECK_IS_DUMP_WITHOUT_CRASH) -/* ASSERT* will currently crash the process if enabled, so which is not - the desired behaviour if DCHECK_IS_DUMP_WITHOUT_CRASH. */ -#define ENABLE_ASSERT 1 -#else +#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) /* Disable ASSERT* macros in release mode by default. */ #define ENABLE_ASSERT 0 -#endif /* DCHECK_IS_ON() */ +#else +#define ENABLE_ASSERT 1 +#endif /* defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) */ #endif #ifndef ASSERT_MSG_DISABLED
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h index c27cda13..63d9b63e 100644 --- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h +++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h
@@ -21,7 +21,8 @@ WebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest, WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect, WebServiceWorkerResponseErrorBodyLocked, - WebServiceWorkerResponseErrorLast = WebServiceWorkerResponseErrorBodyLocked, + WebServiceWorkerResponseErrorNoForeignFetchResponse, + WebServiceWorkerResponseErrorLast = WebServiceWorkerResponseErrorNoForeignFetchResponse, }; } // namespace blink
diff --git a/third_party/WebKit/public/web/WebPerformance.h b/third_party/WebKit/public/web/WebPerformance.h index d32daaa..dbe7620 100644 --- a/third_party/WebKit/public/web/WebPerformance.h +++ b/third_party/WebKit/public/web/WebPerformance.h
@@ -93,6 +93,7 @@ BLINK_EXPORT double parseStart() const; BLINK_EXPORT double parseStop() const; BLINK_EXPORT double parseBlockedOnScriptLoadDuration() const; + BLINK_EXPORT double parseBlockedOnScriptLoadFromDocumentWriteDuration() const; #if BLINK_IMPLEMENTATION WebPerformance(const RawPtr<Performance>&);
diff --git a/third_party/WebKit/public/web/WebPlugin.h b/third_party/WebKit/public/web/WebPlugin.h index e9c7292..eb89147 100644 --- a/third_party/WebKit/public/web/WebPlugin.h +++ b/third_party/WebKit/public/web/WebPlugin.h
@@ -61,23 +61,34 @@ class WebPlugin { public: - // Perform any initialization work given the container this plugin will use to - // communicate with renderer code. Plugins that return false here must - // subsequently return nullptr for the container() method. + // Initializes the plugin using |container| to communicate with the renderer + // code. |container| must own this plugin. |container| must not be nullptr. + // + // Returns true if a plugin (not necessarily this one) has been successfully + // initialized into |container|. + // + // NOTE: This method is subtle. This plugin may be marked for deletion via + // destroy() during initialization. When this occurs, container() will + // return nullptr. Because deletions during initialize() must be + // asynchronous, this object is still alive immediately after initialize(). + // 1) If container() == nullptr and this method returns true, this plugin + // has been replaced by another during initialization. This new plugin + // may be accessed via container->plugin(). + // 2) If container() == nullptr and this method returns false, this plugin + // and the container have both been marked for deletion. virtual bool initialize(WebPluginContainer*) = 0; // Plugins must arrange for themselves to be deleted sometime during or after this - // method is called. This method is generally called by the owning - // WebPluginContainer. If the plugin has been detatched from a WebPluginContainer, - // i.e. been replaced by another plugin, it must be destroyed separately. + // method is called. This method is only called by the owning WebPluginContainer. + // The exception is if the plugin has been detached by a WebPluginContainer, + // i.e. been replaced by another plugin. Then it must be destroyed separately. + // Once this method has been called, container() must return nullptr. virtual void destroy() = 0; // Returns the container that this plugin has been initialized with. + // Must return nullptr if this plugin is scheduled for deletion. // - // Must return nullptr if the initialize() method returns false. - // Must also return nullptr this plugin is scheduled for deletion. - // - // Note: This container doesn't necessarily own this plugin. For example, + // NOTE: This container doesn't necessarily own this plugin. For example, // if the container has been assigned a new plugin, then the container will // own the new plugin, not this old plugin. virtual WebPluginContainer* container() const { return nullptr; }
diff --git a/tools/OWNERS b/tools/OWNERS index 37c4f6c..fc7d22826 100644 --- a/tools/OWNERS +++ b/tools/OWNERS
@@ -5,6 +5,7 @@ # If you're changing existing tools, have your change reviewed by the # OWNERS of the existing tool. +dpranke@chromium.org scottmg@chromium.org thakis@chromium.org
diff --git a/tools/android/memdump/memdump.cc b/tools/android/memdump/memdump.cc index 7f135ee..572a838d 100644 --- a/tools/android/memdump/memdump.cc +++ b/tools/android/memdump/memdump.cc
@@ -56,9 +56,8 @@ size_t end = data_.size(); while (end > 0 && data_[end - 1] == '\0') --end; - std::string bits(&data_[0], end); std::string b64_string; - base::Base64Encode(bits, &b64_string); + base::Base64Encode(base::StringPiece(data_.data(), end), &b64_string); return b64_string; }
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py index cd900fe..b6331df6 100755 --- a/tools/clang/scripts/upload_revision.py +++ b/tools/clang/scripts/upload_revision.py
@@ -70,9 +70,9 @@ clang_old_revision, clang_revision, commit_message)]) Git(["cl", "upload"]) - Git(["cl", "try", "-b", "linux_chromium_clang_upload", "-r", git_revision]) - Git(["cl", "try", "-b", "mac_chromium_clang_upload", "-r", git_revision]) - Git(["cl", "try", "-b", "win_chromium_clang_upload", "-r", git_revision]) + Git(["cl", "try", "-b", "linux_upload_clang", "-r", git_revision]) + Git(["cl", "try", "-b", "mac_upload_clang", "-r", git_revision]) + Git(["cl", "try", "-b", "win_upload_clang", "-r", git_revision]) print ("Please, wait until the try bots succeeded " "and then push the binaries to goma.")
diff --git a/tools/gn/binary_target_generator.cc b/tools/gn/binary_target_generator.cc index 923d0edd..7c81232 100644 --- a/tools/gn/binary_target_generator.cc +++ b/tools/gn/binary_target_generator.cc
@@ -31,6 +31,9 @@ if (!FillOutputName()) return; + if (!FillOutputPrefixOverride()) + return; + if (!FillOutputExtension()) return; @@ -85,6 +88,16 @@ return true; } +bool BinaryTargetGenerator::FillOutputPrefixOverride() { + const Value* value = scope_->GetValue(variables::kOutputPrefixOverride, true); + if (!value) + return true; + if (!value->VerifyTypeIs(Value::BOOLEAN, err_)) + return false; + target_->set_output_prefix_override(value->boolean_value()); + return true; +} + bool BinaryTargetGenerator::FillOutputExtension() { const Value* value = scope_->GetValue(variables::kOutputExtension, true); if (!value)
diff --git a/tools/gn/binary_target_generator.h b/tools/gn/binary_target_generator.h index 4674f96..40ed432 100644 --- a/tools/gn/binary_target_generator.h +++ b/tools/gn/binary_target_generator.h
@@ -26,6 +26,7 @@ private: bool FillCompleteStaticLib(); bool FillOutputName(); + bool FillOutputPrefixOverride(); bool FillOutputExtension(); bool FillAllowCircularIncludesFrom();
diff --git a/tools/gn/docs/reference.md b/tools/gn/docs/reference.md index 70cc6b3..22cbee0 100644 --- a/tools/gn/docs/reference.md +++ b/tools/gn/docs/reference.md
@@ -2845,6 +2845,10 @@ is not already there. The result will show up in the {{output_name}} substitution pattern. + Individual targets can opt-out of the output prefix by setting: + output_prefix_override = true + (see "gn help output_prefix_override"). + This is typically used to prepend "lib" to libraries on Posix systems: output_prefix = "lib" @@ -4664,9 +4668,11 @@ override the name (for example to use "libfreetype.so.6" instead of libfreetype.so on Linux). - This value should not include a leading dot. If undefined or empty, - the default_output_extension specified on the tool will be used. - The output_extension will be used in the "{{output_extension}}" + This value should not include a leading dot. If undefined, the default + specified on the tool will be used. If set to the empty string, no + output extension will be used. + + The output_extension will be used to set the "{{output_extension}}" expansion which the linker tool will generally use to specify the output file name. See "gn help tool". @@ -4724,6 +4730,35 @@ ``` +## **output_prefix_override**: Don't use prefix for output name. + +``` + A boolean that overrides the output prefix for a target. Defaults to + false. + + Some systems use prefixes for the names of the final target output + file. The normal example is "libfoo.so" on Linux for a target + named "foo". + + The output prefix for a given target type is specified on the linker + tool (see "gn help tool"). Sometimes this prefix is undesired. + + See also "gn help output_extension". + +``` + +### **Example** + +``` + shared_library("doom_melon") { + # Normally this will produce "libdoom_melon.so" on Linux, setting + # Setting this flag will produce "doom_melon.so". + output_prefix_override = true + ... + } + + +``` ## **outputs**: Output files for actions and copy targets. ``` @@ -5131,6 +5166,29 @@ ``` +## **write_runtime_deps**: Writes the target's runtime_deps to the given path. + +``` + Does not synchronously write the file, but rather schedules it + to be written at the end of generation. + + If the file exists and the contents are identical to that being + written, the file will not be updated. This will prevent unnecessary + rebuilds of targets that depend on this file. + + Path must be within the output directory. + + See "gn help runtime_deps" for how the runtime dependencies are + computed. + + The format of this file will list one file per line with no escaping. + The files will be relative to the root_build_dir. The first line of + the file will be the main output file of the target itself. The file + contents will be the same as requesting the runtime deps be written on + the command line (see "gn help --runtime-deps-list-file"). + + +``` ## **Build Arguments Overview** ``` @@ -5561,8 +5619,8 @@ ``` Runtime dependencies of a target are exposed via the "runtime_deps" category of "gn desc" (see "gn help desc") or they can be written - at build generation time via "--runtime-deps-list-file" - (see "gn help --runtime-deps-list-file"). + at build generation time via write_runtime_deps(), or + --runtime-deps-list-file (see "gn help --runtime-deps-list-file"). To a first approximation, the runtime dependencies of a target are the set of "data" files, data directories, and the shared libraries
diff --git a/tools/gn/function_toolchain.cc b/tools/gn/function_toolchain.cc index 727be54..72097f2b 100644 --- a/tools/gn/function_toolchain.cc +++ b/tools/gn/function_toolchain.cc
@@ -534,6 +534,10 @@ " is not already there. The result will show up in the\n" " {{output_name}} substitution pattern.\n" "\n" + " Individual targets can opt-out of the output prefix by setting:\n" + " output_prefix_override = true\n" + " (see \"gn help output_prefix_override\").\n" + "\n" " This is typically used to prepend \"lib\" to libraries on\n" " Posix systems:\n" " output_prefix = \"lib\"\n"
diff --git a/tools/gn/ninja_binary_target_writer.cc b/tools/gn/ninja_binary_target_writer.cc index b1bf8032..eaae098 100644 --- a/tools/gn/ninja_binary_target_writer.cc +++ b/tools/gn/ninja_binary_target_writer.cc
@@ -854,15 +854,9 @@ } void NinjaBinaryTargetWriter::WriteOutputExtension() { - out_ << " output_extension = "; - if (target_->output_extension().empty()) { - // Use the default from the tool. - out_ << tool_->default_output_extension(); - } else { - // Use the one specified in the target. Note that the one in the target - // does not include the leading dot, so add that. - out_ << "." << target_->output_extension(); - } + out_ << " output_extension = " + << SubstitutionWriter::GetLinkerSubstitution( + target_, tool_, SUBSTITUTION_OUTPUT_EXTENSION); out_ << std::endl; }
diff --git a/tools/gn/ninja_binary_target_writer_unittest.cc b/tools/gn/ninja_binary_target_writer_unittest.cc index c9b3ebe..0b87883 100644 --- a/tools/gn/ninja_binary_target_writer_unittest.cc +++ b/tools/gn/ninja_binary_target_writer_unittest.cc
@@ -241,10 +241,12 @@ setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); - // This test is the same as ProductExtension, except that - // we call set_output_extension("") and ensure that we still get the default. + // This test is the same as ProductExtension, except that we call + // set_output_extension("") and ensure that we get an empty one and override + // the output prefix so that the name matches the target exactly. Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); target.set_output_type(Target::SHARED_LIBRARY); + target.set_output_prefix_override(true); target.set_output_extension(std::string()); target.sources().push_back(SourceFile("//foo/input1.cc")); target.sources().push_back(SourceFile("//foo/input2.cc")); @@ -263,16 +265,16 @@ "cflags_cc =\n" "root_out_dir = .\n" "target_out_dir = obj/foo\n" - "target_output_name = libshlib\n" + "target_output_name = shlib\n" "\n" - "build obj/foo/libshlib.input1.o: cxx ../../foo/input1.cc\n" - "build obj/foo/libshlib.input2.o: cxx ../../foo/input2.cc\n" + "build obj/foo/shlib.input1.o: cxx ../../foo/input1.cc\n" + "build obj/foo/shlib.input2.o: cxx ../../foo/input2.cc\n" "\n" - "build ./libshlib.so: solink obj/foo/libshlib.input1.o " - "obj/foo/libshlib.input2.o\n" + "build ./shlib: solink obj/foo/shlib.input1.o " + "obj/foo/shlib.input2.o\n" " ldflags =\n" " libs =\n" - " output_extension = .so\n"; + " output_extension = \n"; std::string out_str = out.str(); EXPECT_EQ(expected, out_str);
diff --git a/tools/gn/substitution_writer.cc b/tools/gn/substitution_writer.cc index 99abced1e..23d6914 100644 --- a/tools/gn/substitution_writer.cc +++ b/tools/gn/substitution_writer.cc
@@ -448,7 +448,7 @@ result); break; case SUBSTITUTION_TARGET_OUTPUT_NAME: - *result = target->GetComputedOutputName(true); + *result = target->GetComputedOutputName(); break; default: return false; @@ -547,11 +547,13 @@ // Fall-through to the linker-specific ones. switch (type) { case SUBSTITUTION_OUTPUT_EXTENSION: - // Use the extension provided on the target if nonempty, otherwise + // Use the extension provided on the target if specified, otherwise // fall back on the default. Note that the target's output extension // does not include the dot but the tool's does. - if (target->output_extension().empty()) + if (!target->output_extension_set()) return tool->default_output_extension(); + if (target->output_extension().empty()) + return std::string(); // Explicitly set to no extension. return std::string(".") + target->output_extension(); default:
diff --git a/tools/gn/substitution_writer_unittest.cc b/tools/gn/substitution_writer_unittest.cc index 36d027b..77374f1 100644 --- a/tools/gn/substitution_writer_unittest.cc +++ b/tools/gn/substitution_writer_unittest.cc
@@ -268,4 +268,14 @@ OutputFile output = SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( &target, tool, pattern); EXPECT_EQ("./libbaz.so", output.value()); + + // Output extensions can be overridden. + target.set_output_extension("extension"); + EXPECT_EQ(".extension", + SubstitutionWriter::GetLinkerSubstitution( + &target, tool, SUBSTITUTION_OUTPUT_EXTENSION)); + target.set_output_extension(""); + EXPECT_EQ("", + SubstitutionWriter::GetLinkerSubstitution( + &target, tool, SUBSTITUTION_OUTPUT_EXTENSION)); }
diff --git a/tools/gn/target.cc b/tools/gn/target.cc index 005dd97..18c353e 100644 --- a/tools/gn/target.cc +++ b/tools/gn/target.cc
@@ -212,6 +212,8 @@ Target::Target(const Settings* settings, const Label& label) : Item(settings, label), output_type_(UNKNOWN), + output_prefix_override_(false), + output_extension_set_(false), all_headers_public_(true), check_includes_(true), complete_static_lib_(false), @@ -358,7 +360,7 @@ &public_deps_, &private_deps_, &data_deps_)); } -std::string Target::GetComputedOutputName(bool include_prefix) const { +std::string Target::GetComputedOutputName() const { DCHECK(toolchain_) << "Toolchain must be specified before getting the computed output name."; @@ -366,14 +368,14 @@ : output_name_; std::string result; - if (include_prefix) { - const Tool* tool = toolchain_->GetToolForTargetFinalOutput(this); - if (tool) { - // Only add the prefix if the name doesn't already have it. - if (!base::StartsWith(name, tool->output_prefix(), - base::CompareCase::SENSITIVE)) - result = tool->output_prefix(); - } + const Tool* tool = toolchain_->GetToolForTargetFinalOutput(this); + if (tool) { + // Only add the prefix if the name doesn't already have it and it's not + // being overridden. + if (!output_prefix_override_ && + !base::StartsWith(name, tool->output_prefix(), + base::CompareCase::SENSITIVE)) + result = tool->output_prefix(); } result.append(name); return result; @@ -536,7 +538,7 @@ // entry in the outputs. These stamps are named // "<target_out_dir>/<targetname>.stamp". dependency_output_file_ = GetTargetOutputDirAsOutputFile(this); - dependency_output_file_.value().append(GetComputedOutputName(true)); + dependency_output_file_.value().append(GetComputedOutputName()); dependency_output_file_.value().append(".stamp"); break; }
diff --git a/tools/gn/target.h b/tools/gn/target.h index c3fed012..fdd6f1a 100644 --- a/tools/gn/target.h +++ b/tools/gn/target.h
@@ -89,16 +89,29 @@ void set_output_name(const std::string& name) { output_name_ = name; } // Returns the output name for this target, which is the output_name if - // specified, or the target label if not. If the flag is set, it will also - // include any output prefix specified on the tool (often "lib" on Linux). + // specified, or the target label if not. // // Because this depends on the tool for this target, the toolchain must // have been set before calling. - std::string GetComputedOutputName(bool include_prefix) const; + std::string GetComputedOutputName() const; + bool output_prefix_override() const { return output_prefix_override_; } + void set_output_prefix_override(bool prefix_override) { + output_prefix_override_ = prefix_override; + } + + // The output extension is really a tri-state: unset (output_extension_set + // is false and the string is empty, meaning the default extension should be + // used), the output extension is set but empty (output should have no + // extension) and the output extension is set but nonempty (use the given + // extension). const std::string& output_extension() const { return output_extension_; } void set_output_extension(const std::string& extension) { output_extension_ = extension; + output_extension_set_ = true; + } + bool output_extension_set() const { + return output_extension_set_; } const FileList& sources() const { return sources_; } @@ -318,7 +331,9 @@ OutputType output_type_; std::string output_name_; + bool output_prefix_override_; std::string output_extension_; + bool output_extension_set_; FileList sources_; bool all_headers_public_;
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc index b3a85b7..8629ff21 100644 --- a/tools/gn/target_unittest.cc +++ b/tools/gn/target_unittest.cc
@@ -270,30 +270,32 @@ // no prefix) or output name. TestTarget basic(setup, "//foo:bar", Target::EXECUTABLE); ASSERT_TRUE(basic.OnResolved(&err)); - EXPECT_EQ("bar", basic.GetComputedOutputName(false)); - EXPECT_EQ("bar", basic.GetComputedOutputName(true)); + EXPECT_EQ("bar", basic.GetComputedOutputName()); // Target with no prefix but an output name. TestTarget with_name(setup, "//foo:bar", Target::EXECUTABLE); with_name.set_output_name("myoutput"); ASSERT_TRUE(with_name.OnResolved(&err)); - EXPECT_EQ("myoutput", with_name.GetComputedOutputName(false)); - EXPECT_EQ("myoutput", with_name.GetComputedOutputName(true)); + EXPECT_EQ("myoutput", with_name.GetComputedOutputName()); // Target with a "lib" prefix (the static library tool in the TestWithScope // should specify a "lib" output prefix). TestTarget with_prefix(setup, "//foo:bar", Target::STATIC_LIBRARY); ASSERT_TRUE(with_prefix.OnResolved(&err)); - EXPECT_EQ("bar", with_prefix.GetComputedOutputName(false)); - EXPECT_EQ("libbar", with_prefix.GetComputedOutputName(true)); + EXPECT_EQ("libbar", with_prefix.GetComputedOutputName()); // Target with a "lib" prefix that already has it applied. The prefix should // not duplicate something already in the target name. TestTarget dup_prefix(setup, "//foo:bar", Target::STATIC_LIBRARY); dup_prefix.set_output_name("libbar"); ASSERT_TRUE(dup_prefix.OnResolved(&err)); - EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(false)); - EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName(true)); + EXPECT_EQ("libbar", dup_prefix.GetComputedOutputName()); + + // Target with an output prefix override should not have a prefix. + TestTarget override_prefix(setup, "//foo:bar", Target::SHARED_LIBRARY); + override_prefix.set_output_prefix_override(true); + ASSERT_TRUE(dup_prefix.OnResolved(&err)); + EXPECT_EQ("bar", override_prefix.GetComputedOutputName()); } // Test visibility failure case.
diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc index 88e0ed1..4c5fae1 100644 --- a/tools/gn/variables.cc +++ b/tools/gn/variables.cc
@@ -1092,9 +1092,11 @@ " override the name (for example to use \"libfreetype.so.6\" instead\n" " of libfreetype.so on Linux).\n" "\n" - " This value should not include a leading dot. If undefined or empty,\n" - " the default_output_extension specified on the tool will be used.\n" - " The output_extension will be used in the \"{{output_extension}}\"\n" + " This value should not include a leading dot. If undefined, the default\n" + " specified on the tool will be used. If set to the empty string, no\n" + " output extension will be used.\n" + "\n" + " The output_extension will be used to set the \"{{output_extension}}\"\n" " expansion which the linker tool will generally use to specify the\n" " output file name. See \"gn help tool\".\n" "\n" @@ -1145,6 +1147,33 @@ " output_name = \"fluffy_bunny\"\n" " }\n"; +const char kOutputPrefixOverride[] = "output_prefix_override"; +const char kOutputPrefixOverride_HelpShort[] = + "output_prefix_override: [boolean] Don't use prefix for output name."; +const char kOutputPrefixOverride_Help[] = + "output_prefix_override: Don't use prefix for output name.\n" + "\n" + " A boolean that overrides the output prefix for a target. Defaults to\n" + " false.\n" + "\n" + " Some systems use prefixes for the names of the final target output\n" + " file. The normal example is \"libfoo.so\" on Linux for a target\n" + " named \"foo\".\n" + "\n" + " The output prefix for a given target type is specified on the linker\n" + " tool (see \"gn help tool\"). Sometimes this prefix is undesired.\n" + "\n" + " See also \"gn help output_extension\".\n" + "\n" + "Example\n" + "\n" + " shared_library(\"doom_melon\") {\n" + " # Normally this will produce \"libdoom_melon.so\" on Linux, setting\n" + " # Setting this flag will produce \"doom_melon.so\".\n" + " output_prefix_override = true\n" + " ...\n" + " }\n"; + const char kOutputs[] = "outputs"; const char kOutputs_HelpShort[] = "outputs: [file list] Output files for actions and copy targets."; @@ -1609,6 +1638,7 @@ INSERT_VARIABLE(LibDirs) INSERT_VARIABLE(OutputExtension) INSERT_VARIABLE(OutputName) + INSERT_VARIABLE(OutputPrefixOverride) INSERT_VARIABLE(Outputs) INSERT_VARIABLE(PrecompiledHeader) INSERT_VARIABLE(PrecompiledSource)
diff --git a/tools/gn/variables.h b/tools/gn/variables.h index 27bde5ab..08fea1a 100644 --- a/tools/gn/variables.h +++ b/tools/gn/variables.h
@@ -191,6 +191,10 @@ extern const char kOutputName_HelpShort[]; extern const char kOutputName_Help[]; +extern const char kOutputPrefixOverride[]; +extern const char kOutputPrefixOverride_HelpShort[]; +extern const char kOutputPrefixOverride_Help[]; + extern const char kOutputs[]; extern const char kOutputs_HelpShort[]; extern const char kOutputs_Help[];
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index f0cd4fa..c371698 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -728,7 +728,6 @@ 'swarming_chromeos_gyp_release_trybot', 'linux_chromium_chromeos_rel_ng': 'swarming_chromeos_gyp_release_trybot', 'linux_chromium_chromeos_variable_chrome': 'findit', - 'linux_chromium_clang_upload': 'gn_release_bot', 'linux_chromium_clobber_rel_ng': 'gn_release_trybot', 'linux_chromium_compile_dbg_32_ng': 'swarming_gyp_debug_trybot_x86', 'linux_chromium_compile_dbg_ng': 'swarming_gn_debug_trybot', @@ -759,6 +758,7 @@ 'linux_optional_gpu_tests_rel': 'swarming_gpu_fyi_tests_gn_release_trybot', 'linux_site_isolation': 'gn_release_trybot', + 'linux_upload_clang': 'gn_release_bot', 'linux_valgrind': 'gyp_valgrind_release_bot', }, @@ -779,7 +779,6 @@ 'ios_rel_device': 'ios_gyp', 'ios_rel_device_gn': 'ios_gn', 'ios_rel_device_ninja': 'ios_gyp', - 'mac_chromium_clang_upload': 'gn_release_bot', 'mac_chromium_gn_dbg': 'gn_debug_static_bot', 'mac_chromium_gn_rel': 'gn_release_trybot', 'mac_chromium_gn_upload': 'gn_release_bot', @@ -792,6 +791,7 @@ 'mac_chromium_variable_layout': 'findit', 'mac_nacl_sdk': 'nacl_annotator', 'mac_nacl_sdk_build': 'nacl_annotator', + 'mac_upload_clang': 'gn_release_bot', }, 'tryserver.chromium.perf': { @@ -844,7 +844,6 @@ 'win8_chromium_gn_upload': 'gn_release_bot_minimal_symbols_x86', 'win8_chromium_ng': 'gn_release_trybot_x86', 'win_archive': 'noswarming_gyp_release_trybot_minimal_symbols_x86', - 'win_chromium_clang_upload': 'gn_release_bot', 'win_chromium_compile_dbg_ng': 'swarming_gyp_debug_bot_minimal_symbols_x86', 'win_chromium_compile_rel_ng': @@ -878,6 +877,7 @@ 'win_optional_gpu_tests_rel': 'swarming_gpu_tests_deqp_gles_gyp_release_trybot_minimal_symbols_x86', 'win_pgo': 'gyp_official_winpgo', + 'win_upload_clang': 'gn_release_bot', }, 'tryserver.v8': { @@ -1636,7 +1636,8 @@ # build. 'blimp': { 'gn_args': ('use_aura=true use_ozone=true use_alsa=false ' - 'use_pulseaudio=false use_cups=false use_glib=false'), + 'use_pulseaudio=false use_cups=false use_glib=false ' + 'use_low_quality_image_interpolation=true'), 'gyp_defines': ('use_aura=1 use_ozone=1 use_alsa=0 ' 'use_pulseaudio=0 use_cups=0 use_glib=0'), },
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 62f4b2ac..c6acac4 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -1355,6 +1355,15 @@ </summary> </histogram> +<histogram name="Ash.Wallpaper.Source" enum="WallpaperType"> + <owner>xdai@chromium.org</owner> + <summary> + Recorded when a new wallpaper is set, either by the built-in Wallpaper + Picker App, or by a third party App. Note the wallpaper change triggered by + Sync file system event doesn't count. + </summary> +</histogram> + <histogram name="Ash.Wallpaper.Type" enum="WallpaperType"> <owner>kuscher@google.com</owner> <summary>The wallpaper type. Recorded at user login.</summary> @@ -34560,6 +34569,28 @@ </summary> </histogram> +<histogram name="PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite" + units="ms"> + <owner>bmcquade@chromium.org</owner> + <owner>csharrison@chromium.org</owner> + <summary> + Measures the time that the HTML parser spent blocked on the load of scripts + inserted from document.write, for main frame documents that started parsing. + </summary> +</histogram> + +<histogram + name="PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite.ParseComplete" + units="ms"> + <owner>bmcquade@chromium.org</owner> + <owner>csharrison@chromium.org</owner> + <summary> + Measures the time that the HTML parser spent blocked on the load of scripts + inserted from document.write, for main frame documents that finished + parsing. + </summary> +</histogram> + <histogram name="PageLoad.Timing2.ParseDuration" units="ms"> <owner>bmcquade@chromium.org</owner> <owner>csharrison@chromium.org</owner> @@ -46178,6 +46209,17 @@ </summary> </histogram> +<histogram name="Search.ContextualSearchMandatoryPromoOutcomeByGesture" + enum="ContextualSearchOutcomeByGesture"> + <owner>donnd@chromium.org</owner> + <owner>pedrosimonetti@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <summary> + The outcome of the mandatory Promo broken down by original triggering + gesture. Logged for each view of the promo. Implemented for Android. + </summary> +</histogram> + <histogram name="Search.ContextualSearchNormalPrioritySearchRequestStatus" enum="ContextualSearchSearchRequestStatus"> <owner>donnd@chromium.org</owner> @@ -46375,6 +46417,19 @@ </summary> </histogram> +<histogram name="Search.ContextualSearchResultsSeenSelectionWasUrl" + enum="ContextualSearchSeenByGesture"> + <owner>donnd@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <summary> + Whether search results were seen (Contextual Search panel was opened) when + the selection was part of a URL, broken down by original triggering gesture. + Includes both users that have enabled Contextual Search and users that are + undecided (have neither enabled or disabled the feature). Implemented for + Android. + </summary> +</histogram> + <histogram name="Search.ContextualSearchSelectionValid" enum="ContextualSearchSelectionValid"> <owner>donnd@chromium.org</owner> @@ -50110,6 +50165,16 @@ </summary> </histogram> +<histogram name="SSL.ExpectCTReportFailure" enum="NetErrorCodes"> + <owner>estark@chromium.org</owner> + <summary> + Sites can opt in to Expect CT, a reporting feature that sends a report + whenever a TLS connection does not have valid Certificate Transparency + information associated with it. This records the error code when Chrome + fails to send an Expect CT report. + </summary> +</histogram> + <histogram name="SSL.InsecureContent" enum="InsecureContentType"> <owner>lgarron@chromium.org</owner> <summary> @@ -60602,6 +60667,41 @@ <int value="17" label="Volume decibels"/> <int value="18" label="Volume scalar"/> <int value="19" label="Mute"/> + <int value="20" label="Plugin"/> + <int value="21" label="Uses variable buffer fram sizes"/> + <int value="22" label="IO cycle usage"/> + <int value="23" label="IO proc stream usage"/> + <int value="24" label="Configuration application"/> + <int value="25" label="Device UID"/> + <int value="26" label="Mode UID"/> + <int value="27" label="Transport type"/> + <int value="28" label="Related devices"/> + <int value="29" label="Clock domain"/> + <int value="30" label="Device can be default device"/> + <int value="31" label="Device can be default system device"/> + <int value="32" label="Latency"/> + <int value="33" label="Streams"/> + <int value="34" label="Control list"/> + <int value="35" label="Safety offset"/> + <int value="36" label="Available nominal sample rates"/> + <int value="37" label="Icon"/> + <int value="38" label="Is hidden"/> + <int value="39" label="Preferred channels for stereo"/> + <int value="40" label="Preferred channel layout"/> + <int value="41" label="Volume range decibels"/> + <int value="42" label="Volume scalar to decibels"/> + <int value="43" label="Volume decibel to scalar"/> + <int value="44" label="Stereo pan"/> + <int value="45" label="Stereo pan channels"/> + <int value="46" label="Solo"/> + <int value="47" label="Phantom power"/> + <int value="48" label="Phase invert"/> + <int value="49" label="Clip light"/> + <int value="50" label="Talkback"/> + <int value="51" label="Listenback"/> + <int value="52" label="Clock source"/> + <int value="53" label="Clock sources"/> + <int value="54" label="Sub mute"/> </enum> <enum name="AudioFramesPerBuffer" type="int"> @@ -68355,6 +68455,7 @@ <int value="1111" label="INPUT_IME_SHOWWINDOW"/> <int value="1112" label="INPUT_IME_HIDEWINDOW"/> <int value="1113" label="INPUTMETHODPRIVATE_SHOWINPUTVIEW"/> + <int value="1114" label="WALLPAPERPRIVATE_RECORDWALLPAPERUMA"/> </enum> <enum name="ExtensionInstallCause" type="int"> @@ -70267,6 +70368,9 @@ <int value="1281" label="InvalidReportUriDirectiveInMetaCSP"/> <int value="1282" label="InvalidSandboxDirectiveInMetaCSP"/> <int value="1283" label="InvalidFrameAncestorsDirectiveInMetaCSP"/> + <int value="1284" label="TouchDragUserGestureUsed"/> + <int value="1285" label="TouchDragUserGestureUsedCrossOrigin"/> + <int value="1286" label="DocumentCreateEventForeignFetchEvent"/> </enum> <enum name="FetchRequestMode" type="int"> @@ -90252,6 +90356,10 @@ <affected-histogram name="PageLoad.Timing2.ParseBlockedOnScriptLoad"/> <affected-histogram name="PageLoad.Timing2.ParseBlockedOnScriptLoad.ParseComplete"/> + <affected-histogram + name="PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite"/> + <affected-histogram + name="PageLoad.Timing2.ParseBlockedOnScriptLoadFromDocumentWrite.ParseComplete"/> <affected-histogram name="PageLoad.Timing2.ParseDuration"/> </histogram_suffixes>
diff --git a/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate b/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate index 86b8e249..86bce4b 100644 --- a/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate +++ b/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate
@@ -6,6 +6,7 @@ # that run in Chromium. 'includes': [ '../../../chrome/breakpad.isolate', + '../../../chrome/cdb.isolate', '../../../chrome/chrome.isolate', 'telemetry_binary_manager.isolate', ],
diff --git a/tools/perf/core/stacktrace_unittest.py b/tools/perf/core/stacktrace_unittest.py index 59baa65..9ab0625 100644 --- a/tools/perf/core/stacktrace_unittest.py +++ b/tools/perf/core/stacktrace_unittest.py
@@ -14,8 +14,8 @@ # TODO(dyen): For now this doesn't work on Android but continue to # expand this. - # TODO(kbr): this test doesn't work on the Windows Swarming bots - # yet. http://crbug.com/561763 + # TODO(kbr): currently failing on Windows because the symbolized + # stack trace format is unexpected. http://crbug.com/561763 @decorators.Enabled('mac', 'linux') # Stack traces do not currently work on 10.6, but they are also being # disabled shortly so just disable it for now. @@ -26,9 +26,7 @@ self.assertIn('Thread 0 (crashed)', '\n'.join(c.exception.stack_trace)) # Stack traces aren't working on Android yet. - # TODO(kbr): this test doesn't work on the Windows Swarming bots - # yet. http://crbug.com/561763 - @decorators.Enabled('mac', 'linux') + @decorators.Enabled('mac', 'linux', 'win') @decorators.Disabled('snowleopard') def testCrashSymbols(self): with self.assertRaises(exceptions.DevtoolsTargetCrashException) as c:
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index c8dc2c3..db554383 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -13,6 +13,8 @@ if (is_android) { import("//build/config/android/config.gni") import("//build/config/android/rules.gni") +} else if (is_mac) { + import("//build/config/mac/rules.gni") } build_ime = !is_ios @@ -891,8 +893,8 @@ if (is_mac) { deps += [ + ":ui_unittests Framework", "//third_party/mozilla", - #'ui_base_tests_bundle', TODO(GYP) ] } @@ -947,4 +949,13 @@ } } } -# TODO(GYP) Mac (ui_base_tests_bundle) + +if (is_mac) { + mac_framework("ui_unittests Framework") { + testonly = true + deps = [ + "//ui/resources:ui_test_pak_bundle_data", + ] + info_plist = "test/framework-Info.plist" + } +}
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc index 6d84255..af58ac5 100644 --- a/ui/compositor/test/in_process_context_factory.cc +++ b/ui/compositor/test/in_process_context_factory.cc
@@ -102,23 +102,6 @@ void InProcessContextFactory::CreateOutputSurface( base::WeakPtr<Compositor> compositor) { - gpu::gles2::ContextCreationAttribHelper attribs; - attribs.alpha_size = 8; - attribs.blue_size = 8; - attribs.green_size = 8; - attribs.red_size = 8; - attribs.depth_size = 0; - attribs.stencil_size = 0; - attribs.samples = 0; - attribs.sample_buffers = 0; - attribs.fail_if_major_perf_caveat = false; - attribs.bind_generates_resource = false; - - scoped_refptr<InProcessContextProvider> context_provider = - InProcessContextProvider::Create(attribs, &gpu_memory_buffer_manager_, - &image_factory_, - compositor->widget(), "UICompositor"); - // Try to reuse existing shared worker context provider. bool shared_worker_context_provider_lost = false; if (shared_worker_context_provider_) { @@ -131,7 +114,7 @@ } if (!shared_worker_context_provider_ || shared_worker_context_provider_lost) { shared_worker_context_provider_ = InProcessContextProvider::CreateOffscreen( - &gpu_memory_buffer_manager_, &image_factory_); + &gpu_memory_buffer_manager_, &image_factory_, nullptr); if (shared_worker_context_provider_ && !shared_worker_context_provider_->BindToCurrentThread()) shared_worker_context_provider_ = nullptr; @@ -139,6 +122,23 @@ shared_worker_context_provider_->SetupLock(); } + gpu::gles2::ContextCreationAttribHelper attribs; + attribs.alpha_size = 8; + attribs.blue_size = 8; + attribs.green_size = 8; + attribs.red_size = 8; + attribs.depth_size = 0; + attribs.stencil_size = 0; + attribs.samples = 0; + attribs.sample_buffers = 0; + attribs.fail_if_major_perf_caveat = false; + attribs.bind_generates_resource = false; + scoped_refptr<InProcessContextProvider> context_provider = + InProcessContextProvider::Create( + attribs, shared_worker_context_provider_.get(), + &gpu_memory_buffer_manager_, &image_factory_, compositor->widget(), + "UICompositor"); + scoped_ptr<cc::OutputSurface> real_output_surface; if (use_test_surface_) { @@ -190,7 +190,7 @@ return shared_main_thread_contexts_; shared_main_thread_contexts_ = InProcessContextProvider::CreateOffscreen( - &gpu_memory_buffer_manager_, &image_factory_); + &gpu_memory_buffer_manager_, &image_factory_, nullptr); if (shared_main_thread_contexts_.get() && !shared_main_thread_contexts_->BindToCurrentThread()) shared_main_thread_contexts_ = NULL;
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc index 11f9d28..1eac2df 100644 --- a/ui/compositor/test/in_process_context_provider.cc +++ b/ui/compositor/test/in_process_context_provider.cc
@@ -23,19 +23,22 @@ // static scoped_refptr<InProcessContextProvider> InProcessContextProvider::Create( const gpu::gles2::ContextCreationAttribHelper& attribs, + InProcessContextProvider* shared_context, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, gfx::AcceleratedWidget window, const std::string& debug_name) { - return new InProcessContextProvider( - attribs, gpu_memory_buffer_manager, image_factory, window, debug_name); + return new InProcessContextProvider(attribs, shared_context, + gpu_memory_buffer_manager, image_factory, + window, debug_name); } // static scoped_refptr<InProcessContextProvider> InProcessContextProvider::CreateOffscreen( gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, - gpu::ImageFactory* image_factory) { + gpu::ImageFactory* image_factory, + InProcessContextProvider* shared_context) { gpu::gles2::ContextCreationAttribHelper attribs; attribs.alpha_size = 8; attribs.blue_size = 8; @@ -47,18 +50,20 @@ attribs.sample_buffers = 0; attribs.fail_if_major_perf_caveat = false; attribs.bind_generates_resource = false; - return new InProcessContextProvider(attribs, gpu_memory_buffer_manager, - image_factory, + return new InProcessContextProvider(attribs, shared_context, + gpu_memory_buffer_manager, image_factory, gfx::kNullAcceleratedWidget, "Offscreen"); } InProcessContextProvider::InProcessContextProvider( const gpu::gles2::ContextCreationAttribHelper& attribs, + InProcessContextProvider* shared_context, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, gfx::AcceleratedWidget window, const std::string& debug_name) : attribs_(attribs), + shared_context_(shared_context), gpu_memory_buffer_manager_(gpu_memory_buffer_manager), image_factory_(image_factory), window_(window), @@ -81,19 +86,16 @@ if (!context_) { gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; context_.reset(gpu::GLInProcessContext::Create( - nullptr, /* service */ - nullptr, /* surface */ - !window_, /* is_offscreen */ - window_, gfx::Size(1, 1), nullptr, /* share_context */ - true, /* share_resources */ - attribs_, gpu_preference, gpu::GLInProcessContextSharedMemoryLimits(), + nullptr, /* service */ + nullptr, /* surface */ + !window_, /* is_offscreen */ + window_, gfx::Size(1, 1), + (shared_context_ ? shared_context_->context_.get() : nullptr), attribs_, + gpu_preference, gpu::GLInProcessContextSharedMemoryLimits(), gpu_memory_buffer_manager_, image_factory_)); if (!context_) return false; - - context_->SetContextLostCallback(base::Bind( - &InProcessContextProvider::OnLostContext, base::Unretained(this))); } capabilities_.gpu = context_->GetImplementation()->capabilities(); @@ -168,15 +170,7 @@ void InProcessContextProvider::SetLostContextCallback( const LostContextCallback& lost_context_callback) { - lost_context_callback_ = lost_context_callback; -} - -void InProcessContextProvider::OnLostContext() { - DCHECK(context_thread_checker_.CalledOnValidThread()); - if (!lost_context_callback_.is_null()) - base::ResetAndReturn(&lost_context_callback_).Run(); - if (gr_context_) - gr_context_->abandonContext(); + // Pixel tests do not test lost context. } } // namespace ui
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h index b7c8565..5e0447c 100644 --- a/ui/compositor/test/in_process_context_provider.h +++ b/ui/compositor/test/in_process_context_provider.h
@@ -30,6 +30,7 @@ public: static scoped_refptr<InProcessContextProvider> Create( const gpu::gles2::ContextCreationAttribHelper& attribs, + InProcessContextProvider* shared_context, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, gfx::AcceleratedWidget window, @@ -38,7 +39,8 @@ // Uses default attributes for creating an offscreen context. static scoped_refptr<InProcessContextProvider> CreateOffscreen( gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, - gpu::ImageFactory* image_factory); + gpu::ImageFactory* image_factory, + InProcessContextProvider* shared_context); // cc::ContextProvider: bool BindToCurrentThread() override; @@ -57,14 +59,13 @@ private: InProcessContextProvider( const gpu::gles2::ContextCreationAttribHelper& attribs, + InProcessContextProvider* shared_context, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, gfx::AcceleratedWidget window, const std::string& debug_name); ~InProcessContextProvider() override; - void OnLostContext(); - base::ThreadChecker main_thread_checker_; base::ThreadChecker context_thread_checker_; @@ -72,14 +73,13 @@ skia::RefPtr<class GrContext> gr_context_; gpu::gles2::ContextCreationAttribHelper attribs_; + InProcessContextProvider* shared_context_; gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_; gpu::ImageFactory* image_factory_; gfx::AcceleratedWidget window_; std::string debug_name_; cc::ContextProvider::Capabilities capabilities_; - LostContextCallback lost_context_callback_; - base::Lock context_lock_; DISALLOW_COPY_AND_ASSIGN(InProcessContextProvider);
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index 20ed6af..226485b3 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -37,6 +37,10 @@ "display_export.h", "display_switches.cc", "display_switches.h", + "manager/display_layout.cc", + "manager/display_layout.h", + "manager/display_layout_builder.cc", + "manager/display_layout_builder.h", "win/display_info.cc", "win/display_info.h", "win/screen_win.cc", @@ -146,6 +150,7 @@ "chromeos/update_display_configuration_task_unittest.cc", "chromeos/x11/display_util_x11_unittest.cc", "chromeos/x11/native_display_event_dispatcher_x11_unittest.cc", + "manager/display_layout_builder_unittest.cc", "util/display_util_unittest.cc", "util/edid_parser_unittest.cc", "win/screen_win_unittest.cc",
diff --git a/ui/display/display.gyp b/ui/display/display.gyp index 2e1426f..a5c46448 100644 --- a/ui/display/display.gyp +++ b/ui/display/display.gyp
@@ -76,6 +76,10 @@ 'display_export.h', 'display_switches.cc', 'display_switches.h', + 'manager/display_layout.cc', + 'manager/display_layout.h', + 'manager/display_layout_builder.cc', + 'manager/display_layout_builder.h', 'win/display_info.cc', 'win/display_info.h', 'win/screen_win.cc', @@ -216,6 +220,7 @@ 'chromeos/update_display_configuration_task_unittest.cc', 'chromeos/x11/display_util_x11_unittest.cc', 'chromeos/x11/native_display_event_dispatcher_x11_unittest.cc', + 'manager/display_layout_builder_unittest.cc', 'util/display_util_unittest.cc', 'util/edid_parser_unittest.cc', 'win/screen_win_unittest.cc',
diff --git a/ash/display/display_layout.cc b/ui/display/manager/display_layout.cc similarity index 96% rename from ash/display/display_layout.cc rename to ui/display/manager/display_layout.cc index 1cc7b7f..88128885 100644 --- a/ash/display/display_layout.cc +++ b/ui/display/manager/display_layout.cc
@@ -1,22 +1,19 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/display/display_layout.h" +#include "ui/display/manager/display_layout.h" #include <algorithm> #include <sstream> -#include "ash/ash_switches.h" -#include "ash/display/display_pref_util.h" -#include "ash/shell.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/values.h" #include "ui/gfx/display.h" -namespace ash { +namespace display { namespace { // DisplayPlacement Positions @@ -256,4 +253,4 @@ : DisplayPlacement(*iter); } -} // namespace ash +} // namespace display
diff --git a/ash/display/display_layout.h b/ui/display/manager/display_layout.h similarity index 88% rename from ash/display/display_layout.h rename to ui/display/manager/display_layout.h index fd056130..7f5c99c8 100644 --- a/ash/display/display_layout.h +++ b/ui/display/manager/display_layout.h
@@ -1,19 +1,19 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_DISPLAY_DISPLAY_LAYOUT_H_ -#define ASH_DISPLAY_DISPLAY_LAYOUT_H_ +#ifndef UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_H_ +#define UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_H_ #include <stdint.h> #include <string> #include <vector> -#include "ash/ash_export.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/strings/string_piece.h" +#include "ui/display/display_export.h" namespace base { class Value; @@ -24,7 +24,7 @@ class Display; } -namespace ash { +namespace display { // An identifier used to manage display layout in DisplayManager / // DisplayLayoutStore. @@ -45,7 +45,7 @@ // | | // +--------+ // -struct ASH_EXPORT DisplayPlacement { +struct DISPLAY_EXPORT DisplayPlacement { // The id of the display this placement will be applied to. int64_t display_id; @@ -73,7 +73,7 @@ Position* position); }; -class ASH_EXPORT DisplayLayout final { +class DISPLAY_EXPORT DisplayLayout final { public: DisplayLayout(); ~DisplayLayout(); @@ -109,6 +109,6 @@ DISALLOW_COPY_AND_ASSIGN(DisplayLayout); }; -} // namespace ash +} // namespace display -#endif +#endif // UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_H_
diff --git a/ash/display/display_layout_builder.cc b/ui/display/manager/display_layout_builder.cc similarity index 94% rename from ash/display/display_layout_builder.cc rename to ui/display/manager/display_layout_builder.cc index 579337f..8376e74 100644 --- a/ash/display/display_layout_builder.cc +++ b/ui/display/manager/display_layout_builder.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/display/display_layout_builder.h" +#include "ui/display/manager/display_layout_builder.h" #include <algorithm> -namespace ash { +namespace display { DisplayLayoutBuilder::DisplayLayoutBuilder(const DisplayLayout& layout) : layout_(layout.Copy()) {} @@ -65,4 +65,4 @@ return std::move(layout_); } -} // namespace ash +} // namespace display
diff --git a/ash/display/display_layout_builder.h b/ui/display/manager/display_layout_builder.h similarity index 77% rename from ash/display/display_layout_builder.h rename to ui/display/manager/display_layout_builder.h index 5391a02..9b3caef 100644 --- a/ash/display/display_layout_builder.h +++ b/ui/display/manager/display_layout_builder.h
@@ -2,24 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_DISPLAY_DISPLAY_LAYOUT_BUILDER_H_ -#define ASH_DISPLAY_DISPLAY_LAYOUT_BUILDER_H_ +#ifndef UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_BUILDER_H_ +#define UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_BUILDER_H_ -#include "ash/display/display_layout.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "ui/display/display_export.h" +#include "ui/display/manager/display_layout.h" -namespace ash { +namespace display { class DisplayLayout; // A utility class to create a DisplayLayout instance. -class ASH_EXPORT DisplayLayoutBuilder final { +class DISPLAY_EXPORT DisplayLayoutBuilder final { public: // Creates a builder that uses a copy of the |layout| as a source. explicit DisplayLayoutBuilder(const DisplayLayout& layout); - // Ccreates a builder with the primary display id. + // Creates a builder with the primary display id. explicit DisplayLayoutBuilder(int64_t primary_id); ~DisplayLayoutBuilder(); @@ -51,6 +52,6 @@ DISALLOW_COPY_AND_ASSIGN(DisplayLayoutBuilder); }; -} // namespace ash +} // namespace display -#endif // ASH_DISPLAY_DISPLAY_LAYOUT_BUILDER_H_ +#endif // UI_DISPLAY_MANAGER_DISPLAY_LAYOUT_BUILDER_H_
diff --git a/ash/display/display_layout_builder_unittest.cc b/ui/display/manager/display_layout_builder_unittest.cc similarity index 87% rename from ash/display/display_layout_builder_unittest.cc rename to ui/display/manager/display_layout_builder_unittest.cc index 159790cd..591a16c 100644 --- a/ash/display/display_layout_builder_unittest.cc +++ b/ui/display/manager/display_layout_builder_unittest.cc
@@ -2,15 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/display/display_layout_builder.h" +#include "ui/display/manager/display_layout_builder.h" #include "testing/gtest/include/gtest/gtest.h" -namespace ash { +namespace display { -typedef testing::Test DisplayLayoutBuilderTest; - -TEST_F(DisplayLayoutBuilderTest, SecondaryPlacement) { +TEST(DisplayLayoutBuilderTest, SecondaryPlacement) { DisplayLayoutBuilder builder(1); builder.SetSecondaryPlacement(2, DisplayPlacement::LEFT, 30); scoped_ptr<DisplayLayout> layout(builder.Build()); @@ -22,7 +20,7 @@ EXPECT_EQ(DisplayPlacement::LEFT, layout->placement_list[0].position); } -TEST_F(DisplayLayoutBuilderTest, MultiplePlacement) { +TEST(DisplayLayoutBuilderTest, MultiplePlacement) { DisplayLayoutBuilder builder(1); builder.AddDisplayPlacement(5, 1, DisplayPlacement::TOP, 30); builder.AddDisplayPlacement(3, 5, DisplayPlacement::LEFT, 20); @@ -48,4 +46,4 @@ EXPECT_EQ(DisplayPlacement::TOP, layout->placement_list[2].position); } -} // namespace ash +} // namespace display
diff --git a/ui/events/blink/input_handler_proxy.cc b/ui/events/blink/input_handler_proxy.cc index 267d7399..68fe308 100644 --- a/ui/events/blink/input_handler_proxy.cc +++ b/ui/events/blink/input_handler_proxy.cc
@@ -1110,6 +1110,14 @@ input_handler_->SetSynchronousInputHandlerRootScrollOffset(root_offset); } +void InputHandlerProxy::SynchronouslyZoomBy(float magnify_delta, + const gfx::Point& anchor) { + DCHECK(synchronous_input_handler_); + input_handler_->PinchGestureBegin(); + input_handler_->PinchGestureUpdate(magnify_delta, anchor); + input_handler_->PinchGestureEnd(); +} + void InputHandlerProxy::HandleOverscroll( const gfx::Point& causal_event_viewport_point, const cc::InputHandlerScrollResult& scroll_result) {
diff --git a/ui/events/blink/input_handler_proxy.h b/ui/events/blink/input_handler_proxy.h index a1ccc83..4ef107fb 100644 --- a/ui/events/blink/input_handler_proxy.h +++ b/ui/events/blink/input_handler_proxy.h
@@ -80,6 +80,8 @@ void SynchronouslyAnimate(base::TimeTicks time) override; void SynchronouslySetRootScrollOffset( const gfx::ScrollOffset& root_offset) override; + void SynchronouslyZoomBy(float magnify_delta, + const gfx::Point& anchor) override; // blink::WebGestureCurveTarget implementation. bool scrollBy(const blink::WebFloatSize& offset,
diff --git a/ui/events/blink/synchronous_input_handler_proxy.h b/ui/events/blink/synchronous_input_handler_proxy.h index 36485f0..cafd7ce6 100644 --- a/ui/events/blink/synchronous_input_handler_proxy.h +++ b/ui/events/blink/synchronous_input_handler_proxy.h
@@ -8,6 +8,7 @@ #include "base/time/time.h" namespace gfx { +class Point; class ScrollOffset; class SizeF; } @@ -65,6 +66,12 @@ // from what was sent. virtual void SynchronouslySetRootScrollOffset( const gfx::ScrollOffset& root_offset) = 0; + + // Similar to SetRootScrollOffset above, to control the zoom level, ie scale + // factor. Note |magnify_delta| is an incremental rather than absolute value. + // SynchronousInputHandler should be given back the resulting absolute value. + virtual void SynchronouslyZoomBy(float magnify_delta, + const gfx::Point& anchor) = 0; }; } // namespace ui
diff --git a/ui/ozone/ozone.gni b/ui/ozone/ozone.gni index 2287c1ef..768ddf7 100644 --- a/ui/ozone/ozone.gni +++ b/ui/ozone/ozone.gni
@@ -41,22 +41,21 @@ ozone_platform_cast = true # For visual desktop Chromecast builds, override the default "headless" - # platform with --ozone-platform=egltest + # platform with --ozone-platform=x11. # TODO(halliwell): Create a libcast_graphics implementation for desktop - # using X11, and disable these two platforms. + # using X11, and disable this platform. if (is_cast_desktop_build && !disable_display) { - ozone_platform_egltest = true - ozone_platform_ozonex = true + ozone_platform_x11 = true } else { ozone_platform = "cast" } } else if (is_chromeos) { ozone_platform_gbm = true - ozone_platform_egltest = true + ozone_platform_x11 = true } else { # Build all platforms whose deps are in install-build-deps.sh. # Only these platforms will be compile tested by buildbots. - ozone_platform_egltest = true + ozone_platform_x11 = true } } }
diff --git a/ui/resources/BUILD.gn b/ui/resources/BUILD.gn index 6cd65373..1b407f37 100644 --- a/ui/resources/BUILD.gn +++ b/ui/resources/BUILD.gn
@@ -75,8 +75,9 @@ # This needs to be a separate target from ui_test_pak as ui_base_unittests # wants the generate .pak file in the bundle to be named en.lpro/locale.pak # while components_unittests wants it to be named ui_test.pak. - bundle_data("ui_test_pak_bundle_data") { + bundle_data("ui_test_pak_bundle_data_locale") { testonly = true + visibility = [ ":ui_test_pak_bundle_data" ] public_deps = [ ":ui_test_pak", ] @@ -87,6 +88,43 @@ "{{bundle_resources_dir}}/en.lproj/locale.pak", ] } + + bundle_data("ui_test_pak_bundle_data_test_pak") { + testonly = true + visibility = [ ":ui_test_pak_bundle_data" ] + public_deps = [ + ":ui_test_pak", + ] + sources = [ + "$root_out_dir/ui_test.pak", + ] + outputs = [ + "{{bundle_resources_dir}}/ui_test.pak", + ] + } + + bundle_data("ui_test_pak_bundle_data_100_percent") { + testonly = true + visibility = [ ":ui_test_pak_bundle_data" ] + public_deps = [ + ":ui_test_pak", + ] + sources = [ + "$root_out_dir/ui_test.pak", + ] + outputs = [ + "{{bundle_resources_dir}}/chrome_100_percent.pak", + ] + } + + group("ui_test_pak_bundle_data") { + testonly = true + public_deps = [ + ":ui_test_pak_bundle_data_100_percent", + ":ui_test_pak_bundle_data_locale", + ":ui_test_pak_bundle_data_test_pak", + ] + } } else { copy("ui_test_pak") { sources = [
diff --git a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm index d25a662..73e02ec 100644 --- a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm +++ b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
@@ -23,6 +23,10 @@ void set_checked_command(int command) { checked_command_ = command; } + void set_menu_open_callback(const base::Closure& callback) { + menu_open_callback_ = callback; + } + private: class Delegate : public ui::SimpleMenuModel::Delegate { public: @@ -37,6 +41,10 @@ } void ExecuteCommand(int command_id, int event_flags) override {} + void MenuWillShow(SimpleMenuModel* source) override { + model_->menu_open_callback_.Run(); + } + private: TestModel* model_; @@ -46,6 +54,7 @@ private: int checked_command_ = -1; Delegate delegate_; + base::Closure menu_open_callback_; DISALLOW_COPY_AND_ASSIGN(TestModel); }; @@ -89,14 +98,13 @@ ViewsTestBase::TearDown(); } - // Runs the menu after scheduling |block| on the run loop. - MenuRunner::RunResult RunMenu(dispatch_block_t block) { - CFRunLoopPerformBlock(CFRunLoopGetCurrent(), kCFRunLoopCommonModes, ^{ - EXPECT_TRUE(runner_->IsRunning()); - block(); - }); - return runner_->RunMenuAt(parent_, NULL, gfx::Rect(), MENU_ANCHOR_TOPLEFT, - MenuRunner::CONTEXT_MENU); + // Runs the menu after registering |callback| as the menu open callback. + MenuRunner::RunResult RunMenu(const base::Closure& callback) { + menu_->set_menu_open_callback( + base::Bind(&MenuRunnerCocoaTest::RunMenuWrapperCallback, + base::Unretained(this), callback)); + return runner_->RunMenuAt(parent_, nullptr, gfx::Rect(), + MENU_ANCHOR_TOPLEFT, MenuRunner::CONTEXT_MENU); } // Runs then cancels a combobox menu and captures the frame of the anchoring @@ -107,12 +115,10 @@ // Should be one child (the compositor layer) before showing, and it should // go up by one (the anchor view) while the menu is shown. EXPECT_EQ(1u, [[parent_->GetNativeView() subviews] count]); - CFRunLoopPerformBlock(CFRunLoopGetCurrent(), kCFRunLoopCommonModes, ^{ - NSArray* subviews = [parent_->GetNativeView() subviews]; - EXPECT_EQ(2u, [subviews count]); - last_anchor_frame_ = [[subviews objectAtIndex:1] frame]; - runner_->Cancel(); - }); + + menu_->set_menu_open_callback(base::Bind( + &MenuRunnerCocoaTest::RunMenuAtCallback, base::Unretained(this))); + MenuRunner::RunResult result = runner_->RunMenuAt( parent_, nullptr, anchor, MENU_ANCHOR_TOPLEFT, MenuRunner::COMBOBOX); @@ -121,6 +127,16 @@ return result; } + void MenuCancelCallback() { + runner_->Cancel(); + EXPECT_FALSE(runner_->IsRunning()); + } + + void MenuDeleteCallback() { + runner_->Release(); + runner_ = nullptr; + } + protected: scoped_ptr<TestModel> menu_; internal::MenuRunnerImplCocoa* runner_ = nullptr; @@ -128,16 +144,26 @@ NSRect last_anchor_frame_ = NSZeroRect; private: + void RunMenuWrapperCallback(const base::Closure& callback) { + EXPECT_TRUE(runner_->IsRunning()); + callback.Run(); + } + + void RunMenuAtCallback() { + NSArray* subviews = [parent_->GetNativeView() subviews]; + EXPECT_EQ(2u, [subviews count]); + last_anchor_frame_ = [[subviews objectAtIndex:1] frame]; + runner_->Cancel(); + } + DISALLOW_COPY_AND_ASSIGN(MenuRunnerCocoaTest); }; TEST_F(MenuRunnerCocoaTest, RunMenuAndCancel) { base::TimeDelta min_time = ui::EventTimeForNow(); - MenuRunner::RunResult result = RunMenu(^{ - runner_->Cancel(); - EXPECT_FALSE(runner_->IsRunning()); - }); + MenuRunner::RunResult result = RunMenu(base::Bind( + &MenuRunnerCocoaTest::MenuCancelCallback, base::Unretained(this))); EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); EXPECT_FALSE(runner_->IsRunning()); @@ -151,19 +177,15 @@ } TEST_F(MenuRunnerCocoaTest, RunMenuAndDelete) { - MenuRunner::RunResult result = RunMenu(^{ - runner_->Release(); - runner_ = NULL; - }); - + MenuRunner::RunResult result = RunMenu(base::Bind( + &MenuRunnerCocoaTest::MenuDeleteCallback, base::Unretained(this))); EXPECT_EQ(MenuRunner::MENU_DELETED, result); } TEST_F(MenuRunnerCocoaTest, RunMenuTwice) { for (int i = 0; i < 2; ++i) { - MenuRunner::RunResult result = RunMenu(^{ - runner_->Cancel(); - }); + MenuRunner::RunResult result = RunMenu(base::Bind( + &MenuRunnerCocoaTest::MenuCancelCallback, base::Unretained(this))); EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); EXPECT_FALSE(runner_->IsRunning()); }
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn index 6ad07292..a900576 100644 --- a/ui/views/mus/BUILD.gn +++ b/ui/views/mus/BUILD.gn
@@ -62,7 +62,6 @@ "//mojo/converters/geometry", "//mojo/converters/ime", "//mojo/converters/input_events", - "//mojo/converters/network", "//mojo/converters/surfaces", "//mojo/platform_handle:for_component", "//mojo/public/c/system:for_component",
diff --git a/ui/views/mus/window_manager_connection.cc b/ui/views/mus/window_manager_connection.cc index 8b6398a3..fc41913 100644 --- a/ui/views/mus/window_manager_connection.cc +++ b/ui/views/mus/window_manager_connection.cc
@@ -11,7 +11,6 @@ #include "components/mus/public/cpp/window_tree_connection.h" #include "components/mus/public/interfaces/window_tree.mojom.h" #include "mojo/converters/geometry/geometry_type_converters.h" -#include "mojo/converters/network/network_type_converters.h" #include "mojo/shell/public/cpp/connection.h" #include "mojo/shell/public/cpp/connector.h" #include "ui/views/mus/native_widget_mus.h"
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 1e4fc76..74d5cd6e 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -8,7 +8,6 @@ #include <oleacc.h> #include <shellapi.h> #include <tchar.h> -#include <tpcshrd.h> #include <utility> @@ -385,9 +384,7 @@ direct_manipulation_helper_->Initialize(hwnd()); // Disable pen flicks (http://crbug.com/506977) - ::SetProp(hwnd(), MICROSOFT_TABLETPENSERVICE_PROPERTY, - reinterpret_cast<HANDLE>(TABLET_DISABLE_FLICKS | - TABLET_DISABLE_FLICKFALLBACKKEYS)); + base::win::DisableFlicks(hwnd()); } void HWNDMessageHandler::InitModalType(ui::ModalType modal_type) { @@ -414,9 +411,8 @@ // they can activate as foreground windows upon this window's destruction. RestoreEnabledIfNecessary(); - // Remove the property which disables pen flicks (http://crbug.com/506977) - // for this window. - ::RemoveProp(hwnd(), MICROSOFT_TABLETPENSERVICE_PROPERTY); + // Re-enable flicks which removes the window property. + base::win::EnableFlicks(hwnd()); if (!waiting_for_close_now_) { // And we delay the close so that if we are called from an ATL callback,
diff --git a/ui/views_content_client/views_content_browser_client.cc b/ui/views_content_client/views_content_browser_client.cc index e5f4f388..29b6dec 100644 --- a/ui/views_content_client/views_content_browser_client.cc +++ b/ui/views_content_client/views_content_browser_client.cc
@@ -4,9 +4,6 @@ #include "ui/views_content_client/views_content_browser_client.h" -#include <utility> - -#include "content/shell/browser/shell_browser_context.h" #include "ui/views_content_client/views_content_client_main_parts.h" namespace ui { @@ -27,15 +24,4 @@ return views_content_main_parts_; } -net::URLRequestContextGetter* -ViewsContentBrowserClient::CreateRequestContext( - content::BrowserContext* content_browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) { - content::ShellBrowserContext* shell_context = - views_content_main_parts_->browser_context(); - return shell_context->CreateRequestContext(protocol_handlers, - std::move(request_interceptors)); -} - } // namespace ui
diff --git a/ui/views_content_client/views_content_browser_client.h b/ui/views_content_client/views_content_browser_client.h index 98d9ee4..408fb8a 100644 --- a/ui/views_content_client/views_content_browser_client.h +++ b/ui/views_content_client/views_content_browser_client.h
@@ -8,10 +8,6 @@ #include "base/macros.h" #include "content/public/browser/content_browser_client.h" -namespace content { -class ShellBrowserContext; -} - namespace ui { class ViewsContentClient; @@ -26,10 +22,6 @@ // content::ContentBrowserClient: content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams& parameters) override; - net::URLRequestContextGetter* CreateRequestContext( - content::BrowserContext* browser_context, - content::ProtocolHandlerMap* protocol_handlers, - content::URLRequestInterceptorScopedVector request_interceptors) override; private: ViewsContentClientMainParts* views_content_main_parts_;