diff --git a/DEPS b/DEPS index 1fb8244d5..3e764d5 100644 --- a/DEPS +++ b/DEPS
@@ -44,7 +44,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '5d7e07ff448d851cb3749c8a55d1f2953fc3e459', + 'v8_revision': '2e86791723a422a8e9f0d242da24c2b2d5f3795b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '67ccef73bf664b7cdb4c6eed7acbaa4163c22a80', + 'pdfium_revision': '40870db0aadef4e145fd3b2b95fa5a083afb3161', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -208,7 +208,7 @@ Var('chromium_git') + '/webm/libvpx.git' + '@' + 'b578d59623ddb0f3f76efe5e160aff253b40d19b', 'src/third_party/ffmpeg': - Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'f82eb1989c0cdd5ed179ee4979ffb18a8030c78a', + Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'd19b0ad9b26a4def3411e32a8b780540afbd6a6e', 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '2f6478eb8d40f1766a96b5b033ed26c0c2244589',
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 1627652f..f04911a 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
@@ -127,9 +127,6 @@ private int mOverlayContentWidthMeasureSpec = ContentView.DEFAULT_MEASURE_SPEC; private int mOverlayContentHeightMeasureSpec = ContentView.DEFAULT_MEASURE_SPEC; - // List of callbacks to be called on nearest frame swap. - private List<Runnable> mNextFrameSwapCallbacks; - /** * This view is created on demand to display debugging information. */ @@ -602,24 +599,6 @@ if (!mSkipInvalidation || pendingFrameCount == 0) flushInvalidation(); mSkipInvalidation = !mSkipInvalidation; - - runNextFrameSwapCallbacks(); - } - - /** - * @param nextFrameSwapCallback Callback to run on a nearest compositor frame swap. - */ - public void addNextFrameSwapCallback(Runnable nextFrameSwapCallback) { - if (mNextFrameSwapCallbacks == null) mNextFrameSwapCallbacks = new ArrayList<>(); - mNextFrameSwapCallbacks.add(nextFrameSwapCallback); - } - - private void runNextFrameSwapCallbacks() { - if (mNextFrameSwapCallbacks == null) return; - for (Runnable r : mNextFrameSwapCallbacks) { - post(r); - } - mNextFrameSwapCallbacks = null; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index cfc6022d..9d77a15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -179,7 +179,7 @@ controlContainer); if (getFullscreenManager() != null) getFullscreenManager().setTab(getActivityTab()); - mSplashController.onFinishedNativeInit(getActivityTab(), getCompositorViewHolder()); + mSplashController.onFinishedNativeInit(getActivityTab()); super.finishNativeInitialization(); mIsInitialized = true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java index 727358b..3ba88d1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
@@ -17,7 +17,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; -import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.metrics.WebappUma; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; @@ -25,9 +24,6 @@ /** Shows and hides splash screen. */ class WebappSplashScreenController extends EmptyTabObserver { - /** Used to schedule splash screen hiding. */ - private CompositorViewHolder mCompositorViewHolder; - /** View to which the splash screen is added. */ private ViewGroup mParentView; @@ -80,9 +76,8 @@ } /** Should be called once native has loaded. */ - public void onFinishedNativeInit(Tab tab, CompositorViewHolder compositorViewHolder) { + public void onFinishedNativeInit(Tab tab) { mNativeLoaded = true; - mCompositorViewHolder = compositorViewHolder; tab.addObserver(this); if (mInitializedLayout) { mWebappUma.commitMetrics(); @@ -97,27 +92,27 @@ @Override public void didFirstVisuallyNonEmptyPaint(Tab tab) { if (canHideSplashScreen()) { - hideSplashScreenOnNextFrameSwap(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_PAINT); + hideSplashScreen(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_PAINT); } } @Override public void onPageLoadFinished(Tab tab) { if (canHideSplashScreen()) { - hideSplashScreenOnNextFrameSwap(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_LOAD_FINISHED); + hideSplashScreen(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_LOAD_FINISHED); } } @Override public void onPageLoadFailed(Tab tab, int errorCode) { if (canHideSplashScreen()) { - hideSplashScreenOnNextFrameSwap(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_LOAD_FAILED); + hideSplashScreen(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_LOAD_FAILED); } } @Override public void onCrash(Tab tab, boolean sadTabShown) { - hideSplashScreenOnNextFrameSwap(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_CRASH); + hideSplashScreen(tab, WebappUma.SPLASHSCREEN_HIDES_REASON_CRASH); } protected boolean canHideSplashScreen() { @@ -186,25 +181,8 @@ } } - /** - * Schedules the splash screen hiding animation once the compositor frame has been swapped. - * - * Without this callback we were seeing a short flash of white between the splash screen and - * the web content (crbug.com/734500). - * */ - private void hideSplashScreenOnNextFrameSwap(final Tab tab, final int reason) { - if (mSplashScreen == null || mCompositorViewHolder == null) return; - - mCompositorViewHolder.addNextFrameSwapCallback(new Runnable() { - @Override - public void run() { - animateHidingSplashScreen(tab, reason); - } - }); - } - - /** Performs the splash screen hiding animation. */ - private void animateHidingSplashScreen(final Tab tab, final int reason) { + /** Hides the splash screen. */ + private void hideSplashScreen(final Tab tab, final int reason) { if (mSplashScreen == null) return; mSplashScreen.animate().alpha(0f).withEndAction(new Runnable() { @@ -214,7 +192,6 @@ mParentView.removeView(mSplashScreen); tab.removeObserver(WebappSplashScreenController.this); mSplashScreen = null; - mCompositorViewHolder = null; mWebappUma.splashscreenHidden(reason); } });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java index 22a54c0..99595a3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java
@@ -117,7 +117,7 @@ public void testLaunchAndNavigateOffOrigin() throws Exception { startWebApkActivity("org.chromium.webapk.test", mTestServer.getURL("/chrome/test/data/android/test.html")); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + waitUntilSplashscreenHides(); // We navigate outside origin and expect Custom Tab to open on top of WebApkActivity. mActivityTestRule.runJavaScriptCodeInCurrentTab(
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc index 8f46b5f..fabffd26 100644 --- a/chrome/browser/autocomplete/search_provider_unittest.cc +++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -3305,18 +3305,18 @@ metrics::OmniboxEventProto::OTHER, SearchTermsData(), &client)); // Non-HTTP page URL on different domain. - EXPECT_FALSE(SearchProvider::CanSendURL( + EXPECT_TRUE(SearchProvider::CanSendURL( GURL("https://www.notgoogle.com/search"), GURL("https://www.google.com/complete/search"), &google_template_url, metrics::OmniboxEventProto::OTHER, SearchTermsData(), &client)); // Non-HTTP page URL on different domain, yet with feature flag to allow - // this turned on. + // this turned off. { base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( + feature_list.InitAndDisableFeature( omnibox::kSearchProviderContextAllowHttpsUrls); - EXPECT_TRUE(SearchProvider::CanSendURL( + EXPECT_FALSE(SearchProvider::CanSendURL( GURL("https://www.notgoogle.com/search"), GURL("https://www.google.com/complete/search"), &google_template_url, metrics::OmniboxEventProto::OTHER, SearchTermsData(), &client));
diff --git a/chrome/browser/resources/print_preview/preview_generator.js b/chrome/browser/resources/print_preview/preview_generator.js index f8c06cf..8d47ae1 100644 --- a/chrome/browser/resources/print_preview/preview_generator.js +++ b/chrome/browser/resources/print_preview/preview_generator.js
@@ -219,7 +219,7 @@ this.selectedDestination_ = this.destinationStore_.selectedDestination; this.inFlightRequestId_++; - this.generateDraft_ = this.documentInfo_.isModifiable && previewChanged; + this.generateDraft_ = this.documentInfo_.isModifiable; return { id: this.inFlightRequestId_, request: this.nativeLayer_.getPreview(
diff --git a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html index 2b0ec22..ff1045d 100644 --- a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html +++ b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html
@@ -1,7 +1,9 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/util.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html"> @@ -17,6 +19,7 @@ <template> <style include="settings-shared"> #files-to-remove-container { + padding: 0 var(--settings-box-row-padding); /* Use the full available width for file paths to avoid inconsistent * line breaks when zooming in or out */ width: calc(var(--settings-card-max-width) - @@ -24,12 +27,18 @@ } #files-to-remove-list { + margin: 0; word-break: break-all; } + #powered-by-settings-box { + min-height: 1em; + } + #powered-by-container { align-items: center; display: flex; + min-height: var(--settings-row-min-height); width: 100%; } @@ -41,14 +50,6 @@ height: 13px; } - #show-files-button { - --paper-button-ink-color: white; - /* Left-align the text of the button with the rest of the card's text */ - -webkit-margin-start: calc(var(--cr-button-edge-spacing) * -1); - color: var(--google-blue-700); - text-transform: inherit; - } - #status-icon { height: 24px; width: 24px; @@ -70,8 +71,15 @@ .status-icon-warning { --iron-icon-fill-color: var(--paper-red-700); } + + .top-aligned-settings-box { + align-items: start; + /* override settings-box min-height since we use vertical padding */ + min-height: 0; + padding: 15px var(--settings-box-row-padding); + } </style> - <div class="settings-box first two-line"> + <div class$="settings-box first [[getTopSettingsBoxClass_(showDetails_)]]"> <div class="status-icon-container"> <paper-spinner id="cleaning-spinner" active="[[isRemoving_]]" hidden="[[!isRemoving_]]"> @@ -81,7 +89,15 @@ id="status-icon"> </iron-icon> </div> - <div class="start">[[title_]]</div> + <div class="start"> + <div>[[title_]]</div> + <div class="secondary" hidden="[[!showDetails_]]"> + $i18n{chromeCleanupExplanation} + <a href="$i18n{chromeCleanupLearnMoreUrl}" target="_blank"> + $i18n{learnMore} + </a> + </div> + </div> <template is="dom-if" if="[[showActionButton_]]"> <div class="separator"></div> <paper-button id="action-button" class="primary-button" @@ -90,16 +106,7 @@ </paper-button> </template> </div> - <div id="details-container" - class="settings-box two-line" hidden="[[!showDetails_]]"> - <div> - $i18n{chromeCleanupExplanation} - <a href="$i18n{chromeCleanupLearnMoreUrl}" target="_blank"> - $i18n{learnMore} - </a> - </div> - </div> - <div class="settings-box continuation" hidden="[[!showLogsPermission_]]"> + <div class="settings-box" hidden="[[!showLogsPermission_]]"> <settings-toggle-button class="start" id="chromeCleanupLogsUploadControl" label="$i18n{chromeCleanupLogsUploadPermission}" @@ -107,26 +114,30 @@ on-settings-boolean-control-change="changeLogsPermission_"> </settings-toggle-button> </div> - <div class="settings-box" hidden="[[!showDetails_]]"> - <div class="start" hidden="[[showFilesToRemove_]]"> - <paper-button id="show-files-button" on-tap="showFiles_"> - $i18n{chromeCleanupLinkShowFiles} - </paper-button> + <div id="show-files-button" class="settings-box" actionable on-tap=" + toggleExpandButton_" hidden="[[!showDetails_]]"> + <div class="start"> + $i18n{chromeCleanupLinkShowFiles} </div> - <div id="files-to-remove-container" hidden="[[!showFilesToRemove_]]"> + <cr-expand-button expanded="{{showFilesToRemove_}}" + alt="$i18n{chromeCleanupLinkShowFiles}"> + </cr-expand-button> + </div> + <iron-collapse opened="[[showFilesToRemove_]]"> + <div id="files-to-remove-container"> <ul id="files-to-remove-list" class="secondary"> <template is="dom-repeat" items="[[filesToRemove_]]" as="fileName"> <li>[[fileName]]</li> </template> </ul> </div> - </div> - <div class="settings-box" - hidden="[[!showPoweredBy_(showFilesToRemove_, isPartnerPowered_)]]"> - <div id="powered-by-container" class="secondary"> - $i18nRaw{chromeCleanupPoweredByHtml} + <div id="powered-by-settings-box" class="settings-box continuation"> + <div id="powered-by-container" class="secondary" + hidden="[[!isPartnerPowered_]]"> + $i18nRaw{chromeCleanupPoweredByHtml} + </div> </div> - </div> + </iron-collapse> </template> <script src="chrome_cleanup_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js index d4317fde..e1511f63 100644 --- a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js +++ b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js
@@ -156,12 +156,25 @@ listenOnce(this, 'transitionend', this.doAction_.bind(this)); }, + getTopSettingsBoxClass_: function(showDetails) { + return showDetails ? 'top-aligned-settings-box' : 'two-line'; + }, + /** - * Enables presenting the list of files to be removed by Chrome Cleanup. + * Toggles the expand button within the element being listened to. + * @param {!Event} e * @private */ - showFiles_: function() { - this.showFilesToRemove_ = true; + toggleExpandButton_: function(e) { + // The expand button handles toggling itself. + var expandButtonTag = 'CR-EXPAND-BUTTON'; + if (e.target.tagName == expandButtonTag) + return; + + /** @type {!CrExpandButtonElement} */ + var expandButton = e.currentTarget.querySelector(expandButtonTag); + assert(expandButton); + expandButton.expanded = !expandButton.expanded; }, /**
diff --git a/chrome/browser/resources/settings/chrome_cleanup_page/compiled_resources2.gyp b/chrome/browser/resources/settings/chrome_cleanup_page/compiled_resources2.gyp index d6c2e9b..34c9d87 100644 --- a/chrome/browser/resources/settings/chrome_cleanup_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/chrome_cleanup_page/compiled_resources2.gyp
@@ -14,6 +14,7 @@ { 'target_name': 'chrome_cleanup_page', 'dependencies': [ + '<(DEPTH)/ui/webui/resources/cr_elements/cr_expand_button/compiled_resources2.gyp:cr_expand_button', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:util', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc index 0c3bbf6..acb4877 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -10,6 +10,7 @@ #include <map> #include <set> +#include <string> #include <utility> #include "base/bind.h" @@ -1481,7 +1482,14 @@ EXPECT_FALSE(csd_service->enabled()); } -IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, MalwareWebSocketBlocked) { +// Parameterised fixture to permit running the same test for Window and Worker +// scopes. +class SafeBrowsingServiceWebSocketTest + : public ::testing::WithParamInterface<std::string>, + public SafeBrowsingServiceTest {}; + +IN_PROC_BROWSER_TEST_P(SafeBrowsingServiceWebSocketTest, + MalwareWebSocketBlocked) { // This test currently only passes when the network service is enabled. if (!base::FeatureList::IsEnabled(features::kNetworkService)) return; @@ -1492,6 +1500,11 @@ replace_scheme.SetScheme("ws", url::Component(0, strlen("ws"))); GURL websocket_url = resolved.ReplaceComponents(replace_scheme); + GURL::Replacements add_query; + std::string query = "type=" + GetParam(); + add_query.SetQueryStr(query); + GURL main_url_with_query = main_url.ReplaceComponents(add_query); + // Add the WebSocket url as malware. SBFullHashResult uws_full_hash; GenUrlFullHashResult(websocket_url, MALWARE, &uws_full_hash); @@ -1509,7 +1522,7 @@ base::Unretained(this))); EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(websocket_url))); - ui_test_utils::NavigateToURL(browser(), main_url); + ui_test_utils::NavigateToURL(browser(), main_url_with_query); // If the interstitial fails to be displayed, the test will hang here. load_stop_observer.Wait(); @@ -1518,6 +1531,11 @@ EXPECT_TRUE(got_hit_report()); } +INSTANTIATE_TEST_CASE_P( + /* no prefix */, + SafeBrowsingServiceWebSocketTest, + ::testing::Values("window", "worker")); + IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, UnknownWebSocketNotBlocked) { GURL main_url = embedded_test_server()->GetURL(kMalwareWebSocketPage); @@ -2243,10 +2261,17 @@ } } +// Parameterised fixture to permit running the same test for Window and Worker +// scopes. +class V4SafeBrowsingServiceWebSocketTest + : public ::testing::WithParamInterface<std::string>, + public V4SafeBrowsingServiceTest {}; + // This is almost identical to -// SafeBrowsingServiceTest.MalwareWebSocketBlocked. That test will be deleted -// when the old database backend stops being used. -IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MalwareWebSocketBlocked) { +// SafeBrowsingServiceWebSocketTest.MalwareWebSocketBlocked. That test will be +// deleted when the old database backend is removed. +IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceWebSocketTest, + MalwareWebSocketBlocked) { // This test currently only passes when the network service is enabled. if (!base::FeatureList::IsEnabled(features::kNetworkService)) return; @@ -2257,6 +2282,11 @@ replace_scheme.SetScheme("ws", url::Component(0, strlen("ws"))); GURL websocket_url = resolved.ReplaceComponents(replace_scheme); + GURL::Replacements add_query; + std::string query = "type=" + GetParam(); + add_query.SetQueryStr(query); + GURL main_url_with_query = main_url.ReplaceComponents(add_query); + MarkUrlForMalwareUnexpired(websocket_url); // Brute force method for waiting for the interstitial to be displayed. @@ -2271,7 +2301,7 @@ base::Unretained(this))); EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(websocket_url))); - ui_test_utils::NavigateToURL(browser(), main_url); + ui_test_utils::NavigateToURL(browser(), main_url_with_query); // If the interstitial fails to be displayed, the test will hang here. load_stop_observer.Wait(); @@ -2279,10 +2309,15 @@ EXPECT_TRUE(ShowingInterstitialPage()); EXPECT_TRUE(got_hit_report()); EXPECT_EQ(websocket_url, hit_report().malicious_url); - EXPECT_EQ(main_url, hit_report().page_url); + EXPECT_EQ(main_url_with_query, hit_report().page_url); EXPECT_TRUE(hit_report().is_subresource); } +// TODO(ricea): Test SharedWorker and ServiceWorker scopes as well. +INSTANTIATE_TEST_CASE_P(/* no prefix */, + V4SafeBrowsingServiceWebSocketTest, + ::testing::Values("window", "worker")); + // Identical to SafeBrowsingServiceTest.UnknownWebSocketNotBlocked. Uses the // V4 database backend. IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, UnknownWebSocketNotBlocked) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index c399bd9..b915a01 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -792,6 +792,7 @@ "omnibox/chrome_omnibox_navigation_observer.h", "omnibox/clipboard_utils.cc", "omnibox/clipboard_utils.h", + "overlay/overlay_window.h", "page_info/page_info_infobar_delegate.cc", "page_info/page_info_infobar_delegate.h", "page_info/permission_menu_model.cc", @@ -1557,6 +1558,8 @@ "views/login_view.h", "views/new_back_shortcut_bubble.cc", "views/new_back_shortcut_bubble.h", + "views/overlay/overlay_window_views.cc", + "views/overlay/overlay_window_views.h", "views/page_info/chosen_object_row.cc", "views/page_info/chosen_object_row.h", "views/page_info/chosen_object_row_observer.h",
diff --git a/chrome/browser/ui/overlay/overlay_window.h b/chrome/browser/ui/overlay/overlay_window.h new file mode 100644 index 0000000..de20aef --- /dev/null +++ b/chrome/browser/ui/overlay/overlay_window.h
@@ -0,0 +1,47 @@ +// Copyright 2017 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_OVERLAY_OVERLAY_WINDOW_H_ +#define CHROME_BROWSER_UI_OVERLAY_OVERLAY_WINDOW_H_ + +#include "base/memory/ptr_util.h" +#include "ui/gfx/native_widget_types.h" + +namespace gfx { +class Rect; +} + +namespace ui { +class Layer; +} + +// This window will always float above other windows. The intention is to show +// content perpetually while the user is still interacting with the other +// browser windows. +class OverlayWindow { + public: + OverlayWindow() = default; + virtual ~OverlayWindow() = default; + + // Returns a created OverlayWindow. This is defined in the platform-specific + // implementation for the class. + static std::unique_ptr<OverlayWindow> Create(); + + virtual void Init() = 0; + virtual bool IsActive() const = 0; + virtual void Show() = 0; + virtual void Hide() = 0; + virtual void Close() = 0; + virtual void Activate() = 0; + virtual bool IsAlwaysOnTop() const = 0; + virtual ui::Layer* GetLayer() = 0; + virtual gfx::NativeWindow GetNativeWindow() const = 0; + // Retrieves the window's current bounds, including its window. + virtual gfx::Rect GetBounds() const = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(OverlayWindow); +}; + +#endif // CHROME_BROWSER_UI_OVERLAY_OVERLAY_WINDOW_H_
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc new file mode 100644 index 0000000..36b7045 --- /dev/null +++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -0,0 +1,72 @@ +// Copyright 2017 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/views/overlay/overlay_window_views.h" + +#include "ui/views/widget/widget.h" + +// static +std::unique_ptr<OverlayWindow> OverlayWindow::Create() { + return base::WrapUnique(new OverlayWindowViews()); +} + +OverlayWindowViews::OverlayWindowViews() { + widget_.reset(new views::Widget()); +} + +OverlayWindowViews::~OverlayWindowViews() = default; + +void OverlayWindowViews::Init() { + // TODO(apacible): Finalize the type of widget. http://crbug/726621 + views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + + // TODO(apacible): Update preferred sizing and positioning. + // http://crbug/726621 + params.bounds = gfx::Rect(200, 200, 700, 500); + params.keep_on_top = true; + params.visible_on_all_workspaces = true; + + widget_->Init(params); + widget_->Show(); + + // TODO(apacible): Set the WidgetDelegate for more control over behavior. + // http://crbug/726621 +} + +bool OverlayWindowViews::IsActive() const { + return widget_->IsActive(); +} + +void OverlayWindowViews::Show() { + widget_->Show(); +} + +void OverlayWindowViews::Hide() { + widget_->Hide(); +} + +void OverlayWindowViews::Close() { + widget_->Close(); +} + +void OverlayWindowViews::Activate() { + widget_->Activate(); +} + +bool OverlayWindowViews::IsAlwaysOnTop() const { + return true; +} + +ui::Layer* OverlayWindowViews::GetLayer() { + return widget_->GetLayer(); +} + +gfx::NativeWindow OverlayWindowViews::GetNativeWindow() const { + return widget_->GetNativeWindow(); +} + +gfx::Rect OverlayWindowViews::GetBounds() const { + return widget_->GetRestoredBounds(); +}
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h new file mode 100644 index 0000000..3264932 --- /dev/null +++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -0,0 +1,38 @@ +// Copyright 2017 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_OVERLAY_OVERLAY_WINDOW_VIEWS_H_ +#define CHROME_BROWSER_UI_VIEWS_OVERLAY_OVERLAY_WINDOW_VIEWS_H_ + +#include "chrome/browser/ui/overlay/overlay_window.h" + +namespace views { +class Widget; +} + +// The Views implementation of OverlayWindow. +class OverlayWindowViews : public OverlayWindow { + public: + OverlayWindowViews(); + ~OverlayWindowViews() override; + + // OverlayWindow: + void Init() override; + bool IsActive() const override; + void Show() override; + void Hide() override; + void Close() override; + void Activate() override; + bool IsAlwaysOnTop() const override; + ui::Layer* GetLayer() override; + gfx::NativeWindow GetNativeWindow() const override; + gfx::Rect GetBounds() const override; + + private: + std::unique_ptr<views::Widget> widget_; + + DISALLOW_COPY_AND_ASSIGN(OverlayWindowViews); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_OVERLAY_OVERLAY_WINDOW_VIEWS_H_
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 0f46e7b..a2320139 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -357,7 +357,7 @@ } TEST_F(SiteSettingsHandlerTest, DefaultSettingSource) { - const std::string google("http://www.google.com"); + const std::string google("https://www.google.com"); ContentSettingSourceSetter source_setter(profile(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
diff --git a/chrome/test/data/safe_browsing/malware_websocket.html b/chrome/test/data/safe_browsing/malware_websocket.html index df66c39..deb0a00 100644 --- a/chrome/test/data/safe_browsing/malware_websocket.html +++ b/chrome/test/data/safe_browsing/malware_websocket.html
@@ -1,12 +1,44 @@ <title>Test whether a WebSocket connection triggers a SafeBrowsing interstitial</title> <script> +const url = new URL(document.location.href); +const type = url.searchParams.get('type'); // Construct the WebSocket URL from the page URL. The server should not be // configured to accept a WebSocket handshake at this endpoint, or the "not // blocked" test will fail. A 404 error is perfect. -const wsUrl = new URL('/safe_browsing/malware-ws', document.location.href); +const wsUrl = new URL('/safe_browsing/malware-ws', url); wsUrl.protocol = 'ws'; -const ws = new WebSocket(wsUrl.href); -// The "not blocked" test looks for this title change to verify that the request -// has not been blocked. -ws.onerror = () => { document.title = 'COMPLETED'; }; + +function workerTest() { + const src = ` +const ws = new WebSocket('${wsUrl}'); +ws.onerror = () => { + postMessage('COMPLETED'); +}; +`; + const blob = new Blob([src]); + const srcUrl = URL.createObjectURL(blob); + const worker = new Worker(srcUrl); + worker.onmessage = signalComplete; +} + +switch (type) { + case 'worker': + workerTest(); + break; + + default: + windowTest(); + break; +} + +function windowTest() { + const ws = new WebSocket(wsUrl.href); + ws.onerror = signalComplete; +} + +function signalComplete() { + // The "not blocked" test looks for this title change to verify that the + // request has not been blocked. + document.title = 'COMPLETED'; +} </script>
diff --git a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js index 13247cd..8fec871 100644 --- a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js +++ b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
@@ -97,7 +97,9 @@ 'CustomPaperNames', 'InitIssuesOneRequest', 'InvalidSettingsError', - 'GenerateDraft', + // TODO(thestig): Re-enable this test when the feature works properly. + // https://crbug.com/746768 + 'DISABLED_GenerateDraft', ].forEach(function(testName) { TEST_F('PrintPreviewUIBrowserTest', testName, function() { mocha.grep(new RegExp(testName + '\\b')).run();
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 72382870..2d6a05e 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -51,7 +51,7 @@ // suggestions of the URL in the user's clipboard (if any) upon omnibox focus. const base::Feature kEnableClipboardProvider { "OmniboxEnableClipboardProvider", -#if defined(OS_IOS) +#if defined(OS_IOS) || defined(OS_ANDROID) base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT @@ -89,7 +89,7 @@ // transmit URLs for context in the first place). const base::Feature kSearchProviderContextAllowHttpsUrls{ "OmniboixSearchProviderContextAllowHttpsUrls", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Feature used for the Zero Suggest Redirect to Chrome Field Trial. const base::Feature kZeroSuggestRedirectToChrome{
diff --git a/components/translate/core/browser/translate_browser_metrics.cc b/components/translate/core/browser/translate_browser_metrics.cc index 75b9177..e28e971 100644 --- a/components/translate/core/browser/translate_browser_metrics.cc +++ b/components/translate/core/browser/translate_browser_metrics.cc
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/metrics_hashes.h" #include "base/metrics/sparse_histogram.h" #include "components/language_usage_metrics/language_usage_metrics.h" @@ -29,6 +30,10 @@ "Translate.UndisplayableLanguage"; const char kTranslateUnsupportedLanguageAtInitiation[] = "Translate.UnsupportedLanguageAtInitiation"; +const char kTranslateSourceLanguage[] = + "Translate.SourceLanguage"; +const char kTranslateTargetLanguage[] = + "Translate.TargetLanguage"; struct MetricsEntry { TranslateBrowserMetrics::MetricsNameIndex index; @@ -47,6 +52,10 @@ kTranslateUndisplayableLanguage }, { TranslateBrowserMetrics::UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION, kTranslateUnsupportedLanguageAtInitiation }, + { TranslateBrowserMetrics::UMA_TRANSLATE_SOURCE_LANGUAGE, + kTranslateSourceLanguage }, + { TranslateBrowserMetrics::UMA_TRANSLATE_TARGET_LANGUAGE, + kTranslateTargetLanguage }, }; static_assert(arraysize(kMetricsEntries) == TranslateBrowserMetrics::UMA_MAX, @@ -86,6 +95,16 @@ language_code); } +void ReportTranslateSourceLanguage(const std::string& language) { + UMA_HISTOGRAM_SPARSE_SLOWLY(kTranslateSourceLanguage, + base::HashMetricName(language)); +} + +void ReportTranslateTargetLanguage(const std::string& language) { + UMA_HISTOGRAM_SPARSE_SLOWLY(kTranslateTargetLanguage, + base::HashMetricName(language)); +} + const char* GetMetricsName(MetricsNameIndex index) { for (size_t i = 0; i < arraysize(kMetricsEntries); ++i) { if (kMetricsEntries[i].index == index)
diff --git a/components/translate/core/browser/translate_browser_metrics.h b/components/translate/core/browser/translate_browser_metrics.h index 1db33bb..219b36e 100644 --- a/components/translate/core/browser/translate_browser_metrics.h +++ b/components/translate/core/browser/translate_browser_metrics.h
@@ -19,6 +19,8 @@ UMA_LOCALES_ON_DISABLED_BY_PREFS, UMA_UNDISPLAYABLE_LANGUAGE, UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION, + UMA_TRANSLATE_SOURCE_LANGUAGE, + UMA_TRANSLATE_TARGET_LANGUAGE, UMA_MAX, }; @@ -64,6 +66,16 @@ void ReportUnsupportedLanguageAtInitiation(const std::string& language); +// Called when a request is sent to the translate server to report the source +// language of the translated page. Buckets are labelled with CLD3LanguageCode +// values. +void ReportTranslateSourceLanguage(const std::string& language); + +// Called when a request is sent to the translate server to report the target +// language for the translated page. Buckets are labelled with CLD3LanguageCode +// values. +void ReportTranslateTargetLanguage(const std::string& language); + // Provides UMA entry names for unit tests. const char* GetMetricsName(MetricsNameIndex index);
diff --git a/components/translate/core/browser/translate_browser_metrics_unittest.cc b/components/translate/core/browser/translate_browser_metrics_unittest.cc index b5bfc35..ce5ce186 100644 --- a/components/translate/core/browser/translate_browser_metrics_unittest.cc +++ b/components/translate/core/browser/translate_browser_metrics_unittest.cc
@@ -205,7 +205,6 @@ EXPECT_EQ(0, recorder.GetTotalCount()); translate::TranslateBrowserMetrics::ReportLanguageDetectionError(); EXPECT_EQ(1, recorder.GetTotalCount()); - } @@ -240,3 +239,35 @@ "en"); EXPECT_EQ(1, recorder.GetCount(ENGLISH)); } + +TEST(TranslateBrowserMetricsTest, ReportedTranslateSourceLanguage) { + const int ENGLISH = -74147910; + const int FRENCH = 1704315002; + + MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName( + translate::TranslateBrowserMetrics::UMA_TRANSLATE_SOURCE_LANGUAGE)); + EXPECT_EQ(0, recorder.GetTotalCount()); + + translate::TranslateBrowserMetrics::ReportTranslateSourceLanguage("en"); + translate::TranslateBrowserMetrics::ReportTranslateSourceLanguage("fr"); + translate::TranslateBrowserMetrics::ReportTranslateSourceLanguage("en"); + + EXPECT_EQ(2, recorder.GetCount(ENGLISH)); + EXPECT_EQ(1, recorder.GetCount(FRENCH)); +} + +TEST(TranslateBrowserMetricsTest, ReportedTranslateTargetLanguage) { + const int ENGLISH = -74147910; + const int FRENCH = 1704315002; + + MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName( + translate::TranslateBrowserMetrics::UMA_TRANSLATE_TARGET_LANGUAGE)); + EXPECT_EQ(0, recorder.GetTotalCount()); + + translate::TranslateBrowserMetrics::ReportTranslateTargetLanguage("en"); + translate::TranslateBrowserMetrics::ReportTranslateTargetLanguage("fr"); + translate::TranslateBrowserMetrics::ReportTranslateTargetLanguage("en"); + + EXPECT_EQ(2, recorder.GetCount(ENGLISH)); + EXPECT_EQ(1, recorder.GetCount(FRENCH)); +}
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc index 538b3215..146d1ab 100644 --- a/components/translate/core/browser/translate_manager.cc +++ b/components/translate/core/browser/translate_manager.cc
@@ -337,6 +337,10 @@ return; } + // Log the source and target languages of the translate request. + TranslateBrowserMetrics::ReportTranslateSourceLanguage(original_source_lang); + TranslateBrowserMetrics::ReportTranslateTargetLanguage(target_lang); + // Translation can be kicked by context menu against unsupported languages. // Unsupported language strings should be replaced with // kUnknownLanguageCode in order to send a translation request with enabling
diff --git a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc index 5f1f77b1..07a45c9 100644 --- a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc +++ b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc
@@ -144,9 +144,11 @@ auto guid = GetSharedBitmapGUIDForTracing(bitmap.first); base::UnguessableToken shared_memory_guid; if (bitmap.second->memory) { - shared_memory_guid = bitmap.second->memory->handle().GetGUID(); - pmd->CreateSharedMemoryOwnershipEdge( - dump->guid(), guid, shared_memory_guid, 0 /* importance*/); + shared_memory_guid = bitmap.second->memory->mapped_id(); + if (!shared_memory_guid.is_empty()) { + pmd->CreateSharedMemoryOwnershipEdge( + dump->guid(), guid, shared_memory_guid, 0 /* importance*/); + } } else { pmd->CreateSharedGlobalAllocatorDump(guid); pmd->AddOwnershipEdge(dump->guid(), guid);
diff --git a/components/webdata/common/web_data_request_manager.cc b/components/webdata/common/web_data_request_manager.cc index c52cfd82..f48d7abd 100644 --- a/components/webdata/common/web_data_request_manager.cc +++ b/components/webdata/common/web_data_request_manager.cc
@@ -11,6 +11,8 @@ #include "base/memory/ptr_util.h" #include "base/profiler/scoped_tracker.h" #include "base/stl_util.h" +#include "base/task_scheduler/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" //////////////////////////////////////////////////////////////////////////////// @@ -36,11 +38,12 @@ WebDataRequest::WebDataRequest(WebDataRequestManager* manager, WebDataServiceConsumer* consumer, WebDataServiceBase::Handle handle) - : task_runner_(base::ThreadTaskRunnerHandle::Get()), + : task_runner_(base::SequencedTaskRunnerHandle::IsSet() + ? base::SequencedTaskRunnerHandle::Get() + : nullptr), atomic_manager_(reinterpret_cast<base::subtle::AtomicWord>(manager)), consumer_(consumer), handle_(handle) { - DCHECK(task_runner_); DCHECK(IsActive()); static_assert(sizeof(atomic_manager_) == sizeof(manager), "size mismatch"); } @@ -54,7 +57,7 @@ return consumer_; } -scoped_refptr<base::SingleThreadTaskRunner> WebDataRequest::GetTaskRunner() { +scoped_refptr<base::SequencedTaskRunner> WebDataRequest::GetTaskRunner() { return task_runner_; } @@ -99,12 +102,17 @@ void WebDataRequestManager::RequestCompleted( std::unique_ptr<WebDataRequest> request, std::unique_ptr<WDTypedResult> result) { - scoped_refptr<base::SingleThreadTaskRunner> task_runner = + // Careful: Don't swap this below the BindOnce() call below, since that + // effectively does a std::move() on |request|! + scoped_refptr<base::SequencedTaskRunner> task_runner = request->GetTaskRunner(); - task_runner->PostTask( - FROM_HERE, + auto task = base::BindOnce(&WebDataRequestManager::RequestCompletedOnThread, this, - base::Passed(&request), base::Passed(&result))); + base::Passed(&request), base::Passed(&result)); + if (task_runner) + task_runner->PostTask(FROM_HERE, std::move(task)); + else + base::PostTask(FROM_HERE, std::move(task)); } WebDataRequestManager::~WebDataRequestManager() {
diff --git a/components/webdata/common/web_data_request_manager.h b/components/webdata/common/web_data_request_manager.h index eb621a2..2b96076 100644 --- a/components/webdata/common/web_data_request_manager.h +++ b/components/webdata/common/web_data_request_manager.h
@@ -15,7 +15,6 @@ #include "base/atomicops.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/single_thread_task_runner.h" #include "base/synchronization/lock.h" #include "components/webdata/common/web_data_results.h" #include "components/webdata/common/web_data_service_base.h" @@ -25,6 +24,10 @@ class WebDataServiceConsumer; class WebDataRequestManager; +namespace base { +class SequencedTaskRunner; +} + ////////////////////////////////////////////////////////////////////////////// // // WebData requests @@ -60,15 +63,16 @@ // Retrieves the |consumer_| set in the constructor. WebDataServiceConsumer* GetConsumer(); - // Retrieves the original task runner of the request. - scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(); + // Retrieves the original task runner of the request. This may be null if the + // original task was not posted as a sequenced task. + scoped_refptr<base::SequencedTaskRunner> GetTaskRunner(); // Marks the current request as inactive, either due to cancellation or // completion. void MarkAsInactive(); // Tracks task runner that the request originated on. - const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + const scoped_refptr<base::SequencedTaskRunner> task_runner_; // The manager associated with this request. This is stored as a raw (untyped) // pointer value because it does double duty as the flag indicating whether or
diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc index 8a8ca22..9b9cfbd 100644 --- a/content/browser/frame_host/render_frame_message_filter.cc +++ b/content/browser/frame_host/render_frame_message_filter.cc
@@ -275,9 +275,34 @@ if (!resource_context_) return; + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("renderer_initiated_download", R"( + semantics { + sender: "Download from Renderer" + description: + "The frame has either navigated to a URL that was determined to be " + "a download via one of the renderer's classification mechanisms, " + "or WebView has requested a <canvas> or <img> element at a " + "specific location be to downloaded." + trigger: + "The user navigated to a destination that was categorized as a " + "download, or WebView triggered saving a <canvas> or <img> tag." + data: "Only the URL we are attempting to download." + destination: WEBSITE + } + policy { + cookies_allowed: true + cookies_store: "user" + setting: "This feature cannot be disabled by settings." + chrome_policy { + DownloadRestrictions { + DownloadRestrictions: 3 + } + } + })"); std::unique_ptr<DownloadUrlParameters> parameters(new DownloadUrlParameters( url, render_process_id_, render_view_id, render_frame_id, - request_context_.get(), NO_TRAFFIC_ANNOTATION_YET)); + request_context_.get(), traffic_annotation)); parameters->set_content_initiated(true); parameters->set_suggested_name(suggested_name); parameters->set_prompt(use_prompt);
diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc index 181a817..37510326 100644 --- a/content/child/web_url_loader_impl.cc +++ b/content/child/web_url_loader_impl.cc
@@ -1258,10 +1258,12 @@ // status code or status text. int error_code = sync_load_response.error_code; if (error_code != net::OK) { - response.SetURL(final_url); - error.domain = WebString::FromASCII(net::kErrorDomain); - error.reason = error_code; - error.unreachable_url = final_url; + error = WebURLError(final_url, false, error_code); + if (error_code == net::ERR_ABORTED) { + // SyncResourceHandler returns ERR_ABORTED for CORS redirect errors, + // so we treat the error as a web security violation. + error.is_web_security_violation = true; + } return; }
diff --git a/media/blink/resource_multibuffer_data_provider.cc b/media/blink/resource_multibuffer_data_provider.cc index 921aab9..0a9f2601 100644 --- a/media/blink/resource_multibuffer_data_provider.cc +++ b/media/blink/resource_multibuffer_data_provider.cc
@@ -474,7 +474,6 @@ void ResourceMultiBufferDataProvider::DidFail(const WebURLError& error) { DVLOG(1) << "didFail: reason=" << error.reason - << ", isCancellation=" << error.is_cancellation << ", domain=" << error.domain.Utf8().data() << ", localizedDescription=" << error.localized_description.Utf8().data();
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn index 024ec5a..6cac595 100644 --- a/media/mojo/BUILD.gn +++ b/media/mojo/BUILD.gn
@@ -77,6 +77,7 @@ "clients/mojo_cdm_unittest.cc", "clients/mojo_decryptor_unittest.cc", "clients/mojo_renderer_unittest.cc", + "clients/mojo_video_encode_accelerator_unittest.cc", "common/media_type_converters_unittest.cc", "common/mojo_decoder_buffer_converter_unittest.cc", "common/mojo_shared_buffer_video_frame_unittest.cc",
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn index 407b7dd9..2d2626d 100644 --- a/media/mojo/clients/BUILD.gn +++ b/media/mojo/clients/BUILD.gn
@@ -43,6 +43,8 @@ "mojo_renderer_factory.h", "mojo_video_decoder.cc", "mojo_video_decoder.h", + "mojo_video_encode_accelerator.cc", + "mojo_video_encode_accelerator.h", ] if (is_android) { @@ -63,6 +65,7 @@ ] deps = [ + "//media/gpu", "//media/mojo/common", "//media/mojo/common:mojo_shared_buffer_video_frame", "//mojo/common",
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.cc b/media/mojo/clients/mojo_video_encode_accelerator.cc new file mode 100644 index 0000000..a6eee2d --- /dev/null +++ b/media/mojo/clients/mojo_video_encode_accelerator.cc
@@ -0,0 +1,203 @@ +// Copyright 2017 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 "media/mojo/clients/mojo_video_encode_accelerator.h" + +#include "base/logging.h" +#include "gpu/ipc/client/gpu_channel_host.h" +#include "media/base/video_frame.h" +#include "media/gpu/gpu_video_accelerator_util.h" +#include "media/mojo/common/mojo_shared_buffer_video_frame.h" +#include "media/mojo/interfaces/video_encode_accelerator.mojom.h" +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/system/platform_handle.h" + +namespace media { + +namespace { + +// Does nothing but keeping |frame| alive. +void KeepVideoFrameAlive(const scoped_refptr<VideoFrame>& frame) {} + +// File-static mojom::VideoEncodeAcceleratorClient implementation to trampoline +// method calls to its |client_|. Note that this class is thread hostile when +// bound. +class VideoEncodeAcceleratorClient + : public mojom::VideoEncodeAcceleratorClient { + public: + explicit VideoEncodeAcceleratorClient(VideoEncodeAccelerator::Client* client); + ~VideoEncodeAcceleratorClient() override = default; + + // mojom::VideoEncodeAcceleratorClient impl. + void RequireBitstreamBuffers(uint32_t input_count, + const gfx::Size& input_coded_size, + uint32_t output_buffer_size) override; + void BitstreamBufferReady(int32_t bitstream_buffer_id, + uint32_t payload_size, + bool key_frame, + base::TimeDelta timestamp) override; + void NotifyError(VideoEncodeAccelerator::Error error) override; + + private: + VideoEncodeAccelerator::Client* client_; + + DISALLOW_COPY_AND_ASSIGN(VideoEncodeAcceleratorClient); +}; + +VideoEncodeAcceleratorClient::VideoEncodeAcceleratorClient( + VideoEncodeAccelerator::Client* client) + : client_(client) { + DCHECK(client_); +} + +void VideoEncodeAcceleratorClient::RequireBitstreamBuffers( + uint32_t input_count, + const gfx::Size& input_coded_size, + uint32_t output_buffer_size) { + DVLOG(2) << __func__ << " input_count= " << input_count + << " input_coded_size= " << input_coded_size.ToString() + << " output_buffer_size=" << output_buffer_size; + client_->RequireBitstreamBuffers(input_count, input_coded_size, + output_buffer_size); +} + +void VideoEncodeAcceleratorClient::BitstreamBufferReady( + int32_t bitstream_buffer_id, + uint32_t payload_size, + bool key_frame, + base::TimeDelta timestamp) { + DVLOG(2) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id + << ", payload_size=" << payload_size + << "B, key_frame=" << key_frame; + client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame, + timestamp); +} + +void VideoEncodeAcceleratorClient::NotifyError( + VideoEncodeAccelerator::Error error) { + DVLOG(2) << __func__; + client_->NotifyError(error); +} + +} // anonymous namespace + +MojoVideoEncodeAccelerator::MojoVideoEncodeAccelerator( + mojom::VideoEncodeAcceleratorPtr vea, + const gpu::VideoEncodeAcceleratorSupportedProfiles& supported_profiles) + : vea_(std::move(vea)), supported_profiles_(supported_profiles) { + DVLOG(1) << __func__; + DCHECK(vea_); +} + +VideoEncodeAccelerator::SupportedProfiles +MojoVideoEncodeAccelerator::GetSupportedProfiles() { + DVLOG(1) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + return GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles( + supported_profiles_); +} + +bool MojoVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, + const gfx::Size& input_visible_size, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + Client* client) { + DVLOG(2) << __func__ + << " input_format=" << VideoPixelFormatToString(input_format) + << ", input_visible_size=" << input_visible_size.ToString() + << ", output_profile=" << GetProfileName(output_profile) + << ", initial_bitrate=" << initial_bitrate; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // Get a mojom::VideoEncodeAcceleratorClient bound to a local implementation + // (VideoEncodeAcceleratorClient) and send the pointer remotely. + mojom::VideoEncodeAcceleratorClientPtr vea_client; + mojo::MakeStrongBinding( + base::MakeUnique<VideoEncodeAcceleratorClient>(client), + mojo::MakeRequest(&vea_client)); + + bool result = false; + vea_->Initialize(input_format, input_visible_size, output_profile, + initial_bitrate, std::move(vea_client), &result); + return result; +} + +void MojoVideoEncodeAccelerator::Encode(const scoped_refptr<VideoFrame>& frame, + bool force_keyframe) { + DVLOG(2) << __func__ << " tstamp=" << frame->timestamp(); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(PIXEL_FORMAT_I420, frame->format()); + DCHECK_EQ(VideoFrame::STORAGE_SHMEM, frame->storage_type()); + DCHECK(frame->shared_memory_handle().IsValid()); + + // Oftentimes |frame|'s underlying planes will be aligned and not tightly + // packed, so don't use VideoFrame::AllocationSize(). + const size_t allocation_size = frame->shared_memory_handle().GetSize(); + + // WrapSharedMemoryHandle() takes ownership of the handle passed to it, but we + // don't have ownership of frame->shared_memory_handle(), so Duplicate() it. + mojo::ScopedSharedBufferHandle handle = + mojo::WrapSharedMemoryHandle(frame->shared_memory_handle().Duplicate(), + allocation_size, true /* read_only */); + + const size_t y_offset = frame->shared_memory_offset(); + const size_t u_offset = y_offset + frame->data(VideoFrame::kUPlane) - + frame->data(VideoFrame::kYPlane); + const size_t v_offset = y_offset + frame->data(VideoFrame::kVPlane) - + frame->data(VideoFrame::kYPlane); + // Temporary Mojo VideoFrame to allow for marshalling. + scoped_refptr<MojoSharedBufferVideoFrame> mojo_frame = + MojoSharedBufferVideoFrame::Create( + frame->format(), frame->coded_size(), frame->visible_rect(), + frame->natural_size(), std::move(handle), allocation_size, y_offset, + u_offset, v_offset, frame->stride(VideoFrame::kYPlane), + frame->stride(VideoFrame::kUPlane), + frame->stride(VideoFrame::kVPlane), frame->timestamp()); + + // Encode() is synchronous: clients will assume full ownership of |frame| when + // this gets destroyed and probably recycle its shared_memory_handle(): keep + // the former alive until the remote end is actually finished. + DCHECK(vea_.is_bound()); + vea_->Encode(mojo_frame, force_keyframe, + base::Bind(&KeepVideoFrameAlive, frame)); +} + +void MojoVideoEncodeAccelerator::UseOutputBitstreamBuffer( + const BitstreamBuffer& buffer) { + DVLOG(2) << __func__ << " buffer.id()= " << buffer.id() + << " buffer.size()= " << buffer.size() << "B"; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // WrapSharedMemoryHandle() takes ownership of the handle passed to it, but we + // don't have ownership of the |buffer|s underlying handle, so Duplicate() it. + DCHECK(buffer.handle().IsValid()); + mojo::ScopedSharedBufferHandle buffer_handle = mojo::WrapSharedMemoryHandle( + buffer.handle().Duplicate(), buffer.size(), true /* read_only */); + + vea_->UseOutputBitstreamBuffer(buffer.id(), std::move(buffer_handle)); +} + +void MojoVideoEncodeAccelerator::RequestEncodingParametersChange( + uint32_t bitrate, + uint32_t framerate) { + DVLOG(2) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(vea_.is_bound()); + vea_->RequestEncodingParametersChange(bitrate, framerate); +} + +void MojoVideoEncodeAccelerator::Destroy() { + DVLOG(1) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + vea_.reset(); + // See media::VideoEncodeAccelerator for more info on this peculiar pattern. + delete this; +} + +MojoVideoEncodeAccelerator::~MojoVideoEncodeAccelerator() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} + +} // namespace media
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.h b/media/mojo/clients/mojo_video_encode_accelerator.h new file mode 100644 index 0000000..2bd9b9dd --- /dev/null +++ b/media/mojo/clients/mojo_video_encode_accelerator.h
@@ -0,0 +1,68 @@ +// Copyright 2017 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 MEDIA_MOJO_CLIENTS_MOJO_VIDEO_ENCODE_ACCELERATOR_H_ +#define MEDIA_MOJO_CLIENTS_MOJO_VIDEO_ENCODE_ACCELERATOR_H_ + +#include <stdint.h> + +#include <vector> + +#include "base/sequence_checker.h" +#include "gpu/config/gpu_info.h" +#include "media/mojo/interfaces/video_encode_accelerator.mojom.h" +#include "media/video/video_encode_accelerator.h" + +namespace gfx { +class Size; +} // namespace gfx + +namespace media { +class VideoFrame; +} // namespace media + +namespace media { + +// This class is a renderer-side host bridge from VideoEncodeAccelerator to a +// remote media::mojom::VideoEncodeAccelerator passed on ctor and held as +// |vea_|. An internal mojo::VEA::Client acts as the remote's mojo VEA client, +// trampolining methods to the media::VEA::Client passed on Initialize(). For +// proper operation this class should be managed in a std::unique_ptr that calls +// Destroy() upon destruction. +class MojoVideoEncodeAccelerator : public VideoEncodeAccelerator { + public: + MojoVideoEncodeAccelerator( + mojom::VideoEncodeAcceleratorPtr vea, + const gpu::VideoEncodeAcceleratorSupportedProfiles& supported_profiles); + + // VideoEncodeAccelerator implementation. + SupportedProfiles GetSupportedProfiles() override; + bool Initialize(VideoPixelFormat input_format, + const gfx::Size& input_visible_size, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + Client* client) override; + void Encode(const scoped_refptr<VideoFrame>& frame, + bool force_keyframe) override; + void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override; + void RequestEncodingParametersChange(uint32_t bitrate, + uint32_t framerate_num) override; + void Destroy() override; + + private: + // Only Destroy() should be deleting |this|. + ~MojoVideoEncodeAccelerator() override; + + mojom::VideoEncodeAcceleratorPtr vea_; + + const gpu::VideoEncodeAcceleratorSupportedProfiles supported_profiles_; + + SEQUENCE_CHECKER(sequence_checker_); + + DISALLOW_COPY_AND_ASSIGN(MojoVideoEncodeAccelerator); +}; + +} // namespace media + +#endif // MEDIA_MOJO_CLIENTS_MOJO_VIDEO_ENCODE_ACCELERATOR_H_
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc new file mode 100644 index 0000000..b040009 --- /dev/null +++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -0,0 +1,258 @@ +// Copyright 2017 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 "base/message_loop/message_loop.h" +#include "gpu/config/gpu_info.h" +#include "media/mojo/clients/mojo_video_encode_accelerator.h" +#include "media/mojo/interfaces/video_encode_accelerator.mojom.h" +#include "media/video/video_encode_accelerator.h" +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::InSequence; + +namespace media { + +static const gfx::Size kInputVisibleSize(64, 48); + +// Mock implementation of the Mojo "service" side of the VEA dialogue. Upon an +// Initialize() call, checks |initialization_success_| and responds to |client| +// with a RequireBitstreamBuffers() if so configured; upon Encode(), responds +// with a BitstreamBufferReady() with the bitstream buffer id previously +// configured by a call to UseOutputBitstreamBuffer(). This mock class only +// allows for one bitstream buffer in flight. +class MockMojoVideoEncodeAccelerator : public mojom::VideoEncodeAccelerator { + public: + MockMojoVideoEncodeAccelerator() = default; + + // mojom::VideoEncodeAccelerator impl. + void Initialize(media::VideoPixelFormat input_format, + const gfx::Size& input_visible_size, + media::VideoCodecProfile output_profile, + uint32_t initial_bitrate, + mojom::VideoEncodeAcceleratorClientPtr client, + InitializeCallback success_callback) override { + if (initialization_success_) { + ASSERT_TRUE(client); + client_ = std::move(client); + const size_t allocation_size = + VideoFrame::AllocationSize(input_format, input_visible_size); + + client_->RequireBitstreamBuffers(1, input_visible_size, allocation_size); + + DoInitialize(input_format, input_visible_size, output_profile, + initial_bitrate, &client); + } + std::move(success_callback).Run(initialization_success_); + } + MOCK_METHOD5(DoInitialize, + void(media::VideoPixelFormat, + const gfx::Size&, + media::VideoCodecProfile, + uint32_t, + mojom::VideoEncodeAcceleratorClientPtr*)); + + void Encode(const scoped_refptr<VideoFrame>& frame, + bool keyframe, + EncodeCallback callback) override { + EXPECT_NE(-1, configured_bitstream_buffer_id_); + EXPECT_TRUE(client_); + client_->BitstreamBufferReady(configured_bitstream_buffer_id_, 0, keyframe, + frame->timestamp()); + configured_bitstream_buffer_id_ = -1; + + DoEncode(frame, keyframe); + std::move(callback).Run(); + } + MOCK_METHOD2(DoEncode, void(const scoped_refptr<VideoFrame>&, bool)); + + void UseOutputBitstreamBuffer( + int32_t bitstream_buffer_id, + mojo::ScopedSharedBufferHandle buffer) override { + EXPECT_EQ(-1, configured_bitstream_buffer_id_); + configured_bitstream_buffer_id_ = bitstream_buffer_id; + + DoUseOutputBitstreamBuffer(bitstream_buffer_id, &buffer); + } + MOCK_METHOD2(DoUseOutputBitstreamBuffer, + void(int32_t, mojo::ScopedSharedBufferHandle*)); + + MOCK_METHOD2(RequestEncodingParametersChange, void(uint32_t, uint32_t)); + + void set_initialization_success(bool success) { + initialization_success_ = success; + } + + private: + mojom::VideoEncodeAcceleratorClientPtr client_; + int32_t configured_bitstream_buffer_id_ = -1; + bool initialization_success_ = true; + + DISALLOW_COPY_AND_ASSIGN(MockMojoVideoEncodeAccelerator); +}; + +// Mock implementation of the client of MojoVideoEncodeAccelerator. +class MockVideoEncodeAcceleratorClient : public VideoEncodeAccelerator::Client { + public: + MockVideoEncodeAcceleratorClient() = default; + + MOCK_METHOD3(RequireBitstreamBuffers, + void(unsigned int, const gfx::Size&, size_t)); + MOCK_METHOD4(BitstreamBufferReady, + void(int32_t, size_t, bool, base::TimeDelta)); + MOCK_METHOD1(NotifyError, void(VideoEncodeAccelerator::Error)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockVideoEncodeAcceleratorClient); +}; + +// Test wrapper for a MojoVideoEncodeAccelerator, which translates between a +// pipe to a remote mojom::MojoVideoEncodeAccelerator, and a local +// media::VideoEncodeAccelerator::Client. +class MojoVideoEncodeAcceleratorTest : public ::testing::Test { + public: + MojoVideoEncodeAcceleratorTest() = default; + + void SetUp() override { + mojom::VideoEncodeAcceleratorPtr mojo_vea; + mojo_vea_binding_ = mojo::MakeStrongBinding( + base::MakeUnique<MockMojoVideoEncodeAccelerator>(), + mojo::MakeRequest(&mojo_vea)); + + mojo_vea_.reset(new MojoVideoEncodeAccelerator( + std::move(mojo_vea), gpu::VideoEncodeAcceleratorSupportedProfiles())); + } + + void TearDown() override { + // The destruction of a mojo::StrongBinding closes the bound message pipe + // but does not destroy the implementation object(s): this needs to happen + // manually by Close()ing it. + mojo_vea_binding_->Close(); + } + + MockMojoVideoEncodeAccelerator* mock_mojo_vea() { + return static_cast<media::MockMojoVideoEncodeAccelerator*>( + mojo_vea_binding_->impl()); + } + VideoEncodeAccelerator* mojo_vea() { return mojo_vea_.get(); } + + // This method calls Initialize() with semantically correct parameters and + // verifies that the appropriate message goes through the mojo pipe and is + // responded by a RequireBitstreamBuffers() on |mock_vea_client|. + void Initialize(MockVideoEncodeAcceleratorClient* mock_vea_client) { + const VideoCodecProfile kOutputProfile = VIDEO_CODEC_PROFILE_UNKNOWN; + const uint32_t kInitialBitrate = 100000u; + + EXPECT_CALL(*mock_mojo_vea(), + DoInitialize(PIXEL_FORMAT_I420, kInputVisibleSize, + kOutputProfile, kInitialBitrate, _)); + EXPECT_CALL( + *mock_vea_client, + RequireBitstreamBuffers( + _, kInputVisibleSize, + VideoFrame::AllocationSize(PIXEL_FORMAT_I420, kInputVisibleSize))); + + EXPECT_TRUE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, + kOutputProfile, kInitialBitrate, + mock_vea_client)); + base::RunLoop().RunUntilIdle(); + } + + private: + const base::MessageLoop message_loop_; + + // This member holds on to the mock implementation of the "service" side. + mojo::StrongBindingPtr<mojom::VideoEncodeAccelerator> mojo_vea_binding_; + + // The class under test, as a generic media::VideoEncodeAccelerator. + std::unique_ptr<VideoEncodeAccelerator> mojo_vea_; + + DISALLOW_COPY_AND_ASSIGN(MojoVideoEncodeAcceleratorTest); +}; + +TEST_F(MojoVideoEncodeAcceleratorTest, CreateAndDestroy) {} + +// This test verifies the Initialize() communication prologue in isolation. +TEST_F(MojoVideoEncodeAcceleratorTest, InitializeAndRequireBistreamBuffers) { + std::unique_ptr<MockVideoEncodeAcceleratorClient> mock_vea_client = + base::MakeUnique<MockVideoEncodeAcceleratorClient>(); + Initialize(mock_vea_client.get()); +} + +// This test verifies the Initialize() communication prologue followed by a +// sharing of a single bitstream buffer and the Encode() of one frame. +TEST_F(MojoVideoEncodeAcceleratorTest, EncodeOneFrame) { + std::unique_ptr<MockVideoEncodeAcceleratorClient> mock_vea_client = + base::MakeUnique<MockVideoEncodeAcceleratorClient>(); + Initialize(mock_vea_client.get()); + + const int32_t kBitstreamBufferId = 17; + { + const int32_t kShMemSize = 10; + base::SharedMemory shmem; + shmem.CreateAnonymous(kShMemSize); + EXPECT_CALL(*mock_mojo_vea(), + DoUseOutputBitstreamBuffer(kBitstreamBufferId, _)); + mojo_vea()->UseOutputBitstreamBuffer( + BitstreamBuffer(kBitstreamBufferId, shmem.handle(), kShMemSize, + 0 /* offset */, base::TimeDelta())); + base::RunLoop().RunUntilIdle(); + } + + { + const scoped_refptr<VideoFrame> video_frame = VideoFrame::CreateFrame( + PIXEL_FORMAT_I420, kInputVisibleSize, gfx::Rect(kInputVisibleSize), + kInputVisibleSize, base::TimeDelta()); + base::SharedMemory shmem; + shmem.CreateAnonymous( + VideoFrame::AllocationSize(PIXEL_FORMAT_I420, kInputVisibleSize) * 2); + video_frame->AddSharedMemoryHandle(shmem.handle()); + const bool is_keyframe = true; + + // The remote end of the mojo Pipe doesn't receive |video_frame| itself. + EXPECT_CALL(*mock_mojo_vea(), DoEncode(_, is_keyframe)); + EXPECT_CALL(*mock_vea_client, + BitstreamBufferReady(kBitstreamBufferId, _, is_keyframe, + video_frame->timestamp())); + + mojo_vea()->Encode(video_frame, is_keyframe); + base::RunLoop().RunUntilIdle(); + } +} + +// Tests that a RequestEncodingParametersChange() ripples through correctly. +TEST_F(MojoVideoEncodeAcceleratorTest, EncodingParametersChange) { + const uint32_t kNewBitrate = 123123u; + const uint32_t kNewFramerate = 321321u; + + // In a real world scenario, we should go through an Initialize() prologue, + // but we can skip that in unit testing. + + EXPECT_CALL(*mock_mojo_vea(), + RequestEncodingParametersChange(kNewBitrate, kNewFramerate)); + mojo_vea()->RequestEncodingParametersChange(kNewBitrate, kNewFramerate); + base::RunLoop().RunUntilIdle(); +} + +// This test verifies the Initialize() communication prologue fails when the +// FakeVEA is configured to do so. +TEST_F(MojoVideoEncodeAcceleratorTest, InitializeFailure) { + std::unique_ptr<MockVideoEncodeAcceleratorClient> mock_vea_client = + base::MakeUnique<MockVideoEncodeAcceleratorClient>(); + + const uint32_t kInitialBitrate = 100000u; + + mock_mojo_vea()->set_initialization_success(false); + + EXPECT_FALSE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, + VIDEO_CODEC_PROFILE_UNKNOWN, + kInitialBitrate, mock_vea_client.get())); + base::RunLoop().RunUntilIdle(); +} + +} // namespace media
diff --git a/media/mojo/interfaces/video_encode_accelerator.mojom b/media/mojo/interfaces/video_encode_accelerator.mojom index c7741a8f..3173da7 100644 --- a/media/mojo/interfaces/video_encode_accelerator.mojom +++ b/media/mojo/interfaces/video_encode_accelerator.mojom
@@ -41,11 +41,14 @@ }; // Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers(). + // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. + [Sync] Initialize(VideoPixelFormat input_format, gfx.mojom.Size input_visible_size, VideoCodecProfile output_profile, uint32 initial_bitrate, - VideoEncodeAcceleratorClient client); + VideoEncodeAcceleratorClient client) + => (bool result); // Encodes a |frame|, being completely done with it after its callback. Encode(VideoFrame frame, bool force_keyframe) => ();
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index bc8528a9..bbf9d7f 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -48,7 +48,8 @@ const gfx::Size& input_visible_size, VideoCodecProfile output_profile, uint32_t initial_bitrate, - mojom::VideoEncodeAcceleratorClientPtr client) { + mojom::VideoEncodeAcceleratorClientPtr client, + InitializeCallback success_callback) { DVLOG(1) << __func__ << " input_format=" << VideoPixelFormatToString(input_format) << ", input_visible_size=" << input_visible_size.ToString() @@ -60,6 +61,7 @@ if (!client) { DLOG(ERROR) << __func__ << "null |client|"; + std::move(success_callback).Run(false); return; } vea_client_ = std::move(client); @@ -70,6 +72,7 @@ DLOG(ERROR) << __func__ << "too large input_visible_size " << input_visible_size.ToString(); NotifyError(::media::VideoEncodeAccelerator::kInvalidArgumentError); + std::move(success_callback).Run(false); return; } @@ -79,6 +82,7 @@ if (!encoder_) { DLOG(ERROR) << __func__ << " Error creating or initializing VEA"; NotifyError(::media::VideoEncodeAccelerator::kPlatformFailureError); + std::move(success_callback).Run(false); return; } @@ -86,6 +90,7 @@ // ad-hoc background worker thread, but for the time being this doesn't seem // necessary since we're already on a background thread. + std::move(success_callback).Run(true); return; } @@ -103,6 +108,7 @@ << input_coded_size_.ToString() << ", got " << frame->coded_size().ToString(); NotifyError(::media::VideoEncodeAccelerator::kInvalidArgumentError); + std::move(callback).Run(); return; }
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.h b/media/mojo/services/mojo_video_encode_accelerator_service.h index 985bc8c..72f2d29 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.h +++ b/media/mojo/services/mojo_video_encode_accelerator_service.h
@@ -56,7 +56,8 @@ const gfx::Size& input_visible_size, VideoCodecProfile output_profile, uint32_t initial_bitrate, - mojom::VideoEncodeAcceleratorClientPtr client) override; + mojom::VideoEncodeAcceleratorClientPtr client, + InitializeCallback callback) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe, EncodeCallback callback) override;
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc index a84b764..7fd4f1e 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
@@ -98,9 +98,10 @@ RequireBitstreamBuffers(_, kInputVisibleSize, _)); const uint32_t kInitialBitrate = 100000u; - mojo_vea_service()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - H264PROFILE_MIN, kInitialBitrate, - std::move(mojo_vea_client)); + mojo_vea_service()->Initialize( + PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate, + std::move(mojo_vea_client), + base::Bind([](bool success) { ASSERT_TRUE(success); })); base::RunLoop().RunUntilIdle(); } @@ -195,9 +196,10 @@ NotifyError(VideoEncodeAccelerator::kPlatformFailureError)); const uint32_t kInitialBitrate = 100000u; - mojo_vea_service()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - H264PROFILE_MIN, kInitialBitrate, - std::move(mojo_vea_client)); + mojo_vea_service()->Initialize( + PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate, + std::move(mojo_vea_client), + base::Bind([](bool success) { ASSERT_FALSE(success); })); base::RunLoop().RunUntilIdle(); mojo_vea_binding->Close();
diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h index 2d10da7..281ac06 100644 --- a/media/video/video_encode_accelerator.h +++ b/media/video/video_encode_accelerator.h
@@ -107,6 +107,7 @@ // Initializes the video encoder with specific configuration. Called once per // encoder construction. This call is synchronous and returns true iff // initialization is successful. + // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. // Parameters: // |input_format| is the frame format of the input stream (as would be // reported by VideoFrame::format() for frames passed to Encode()).
diff --git a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter index b875db1..d8ddda72 100644 --- a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter +++ b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
@@ -76,6 +76,7 @@ -MHTMLGenerationTest.InvalidPath -MHTMLGenerationTest.ViewedMHTMLContainsNoStoreContentIfNoCacheControlPolicy -MHTMLGenerationTest.ViewedMHTMLDoesNotContainNoStoreContent +-ManifestBrowserTest.MixedContentManifest -ManifestBrowserTest.UseCredentialsSendCookies -MediaSessionImplVisibilityBrowserTestInstances/MediaSessionImplVisibilityBrowserTest* -MemoryCoordinatorImplBrowserTest.CanSuspendRenderer
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index a73a4b0..0b9b0d1 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -808,8 +808,6 @@ # Text::inDocument() returns false but should not. crbug.com/264138 dom/legacy_dom_conformance/xhtml/level3/core/nodecomparedocumentposition38.xhtml [ Failure ] -crbug.com/736676 virtual/enable_wasm_streaming/http/tests/wasm_streaming/wasm_response_apis.html [ Pass Crash ] - crbug.com/410145 [ Win ] fast/table/column-in-inline.html [ Failure ] crbug.com/410145 [ Win ] virtual/mojo-loading/fast/table/column-in-inline.html [ Failure ] crbug.com/411164 [ Win ] http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/reflection-tabular-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/reflection-tabular-expected.txt index b85d44f..79d4c86 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/reflection-tabular-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/reflection-tabular-expected.txt
@@ -30,9 +30,7 @@ PASS colgroup.hidden: 33 tests PASS colgroup.accessKey: 32 tests PASS colgroup.tabIndex: 24 tests -PASS colgroup.span: 11 tests -FAIL colgroup.span: setAttribute() to 4294967296 assert_equals: IDL get expected 1000 but got 1 -PASS colgroup.span: 53 tests +PASS colgroup.span: 65 tests PASS colgroup.align: 32 tests PASS colgroup.ch (<colgroup char>): 32 tests PASS colgroup.chOff (<colgroup charoff>): 32 tests @@ -45,9 +43,7 @@ PASS col.hidden: 33 tests PASS col.accessKey: 32 tests PASS col.tabIndex: 24 tests -PASS col.span: 11 tests -FAIL col.span: setAttribute() to 4294967296 assert_equals: IDL get expected 1000 but got 1 -PASS col.span: 53 tests +PASS col.span: 65 tests PASS col.align: 32 tests PASS col.ch (<col char>): 32 tests PASS col.chOff (<col charoff>): 32 tests @@ -105,14 +101,10 @@ PASS td.hidden: 33 tests PASS td.accessKey: 32 tests PASS td.tabIndex: 24 tests -PASS td.colSpan: 11 tests -FAIL td.colSpan: setAttribute() to 4294967296 assert_equals: IDL get expected 1000 but got 1 -PASS td.colSpan: 53 tests +PASS td.colSpan: 65 tests PASS td.rowSpan: 6 tests FAIL td.rowSpan: setAttribute() to 0 assert_equals: IDL get expected 0 but got 1 -PASS td.rowSpan: 4 tests -FAIL td.rowSpan: setAttribute() to 4294967296 assert_equals: IDL get expected 65534 but got 1 -PASS td.rowSpan: 2 tests +PASS td.rowSpan: 7 tests FAIL td.rowSpan: setAttribute() to "-0" assert_equals: IDL get expected 0 but got 1 FAIL td.rowSpan: setAttribute() to "0" assert_equals: IDL get expected 0 but got 1 PASS td.rowSpan: 40 tests @@ -138,14 +130,10 @@ PASS th.hidden: 33 tests PASS th.accessKey: 32 tests PASS th.tabIndex: 24 tests -PASS th.colSpan: 11 tests -FAIL th.colSpan: setAttribute() to 4294967296 assert_equals: IDL get expected 1000 but got 1 -PASS th.colSpan: 53 tests +PASS th.colSpan: 65 tests PASS th.rowSpan: 6 tests FAIL th.rowSpan: setAttribute() to 0 assert_equals: IDL get expected 0 but got 1 -PASS th.rowSpan: 4 tests -FAIL th.rowSpan: setAttribute() to 4294967296 assert_equals: IDL get expected 65534 but got 1 -PASS th.rowSpan: 2 tests +PASS th.rowSpan: 7 tests FAIL th.rowSpan: setAttribute() to "-0" assert_equals: IDL get expected 0 but got 1 FAIL th.rowSpan: setAttribute() to "0" assert_equals: IDL get expected 0 but got 1 PASS th.rowSpan: 40 tests
diff --git a/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values-expected.txt b/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values-expected.txt index 4067a0f..7dd6fb0 100644 --- a/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values-expected.txt
@@ -5,7 +5,7 @@ PASS document.getElementById('case1').span is 1 PASS document.getElementById('case2').span is 1 -PASS document.getElementById('case3').span is 1 +PASS document.getElementById('case3').span is 1000 PASS document.getElementById('case4').span is 1 PASS document.getElementById('case5').span is 1 PASS document.getElementById('case6').span is 1
diff --git a/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values.html b/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values.html index 3b75991..c101d859c 100644 --- a/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values.html +++ b/third_party/WebKit/LayoutTests/fast/table/incorrect-colgroup-span-values.html
@@ -15,7 +15,7 @@ shouldBe("document.getElementById('case1').span", "1"); shouldBe("document.getElementById('case2').span", "1"); - shouldBe("document.getElementById('case3').span", "1"); + shouldBe("document.getElementById('case3').span", "1000"); shouldBe("document.getElementById('case4').span", "1"); shouldBe("document.getElementById('case5').span", "1"); shouldBe("document.getElementById('case6').span", "1"); @@ -57,4 +57,4 @@ test(); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/col_span-expected.txt b/third_party/WebKit/LayoutTests/html/tabular_data/col_span-expected.txt index ddcbba3..404df76 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/col_span-expected.txt +++ b/third_party/WebKit/LayoutTests/html/tabular_data/col_span-expected.txt
@@ -24,7 +24,7 @@ PASS spanAttributeEffect("2147483647") is 1000 PASS spanAttributeEffect("2147483648") is 1000 PASS spanAttributeEffect("4294967295") is 1000 -PASS spanAttributeEffect("4294967296") is 1 +PASS spanAttributeEffect("4294967296") is 1000 PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/col_span.html b/third_party/WebKit/LayoutTests/html/tabular_data/col_span.html index 0999ded..29b8d9ed 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/col_span.html +++ b/third_party/WebKit/LayoutTests/html/tabular_data/col_span.html
@@ -44,7 +44,7 @@ shouldBe('spanAttributeEffect("2147483647")', '1000'); shouldBe('spanAttributeEffect("2147483648")', '1000'); shouldBe('spanAttributeEffect("4294967295")', '1000'); -shouldBe('spanAttributeEffect("4294967296")', '1'); +shouldBe('spanAttributeEffect("4294967296")', '1000'); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan-expected.txt b/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan-expected.txt index 53babaf..6041750 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan-expected.txt +++ b/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan-expected.txt
@@ -23,7 +23,7 @@ PASS colspanAttributeEffect("2" + arabicIndicDigitOne) is 2 PASS colspanAttributeEffect("2147483647") is 1000 PASS colspanAttributeEffect("4294967295") is 1000 -PASS colspanAttributeEffect("4294967296") is 1 +PASS colspanAttributeEffect("4294967296") is 1000 PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan.html b/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan.html index 3237c91..ed3a28c9 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan.html +++ b/third_party/WebKit/LayoutTests/html/tabular_data/td_colspan.html
@@ -43,7 +43,7 @@ shouldBe('colspanAttributeEffect("2147483647")', '1000'); shouldBe('colspanAttributeEffect("4294967295")', '1000'); -shouldBe('colspanAttributeEffect("4294967296")', '1'); +shouldBe('colspanAttributeEffect("4294967296")', '1000'); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan-expected.txt b/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan-expected.txt index ee60b592..32cf2fc4 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan-expected.txt +++ b/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan-expected.txt
@@ -23,7 +23,7 @@ PASS rowspanAttributeEffect("2" + arabicIndicDigitOne) is 2 PASS rowspanAttributeEffect("2147483647") is 65534 PASS rowspanAttributeEffect("4294967295") is 65534 -PASS rowspanAttributeEffect("4294967296") is 1 +PASS rowspanAttributeEffect("4294967296") is 65534 PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan.html b/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan.html index a845031..0125a5c 100644 --- a/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan.html +++ b/third_party/WebKit/LayoutTests/html/tabular_data/td_rowspan.html
@@ -43,7 +43,7 @@ shouldBe('rowspanAttributeEffect("2147483647")', '65534'); shouldBe('rowspanAttributeEffect("4294967295")', '65534'); -shouldBe('rowspanAttributeEffect("4294967296")', '1'); +shouldBe('rowspanAttributeEffect("4294967296")', '65534'); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/disable-interception-midway-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/disable-interception-midway-expected.txt index dec24051..84cb692 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/disable-interception-midway-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/disable-interception-midway-expected.txt
@@ -9,14 +9,14 @@ Network.responseReceived resource-iframe.html 200 text/html Network.requestIntercepted ID 2 GET i-dont-exist.css type: Stylesheet Network.responseReceived i-dont-exist.css 404 text/html -Network.loadingFailed i-dont-exist.css +Network.loadingFailed i-dont-exist.css net::ERR_ABORTED Network.requestIntercepted ID 3 GET script.js type: Script Network.responseReceived script.js 404 text/html -Network.loadingFailed script.js +Network.loadingFailed script.js net::ERR_ABORTED Network.requestIntercepted ID 4 GET script2.js type: Script ----- disableRequestInterception ----- Network.responseReceived script2.js 404 text/html -Network.loadingFailed script2.js +Network.loadingFailed script2.js net::ERR_ABORTED Page.frameStoppedLoading Network.responseReceived post-echo.pl 200 text/plain Post - ECHO SUCCESS!
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-auth-cancel-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-auth-cancel-expected.txt index 9cec389a..68ef49ac 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-auth-cancel-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-auth-cancel-expected.txt
@@ -12,6 +12,6 @@ Auth required for ID 2 ----- Cancel Auth ----- Network.responseReceived unauthorised.pl 401 text/plain -Network.loadingFailed unauthorised.pl +Network.loadingFailed unauthorised.pl net::ERR_ABORTED Page.frameStoppedLoading
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-mock404-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-mock404-expected.txt index 33eb84d..af4a164d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-mock404-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-mock404-expected.txt
@@ -10,6 +10,6 @@ Network.requestIntercepted ID 2 GET redirect1.pl type: Script mockResponse ID 2 Network.responseReceived redirect1.pl 404 text/plain -Network.loadingFailed redirect1.pl +Network.loadingFailed redirect1.pl net::ERR_ABORTED Page.frameStoppedLoading
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStyleChildElementSelectors.html b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleChildElementSelectors.html new file mode 100644 index 0000000..75cac36 --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleChildElementSelectors.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + PerfTestRunner.measureTime({ + description: "Measures the performance of applying a style on the div child of a div.", + run: function() { + var rule = applyCSSRule("div div { color: red; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStyleElementSelector.html b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleElementSelector.html new file mode 100644 index 0000000..45d094d8 --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleElementSelector.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + PerfTestRunner.measureTime({ + description: "Measures the performance of applying a style on all divs.", + run: function() { + var rule = applyCSSRule("div { color: red; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStyleGrandChildElementSelector.html b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleGrandChildElementSelector.html new file mode 100644 index 0000000..724c4a13 --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleGrandChildElementSelector.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + PerfTestRunner.measureTime({ + description: "Measures the performance of applying a style on the div grandchild of a div.", + run: function() { + var rule = applyCSSRule("div div div { color: red; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStylePartialAttributeMatchingSelector.html b/third_party/WebKit/PerformanceTests/CSS/ChangeStylePartialAttributeMatchingSelector.html new file mode 100644 index 0000000..c90816e --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStylePartialAttributeMatchingSelector.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + var allElements = document.body.getElementsByTagName("div"); + for (var i=0; i < allElements.length; i+=2) { + allElements[i].className = "wrap"; + } + PerfTestRunner.measureTime({ + description: "Measures the performance of partial attribute matching.", + run: function() { + var rule = applyCSSRule("[class^='wrap'] { color: red; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStyleSinglePseudoSelector.html~HEAD b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleSinglePseudoSelector.html~HEAD new file mode 100644 index 0000000..335a15e8f2 --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleSinglePseudoSelector.html~HEAD
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + PerfTestRunner.measureTime({ + description: "Measures the performance of a solo pseudo selector.", + run: function() { + var rule = applyCSSRule("div:after { content: 'after'; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/CSS/ChangeStyleUniversalSelector.html b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleUniversalSelector.html new file mode 100644 index 0000000..95be1d7 --- /dev/null +++ b/third_party/WebKit/PerformanceTests/CSS/ChangeStyleUniversalSelector.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script src="../resources/runner.js"></script> + <script src="resources/utils.js"></script> +</head> +<body> +</body> + <script> + createRegularDOMTree(); + PerfTestRunner.measureTime({ + description: "Measures the performance of the universal selector.", + run: function() { + var rule = applyCSSRule("* { color: red; }"); + forceStyleRecalc(document.body); + rule.remove(); + forceStyleRecalc(document.body); + }, + tracingCategories: 'blink', + traceEventsToMeasure: [ + 'Document::updateStyle', + 'Document::recalcStyle', + 'Document::rebuildLayoutTree' + ] + }); + </script> +</html> \ No newline at end of file
diff --git a/third_party/WebKit/Source/build/scripts/core/css/OWNERS b/third_party/WebKit/Source/build/scripts/core/css/OWNERS new file mode 100644 index 0000000..8e83a81 --- /dev/null +++ b/third_party/WebKit/Source/build/scripts/core/css/OWNERS
@@ -0,0 +1,8 @@ +set noparent +file://third_party/WebKit/Source/core/OWNERS + +nainar@chromium.org +shend@chromium.org +meade@chromium.org + +# COMPONENT: Blink>CSS
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn index 1939452b..46a27d9 100644 --- a/third_party/WebKit/Source/core/html/BUILD.gn +++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -240,6 +240,7 @@ "RadioNodeList.h", "RelList.cpp", "RelList.h", + "TableConstants.h", "TextControlElement.cpp", "TextControlElement.h", "TextDocument.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLTableCellElement.cpp b/third_party/WebKit/Source/core/html/HTMLTableCellElement.cpp index f7fda5a..c20dd0d 100644 --- a/third_party/WebKit/Source/core/html/HTMLTableCellElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTableCellElement.cpp
@@ -31,6 +31,7 @@ #include "core/dom/ElementTraversal.h" #include "core/frame/UseCounter.h" #include "core/html/HTMLTableElement.h" +#include "core/html/TableConstants.h" #include "core/html/parser/HTMLParserIdioms.h" #include "core/layout/LayoutTableCell.h" @@ -38,11 +39,6 @@ using namespace HTMLNames; -namespace { -const unsigned kDefaultColSpan = 1; -const unsigned kDefaultRowSpan = 1; -} // namespace - inline HTMLTableCellElement::HTMLTableCellElement(const QualifiedName& tag_name, Document& document) : HTMLTablePartElement(tag_name, document) {} @@ -52,8 +48,8 @@ unsigned HTMLTableCellElement::colSpan() const { const AtomicString& col_span_value = FastGetAttribute(colspanAttr); unsigned value = 0; - if (col_span_value.IsEmpty() || - !ParseHTMLNonNegativeInteger(col_span_value, value)) + if (!ParseHTMLClampedNonNegativeInteger(col_span_value, kMinColSpan, + kMaxColSpan, value)) return kDefaultColSpan; // Counting for https://github.com/whatwg/html/issues/1198 UseCounter::Count(GetDocument(), WebFeature::kHTMLTableCellElementColspan); @@ -64,16 +60,16 @@ UseCounter::Count(GetDocument(), WebFeature::kHTMLTableCellElementColspanGreaterThan1000); } - return std::max(1u, std::min(value, MaxColSpan())); + return value; } unsigned HTMLTableCellElement::rowSpan() const { const AtomicString& row_span_value = FastGetAttribute(rowspanAttr); unsigned value = 0; - if (row_span_value.IsEmpty() || - !ParseHTMLNonNegativeInteger(row_span_value, value)) + if (!ParseHTMLClampedNonNegativeInteger(row_span_value, kMinRowSpan, + kMaxRowSpan, value)) return kDefaultRowSpan; - return std::max(1u, std::min(value, MaxRowSpan())); + return value; } int HTMLTableCellElement::cellIndex() const {
diff --git a/third_party/WebKit/Source/core/html/HTMLTableCellElement.h b/third_party/WebKit/Source/core/html/HTMLTableCellElement.h index cb02550..ceccae0a 100644 --- a/third_party/WebKit/Source/core/html/HTMLTableCellElement.h +++ b/third_party/WebKit/Source/core/html/HTMLTableCellElement.h
@@ -50,13 +50,6 @@ const AtomicString& Headers() const; void setRowSpan(unsigned); - // Public so that HTMLTableColElement can use MaxColSpan. MaxRowSpan is only - // used by this class but keeping them together seems desirable. - // https://html.spec.whatwg.org/#dom-tdth-colspan - static unsigned MaxColSpan() { return 1000u; } - // https://html.spec.whatwg.org/#dom-tdth-rowspan - static unsigned MaxRowSpan() { return 65534u; } - private: HTMLTableCellElement(const QualifiedName&, Document&);
diff --git a/third_party/WebKit/Source/core/html/HTMLTableColElement.cpp b/third_party/WebKit/Source/core/html/HTMLTableColElement.cpp index 67d28fc..31922c6a 100644 --- a/third_party/WebKit/Source/core/html/HTMLTableColElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTableColElement.cpp
@@ -24,25 +24,22 @@ #include "core/html/HTMLTableColElement.h" +#include <algorithm> #include "core/CSSPropertyNames.h" #include "core/HTMLNames.h" #include "core/html/HTMLTableCellElement.h" #include "core/html/HTMLTableElement.h" +#include "core/html/TableConstants.h" #include "core/html/parser/HTMLParserIdioms.h" #include "core/layout/LayoutTableCol.h" -#include <algorithm> namespace blink { using namespace HTMLNames; -namespace { -const unsigned kDefaultSpan = 1; -} // namespace - inline HTMLTableColElement::HTMLTableColElement(const QualifiedName& tag_name, Document& document) - : HTMLTablePartElement(tag_name, document), span_(1) {} + : HTMLTablePartElement(tag_name, document), span_(kDefaultColSpan) {} DEFINE_ELEMENT_FACTORY_WITH_TAGNAME(HTMLTableColElement) @@ -68,14 +65,10 @@ const AttributeModificationParams& params) { if (params.name == spanAttr) { unsigned new_span = 0; - if (params.new_value.IsEmpty() || - !ParseHTMLNonNegativeInteger(params.new_value, new_span) || - new_span < 1) { - // If the value of span is not a valid non-negative integer greater than - // zero, set it to 1. - new_span = kDefaultSpan; + if (!ParseHTMLClampedNonNegativeInteger(params.new_value, kMinColSpan, + kMaxColSpan, new_span)) { + new_span = kDefaultColSpan; } - new_span = std::min(new_span, HTMLTableCellElement::MaxColSpan()); span_ = new_span; if (GetLayoutObject() && GetLayoutObject()->IsLayoutTableCol()) GetLayoutObject()->UpdateFromElement(); @@ -104,7 +97,7 @@ } void HTMLTableColElement::setSpan(unsigned n) { - SetUnsignedIntegralAttribute(spanAttr, n, kDefaultSpan); + SetUnsignedIntegralAttribute(spanAttr, n, kDefaultColSpan); } const AtomicString& HTMLTableColElement::Width() const {
diff --git a/third_party/WebKit/Source/core/html/TableConstants.h b/third_party/WebKit/Source/core/html/TableConstants.h new file mode 100644 index 0000000..009adb9 --- /dev/null +++ b/third_party/WebKit/Source/core/html/TableConstants.h
@@ -0,0 +1,26 @@ +// Copyright 2017 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 TableConstants_h +#define TableConstants_h + +namespace blink { + +// https://html.spec.whatwg.org/multipage/tables.html#dom-colgroup-span +// https://html.spec.whatwg.org/multipage/tables.html#dom-col-span +// https://html.spec.whatwg.org/multipage/tables.html#dom-tdth-colspan +constexpr unsigned kDefaultColSpan = 1u; +constexpr unsigned kMinColSpan = 1u; +constexpr unsigned kMaxColSpan = 1000u; + +// https://html.spec.whatwg.org/multipage/tables.html#dom-tdth-rowspan +constexpr unsigned kDefaultRowSpan = 1u; +constexpr unsigned kMaxRowSpan = 65534u; +// The minimum value is 1 though the standard says it's 0. It's intentional +// because we don't implement rowSpan=0 behavior. +constexpr unsigned kMinRowSpan = 1; + +} // namespace blink + +#endif // TableConstants_h
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp index 59c3063..01382eb 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp
@@ -226,9 +226,10 @@ } template <typename CharacterType> -static bool ParseHTMLNonNegativeIntegerInternal(const CharacterType* position, - const CharacterType* end, - unsigned& value) { +static WTF::NumberParsingState ParseHTMLNonNegativeIntegerInternal( + const CharacterType* position, + const CharacterType* end, + unsigned& value) { // This function is an implementation of the following algorithm: // https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-non-negative-integers // However, in order to support integers >= 2^31, we fold [1] into this. @@ -249,7 +250,7 @@ // Step 5: If position is past the end of input, return an error. if (position == end) - return false; + return WTF::NumberParsingState::kError; DCHECK_LT(position, end); // Step 6: If the character indicated by position (the first character) is a @@ -262,13 +263,13 @@ } if (position == end) - return false; + return WTF::NumberParsingState::kError; DCHECK_LT(position, end); // Step 7: If the character indicated by position is not an ASCII digit, // then return an error. if (!IsASCIIDigit(*position)) - return false; + return WTF::NumberParsingState::kError; // Step 8: Collect a sequence of characters ... StringBuilder digits; @@ -278,26 +279,36 @@ digits.Append(*position++); } - bool ok; + WTF::NumberParsingState state; unsigned digits_value; - if (digits.Is8Bit()) + if (digits.Is8Bit()) { digits_value = - CharactersToUIntStrict(digits.Characters8(), digits.length(), &ok); - else + CharactersToUIntStrict(digits.Characters8(), digits.length(), &state); + } else { digits_value = - CharactersToUIntStrict(digits.Characters16(), digits.length(), &ok); - if (!ok) - return false; - if (sign < 0 && digits_value != 0) - return false; - value = digits_value; - return true; + CharactersToUIntStrict(digits.Characters16(), digits.length(), &state); + } + // TODO(tkent): The following code to adjust NumberParsingState is not simple + // due to "-0" behavior difference between CharactersToUIntStrict() and + // ParseHTMLNonNegativeIntegerInternal(). Simplify the code by updating + // CharactersToUIntStrict() to accept "-0". + if (state == WTF::NumberParsingState::kOverflowMax && sign < 0) + return WTF::NumberParsingState::kError; + if (state == WTF::NumberParsingState::kSuccess) { + if (sign < 0 && digits_value != 0) + return WTF::NumberParsingState::kError; + value = digits_value; + } + return state; } -// https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-non-negative-integers -bool ParseHTMLNonNegativeInteger(const String& input, unsigned& value) { +static WTF::NumberParsingState ParseHTMLNonNegativeIntegerInternal( + const String& input, + unsigned& value) { unsigned length = input.length(); - if (length && input.Is8Bit()) { + if (length == 0) + return WTF::NumberParsingState::kError; + if (input.Is8Bit()) { const LChar* start = input.Characters8(); return ParseHTMLNonNegativeIntegerInternal(start, start + length, value); } @@ -306,6 +317,33 @@ return ParseHTMLNonNegativeIntegerInternal(start, start + length, value); } +// https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-non-negative-integers +bool ParseHTMLNonNegativeInteger(const String& input, unsigned& value) { + return ParseHTMLNonNegativeIntegerInternal(input, value) == + WTF::NumberParsingState::kSuccess; +} + +bool ParseHTMLClampedNonNegativeInteger(const String& input, + unsigned min, + unsigned max, + unsigned& value) { + unsigned parsed_value; + switch (ParseHTMLNonNegativeIntegerInternal(input, parsed_value)) { + case WTF::NumberParsingState::kError: + return false; + case WTF::NumberParsingState::kOverflowMin: + NOTREACHED() << input; + return false; + case WTF::NumberParsingState::kOverflowMax: + value = max; + return true; + case WTF::NumberParsingState::kSuccess: + value = std::max(min, std::min(parsed_value, max)); + return true; + } + return false; +} + template <typename CharacterType> static bool IsSpaceOrDelimiter(CharacterType c) { return IsHTMLSpace(c) || c == ',' || c == ';';
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.h b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.h index 1113ce1..ce81f5d 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.h +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.h
@@ -63,6 +63,13 @@ // http://www.whatwg.org/specs/web-apps/current-work/#rules-for-parsing-non-negative-integers CORE_EXPORT bool ParseHTMLNonNegativeInteger(const String&, unsigned&); +// https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#clamped-to-the-range +// without default value processing. +bool ParseHTMLClampedNonNegativeInteger(const String&, + unsigned min, + unsigned max, + unsigned&); + // https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-list-of-floating-point-numbers CORE_EXPORT Vector<double> ParseHTMLListOfFloatingPointNumbers(const String&);
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp index e8bae1a0..57ffb76 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -517,13 +517,7 @@ return; } - // FIXME: This error is sent to the client in didFail(), so it should not be - // an internal one. Use LocalFrameClient::cancelledError() instead. - ResourceError error(kErrorDomainBlinkInternal, 0, GetResource()->Url(), - "Load cancelled"); - error.SetIsCancellation(true); - - DispatchDidFail(error); + DispatchDidFail(ResourceError::CancelledError(GetResource()->Url())); } void DocumentThreadableLoader::SetDefersLoading(bool value) {
diff --git a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp index 0fbb3102..8da19d59 100644 --- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
@@ -302,9 +302,7 @@ // by sending a cancellation error. // Note: no more client callbacks will be done after this method -- the // clearClient() call ensures that. - ResourceError error(String(), 0, String(), String()); - error.SetIsCancellation(true); - DidFail(error); + DidFail(ResourceError::CancelledError(KURL())); DCHECK(!client_); }
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn index c1827848..02dbfa4a 100644 --- a/third_party/WebKit/Source/devtools/BUILD.gn +++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -48,7 +48,6 @@ "front_end/audits2/Audits2Panel.js", "front_end/audits2/audits2Dialog.css", "front_end/audits2/audits2Panel.css", - "front_end/audits2/audits2Tree.css", "front_end/audits2/lighthouse/renderer/dom.js", "front_end/audits2/lighthouse/renderer/details-renderer.js", "front_end/audits2/lighthouse/renderer/category-renderer.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png index 90a5392..eca94ca 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png +++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons.png Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png index 19939eb..a75002b2 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png +++ b/third_party/WebKit/Source/devtools/front_end/Images/largeIcons_2x.png Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/readme.md b/third_party/WebKit/Source/devtools/front_end/Images/readme.md new file mode 100644 index 0000000..0b5514f --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/Images/readme.md
@@ -0,0 +1,16 @@ +## Adding new icons + +1. Use Inkscape 0.48.4. Newer versions are incompatible because of DPI issues. +1. Choose an existing spritesheet, like `largeIcons.svg` to add the icon to +1. Open that file with Inkscape and import the new SVG into the document +1. Place in an open spot, and use guides to scale the icon to a good size, relative to other icons +1. Any straight lines should be snapped to the closest pixel value. + - Use the `Edit paths by nodes` tool (F2) to edit the path directly. + - Tweak the X, Y values at the top to be integers. +1. Generate pngs from the SVGs: + - `./scripts/convert_svg_images_to_png.py` +1. In `ui/Icon.js` add an entry in `UI.Icon.Descriptors`. + - Look at the spritesheet's axes to identify the correct grid position. +1. You may want to regenerate devtools resources: + - `ninja -C ~/chromium/src/out/Release/ devtools_frontend_resources` +
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg index 81d55d8..f810e42 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg +++ b/third_party/WebKit/Source/devtools/front_end/Images/src/largeIcons.svg
@@ -1,278 +1,1439 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="224" height="216" id="svg2" version="1.1" inkscape:version="0.48.4 r9939" sodipodi:docname="largeIcons.svg"> - <metadata id="metadata606"> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="224" + height="216" + id="svg2" + version="1.1" + inkscape:version="0.48.0 r9654" + sodipodi:docname="largeIcons.svg"> + <metadata + id="metadata606"> <rdf:RDF> - <cc:Work rdf:about=""> + <cc:Work + rdf:about=""> <dc:format>image/svg+xml</dc:format> - <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> - <defs id="defs604"/> - <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1407" inkscape:window-height="1195" id="namedview602" showgrid="true" inkscape:zoom="4.3703705" inkscape:cx="108.18205" inkscape:cy="107.38296" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" inkscape:current-layer="svg2"> - <inkscape:grid type="xygrid" id="grid3583" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true" spacingx="28px" spacingy="24px"/> + <defs + id="defs604" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1407" + inkscape:window-height="1195" + id="namedview602" + showgrid="true" + inkscape:zoom="17.481482" + inkscape:cx="183.14435" + inkscape:cy="135.46745" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg2"> + <inkscape:grid + type="xygrid" + id="grid3583" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + spacingx="28px" + spacingy="24px" /> </sodipodi:namedview> - <g id="g4"> - <g transform="translate(-322,-72)" id="g8"> - <circle transform="translate(326,74)" cx="15" cy="17" r="3" id="circle10" d="m 18,17 c 0,1.656854 -1.343146,3 -3,3 -1.656854,0 -3,-1.343146 -3,-3 0,-1.656854 1.343146,-3 3,-3 1.656854,0 3,1.343146 3,3 z" sodipodi:cx="15" sodipodi:cy="17" sodipodi:rx="3" sodipodi:ry="3" style="fill:#009802"/> - <path d="m 329,77 h 18 v 18 h -18 z" id="path12" inkscape:connector-curvature="0" style="fill:none"/> - <path d="m 327.25,75.25 h 20 v 20 h -20 z" id="path14" inkscape:connector-curvature="0" style="fill:none"/> - <path d="m 325.12,73.125 h 20 v 20 h -20 z" id="path16" inkscape:connector-curvature="0" style="fill:none"/> - </g> - </g> - <g transform="translate(28,0)" id="g18"> - <path transform="translate(-32,0)" d="M 57,12 53.5,8 H 39 v 8 h 14.5" id="path22" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,24)" id="g24"> - <path transform="translate(-224,-120)" d="m 240.77,127 h -1.534 v 4.233 h -4.233 v 1.534 h 4.233 V 137 h 1.534 v -4.233 h 4.233 v -1.534 H 240.77 V 127 z" id="path28" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,24)" id="g30"> - <path transform="translate(-96,-145)" d="m 103,148 h 18 v 18 h -18 z" id="path34" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-96,-145)" d="m 115.42,154.7 -6.705,-6.705 -1.0575,1.0575 1.785,1.785 -3.8625,3.8625 c -0.4425,0.4425 -0.4425,1.155 0,1.59 l 4.125,4.125 c 0.2175,0.2175 0.51,0.33 0.795,0.33 0.285,0 0.5775,-0.1125 0.795,-0.33 l 4.125,-4.125 c 0.4425,-0.435 0.4425,-1.1475 0,-1.59 z m -8.5125,0.795 3.5925,-3.5925 3.5925,3.5925 h -7.185 z m 10.342,1.125 c 0,0 -1.5,1.6275 -1.5,2.625 0,0.825 0.675,1.5 1.5,1.5 0.825,0 1.5,-0.675 1.5,-1.5 0,-0.9975 -1.5,-2.625 -1.5,-2.625 z" id="path36" inkscape:connector-curvature="0"/><path transform="translate(-96,-145)" d="m 103,163 h 18 v 3 h -18 z" id="path38" inkscape:connector-curvature="0" style="fill-opacity:0.36000001"/> - </g> - <g transform="translate(0,48)" id="g40"> - <path transform="translate(7,3)" d="M 0,0 H 18 V 18 H 0 z" id="path44" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(7,3)" d="m 13,5 h 1.4936 C 15.32558,5 16,5.67154 16,6.5064 v 7.9871 c 0,0.83198 -0.67154,1.5064 -1.5064,1.5064 H 6.5065 c -0.83198,0 -1.5064,-0.67154 -1.5064,-1.5064 v -1.4936 h 6.4936 c 0.8349,0 1.5064,-0.67446 1.5064,-1.5064 V 4.9999 z" id="path46" inkscape:connector-curvature="0" style="fill-opacity:0.36000001"/><path transform="translate(7,3)" d="M 3.5,2 C 2.669,2 2,2.669 2,3.5 v 8 C 2,12.331 2.669,13 3.5,13 h 8 c 0.831,0 1.5,-0.669 1.5,-1.5 v -8 C 13,2.669 12.331,2 11.5,2 h -8 z m 0,1.5 h 8 v 8 h -8 v -8 z" id="path48" inkscape:connector-curvature="0" style="fill:#212121"/> - </g> - <g transform="translate(28,48)" id="g50"> - <path transform="translate(-96,-24)" d="m 107,33 h 8 v 6 h -8 z" stroke-miterlimit="4.2" id="path54" inkscape:connector-curvature="0" style="stroke:#000000;stroke-width:2;stroke-miterlimit:4.19999981"/><path transform="translate(-96,-24)" d="m 115,36 4,-4 v 8" id="path56" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,0)" id="g58"> - <g id="g62" style="stroke:#000000"> - <path transform="matrix(0.36,0,0,0.36,-2.5,7.46)" d="m 53,14 a 3,3 0 1 1 -6,0 3,3 0 1 1 6,0 z" id="path64" inkscape:connector-curvature="0" style="fill-rule:evenodd;stroke-width:2.77800012"/> - <path transform="translate(-128,-120)" d="m 143.48,129.5 2.5403,-2 h -1.5242 v -2 h -2 l -0.0161,2 h -1.5403 z" id="path66" inkscape:connector-curvature="0"/> - <path transform="translate(-128,-120)" d="m 146.5,132.5 2,2.5 v -1.4998 l 2,-1e-4 v -2.0002 l -2,1e-4 V 130 z" id="path68" inkscape:connector-curvature="0"/> - <path transform="translate(-128,-120)" d="m 143.5,135.5 -2.5,2 h 1.5 v 2 h 2 v -2 h 1.5 z" id="path70" inkscape:connector-curvature="0"/> - <path transform="translate(-128,-120)" d="m 140.5,132.5 -2,-2.5 v 1.4999 h -2 v 2.0002 l 2,-3e-4 V 135 z" id="path72" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(56,24)" id="g74"> - <g id="g78" style="fill-rule:evenodd"> - <path transform="matrix(0.9018,0,0,0.9018,4.308,4.525)" d="M 0,0 H 18 V 18 H 0 z" id="path80" inkscape:connector-curvature="0" style="fill:none"/> - <path transform="matrix(0.9018,0,0,0.9018,4.308,4.525)" d="M 4.174,8.343 2.76,9.757 7.003,13.999 15.488,5.514 14.074,4.1 7.003,11.171 z" id="path82" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(57,47)" id="g84"> - <path transform="translate(-68,-143)" d="M 76.94,152 76,152.94 79.0533,156 76,159.06 l 0.94,0.94 4,-4 z" id="path88" inkscape:connector-curvature="0"/><path transform="translate(-68,-143)" d="M 80.94,152 80,152.94 83.0533,156 80,159.06 l 0.94,0.94 4,-4 z" id="path90" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,72)" id="g92"> - <path transform="translate(-64,0)" d="m 80.44,16.94 c -2.48,0 -4.5,-2.02 -4.5,-4.5 0,-0.88 0.26,-1.7 0.69,-2.39 l 6.2,6.2 c -0.69,0.44 -1.51,0.69 -2.39,0.69 m 4.5,-4.5 c 0,0.88 -0.26,1.7 -0.69,2.39 l -6.2,-6.2 c 0.69,-0.44 1.51,-0.69 2.39,-0.69 2.48,0 4.5,2.02 4.5,4.5 M 80.5,6 C 76.91,6 74,8.91 74,12.5 74,16.09 76.91,19 80.5,19 84.09,19 87,16.09 87,12.5 87,8.91 84.09,6 80.5,6" id="path96" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,72)" id="g98"> - <g id="g102" style="fill-rule:evenodd"> - <path transform="matrix(0.87153,0,0,0.87153,4.071,4.568)" d="M 0,0 H 18 V 18 H 0 z" id="path104" inkscape:connector-curvature="0" style="fill:none"/> - <path transform="matrix(0.87153,0,0,0.87153,4.071,4.568)" d="M 12,3.5 A 1.505,1.505 0 0 0 10.494,2 H 4.506 C 3.676,2 3,2.674 3,3.506 v 7.988 C 3,12.326 3.671,12.997 4.5,13 V 3.5 H 12 z M 6,6.506 C 6,5.674 6.676,5 7.506,5 h 5.988 C 14.326,5 15,5.672 15,6.506 v 7.988 C 15,15.326 14.324,16 13.494,16 H 7.506 A 1.505,1.505 0 0 1 6,14.494 V 6.506 z M 7.5,6.5 h 6 v 8 h -6 v -8 z" id="path106" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(56,72)" id="g108"> - <path transform="translate(0,-24)" d="M 25,36 21.36,32 H 19.57 L 14,40 h 7.36 L 25,36 z" id="path112" inkscape:connector-curvature="0"/><path transform="translate(0,-24)" d="m 7,32 v 8 H 9.05 L 14,32 H 7 z" id="path114" inkscape:connector-curvature="0"/><path transform="translate(0,-24)" d="M 9.67,44.55 8.08,43.23 18.84,27.45 20.43,28.77 9.67,44.55 z" id="path116" inkscape:connector-curvature="0"/><path transform="translate(0,-24)" d="M 0,24 H 24 V 48 H 0 z" id="path118" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(0,-24)" d="M 0,24 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z" id="path120" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(0,-24)" d="M 0,24 H 24 V 48 H 0 z" id="path122" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(0,-24)" d="M 0,24 H 24 V 48 H 0 z" id="path124" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(0,-24)" d="M 0,24 H 24 V 48 H 0 z" id="path126" inkscape:connector-curvature="0" style="fill:none"/> - </g> - <g transform="translate(84,0)" id="g128"> - <path transform="translate(-128,0)" d="M 149,8.33 147.67,7 144,10.67 140.33,7 139,8.33 142.67,12 139,15.67 140.33,17 144,13.33 147.67,17 149,15.67 145.33,12 149,8.33 z" id="path132" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,24)" id="g134"> - <path transform="translate(-32,-24)" d="M 53,37 H 43 v -5 h 10 v 5 z M 41,42 H 55 V 30 H 41 v 12 z" id="path138" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,48)" id="g140"> - <path transform="translate(-224,-48)" d="m 238,64 h 7 v -8 h -7 z m 9,2 H 233 V 54 h 14 z" id="path144" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,72)" id="g146"> - <path transform="translate(-256,-48)" d="m 274,64 h -7 v -8 h 7 v 8 z m -9,2 h 14 V 54 h -14 v 12 z" id="path150" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,96)" id="g152"> - <path transform="translate(-160,0)" d="m 169,16.089 v 2.9105 h 2.9105 L 180.1944,10.7156 177.2838,7.8051 169,16.089 z m 13.769,-7.9387 c 0.30785,-0.30785 0.30785,-0.79294 0,-1.1008 l -1.8191,-1.8191 c -0.30785,-0.30784 -0.79295,-0.30784 -1.1008,0 l -1.5206,1.5299 2.9105,2.9105 1.5299,-1.5206 z" id="path156" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,96)" id="g158"> - <path transform="translate(-288,-120)" d="m 310.77,127.04 -1.816,-1.8164 c -0.30331,-0.30338 -0.79716,-0.30338 -1.1005,0 l -2.4304,2.4309 -1.4894,-1.4935 -1.1005,1.1007 1.1044,1.1046 -6.9373,6.9348 v 3.695 h 3.6942 l 6.9373,-6.9387 1.1005,1.1046 1.1005,-1.1007 -1.4932,-1.4935 2.4304,-2.4309 c 0.3072,-0.30338 0.3072,-0.79345 0,-1.0968 z m -10.721,10.4 -1.4932,-1.4935 6.2724,-6.2736 1.4932,1.4935 -6.2723,6.2736 z" id="path162" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,96)" id="g164"> - <path transform="translate(-32,-48)" d="m 44,59 2,3 v 4 h 4 v -4 l 2,-3 z" id="path168" inkscape:connector-curvature="0" style="opacity:0.5;fill:#424242"/><path transform="translate(-32,-48)" d="m 46.5,65.23 c 0.32,0.13 0.84,0.24 1.47,0.24 0.59,0 1.14,-0.1 1.53,-0.26 v -3.93 l 4,-4.57 v -0.19 h -11 v 0.22 l 4,4.57 v 3.93 z M 47.97,67 C 46.81,66.91 45.82,66.71 45,66.01 V 61.89 L 41,57.32 V 55 h 14 v 2.35 l -4,4.57 v 4.13 c -0.92,0.67 -2.1,0.94 -3.03,0.95" id="path170" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,96)" id="g172"> - <path transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" d="m 108.56,195.24 h 24 v 24 h -24 z" id="path176" inkscape:connector-curvature="0" style="fill:none"/><path transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" d="m 108.56,215.24 h 24 v 4 h -24 z" id="path178" inkscape:connector-curvature="0" style="fill-opacity:0.36000001"/><path transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" d="m 119.56,198.24 -5.5,14 h 2.25 l 1.12,-3 h 6.25 l 1.12,3 h 2.25 l -5.49,-14 h -2 z m -1.38,9 2.38,-6.33 2.38,6.33 h -4.76 z" id="path180" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,0)" id="g182"> - <path transform="matrix(0,-1,1,0,-112,-260)" d="m -278.5,126.5 h 14 v 12 h -14 z" id="path186" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="matrix(0,1,1,0,-112,-260)" d="m 272,132.5 -5,-3.25 v 6.5" id="path188" inkscape:connector-curvature="0"/><path transform="matrix(0,-1,1,0,-112,-260)" d="m -275,126 h 1 v 13 h -1 z" id="path190" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,24)" id="g192"> - <path transform="translate(-192,-72)" d="m 200.5,78.5 h 14 v 12 h -14 z" id="path196" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="translate(-192,-72)" d="m 207,84.5 5,-3.25 v 6.5" id="path198" inkscape:connector-curvature="0"/><path transform="translate(-192,-72)" d="m 204,78 h 1 v 13 h -1 z" id="path200" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,48)" id="g202"> - <path transform="matrix(-1,0,0,1,-192,-120)" d="m -214.5,126.5 h 14 v 12 h -14 z" id="path206" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="translate(-192,-120)" d="m 208,132.5 -5,-3.25 v 6.5" id="path208" inkscape:connector-curvature="0"/><path transform="matrix(-1,0,0,1,-192,-120)" d="m -211,126 h 1 v 13 h -1 z" id="path210" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,72)" id="g212"> - <path transform="matrix(0,1,1,0,-88,283)" d="m -278.5,102.5 h 14 v 12 h -14 z" id="path216" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="matrix(0,-1,1,0,-88,283)" d="m 272,108.5 -5,-3.25 v 6.5" id="path218" inkscape:connector-curvature="0"/><path transform="matrix(0,1,1,0,-88,283)" d="m -275,102 h 1 v 13 h -1 z" id="path220" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,96)" id="g222"> - <path transform="translate(-224,0)" d="m 237,11 h -4 V 7 h 4 v 4 z" id="path226" inkscape:connector-curvature="0"/><path transform="translate(-224,0)" d="m 247,9 h -9 V 7 h 9 v 2 z" id="path228" inkscape:connector-curvature="0"/><path transform="translate(-224,0)" d="m 247,11 h -9 v -1 h 9 v 1 z" id="path230" inkscape:connector-curvature="0"/><path transform="translate(-224,0)" d="m 247,15 h -9 v -2 h 9 v 2 z" id="path232" inkscape:connector-curvature="0"/><path transform="translate(-224,0)" d="m 237,17 h -4 v -4 h 4 v 4 z" id="path234" inkscape:connector-curvature="0"/><path transform="translate(-224,0)" d="m 247,17 h -9 v -1 h 9 v 1 z" id="path236" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,120)" id="g238"> - <path transform="translate(0,-144)" d="m 23,157 h -2 v 2 h 2 z" id="path242" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 23,161 h -2 v 2 c 1,0 2,-1 2,-2 z" id="path244" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 23,153 h -2 v 2 h 2 z" id="path246" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 21,149 v 2 h 2 c 0,-1 -1,-2 -2,-2 z" id="path248" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 11,163 h 4 v -6 H 9 v 4 c 0,1.1 0.9,2 2,2 z" id="path250" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="M 11,153 H 9 v 2 h 2 z" id="path252" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 19,149 h -2 v 2 h 2 z" id="path254" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 19,161 h -2 v 2 h 2 z" id="path256" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 11,149 c -1,0 -2,1 -2,2 h 2 z" id="path258" inkscape:connector-curvature="0"/><path transform="translate(0,-144)" d="m 15,149 h -2 v 2 h 2 z" id="path260" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,120)" id="g262"> - <path transform="translate(-290,-46)" d="m 317,69 v -5 l -5,5 h 5 z" id="path266" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,120)" id="g268"> - <g id="g272" style="fill-rule:evenodd"> - <path transform="matrix(1.4142,0,0,1.4142,-278.88,-36.772)" d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" id="path274" inkscape:connector-curvature="0"/> - <path transform="matrix(1.4142,0,0,1.4142,-278.88,-31.772)" d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" id="path276" inkscape:connector-curvature="0"/> - <path transform="matrix(1.4142,0,0,1.4142,-278.88,-26.772)" d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" id="path278" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(84,120)" id="g280"> - <path transform="translate(-162,-144)" d="m 166,147 h 18 v 18 h -18 z" id="path284" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-162,-144)" d="m 181.52,154.53 c -0.51,-2.58 -2.7862,-4.5262 -5.5162,-4.5262 -2.1675,0 -4.0462,1.23 -4.9875,3.0262 -2.2538,0.24375 -4.0125,2.1525 -4.0125,4.4738 0,2.4862 2.0138,4.5 4.5,4.5 h 9.75 c 2.07,0 3.75,-1.68 3.75,-3.75 0,-1.98 -1.5412,-3.585 -3.4838,-3.7238 z m -0.26625,5.9738 h -9.75 c -1.6575,0 -3,-1.3425 -3,-3 0,-1.6575 1.3425,-3 3,-3 h 0.5325 c 0.49125,-1.7288 2.0775,-3 3.9675,-3 2.28,0 4.125,1.845 4.125,4.125 v 0.375 h 1.125 c 1.2412,0 2.25,1.0088 2.25,2.25 0,1.2412 -1.0088,2.25 -2.25,2.25 z" id="path286" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,120)" id="g288"> - <path transform="translate(-226,-72)" d="m 235,76 c -0.55,0 -0.99,0.45 -0.99,1 L 234,91 c 0,0.55 0.44,1 1,1 h 10 c 0.55,0 1,-0.45 1,-1 V 81 l -5,-5 h -6 z m 6,5 v -4 l 4,4 h -4 z" id="path292" inkscape:connector-curvature="0"/><path transform="translate(-226,-72)" d="m 231,75 h 18 v 18 h -18 z" id="path294" inkscape:connector-curvature="0" style="fill:none"/> - </g> - <g transform="translate(140,0)" id="g296"> - <path transform="translate(-162,-24)" d="m 169,29 h 18 v 18 h -18 z" id="path300" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-162,-24)" d="m 167.25,27.25 h 20 v 20 h -20 z" id="path302" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-162,-24)" d="m 165.12,25.125 h 20 v 20 h -20 z" id="path304" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-162,-24)" d="m 171,28 c -0.55,0 -1,0.45 -1,1 v 14 c 0,0.55 0.44,1 1,1 h 5.0938 c -0.0656,-0.32311 -0.0937,-0.65753 -0.0937,-1 0,-2.7614 2.2386,-5 5,-5 0.34247,0 0.67689,0.02816 1,0.09375 v -5.0938 l -5,-5 h -6 z m 6,1 4,4 h -4 v -4 z" id="path306" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(140,24)" id="g308"> - <path transform="translate(-66,-120)" d="m 71,124 h 18 v 18 H 71 z" id="path312" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-66,-120)" d="m 82,129 -2,-2 h -5 c -0.55,0 -1,0.45 -1,1 v 10 c 0,0.55 0.45,1 1,1 h 12 c 0.55,0 1,-0.45 1,-1 v -8 c 0,-0.55 -0.45,-1 -1,-1 h -5 z" id="path314" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(140,48)" id="g316"> - <path transform="translate(-258,-144)" d="m 278,150 h -10.5 c -0.8325,0 -1.5,0.675 -1.5,1.5 v 9 c 0,0.825 0.6675,1.5 1.5,1.5 H 278 c 0.825,0 1.5,-0.675 1.5,-1.5 v -9 c 0,-0.825 -0.6675,-1.5 -1.5,-1.5 z m 0,10.5 H 267.5 V 153 H 278 v 7.5 z" id="path320" inkscape:connector-curvature="0" style="fill:#010101"/><path transform="translate(-258,-144)" d="m 262.97,147.07 h 18 v 18 h -18 z" id="path322" inkscape:connector-curvature="0" style="fill:none"/> - </g> - <g transform="translate(140,72)" id="g324"> - <path transform="translate(6,3.9)" d="M 9,1 H 3.9954 C 3.45567,1 3,1.45078 3,2.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 h 8.0092 C 12.54433,14.9996 13,14.54882 13,13.9928 V 4.9996 l -4,-4 z m 3,4 H 9 V 2 l 3,3 z M 6,7 11,9.5 6,12 V 7 z" id="path328" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(140,96)" id="g330"> - <g id="g334" style="stroke:#000000"> - <path transform="matrix(0.72907,0,0,0.72907,5.617,4.598)" d="M 7.854,6.963 6.877,7.279 6.857,8.617 6.889,8.705 7.398,9.699 6.188,10.578 5.398,9.787 5.326,9.73 4.047,9.336 3.443,10.166 4.213,11.26 4.291,11.313 5.287,11.817 4.824,13.241 3.72,13.065 3.628,13.061 2.362,13.493 v 1.027 l 1.266,0.434 0.092,-0.004 1.104,-0.178 0.463,1.424 -0.996,0.506 -0.078,0.051 -0.77,1.094 0.604,0.83 1.279,-0.393 0.072,-0.059 0.789,-0.791 1.211,0.879 -0.51,0.996 -0.031,0.086 0.02,1.338 0.977,0.316 0.803,-1.068 0.025,-0.09 0.172,-1.104 h 1.498 l 0.172,1.104 0.025,0.09 0.803,1.068 0.977,-0.316 0.02,-1.338 -0.031,-0.086 -0.51,-0.996 1.211,-0.879 0.789,0.791 0.072,0.059 1.279,0.393 0.604,-0.83 -0.771,-1.094 -0.076,-0.051 -0.996,-0.506 0.461,-1.424 1.105,0.178 0.092,0.004 1.266,-0.434 v -1.027 l -1.266,-0.432 -0.092,0.004 -1.105,0.176 -0.461,-1.424 0.996,-0.504 0.076,-0.053 0.771,-1.094 L 15.159,9.336 13.88,9.731 13.808,9.788 13.019,10.579 11.808,9.7 12.318,8.706 12.349,8.618 12.329,7.28 11.352,6.964 10.549,8.034 10.524,8.122 10.352,9.227 H 8.854 L 8.682,8.121 8.656,8.03 7.854,6.963 m 1.748,3.398 a 3.621,3.645 0 0 1 3.621,3.645 3.621,3.645 0 0 1 -3.621,3.646 3.621,3.645 0 0 1 -3.619,-3.646 3.621,3.645 0 0 1 3.619,-3.645 z" id="path336" inkscape:connector-curvature="0"/> - <path transform="matrix(0.72907,0,0,0.72907,5.227,3.617)" d="M 14.885,1.563 14.178,1.957 14.365,3.24 14.396,3.279 15.14,4.04 14.553,5.03 13.529,4.736 13.479,4.729 12.262,5.172 12.25,5.98 13.455,6.459 13.506,6.453 14.537,6.189 15.1,7.191 14.332,7.932 14.301,7.971 14.08,9.248 14.771,9.662 15.787,8.859 15.807,8.811 16.1,7.787 17.242,7.803 17.502,8.834 17.52,8.883 18.514,9.715 19.219,9.32 19.03,8.04 19,7.998 18.258,7.234 18.844,6.25 19.869,6.541 19.92,6.551 21.14,6.105 21.15,5.297 19.943,4.818 19.893,4.824 18.861,5.088 18.301,4.086 19.07,3.346 19.1,3.307 19.322,2.029 18.627,1.615 17.609,2.418 17.59,2.467 17.303,3.49 16.16,3.475 15.896,2.443 15.879,2.395 14.885,1.563 z m 1.814,2.138 a 1.938,1.938 0 0 1 1.938,1.938 1.938,1.938 0 0 1 -1.938,1.937 1.938,1.938 0 0 1 -1.937,-1.937 1.938,1.938 0 0 1 1.937,-1.938 z" id="path338" inkscape:connector-curvature="0" style="stroke-width:0.89899999"/> - </g> - </g> - <g transform="translate(140,120)" id="g340"> - <g id="g344" style="fill:none"> - <path transform="translate(8,4)" d="M 0,0 H 16 V 16 H 0 V 0 z" id="path346" inkscape:connector-curvature="0" style="opacity:0.5"/> - <path transform="translate(8,4)" d="M 6,14 H 3.5 C 2.5,14 2,13.5 2,12.5 v -9 C 2,2.5 2.5,2 3.5,2 h 9 C 14,2 14,3.4678 14,3.5 V 6 H 13 V 3 H 3 v 10 h 3 v 1 z m 9,-5 -3,2 3,3 -1,1 -3,-3 -2,3 -2,-8 8,2 z" id="path348" inkscape:connector-curvature="0" style="fill:#000000"/> - </g> - </g> - <g transform="translate(0,144)" id="g350"> - <path transform="translate(-98,-120)" d="m 110.5,127.5 h -1 l 2,-2 2,2 h -1 c 0,0 -0.0345,4.6379 -0.0345,4.0345 l 4.0345,-0.034 v -1 l 2,2 -2,2 v -1 l -4.0345,-0.034 0.0345,4.0346 h 1 l -2,2 -2,-2 h 1 l 0.0345,-4.0346 -4.0345,0.034 v 1 l -2,-2 2,-2 v 1 l 4.0345,0.034 z" id="path354" inkscape:connector-curvature="0" style="stroke:#000000"/> - </g> - <g transform="translate(28,144)" id="g356"> - <path transform="translate(-320,0)" d="m 333.6,15.2 h 1.6 V 8.8 h -1.6 v 6.4 z M 336,4 c -4.42,0 -8,3.58 -8,8 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 z m 0,14.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z m 0.8,-3.2 h 1.6 V 8.8 h -1.6 v 6.4 z" id="path360" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,144)" id="g362"> - <path transform="translate(-32,-72)" d="m 47,88 h -3 v -8 h 3 v 8 z" id="path366" inkscape:connector-curvature="0"/><path transform="translate(-32,-72)" d="m 53,88 h -3 v -8 h 3 v 8 z" id="path368" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,144)" id="g370"> - <path transform="translate(-256,0)" d="m 275,15 h -2 V 9 h 2 z m -4,0 h -2 V 9 h 2 z m 4,-10 h -6 l -4,4 v 6 l 4,4 h 6 l 4,-4.12 V 9 z" id="path374" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(112,144)" id="g376"> - <g font-weight="400" id="g380" style="font-weight:400;font-family:Sans"> - <path transform="translate(-289,-96)" d="m 300,101 v 4.0001 1.0001 l 3.3434,0.53115 -0.0156,8.0468 -1.3278,0.42183 c 0.006,0.59278 0.43931,1.0114 1,1 h 8 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -14 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -10 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,0 h 10 v 14 h -8 l 0.71845,-0.42179 0.0937,-8.4218 -2.8122,-0.1561 v -0.99993 z" overflow="visible" style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible" id="path382" inkscape:connector-curvature="0"/> - <path transform="translate(-289,-96)" d="m 297,106 v 9 c 0.006,0.59278 0.43931,1.0114 1,1 h 5 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -9 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -5 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,1.0002 h 5 v 7 h -5 z" overflow="visible" style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible" id="path384" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(140,144)" id="g386"> - <path transform="translate(-320,-48)" d="m 328,60 c 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 -4.42,0 -8,3.58 -8,8 z m 8,6.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z M 334.5067,63.4286 339.0781,60 334.5067,56.5714 v 6.8571 z" id="path390" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,168)" id="g392"> - <path transform="translate(-96,-48)" d="m 108,60 10,-5 v 10" id="path396" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,168)" id="g398"> - <path transform="translate(-64,-48)" d="M 86,60 76,55 v 10" id="path402" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,168)" id="g404"> - <path transform="translate(-256,-24)" d="m 268.01,35.99 c 0.61,0.28 1.07,0.9 1.07,1.58 0.11,0.85 -0.05,1.72 0.12,2.57 0.27,0.54 1,0.28 1.43,0.55 0.49,0.24 0.48,1.01 -0.06,1.18 -0.56,0.22 -1.18,0.08 -1.74,-0.05 -0.71,-0.2 -1.41,-0.72 -1.5,-1.5 -0.18,-0.89 0.01,-1.8 -0.16,-2.68 -0.22,-0.64 -0.94,-0.9 -1.57,-0.93 -0.58,-0.1 -0.83,-0.94 -0.35,-1.3 0.51,-0.35 1.26,-0.14 1.69,-0.66 0.44,-0.48 0.29,-1.18 0.32,-1.78 0,-0.81 -0.02,-1.77 0.65,-2.34 0.66,-0.54 1.58,-0.71 2.41,-0.63 0.63,0 0.98,0.87 0.4,1.22 -0.44,0.37 -1.2,0.06 -1.51,0.65 -0.14,0.56 -0.05,1.15 -0.07,1.73 -0.01,0.75 -0.05,1.64 -0.72,2.13 -0.12,0.1 -0.26,0.19 -0.4,0.26" id="path408" inkscape:connector-curvature="0"/><path transform="translate(-256,-24)" d="m 276.98,35.99 c -0.67,-0.3 -1.08,-1.02 -1.08,-1.75 -0.07,-0.76 0.03,-1.52 -0.06,-2.28 -0.24,-0.58 -0.98,-0.4 -1.46,-0.59 -0.59,-0.24 -0.48,-1.18 0.14,-1.31 0.73,-0.15 1.52,-0.01 2.18,0.32 0.56,0.28 0.95,0.86 0.99,1.48 0.13,0.83 -0.03,1.68 0.13,2.5 0.2,0.68 0.94,0.83 1.54,0.9 0.56,0.07 0.86,0.8 0.46,1.21 -0.44,0.46 -1.2,0.2 -1.65,0.66 -0.51,0.46 -0.4,1.21 -0.4,1.83 -0.03,0.78 0.06,1.69 -0.52,2.3 -0.74,0.65 -1.8,0.86 -2.75,0.68 -0.52,-0.16 -0.69,-1.01 -0.15,-1.25 0.44,-0.23 1.02,-0.08 1.41,-0.45 0.26,-0.45 0.09,-0.98 0.14,-1.47 0.01,-0.76 -0.07,-1.63 0.43,-2.26 0.18,-0.21 0.42,-0.37 0.66,-0.51" id="path410" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,168)" id="g412"> - <g id="g416"> - <path d="M 0,0 H 24 V 24 H 0 z" id="path418" inkscape:connector-curvature="0" style="fill:none"/> - <path d="m 16,6 c -3.31,0 -6,2.69 -6,6 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 h -2 c 0,2.2091 -1.7909,4 -4,4 -2.2091,0 -4,-1.7909 -4,-4 0,-2.2091 1.7909,-4 4,-4 1.2756,0 2.3926,0.60127 3.125,1.5312 h 2.3438 C 20.52659,7.4496 18.4308,6 16,6 z" id="path420" inkscape:connector-curvature="0"/> - <path d="M 21.091,6.88 V 9.9718 H 17.9992 z" id="path422" inkscape:connector-curvature="0" style="stroke:#000000;stroke-width:1.06799996"/> - </g> - </g> - <g transform="translate(112,168)" id="g424"> - <path transform="translate(8,4)" d="M 2.5858,13.891 C 0.9959,12.4291 0,10.3315 0,8.0002 c 0,-4.42 3.58,-8 8,-8 4.42,0 8,3.58 8,8 0,4.42 -3.58,8 -8,8 v -1.6 c 3.528,0 6.4,-2.872 6.4,-6.4 0,-3.528 -2.872,-6.4 -6.4,-6.4 -3.528,0 -6.4,2.872 -6.4,6.4 0,1.9357 0.86461,3.674 2.2278,4.8487 l 1.6925,-1.4201 0.015145,4.463 -4.3925,-0.7899 1.443,-1.2108 z M 6.5066,11.4287 11.078,8.0001 6.5066,4.5715 v 6.8571 z" id="path428" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(140,168)" id="g430"> - <path transform="translate(0,-72)" d="M 23,84 15,79 V 89" id="path434" inkscape:connector-curvature="0"/><path transform="translate(0,-72)" d="M 13,89 H 10 V 79 h 3 v 10 z" id="path436" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,0)" id="g438"> - <path transform="translate(-160,-120)" d="m 169.2,130.15 c 0.0551,-0.1128 0.15339,-0.22 0.2313,-0.3064 0.54584,-0.6074 1.3889,-1.1974 3.0053,-1.5702 v -2.1715 c -1.2931,0.2523 -2.3146,0.6686 -3.304,1.5597 -0.33248,0.3832 -0.50543,0.6247 -0.514,1.1665 -0.007,0.443 0.17732,0.8863 0.58141,1.3219 z m 6.6309,3.1292 c -1.6164,-0.024 -3.1091,-0.2558 -4.6228,-0.764 -2.6938,-0.9037 -3.0286,-2.1697 -3.1703,-2.5931 -0.0958,1.6897 0.028,2.9573 0.0346,3.0648 0.092,1.5004 1.2918,2.6742 2.1575,3.1151 1.7796,0.9067 3.6614,1.3756 5.601,1.4151 v 2.4842 l 3.251,-4.6483 -3.251,-4.6486 v 2.5748 z m -0.32327,-5.2959 c 1.6164,0.01 3.4529,0.3384 5.2454,1.1131 0.73528,0.3177 1.3275,0.7904 1.8082,1.3048 0.33152,-0.1523 0.80672,-0.7308 0.74126,-1.2923 -0.16163,-1.3879 -1.6264,-2.1912 -1.8801,-2.3045 -1.7704,-0.7908 -3.9751,-1.0356 -5.9147,-1.0589 v -1.7442 l -2.0132,2.8787 2.0132,2.8783 v -1.775 z m 8.4236,1.8658 c -0.0824,0.6478 -0.82676,2.0349 -3.8978,2.9138 v 4.5247 c 1.1314,-0.3677 2.465,-1.2956 3.1787,-2.1988 0.2911,-0.3677 0.46906,-0.875 0.57736,-1.242 0.33216,-1.1229 0.18604,-3.3136 0.14175,-3.9977 z" id="path442" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,24)" id="g444"> - <path transform="translate(8,4)" d="m 10.624,2.47 c 1.9155,0.90417 3.2862,2.7533 3.4971,4.9467 h 0.87866 C 14.70102,3.8234 11.68426,1 7.99976,1 L 7.61315,1.0175 9.84495,3.24 10.62403,2.47 z M 6.9629,2.02083 c -0.34561,-0.34417 -0.90209,-0.34417 -1.2418,0 l -3.7255,3.71 c -0.34561,0.34417 -0.34561,0.89833 0,1.2367 l 7.041,7.0117 c 0.34561,0.34417 0.90209,0.34417 1.2418,0 l 3.7255,-3.71 c 0.34561,-0.34417 0.34561,-0.89833 0,-1.2367 l -7.041,-7.0117 z m 2.6946,11.34 -7.041,-7.0117 3.7255,-3.71 7.041,7.0117 -3.7255,3.71 z M 5.3755,13.53 C 3.46,12.63167 2.0893,10.7767 1.8784,8.5833 H 0.99974 C 1.29848,12.1766 4.31524,15 7.99974,15 L 8.38635,14.9825 6.15455,12.76 5.37547,13.53 z" id="path448" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,48)" id="g450"> - <path transform="translate(-288,-72)" d="m 293.96,74.013 h 20 v 20 h -20 z" id="path454" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-288,-72)" d="m 297,77 h 18 v 18 h -18 z" id="path456" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-288,-72)" d="m 295.25,75.25 h 20 v 20 h -20 z" id="path458" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-288,-72)" d="m 293.12,73.125 h 20 v 20 h -20 z" id="path460" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-288,-72)" d="m 288,72 h 24 v 24 h -24 z" id="path462" inkscape:connector-curvature="0" style="fill:none"/><path transform="translate(-288,-72)" d="m 309.35,84.686 c 0.0288,-0.224 0.0504,-0.448 0.0504,-0.686 0,-0.238 -0.0216,-0.462 -0.0504,-0.686 l 1.5184,-1.155 c 0.13673,-0.105 0.17272,-0.294 0.0863,-0.448 l -1.4393,-2.422 c -0.0863,-0.154 -0.28065,-0.21 -0.43897,-0.154 l -1.7919,0.7 c -0.37422,-0.28 -0.77722,-0.511 -1.2162,-0.686 l -0.27341,-1.855 C 305.77334,77.126 305.62223,77 305.44232,77 h -2.8785 c -0.17992,0 -0.33104,0.126 -0.35263,0.294 l -0.27346,1.855 c -0.43898,0.175 -0.84198,0.413 -1.2162,0.686 l -1.7919,-0.7 c -0.16551,-0.063 -0.35262,0 -0.43898,0.154 l -1.4393,2.422 c -0.0935,0.154 -0.0504,0.343 0.0863,0.448 l 1.5184,1.155 c -0.0287,0.224 -0.0504,0.455 -0.0504,0.686 0,0.231 0.0216,0.462 0.0504,0.686 l -1.5184,1.155 c -0.13673,0.105 -0.17271,0.294 -0.0863,0.448 l 1.4393,2.422 c 0.0863,0.154 0.28067,0.21 0.43898,0.154 l 1.7919,-0.7 c 0.37421,0.28 0.77721,0.511 1.2162,0.686 l 0.27346,1.855 c 0.0216,0.168 0.17271,0.294 0.35263,0.294 h 2.8785 c 0.17991,0 0.33103,-0.126 0.35263,-0.294 l 0.27345,-1.855 c 0.43898,-0.175 0.84198,-0.413 1.2162,-0.686 l 1.7919,0.7 c 0.16552,0.063 0.35263,0 0.43898,-0.154 l 1.4393,-2.422 c 0.0863,-0.154 0.0504,-0.343 -0.0863,-0.448 l -1.5184,-1.155 z m -5.3469,1.764 c -1.3889,0 -2.5187,-1.099 -2.5187,-2.45 0,-1.351 1.1298,-2.45 2.5187,-2.45 1.3889,0 2.5187,1.099 2.5187,2.45 0,1.351 -1.1298,2.45 -2.5187,2.45 z" id="path464" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,72)" id="g466"> - <path transform="matrix(0,-1,1,0,-136,251)" d="m 232.5,150.5 h 14 v 12 h -14 z" id="path470" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="matrix(0,-1,1,0,-136,251)" d="m 244,156.5 -5,-3.25 v 6.5" id="path472" inkscape:connector-curvature="0"/><path transform="matrix(0,-1,1,0,-136,251)" d="m 236,150 h 1 v 13 h -1 z" id="path474" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,96)" id="g476"> - <path transform="translate(-160,-72)" d="m 168.5,78.5 h 14 v 12 h -14 z" id="path480" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="translate(-160,-72)" d="m 180,84.5 -5,-3.25 v 6.5" id="path482" inkscape:connector-curvature="0"/><path transform="translate(-160,-72)" d="m 172,78 h 1 v 13 h -1 z" id="path484" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,120)" id="g486"> - <path transform="matrix(-1,0,0,1,-192,-96)" d="m -214.5,102.5 h 14 v 12 h -14 z" id="path490" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="translate(-192,-96)" d="m 203,108.5 5,-3.25 v 6.5" id="path492" inkscape:connector-curvature="0"/><path transform="matrix(-1,0,0,1,-192,-96)" d="m -211,102 h 1 v 13 h -1 z" id="path494" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,144)" id="g496"> - <path transform="matrix(0,1,1,0,-88,219)" d="m -214.5,102.5 h 14 v 12 h -14 z" id="path500" inkscape:connector-curvature="0" style="fill:none;stroke:#000000"/><path transform="matrix(0,-1,1,0,-88,219)" d="m 203,108.5 5,-3.25 v 6.5" id="path502" inkscape:connector-curvature="0"/><path transform="matrix(0,1,1,0,-88,219)" d="m -211,102 h 1 v 13 h -1 z" id="path504" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,168)" id="g506"> - <path transform="translate(-288,0)" d="m 298,12 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" id="path510" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(0,192)" id="g512"> - <path transform="translate(-64,-72)" d="m 78.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" id="path516" inkscape:connector-curvature="0"/><path transform="translate(-64,-72)" d="m 79,78 v 4 h -3 l 4.5,4 4.5,-4 h -3 v -4 h -3 z" id="path518" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(28,192)" id="g520"> - <path transform="translate(-96,-72)" d="m 110.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" id="path524" inkscape:connector-curvature="0"/><path transform="translate(-96,-72)" d="m 112.5,78 -4.5,4 h 3 v 4 h 3 v -4 h 3 l -4.5,-4 z" id="path526" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(56,192)" id="g528"> - <path transform="translate(-128,-72)" d="m 142,86.5 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" id="path532" inkscape:connector-curvature="0"/><path transform="translate(-128,-72)" d="m 137.25,87.03 c 2.55,-8.43 11.4,-8.73 13.94,0" id="path534" inkscape:connector-curvature="0" style="fill:none;stroke:#000000;stroke-width:2.5"/><path transform="translate(-128,-72)" d="m 151.68,89 -4.54,-2.76 6.68,-2.1" id="path536" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(84,192)" id="g538"> - <path transform="translate(-288,-24)" d="m 295,36 c 0,4.97 4.03,9 9,9 4.97,0 9,-4.03 9,-9 0,-4.97 -4.03,-9 -9,-9 -4.97,0 -9,4.03 -9,9" id="path542" inkscape:connector-curvature="0" style="fill:url(#sprite60_a)"/><path transform="translate(-288,-24)" d="m 298,36 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" id="path544" inkscape:connector-curvature="0"/><defs id="defs546"> - <radialGradient id="sprite60_b" cx="0" cy="0" r="1" gradientTransform="matrix(18,0,0,-18,680,341)" gradientUnits="userSpaceOnUse"> - <stop offset="0" id="stop549"/> - <stop stop-opacity="0" offset="1" id="stop551"/> - </radialGradient> - <radialGradient id="sprite60_a" cx="0" cy="0" r="1" gradientTransform="matrix(9,0,0,9,304,36)" gradientUnits="userSpaceOnUse" xlink:href="#sprite60_b"/> - </defs> - </g> - <g transform="translate(112,192)" id="g554"> - <g id="g558"> - <path transform="translate(7,3)" d="M 0,0 H 18 V 18 H 0 z" id="path560" inkscape:connector-curvature="0" style="fill:none"/> - <path transform="translate(7,3)" d="M 15.25,8 H 16 V 6.125 5 H 5 V 6.125 8 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 16 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 6.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z" id="path562" inkscape:connector-curvature="0" style="fill-opacity:0.36000001"/> - <path transform="translate(7,3)" d="M 12.25,5 H 13 V 3.125 2 H 2 V 3.125 5 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 13 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 3.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z" id="path564" inkscape:connector-curvature="0"/> - </g> - </g> - <g transform="translate(140,192)" id="g566"> - <path transform="translate(-128,-24)" d="m 139.5,33 h 9 L 147,43 h -6" id="path570" inkscape:connector-curvature="0"/><path transform="translate(-128,-24)" d="m 147.5,30 h -2 v -1 h -3 v 1 h -2 c -0.55,0 -1,0.48 -1,1 v 1 h 1 7 1 v -1 c 0,-0.52 -0.45,-1 -1,-1" id="path572" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(168,192)" id="g574"> - <path transform="translate(0,-48)" d="M 10,57 H 8 v 9 h 11 v -2 h -9 z" id="path578" inkscape:connector-curvature="0"/><path transform="translate(0,-48)" d="m 13,56 h 7 v 5 h -7 z m -2,-2 v 9 h 11 v -9 z" id="path580" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(196,0)" id="g582"> - <path transform="translate(-96,0)" d="m 112,6.6909 c -3.6364,0 -6.7418,2.2618 -8,5.4545 1.2582,3.1927 4.3636,5.4545 8,5.4545 3.6364,0 6.7418,-2.2618 8,-5.4545 -1.2582,-3.1927 -4.3636,-5.4545 -8,-5.4545 z m 0,9.0909 c -2.0073,0 -3.6364,-1.6291 -3.6364,-3.6364 0,-2.0073 1.6291,-3.6364 3.6364,-3.6364 2.0073,0 3.6364,1.6291 3.6364,3.6364 0,2.0073 -1.6291,3.6364 -3.6364,3.6364 z m 0,-5.8182 c -1.2073,0 -2.1818,0.97455 -2.1818,2.1818 0,1.2073 0.97455,2.1818 2.1818,2.1818 1.2073,0 2.1818,-0.97455 2.1818,-2.1818 0,-1.2073 -0.97455,-2.1818 -2.1818,-2.1818 z" id="path586" inkscape:connector-curvature="0"/> - </g> - <g transform="translate(196,24)" id="g588"> - <path transform="translate(-128,-48)" d="m 153,57 h -11 v -2 h 11 v 2 z" id="path592" inkscape:connector-curvature="0" style="opacity:0.2"/><path transform="translate(-128,-48)" d="m 142,57 h -6 v -2 h 6 v 2 z" id="path594" inkscape:connector-curvature="0"/><path transform="translate(-128,-48)" d="m 145,60 h -6 v -2 h 6 v 2 z" id="path596" inkscape:connector-curvature="0"/><path transform="translate(-128,-48)" d="m 150,63 h -6 v -2 h 6 v 2 z" id="path598" inkscape:connector-curvature="0"/><path transform="translate(-128,-48)" d="m 152,66 h -6 v -2 h 6 v 2 z" id="path600" inkscape:connector-curvature="0"/> - </g> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="12.355932" y="231.55931" id="text4355" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357" x="12.355932" y="231.55931">a</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="40.355934" y="231.55931" id="text4355-3" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-6" x="40.355934" y="231.55931">b</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="68.355934" y="231.55931" id="text4355-7" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-5" x="68.355934" y="231.55931">c</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="96.355934" y="231.55931" id="text4355-35" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-62" x="96.355934" y="231.55931">d</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="124.35593" y="231.55931" id="text4355-9" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-1" x="124.35593" y="231.55931">e</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="152.35593" y="231.55931" id="text4355-2" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-7" x="152.35593" y="231.55931">f</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="180.35593" y="231.55931" id="text4355-0" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-9" x="180.35593" y="231.55931">g</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="208.35593" y="231.55931" id="text4355-36" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-0" x="208.35593" y="231.55931">h</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="207.55931" id="text4355-6" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-2" x="-15.644068" y="207.55931">1</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="183.55931" id="text4355-61" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-8" x="-15.644068" y="183.55931">2</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="159.55931" id="text4355-79" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-20" x="-15.644068" y="159.55931">3</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="135.55931" id="text4355-23" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-75" x="-15.644068" y="135.55931">4</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="111.55931" id="text4355-92" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-28" x="-15.644068" y="111.55931">5</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="87.559311" id="text4355-97" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-3" x="-15.644068" y="87.559311">6</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="63.559311" id="text4355-612" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-93" x="-15.644068" y="63.559311">7</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="39.559311" id="text4355-1" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-94" x="-15.644068" y="39.559311">8</tspan></text> - <text xml:space="preserve" style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" x="-15.644068" y="15.559311" id="text4355-78" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4357-4" x="-15.644068" y="15.559311">9</tspan></text> - <g id="Page-1-6" style="fill:none;stroke:none" transform="translate(200,50)"> - <g id="undo"> - <rect height="20" width="20" y="0" x="0" id="bounds" style="fill:#ffffff;fill-opacity:0"/> - <path id="shape" d="M 4.3431457,9.3431458 C 5.790861,7.8954305 7.790861,7 10,7 c 3.555275,0 6.568879,2.3191676 7.610506,5.527197 L 16.155367,13 15.658589,13 C 14.834916,10.669615 12.612438,9 10,9 8.3431458,9 6.8431457,9.6715729 5.7573593,10.757359 L 8,13 2,13 2,7 l 2.3431457,2.3431458 0,0 z" inkscape:connector-curvature="0" style="fill:#000000"/> + <g + id="g4"> + <g + transform="translate(-322,-72)" + id="g8"> + <circle + transform="translate(326,74)" + cx="15" + cy="17" + r="3" + id="circle10" + d="m 18,17 c 0,1.656854 -1.343146,3 -3,3 -1.656854,0 -3,-1.343146 -3,-3 0,-1.656854 1.343146,-3 3,-3 1.656854,0 3,1.343146 3,3 z" + sodipodi:cx="15" + sodipodi:cy="17" + sodipodi:rx="3" + sodipodi:ry="3" + style="fill:#009802" /> + <path + d="m 329,77 h 18 v 18 h -18 z" + id="path12" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + d="m 327.25,75.25 h 20 v 20 h -20 z" + id="path14" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + d="m 325.12,73.125 h 20 v 20 h -20 z" + id="path16" + inkscape:connector-curvature="0" + style="fill:none" /> </g> </g> + <g + transform="translate(28,0)" + id="g18"> + <path + transform="translate(-32,0)" + d="M 57,12 53.5,8 H 39 v 8 h 14.5" + id="path22" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,24)" + id="g24"> + <path + transform="translate(-224,-120)" + d="m 240.77,127 h -1.534 v 4.233 h -4.233 v 1.534 h 4.233 V 137 h 1.534 v -4.233 h 4.233 v -1.534 H 240.77 V 127 z" + id="path28" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,24)" + id="g30"> + <path + transform="translate(-96,-145)" + d="m 103,148 h 18 v 18 h -18 z" + id="path34" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-96,-145)" + d="m 115.42,154.7 -6.705,-6.705 -1.0575,1.0575 1.785,1.785 -3.8625,3.8625 c -0.4425,0.4425 -0.4425,1.155 0,1.59 l 4.125,4.125 c 0.2175,0.2175 0.51,0.33 0.795,0.33 0.285,0 0.5775,-0.1125 0.795,-0.33 l 4.125,-4.125 c 0.4425,-0.435 0.4425,-1.1475 0,-1.59 z m -8.5125,0.795 3.5925,-3.5925 3.5925,3.5925 h -7.185 z m 10.342,1.125 c 0,0 -1.5,1.6275 -1.5,2.625 0,0.825 0.675,1.5 1.5,1.5 0.825,0 1.5,-0.675 1.5,-1.5 0,-0.9975 -1.5,-2.625 -1.5,-2.625 z" + id="path36" + inkscape:connector-curvature="0" /> + <path + transform="translate(-96,-145)" + d="m 103,163 h 18 v 3 h -18 z" + id="path38" + inkscape:connector-curvature="0" + style="fill-opacity:0.36000001" /> + </g> + <g + transform="translate(0,48)" + id="g40"> + <path + transform="translate(7,3)" + d="M 0,0 H 18 V 18 H 0 z" + id="path44" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(7,3)" + d="m 13,5 h 1.4936 C 15.32558,5 16,5.67154 16,6.5064 v 7.9871 c 0,0.83198 -0.67154,1.5064 -1.5064,1.5064 H 6.5065 c -0.83198,0 -1.5064,-0.67154 -1.5064,-1.5064 v -1.4936 h 6.4936 c 0.8349,0 1.5064,-0.67446 1.5064,-1.5064 V 4.9999 z" + id="path46" + inkscape:connector-curvature="0" + style="fill-opacity:0.36000001" /> + <path + transform="translate(7,3)" + d="M 3.5,2 C 2.669,2 2,2.669 2,3.5 v 8 C 2,12.331 2.669,13 3.5,13 h 8 c 0.831,0 1.5,-0.669 1.5,-1.5 v -8 C 13,2.669 12.331,2 11.5,2 h -8 z m 0,1.5 h 8 v 8 h -8 v -8 z" + id="path48" + inkscape:connector-curvature="0" + style="fill:#212121" /> + </g> + <g + transform="translate(28,48)" + id="g50"> + <path + transform="translate(-96,-24)" + d="m 107,33 h 8 v 6 h -8 z" + stroke-miterlimit="4.2" + id="path54" + inkscape:connector-curvature="0" + style="stroke:#000000;stroke-width:2;stroke-miterlimit:4.19999981" /> + <path + transform="translate(-96,-24)" + d="m 115,36 4,-4 v 8" + id="path56" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,0)" + id="g58"> + <g + id="g62" + style="stroke:#000000"> + <path + transform="matrix(0.36,0,0,0.36,-2.5,7.46)" + d="m 53,14 a 3,3 0 1 1 -6,0 3,3 0 1 1 6,0 z" + id="path64" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke-width:2.77800012" /> + <path + transform="translate(-128,-120)" + d="m 143.48,129.5 2.5403,-2 h -1.5242 v -2 h -2 l -0.0161,2 h -1.5403 z" + id="path66" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-120)" + d="m 146.5,132.5 2,2.5 v -1.4998 l 2,-1e-4 v -2.0002 l -2,1e-4 V 130 z" + id="path68" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-120)" + d="m 143.5,135.5 -2.5,2 h 1.5 v 2 h 2 v -2 h 1.5 z" + id="path70" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-120)" + d="m 140.5,132.5 -2,-2.5 v 1.4999 h -2 v 2.0002 l 2,-3e-4 V 135 z" + id="path72" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(56,24)" + id="g74"> + <g + id="g78" + style="fill-rule:evenodd"> + <path + transform="matrix(0.9018,0,0,0.9018,4.308,4.525)" + d="M 0,0 H 18 V 18 H 0 z" + id="path80" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="matrix(0.9018,0,0,0.9018,4.308,4.525)" + d="M 4.174,8.343 2.76,9.757 7.003,13.999 15.488,5.514 14.074,4.1 7.003,11.171 z" + id="path82" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(57,47)" + id="g84"> + <path + transform="translate(-68,-143)" + d="M 76.94,152 76,152.94 79.0533,156 76,159.06 l 0.94,0.94 4,-4 z" + id="path88" + inkscape:connector-curvature="0" /> + <path + transform="translate(-68,-143)" + d="M 80.94,152 80,152.94 83.0533,156 80,159.06 l 0.94,0.94 4,-4 z" + id="path90" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,72)" + id="g92"> + <path + transform="translate(-64,0)" + d="m 80.44,16.94 c -2.48,0 -4.5,-2.02 -4.5,-4.5 0,-0.88 0.26,-1.7 0.69,-2.39 l 6.2,6.2 c -0.69,0.44 -1.51,0.69 -2.39,0.69 m 4.5,-4.5 c 0,0.88 -0.26,1.7 -0.69,2.39 l -6.2,-6.2 c 0.69,-0.44 1.51,-0.69 2.39,-0.69 2.48,0 4.5,2.02 4.5,4.5 M 80.5,6 C 76.91,6 74,8.91 74,12.5 74,16.09 76.91,19 80.5,19 84.09,19 87,16.09 87,12.5 87,8.91 84.09,6 80.5,6" + id="path96" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,72)" + id="g98"> + <g + id="g102" + style="fill-rule:evenodd"> + <path + transform="matrix(0.87153,0,0,0.87153,4.071,4.568)" + d="M 0,0 H 18 V 18 H 0 z" + id="path104" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="matrix(0.87153,0,0,0.87153,4.071,4.568)" + d="M 12,3.5 A 1.505,1.505 0 0 0 10.494,2 H 4.506 C 3.676,2 3,2.674 3,3.506 v 7.988 C 3,12.326 3.671,12.997 4.5,13 V 3.5 H 12 z M 6,6.506 C 6,5.674 6.676,5 7.506,5 h 5.988 C 14.326,5 15,5.672 15,6.506 v 7.988 C 15,15.326 14.324,16 13.494,16 H 7.506 A 1.505,1.505 0 0 1 6,14.494 V 6.506 z M 7.5,6.5 h 6 v 8 h -6 v -8 z" + id="path106" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(56,72)" + id="g108"> + <path + transform="translate(0,-24)" + d="M 25,36 21.36,32 H 19.57 L 14,40 h 7.36 L 25,36 z" + id="path112" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-24)" + d="m 7,32 v 8 H 9.05 L 14,32 H 7 z" + id="path114" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-24)" + d="M 9.67,44.55 8.08,43.23 18.84,27.45 20.43,28.77 9.67,44.55 z" + id="path116" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-24)" + d="M 0,24 H 24 V 48 H 0 z" + id="path118" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(0,-24)" + d="M 0,24 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z m 0,0 H 24 V 48 H 0 z" + id="path120" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(0,-24)" + d="M 0,24 H 24 V 48 H 0 z" + id="path122" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(0,-24)" + d="M 0,24 H 24 V 48 H 0 z" + id="path124" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(0,-24)" + d="M 0,24 H 24 V 48 H 0 z" + id="path126" + inkscape:connector-curvature="0" + style="fill:none" /> + </g> + <g + transform="translate(84,0)" + id="g128"> + <path + transform="translate(-128,0)" + d="M 149,8.33 147.67,7 144,10.67 140.33,7 139,8.33 142.67,12 139,15.67 140.33,17 144,13.33 147.67,17 149,15.67 145.33,12 149,8.33 z" + id="path132" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,24)" + id="g134"> + <path + transform="translate(-32,-24)" + d="M 53,37 H 43 v -5 h 10 v 5 z M 41,42 H 55 V 30 H 41 v 12 z" + id="path138" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,48)" + id="g140"> + <path + transform="translate(-224,-48)" + d="m 238,64 h 7 v -8 h -7 z m 9,2 H 233 V 54 h 14 z" + id="path144" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,72)" + id="g146"> + <path + transform="translate(-256,-48)" + d="m 274,64 h -7 v -8 h 7 v 8 z m -9,2 h 14 V 54 h -14 v 12 z" + id="path150" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,96)" + id="g152"> + <path + transform="translate(-160,0)" + d="m 169,16.089 v 2.9105 h 2.9105 L 180.1944,10.7156 177.2838,7.8051 169,16.089 z m 13.769,-7.9387 c 0.30785,-0.30785 0.30785,-0.79294 0,-1.1008 l -1.8191,-1.8191 c -0.30785,-0.30784 -0.79295,-0.30784 -1.1008,0 l -1.5206,1.5299 2.9105,2.9105 1.5299,-1.5206 z" + id="path156" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,96)" + id="g158"> + <path + transform="translate(-288,-120)" + d="m 310.77,127.04 -1.816,-1.8164 c -0.30331,-0.30338 -0.79716,-0.30338 -1.1005,0 l -2.4304,2.4309 -1.4894,-1.4935 -1.1005,1.1007 1.1044,1.1046 -6.9373,6.9348 v 3.695 h 3.6942 l 6.9373,-6.9387 1.1005,1.1046 1.1005,-1.1007 -1.4932,-1.4935 2.4304,-2.4309 c 0.3072,-0.30338 0.3072,-0.79345 0,-1.0968 z m -10.721,10.4 -1.4932,-1.4935 6.2724,-6.2736 1.4932,1.4935 -6.2723,6.2736 z" + id="path162" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,96)" + id="g164"> + <path + transform="translate(-32,-48)" + d="m 44,59 2,3 v 4 h 4 v -4 l 2,-3 z" + id="path168" + inkscape:connector-curvature="0" + style="opacity:0.5;fill:#424242" /> + <path + transform="translate(-32,-48)" + d="m 46.5,65.23 c 0.32,0.13 0.84,0.24 1.47,0.24 0.59,0 1.14,-0.1 1.53,-0.26 v -3.93 l 4,-4.57 v -0.19 h -11 v 0.22 l 4,4.57 v 3.93 z M 47.97,67 C 46.81,66.91 45.82,66.71 45,66.01 V 61.89 L 41,57.32 V 55 h 14 v 2.35 l -4,4.57 v 4.13 c -0.92,0.67 -2.1,0.94 -3.03,0.95" + id="path170" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,96)" + id="g172"> + <path + transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" + d="m 108.56,195.24 h 24 v 24 h -24 z" + id="path176" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" + d="m 108.56,215.24 h 24 v 4 h -24 z" + id="path178" + inkscape:connector-curvature="0" + style="fill-opacity:0.36000001" /> + <path + transform="matrix(0.75,0,0,0.75,-74.421,-143.43)" + d="m 119.56,198.24 -5.5,14 h 2.25 l 1.12,-3 h 6.25 l 1.12,3 h 2.25 l -5.49,-14 h -2 z m -1.38,9 2.38,-6.33 2.38,6.33 h -4.76 z" + id="path180" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,0)" + id="g182"> + <path + transform="matrix(0,-1,1,0,-112,-260)" + d="m -278.5,126.5 h 14 v 12 h -14 z" + id="path186" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="matrix(0,1,1,0,-112,-260)" + d="m 272,132.5 -5,-3.25 v 6.5" + id="path188" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0,-1,1,0,-112,-260)" + d="m -275,126 h 1 v 13 h -1 z" + id="path190" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,24)" + id="g192"> + <path + transform="translate(-192,-72)" + d="m 200.5,78.5 h 14 v 12 h -14 z" + id="path196" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="translate(-192,-72)" + d="m 207,84.5 5,-3.25 v 6.5" + id="path198" + inkscape:connector-curvature="0" /> + <path + transform="translate(-192,-72)" + d="m 204,78 h 1 v 13 h -1 z" + id="path200" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,48)" + id="g202"> + <path + transform="matrix(-1,0,0,1,-192,-120)" + d="m -214.5,126.5 h 14 v 12 h -14 z" + id="path206" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="translate(-192,-120)" + d="m 208,132.5 -5,-3.25 v 6.5" + id="path208" + inkscape:connector-curvature="0" /> + <path + transform="matrix(-1,0,0,1,-192,-120)" + d="m -211,126 h 1 v 13 h -1 z" + id="path210" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,72)" + id="g212"> + <path + transform="matrix(0,1,1,0,-88,283)" + d="m -278.5,102.5 h 14 v 12 h -14 z" + id="path216" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="matrix(0,-1,1,0,-88,283)" + d="m 272,108.5 -5,-3.25 v 6.5" + id="path218" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0,1,1,0,-88,283)" + d="m -275,102 h 1 v 13 h -1 z" + id="path220" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,96)" + id="g222"> + <path + transform="translate(-224,0)" + d="m 237,11 h -4 V 7 h 4 v 4 z" + id="path226" + inkscape:connector-curvature="0" /> + <path + transform="translate(-224,0)" + d="m 247,9 h -9 V 7 h 9 v 2 z" + id="path228" + inkscape:connector-curvature="0" /> + <path + transform="translate(-224,0)" + d="m 247,11 h -9 v -1 h 9 v 1 z" + id="path230" + inkscape:connector-curvature="0" /> + <path + transform="translate(-224,0)" + d="m 247,15 h -9 v -2 h 9 v 2 z" + id="path232" + inkscape:connector-curvature="0" /> + <path + transform="translate(-224,0)" + d="m 237,17 h -4 v -4 h 4 v 4 z" + id="path234" + inkscape:connector-curvature="0" /> + <path + transform="translate(-224,0)" + d="m 247,17 h -9 v -1 h 9 v 1 z" + id="path236" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,120)" + id="g238"> + <path + transform="translate(0,-144)" + d="m 23,157 h -2 v 2 h 2 z" + id="path242" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 23,161 h -2 v 2 c 1,0 2,-1 2,-2 z" + id="path244" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 23,153 h -2 v 2 h 2 z" + id="path246" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 21,149 v 2 h 2 c 0,-1 -1,-2 -2,-2 z" + id="path248" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 11,163 h 4 v -6 H 9 v 4 c 0,1.1 0.9,2 2,2 z" + id="path250" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="M 11,153 H 9 v 2 h 2 z" + id="path252" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 19,149 h -2 v 2 h 2 z" + id="path254" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 19,161 h -2 v 2 h 2 z" + id="path256" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 11,149 c -1,0 -2,1 -2,2 h 2 z" + id="path258" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-144)" + d="m 15,149 h -2 v 2 h 2 z" + id="path260" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,120)" + id="g262"> + <path + transform="translate(-290,-46)" + d="m 317,69 v -5 l -5,5 h 5 z" + id="path266" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,120)" + id="g268"> + <g + id="g272" + style="fill-rule:evenodd"> + <path + transform="matrix(1.4142,0,0,1.4142,-278.88,-36.772)" + d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" + id="path274" + inkscape:connector-curvature="0" /> + <path + transform="matrix(1.4142,0,0,1.4142,-278.88,-31.772)" + d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" + id="path276" + inkscape:connector-curvature="0" /> + <path + transform="matrix(1.4142,0,0,1.4142,-278.88,-26.772)" + d="m 209.92,31.305 a 1.0607,1.0607 0 1 1 -2.1213,0 1.0607,1.0607 0 1 1 2.1213,0 z" + id="path278" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(84,120)" + id="g280"> + <path + transform="translate(-162,-144)" + d="m 166,147 h 18 v 18 h -18 z" + id="path284" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-162,-144)" + d="m 181.52,154.53 c -0.51,-2.58 -2.7862,-4.5262 -5.5162,-4.5262 -2.1675,0 -4.0462,1.23 -4.9875,3.0262 -2.2538,0.24375 -4.0125,2.1525 -4.0125,4.4738 0,2.4862 2.0138,4.5 4.5,4.5 h 9.75 c 2.07,0 3.75,-1.68 3.75,-3.75 0,-1.98 -1.5412,-3.585 -3.4838,-3.7238 z m -0.26625,5.9738 h -9.75 c -1.6575,0 -3,-1.3425 -3,-3 0,-1.6575 1.3425,-3 3,-3 h 0.5325 c 0.49125,-1.7288 2.0775,-3 3.9675,-3 2.28,0 4.125,1.845 4.125,4.125 v 0.375 h 1.125 c 1.2412,0 2.25,1.0088 2.25,2.25 0,1.2412 -1.0088,2.25 -2.25,2.25 z" + id="path286" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,120)" + id="g288"> + <path + transform="translate(-226,-72)" + d="m 235,76 c -0.55,0 -0.99,0.45 -0.99,1 L 234,91 c 0,0.55 0.44,1 1,1 h 10 c 0.55,0 1,-0.45 1,-1 V 81 l -5,-5 h -6 z m 6,5 v -4 l 4,4 h -4 z" + id="path292" + inkscape:connector-curvature="0" /> + <path + transform="translate(-226,-72)" + d="m 231,75 h 18 v 18 h -18 z" + id="path294" + inkscape:connector-curvature="0" + style="fill:none" /> + </g> + <g + transform="translate(140,0)" + id="g296"> + <path + transform="translate(-162,-24)" + d="m 169,29 h 18 v 18 h -18 z" + id="path300" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-162,-24)" + d="m 167.25,27.25 h 20 v 20 h -20 z" + id="path302" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-162,-24)" + d="m 165.12,25.125 h 20 v 20 h -20 z" + id="path304" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-162,-24)" + d="m 171,28 c -0.55,0 -1,0.45 -1,1 v 14 c 0,0.55 0.44,1 1,1 h 5.0938 c -0.0656,-0.32311 -0.0937,-0.65753 -0.0937,-1 0,-2.7614 2.2386,-5 5,-5 0.34247,0 0.67689,0.02816 1,0.09375 v -5.0938 l -5,-5 h -6 z m 6,1 4,4 h -4 v -4 z" + id="path306" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(140,24)" + id="g308"> + <path + transform="translate(-66,-120)" + d="m 71,124 h 18 v 18 H 71 z" + id="path312" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-66,-120)" + d="m 82,129 -2,-2 h -5 c -0.55,0 -1,0.45 -1,1 v 10 c 0,0.55 0.45,1 1,1 h 12 c 0.55,0 1,-0.45 1,-1 v -8 c 0,-0.55 -0.45,-1 -1,-1 h -5 z" + id="path314" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(140,48)" + id="g316"> + <path + transform="translate(-258,-144)" + d="m 278,150 h -10.5 c -0.8325,0 -1.5,0.675 -1.5,1.5 v 9 c 0,0.825 0.6675,1.5 1.5,1.5 H 278 c 0.825,0 1.5,-0.675 1.5,-1.5 v -9 c 0,-0.825 -0.6675,-1.5 -1.5,-1.5 z m 0,10.5 H 267.5 V 153 H 278 v 7.5 z" + id="path320" + inkscape:connector-curvature="0" + style="fill:#010101" /> + <path + transform="translate(-258,-144)" + d="m 262.97,147.07 h 18 v 18 h -18 z" + id="path322" + inkscape:connector-curvature="0" + style="fill:none" /> + </g> + <g + transform="translate(140,72)" + id="g324"> + <path + transform="translate(6,3.9)" + d="M 9,1 H 3.9954 C 3.45567,1 3,1.45078 3,2.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 h 8.0092 C 12.54433,14.9996 13,14.54882 13,13.9928 V 4.9996 l -4,-4 z m 3,4 H 9 V 2 l 3,3 z M 6,7 11,9.5 6,12 V 7 z" + id="path328" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(140,96)" + id="g330"> + <g + id="g334" + style="stroke:#000000"> + <path + transform="matrix(0.72907,0,0,0.72907,5.617,4.598)" + d="M 7.854,6.963 6.877,7.279 6.857,8.617 6.889,8.705 7.398,9.699 6.188,10.578 5.398,9.787 5.326,9.73 4.047,9.336 3.443,10.166 4.213,11.26 4.291,11.313 5.287,11.817 4.824,13.241 3.72,13.065 3.628,13.061 2.362,13.493 v 1.027 l 1.266,0.434 0.092,-0.004 1.104,-0.178 0.463,1.424 -0.996,0.506 -0.078,0.051 -0.77,1.094 0.604,0.83 1.279,-0.393 0.072,-0.059 0.789,-0.791 1.211,0.879 -0.51,0.996 -0.031,0.086 0.02,1.338 0.977,0.316 0.803,-1.068 0.025,-0.09 0.172,-1.104 h 1.498 l 0.172,1.104 0.025,0.09 0.803,1.068 0.977,-0.316 0.02,-1.338 -0.031,-0.086 -0.51,-0.996 1.211,-0.879 0.789,0.791 0.072,0.059 1.279,0.393 0.604,-0.83 -0.771,-1.094 -0.076,-0.051 -0.996,-0.506 0.461,-1.424 1.105,0.178 0.092,0.004 1.266,-0.434 v -1.027 l -1.266,-0.432 -0.092,0.004 -1.105,0.176 -0.461,-1.424 0.996,-0.504 0.076,-0.053 0.771,-1.094 L 15.159,9.336 13.88,9.731 13.808,9.788 13.019,10.579 11.808,9.7 12.318,8.706 12.349,8.618 12.329,7.28 11.352,6.964 10.549,8.034 10.524,8.122 10.352,9.227 H 8.854 L 8.682,8.121 8.656,8.03 7.854,6.963 m 1.748,3.398 a 3.621,3.645 0 0 1 3.621,3.645 3.621,3.645 0 0 1 -3.621,3.646 3.621,3.645 0 0 1 -3.619,-3.646 3.621,3.645 0 0 1 3.619,-3.645 z" + id="path336" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.72907,0,0,0.72907,5.227,3.617)" + d="M 14.885,1.563 14.178,1.957 14.365,3.24 14.396,3.279 15.14,4.04 14.553,5.03 13.529,4.736 13.479,4.729 12.262,5.172 12.25,5.98 13.455,6.459 13.506,6.453 14.537,6.189 15.1,7.191 14.332,7.932 14.301,7.971 14.08,9.248 14.771,9.662 15.787,8.859 15.807,8.811 16.1,7.787 17.242,7.803 17.502,8.834 17.52,8.883 18.514,9.715 19.219,9.32 19.03,8.04 19,7.998 18.258,7.234 18.844,6.25 19.869,6.541 19.92,6.551 21.14,6.105 21.15,5.297 19.943,4.818 19.893,4.824 18.861,5.088 18.301,4.086 19.07,3.346 19.1,3.307 19.322,2.029 18.627,1.615 17.609,2.418 17.59,2.467 17.303,3.49 16.16,3.475 15.896,2.443 15.879,2.395 14.885,1.563 z m 1.814,2.138 a 1.938,1.938 0 0 1 1.938,1.938 1.938,1.938 0 0 1 -1.938,1.937 1.938,1.938 0 0 1 -1.937,-1.937 1.938,1.938 0 0 1 1.937,-1.938 z" + id="path338" + inkscape:connector-curvature="0" + style="stroke-width:0.89899999" /> + </g> + </g> + <g + transform="translate(140,120)" + id="g340"> + <g + id="g344" + style="fill:none"> + <path + transform="translate(8,4)" + d="M 0,0 H 16 V 16 H 0 V 0 z" + id="path346" + inkscape:connector-curvature="0" + style="opacity:0.5" /> + <path + transform="translate(8,4)" + d="M 6,14 H 3.5 C 2.5,14 2,13.5 2,12.5 v -9 C 2,2.5 2.5,2 3.5,2 h 9 C 14,2 14,3.4678 14,3.5 V 6 H 13 V 3 H 3 v 10 h 3 v 1 z m 9,-5 -3,2 3,3 -1,1 -3,-3 -2,3 -2,-8 8,2 z" + id="path348" + inkscape:connector-curvature="0" + style="fill:#000000" /> + </g> + </g> + <g + transform="translate(0,144)" + id="g350"> + <path + transform="translate(-98,-120)" + d="m 110.5,127.5 h -1 l 2,-2 2,2 h -1 c 0,0 -0.0345,4.6379 -0.0345,4.0345 l 4.0345,-0.034 v -1 l 2,2 -2,2 v -1 l -4.0345,-0.034 0.0345,4.0346 h 1 l -2,2 -2,-2 h 1 l 0.0345,-4.0346 -4.0345,0.034 v 1 l -2,-2 2,-2 v 1 l 4.0345,0.034 z" + id="path354" + inkscape:connector-curvature="0" + style="stroke:#000000" /> + </g> + <g + transform="translate(28,144)" + id="g356"> + <path + transform="translate(-320,0)" + d="m 333.6,15.2 h 1.6 V 8.8 h -1.6 v 6.4 z M 336,4 c -4.42,0 -8,3.58 -8,8 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 z m 0,14.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z m 0.8,-3.2 h 1.6 V 8.8 h -1.6 v 6.4 z" + id="path360" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,144)" + id="g362"> + <path + transform="translate(-32,-72)" + d="m 47,88 h -3 v -8 h 3 v 8 z" + id="path366" + inkscape:connector-curvature="0" /> + <path + transform="translate(-32,-72)" + d="m 53,88 h -3 v -8 h 3 v 8 z" + id="path368" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,144)" + id="g370"> + <path + transform="translate(-256,0)" + d="m 275,15 h -2 V 9 h 2 z m -4,0 h -2 V 9 h 2 z m 4,-10 h -6 l -4,4 v 6 l 4,4 h 6 l 4,-4.12 V 9 z" + id="path374" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(112,144)" + id="g376"> + <g + font-weight="400" + id="g380" + style="font-weight:400;font-family:Sans"> + <path + transform="translate(-289,-96)" + d="m 300,101 v 4.0001 1.0001 l 3.3434,0.53115 -0.0156,8.0468 -1.3278,0.42183 c 0.006,0.59278 0.43931,1.0114 1,1 h 8 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -14 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -10 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,0 h 10 v 14 h -8 l 0.71845,-0.42179 0.0937,-8.4218 -2.8122,-0.1561 v -0.99993 z" + overflow="visible" + style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible" + id="path382" + inkscape:connector-curvature="0" /> + <path + transform="translate(-289,-96)" + d="m 297,106 v 9 c 0.006,0.59278 0.43931,1.0114 1,1 h 5 c 0.57896,0.002 0.98177,-0.42708 1,-1 v -9 c -0.0102,-0.53477 -0.48177,-0.99739 -1,-1 h -5 c -0.53297,0.008 -0.99716,0.45677 -1,1 z m 1,1.0002 h 5 v 7 h -5 z" + overflow="visible" + style="text-indent:0;line-height:normal;text-transform:none;block-progression:tb;overflow:visible" + id="path384" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(140,144)" + id="g386"> + <path + transform="translate(-320,-48)" + d="m 328,60 c 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 -4.42,0 -8,3.58 -8,8 z m 8,6.4 c -3.528,0 -6.4,-2.872 -6.4,-6.4 0,-3.528 2.872,-6.4 6.4,-6.4 3.528,0 6.4,2.872 6.4,6.4 0,3.528 -2.872,6.4 -6.4,6.4 z M 334.5067,63.4286 339.0781,60 334.5067,56.5714 v 6.8571 z" + id="path390" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,168)" + id="g392"> + <path + transform="translate(-96,-48)" + d="m 108,60 10,-5 v 10" + id="path396" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,168)" + id="g398"> + <path + transform="translate(-64,-48)" + d="M 86,60 76,55 v 10" + id="path402" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,168)" + id="g404"> + <path + transform="translate(-256,-24)" + d="m 268.01,35.99 c 0.61,0.28 1.07,0.9 1.07,1.58 0.11,0.85 -0.05,1.72 0.12,2.57 0.27,0.54 1,0.28 1.43,0.55 0.49,0.24 0.48,1.01 -0.06,1.18 -0.56,0.22 -1.18,0.08 -1.74,-0.05 -0.71,-0.2 -1.41,-0.72 -1.5,-1.5 -0.18,-0.89 0.01,-1.8 -0.16,-2.68 -0.22,-0.64 -0.94,-0.9 -1.57,-0.93 -0.58,-0.1 -0.83,-0.94 -0.35,-1.3 0.51,-0.35 1.26,-0.14 1.69,-0.66 0.44,-0.48 0.29,-1.18 0.32,-1.78 0,-0.81 -0.02,-1.77 0.65,-2.34 0.66,-0.54 1.58,-0.71 2.41,-0.63 0.63,0 0.98,0.87 0.4,1.22 -0.44,0.37 -1.2,0.06 -1.51,0.65 -0.14,0.56 -0.05,1.15 -0.07,1.73 -0.01,0.75 -0.05,1.64 -0.72,2.13 -0.12,0.1 -0.26,0.19 -0.4,0.26" + id="path408" + inkscape:connector-curvature="0" /> + <path + transform="translate(-256,-24)" + d="m 276.98,35.99 c -0.67,-0.3 -1.08,-1.02 -1.08,-1.75 -0.07,-0.76 0.03,-1.52 -0.06,-2.28 -0.24,-0.58 -0.98,-0.4 -1.46,-0.59 -0.59,-0.24 -0.48,-1.18 0.14,-1.31 0.73,-0.15 1.52,-0.01 2.18,0.32 0.56,0.28 0.95,0.86 0.99,1.48 0.13,0.83 -0.03,1.68 0.13,2.5 0.2,0.68 0.94,0.83 1.54,0.9 0.56,0.07 0.86,0.8 0.46,1.21 -0.44,0.46 -1.2,0.2 -1.65,0.66 -0.51,0.46 -0.4,1.21 -0.4,1.83 -0.03,0.78 0.06,1.69 -0.52,2.3 -0.74,0.65 -1.8,0.86 -2.75,0.68 -0.52,-0.16 -0.69,-1.01 -0.15,-1.25 0.44,-0.23 1.02,-0.08 1.41,-0.45 0.26,-0.45 0.09,-0.98 0.14,-1.47 0.01,-0.76 -0.07,-1.63 0.43,-2.26 0.18,-0.21 0.42,-0.37 0.66,-0.51" + id="path410" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,168)" + id="g412"> + <g + id="g416"> + <path + d="M 0,0 H 24 V 24 H 0 z" + id="path418" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + d="m 16,6 c -3.31,0 -6,2.69 -6,6 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 h -2 c 0,2.2091 -1.7909,4 -4,4 -2.2091,0 -4,-1.7909 -4,-4 0,-2.2091 1.7909,-4 4,-4 1.2756,0 2.3926,0.60127 3.125,1.5312 h 2.3438 C 20.52659,7.4496 18.4308,6 16,6 z" + id="path420" + inkscape:connector-curvature="0" /> + <path + d="M 21.091,6.88 V 9.9718 H 17.9992 z" + id="path422" + inkscape:connector-curvature="0" + style="stroke:#000000;stroke-width:1.06799996" /> + </g> + </g> + <g + transform="translate(112,168)" + id="g424"> + <path + transform="translate(8,4)" + d="M 2.5858,13.891 C 0.9959,12.4291 0,10.3315 0,8.0002 c 0,-4.42 3.58,-8 8,-8 4.42,0 8,3.58 8,8 0,4.42 -3.58,8 -8,8 v -1.6 c 3.528,0 6.4,-2.872 6.4,-6.4 0,-3.528 -2.872,-6.4 -6.4,-6.4 -3.528,0 -6.4,2.872 -6.4,6.4 0,1.9357 0.86461,3.674 2.2278,4.8487 l 1.6925,-1.4201 0.015145,4.463 -4.3925,-0.7899 1.443,-1.2108 z M 6.5066,11.4287 11.078,8.0001 6.5066,4.5715 v 6.8571 z" + id="path428" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(140,168)" + id="g430"> + <path + transform="translate(0,-72)" + d="M 23,84 15,79 V 89" + id="path434" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-72)" + d="M 13,89 H 10 V 79 h 3 v 10 z" + id="path436" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,0)" + id="g438"> + <path + transform="translate(-160,-120)" + d="m 169.2,130.15 c 0.0551,-0.1128 0.15339,-0.22 0.2313,-0.3064 0.54584,-0.6074 1.3889,-1.1974 3.0053,-1.5702 v -2.1715 c -1.2931,0.2523 -2.3146,0.6686 -3.304,1.5597 -0.33248,0.3832 -0.50543,0.6247 -0.514,1.1665 -0.007,0.443 0.17732,0.8863 0.58141,1.3219 z m 6.6309,3.1292 c -1.6164,-0.024 -3.1091,-0.2558 -4.6228,-0.764 -2.6938,-0.9037 -3.0286,-2.1697 -3.1703,-2.5931 -0.0958,1.6897 0.028,2.9573 0.0346,3.0648 0.092,1.5004 1.2918,2.6742 2.1575,3.1151 1.7796,0.9067 3.6614,1.3756 5.601,1.4151 v 2.4842 l 3.251,-4.6483 -3.251,-4.6486 v 2.5748 z m -0.32327,-5.2959 c 1.6164,0.01 3.4529,0.3384 5.2454,1.1131 0.73528,0.3177 1.3275,0.7904 1.8082,1.3048 0.33152,-0.1523 0.80672,-0.7308 0.74126,-1.2923 -0.16163,-1.3879 -1.6264,-2.1912 -1.8801,-2.3045 -1.7704,-0.7908 -3.9751,-1.0356 -5.9147,-1.0589 v -1.7442 l -2.0132,2.8787 2.0132,2.8783 v -1.775 z m 8.4236,1.8658 c -0.0824,0.6478 -0.82676,2.0349 -3.8978,2.9138 v 4.5247 c 1.1314,-0.3677 2.465,-1.2956 3.1787,-2.1988 0.2911,-0.3677 0.46906,-0.875 0.57736,-1.242 0.33216,-1.1229 0.18604,-3.3136 0.14175,-3.9977 z" + id="path442" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,24)" + id="g444"> + <path + transform="translate(8,4)" + d="m 10.624,2.47 c 1.9155,0.90417 3.2862,2.7533 3.4971,4.9467 h 0.87866 C 14.70102,3.8234 11.68426,1 7.99976,1 L 7.61315,1.0175 9.84495,3.24 10.62403,2.47 z M 6.9629,2.02083 c -0.34561,-0.34417 -0.90209,-0.34417 -1.2418,0 l -3.7255,3.71 c -0.34561,0.34417 -0.34561,0.89833 0,1.2367 l 7.041,7.0117 c 0.34561,0.34417 0.90209,0.34417 1.2418,0 l 3.7255,-3.71 c 0.34561,-0.34417 0.34561,-0.89833 0,-1.2367 l -7.041,-7.0117 z m 2.6946,11.34 -7.041,-7.0117 3.7255,-3.71 7.041,7.0117 -3.7255,3.71 z M 5.3755,13.53 C 3.46,12.63167 2.0893,10.7767 1.8784,8.5833 H 0.99974 C 1.29848,12.1766 4.31524,15 7.99974,15 L 8.38635,14.9825 6.15455,12.76 5.37547,13.53 z" + id="path448" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,48)" + id="g450"> + <path + transform="translate(-288,-72)" + d="m 293.96,74.013 h 20 v 20 h -20 z" + id="path454" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-288,-72)" + d="m 297,77 h 18 v 18 h -18 z" + id="path456" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-288,-72)" + d="m 295.25,75.25 h 20 v 20 h -20 z" + id="path458" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-288,-72)" + d="m 293.12,73.125 h 20 v 20 h -20 z" + id="path460" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-288,-72)" + d="m 288,72 h 24 v 24 h -24 z" + id="path462" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(-288,-72)" + d="m 309.35,84.686 c 0.0288,-0.224 0.0504,-0.448 0.0504,-0.686 0,-0.238 -0.0216,-0.462 -0.0504,-0.686 l 1.5184,-1.155 c 0.13673,-0.105 0.17272,-0.294 0.0863,-0.448 l -1.4393,-2.422 c -0.0863,-0.154 -0.28065,-0.21 -0.43897,-0.154 l -1.7919,0.7 c -0.37422,-0.28 -0.77722,-0.511 -1.2162,-0.686 l -0.27341,-1.855 C 305.77334,77.126 305.62223,77 305.44232,77 h -2.8785 c -0.17992,0 -0.33104,0.126 -0.35263,0.294 l -0.27346,1.855 c -0.43898,0.175 -0.84198,0.413 -1.2162,0.686 l -1.7919,-0.7 c -0.16551,-0.063 -0.35262,0 -0.43898,0.154 l -1.4393,2.422 c -0.0935,0.154 -0.0504,0.343 0.0863,0.448 l 1.5184,1.155 c -0.0287,0.224 -0.0504,0.455 -0.0504,0.686 0,0.231 0.0216,0.462 0.0504,0.686 l -1.5184,1.155 c -0.13673,0.105 -0.17271,0.294 -0.0863,0.448 l 1.4393,2.422 c 0.0863,0.154 0.28067,0.21 0.43898,0.154 l 1.7919,-0.7 c 0.37421,0.28 0.77721,0.511 1.2162,0.686 l 0.27346,1.855 c 0.0216,0.168 0.17271,0.294 0.35263,0.294 h 2.8785 c 0.17991,0 0.33103,-0.126 0.35263,-0.294 l 0.27345,-1.855 c 0.43898,-0.175 0.84198,-0.413 1.2162,-0.686 l 1.7919,0.7 c 0.16552,0.063 0.35263,0 0.43898,-0.154 l 1.4393,-2.422 c 0.0863,-0.154 0.0504,-0.343 -0.0863,-0.448 l -1.5184,-1.155 z m -5.3469,1.764 c -1.3889,0 -2.5187,-1.099 -2.5187,-2.45 0,-1.351 1.1298,-2.45 2.5187,-2.45 1.3889,0 2.5187,1.099 2.5187,2.45 0,1.351 -1.1298,2.45 -2.5187,2.45 z" + id="path464" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,72)" + id="g466"> + <path + transform="matrix(0,-1,1,0,-136,251)" + d="m 232.5,150.5 h 14 v 12 h -14 z" + id="path470" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="matrix(0,-1,1,0,-136,251)" + d="m 244,156.5 -5,-3.25 v 6.5" + id="path472" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0,-1,1,0,-136,251)" + d="m 236,150 h 1 v 13 h -1 z" + id="path474" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,96)" + id="g476"> + <path + transform="translate(-160,-72)" + d="m 168.5,78.5 h 14 v 12 h -14 z" + id="path480" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="translate(-160,-72)" + d="m 180,84.5 -5,-3.25 v 6.5" + id="path482" + inkscape:connector-curvature="0" /> + <path + transform="translate(-160,-72)" + d="m 172,78 h 1 v 13 h -1 z" + id="path484" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,120)" + id="g486"> + <path + transform="matrix(-1,0,0,1,-192,-96)" + d="m -214.5,102.5 h 14 v 12 h -14 z" + id="path490" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="translate(-192,-96)" + d="m 203,108.5 5,-3.25 v 6.5" + id="path492" + inkscape:connector-curvature="0" /> + <path + transform="matrix(-1,0,0,1,-192,-96)" + d="m -211,102 h 1 v 13 h -1 z" + id="path494" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,144)" + id="g496"> + <path + transform="matrix(0,1,1,0,-88,219)" + d="m -214.5,102.5 h 14 v 12 h -14 z" + id="path500" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000" /> + <path + transform="matrix(0,-1,1,0,-88,219)" + d="m 203,108.5 5,-3.25 v 6.5" + id="path502" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0,1,1,0,-88,219)" + d="m -211,102 h 1 v 13 h -1 z" + id="path504" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,168)" + id="g506"> + <path + transform="translate(-288,0)" + d="m 298,12 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" + id="path510" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(0,192)" + id="g512"> + <path + transform="translate(-64,-72)" + d="m 78.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" + id="path516" + inkscape:connector-curvature="0" /> + <path + transform="translate(-64,-72)" + d="m 79,78 v 4 h -3 l 4.5,4 4.5,-4 h -3 v -4 h -3 z" + id="path518" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(28,192)" + id="g520"> + <path + transform="translate(-96,-72)" + d="m 110.5,89 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" + id="path524" + inkscape:connector-curvature="0" /> + <path + transform="translate(-96,-72)" + d="m 112.5,78 -4.5,4 h 3 v 4 h 3 v -4 h 3 l -4.5,-4 z" + id="path526" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(56,192)" + id="g528"> + <path + transform="translate(-128,-72)" + d="m 142,86.5 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" + id="path532" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-72)" + d="m 137.25,87.03 c 2.55,-8.43 11.4,-8.73 13.94,0" + id="path534" + inkscape:connector-curvature="0" + style="fill:none;stroke:#000000;stroke-width:2.5" /> + <path + transform="translate(-128,-72)" + d="m 151.68,89 -4.54,-2.76 6.68,-2.1" + id="path536" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(84,192)" + id="g538"> + <path + transform="translate(-288,-24)" + d="m 295,36 c 0,4.97 4.03,9 9,9 4.97,0 9,-4.03 9,-9 0,-4.97 -4.03,-9 -9,-9 -4.97,0 -9,4.03 -9,9" + id="path542" + inkscape:connector-curvature="0" + style="fill:url(#sprite60_a)" /> + <path + transform="translate(-288,-24)" + d="m 298,36 c 0,3.31 2.69,6 6,6 3.31,0 6,-2.69 6,-6 0,-3.31 -2.69,-6 -6,-6 -3.31,0 -6,2.69 -6,6" + id="path544" + inkscape:connector-curvature="0" /> + <defs + id="defs546"> + <radialGradient + id="sprite60_b" + cx="0" + cy="0" + r="1" + gradientTransform="matrix(18,0,0,-18,680,341)" + gradientUnits="userSpaceOnUse"> + <stop + offset="0" + id="stop549" /> + <stop + stop-opacity="0" + offset="1" + id="stop551" /> + </radialGradient> + <radialGradient + id="sprite60_a" + cx="0" + cy="0" + r="1" + gradientTransform="matrix(9,0,0,9,304,36)" + gradientUnits="userSpaceOnUse" + xlink:href="#sprite60_b" /> + </defs> + </g> + <g + transform="translate(112,192)" + id="g554"> + <g + id="g558"> + <path + transform="translate(7,3)" + d="M 0,0 H 18 V 18 H 0 z" + id="path560" + inkscape:connector-curvature="0" + style="fill:none" /> + <path + transform="translate(7,3)" + d="M 15.25,8 H 16 V 6.125 5 H 5 V 6.125 8 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 16 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 6.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z" + id="path562" + inkscape:connector-curvature="0" + style="fill-opacity:0.36000001" /> + <path + transform="translate(7,3)" + d="M 12.25,5 H 13 V 3.125 2 H 2 V 3.125 5 h 0.75 c 0,-0.82843 0.67157,-1.5 1.5,-1.5 h 2.5 v 7.25 c 0,0.82843 -0.67157,1.5 -1.5,1.5 V 13 h 1.875 0.75 1.875 v -0.75 c -0.82843,0 -1.5,-0.67157 -1.5,-1.5 V 3.5 h 2.5 c 0.82843,0 1.5,0.67157 1.5,1.5 z" + id="path564" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="translate(140,192)" + id="g566"> + <path + transform="translate(-128,-24)" + d="m 139.5,33 h 9 L 147,43 h -6" + id="path570" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-24)" + d="m 147.5,30 h -2 v -1 h -3 v 1 h -2 c -0.55,0 -1,0.48 -1,1 v 1 h 1 7 1 v -1 c 0,-0.52 -0.45,-1 -1,-1" + id="path572" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(168,192)" + id="g574"> + <path + transform="translate(0,-48)" + d="M 10,57 H 8 v 9 h 11 v -2 h -9 z" + id="path578" + inkscape:connector-curvature="0" /> + <path + transform="translate(0,-48)" + d="m 13,56 h 7 v 5 h -7 z m -2,-2 v 9 h 11 v -9 z" + id="path580" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(196,0)" + id="g582"> + <path + transform="translate(-96,0)" + d="m 112,6.6909 c -3.6364,0 -6.7418,2.2618 -8,5.4545 1.2582,3.1927 4.3636,5.4545 8,5.4545 3.6364,0 6.7418,-2.2618 8,-5.4545 -1.2582,-3.1927 -4.3636,-5.4545 -8,-5.4545 z m 0,9.0909 c -2.0073,0 -3.6364,-1.6291 -3.6364,-3.6364 0,-2.0073 1.6291,-3.6364 3.6364,-3.6364 2.0073,0 3.6364,1.6291 3.6364,3.6364 0,2.0073 -1.6291,3.6364 -3.6364,3.6364 z m 0,-5.8182 c -1.2073,0 -2.1818,0.97455 -2.1818,2.1818 0,1.2073 0.97455,2.1818 2.1818,2.1818 1.2073,0 2.1818,-0.97455 2.1818,-2.1818 0,-1.2073 -0.97455,-2.1818 -2.1818,-2.1818 z" + id="path586" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(196,24)" + id="g588"> + <path + transform="translate(-128,-48)" + d="m 153,57 h -11 v -2 h 11 v 2 z" + id="path592" + inkscape:connector-curvature="0" + style="opacity:0.2" /> + <path + transform="translate(-128,-48)" + d="m 142,57 h -6 v -2 h 6 v 2 z" + id="path594" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-48)" + d="m 145,60 h -6 v -2 h 6 v 2 z" + id="path596" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-48)" + d="m 150,63 h -6 v -2 h 6 v 2 z" + id="path598" + inkscape:connector-curvature="0" /> + <path + transform="translate(-128,-48)" + d="m 152,66 h -6 v -2 h 6 v 2 z" + id="path600" + inkscape:connector-curvature="0" /> + </g> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="12.355932" + y="231.55931" + id="text4355" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357" + x="12.355932" + y="231.55931">a</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="40.355934" + y="231.55931" + id="text4355-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-6" + x="40.355934" + y="231.55931">b</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="68.355934" + y="231.55931" + id="text4355-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-5" + x="68.355934" + y="231.55931">c</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="96.355934" + y="231.55931" + id="text4355-35" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-62" + x="96.355934" + y="231.55931">d</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="124.35593" + y="231.55931" + id="text4355-9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-1" + x="124.35593" + y="231.55931">e</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="152.35593" + y="231.55931" + id="text4355-2" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-7" + x="152.35593" + y="231.55931">f</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="180.35593" + y="231.55931" + id="text4355-0" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-9" + x="180.35593" + y="231.55931">g</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="208.35593" + y="231.55931" + id="text4355-36" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-0" + x="208.35593" + y="231.55931">h</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="207.55931" + id="text4355-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-2" + x="-15.644068" + y="207.55931">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="183.55931" + id="text4355-61" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-8" + x="-15.644068" + y="183.55931">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="159.55931" + id="text4355-79" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-20" + x="-15.644068" + y="159.55931">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="135.55931" + id="text4355-23" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-75" + x="-15.644068" + y="135.55931">4</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="111.55931" + id="text4355-92" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-28" + x="-15.644068" + y="111.55931">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="87.559311" + id="text4355-97" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-3" + x="-15.644068" + y="87.559311">6</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="63.559311" + id="text4355-612" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-93" + x="-15.644068" + y="63.559311">7</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="39.559311" + id="text4355-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-94" + x="-15.644068" + y="39.559311">8</tspan></text> + <text + xml:space="preserve" + style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + x="-15.644068" + y="15.559311" + id="text4355-78" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4357-4" + x="-15.644068" + y="15.559311">9</tspan></text> + <g + id="Page-1-6" + style="fill:none;stroke:none" + transform="translate(200,50)"> + <g + id="undo"> + <rect + height="20" + width="20" + y="0" + x="0" + id="bounds" + style="fill:#ffffff;fill-opacity:0" /> + <path + id="shape" + d="M 4.3431457,9.3431458 C 5.790861,7.8954305 7.790861,7 10,7 c 3.555275,0 6.568879,2.3191676 7.610506,5.527197 L 16.155367,13 15.658589,13 C 14.834916,10.669615 12.612438,9 10,9 8.3431458,9 6.8431457,9.6715729 5.7573593,10.757359 L 8,13 2,13 2,7 l 2.3431457,2.3431458 0,0 z" + inkscape:connector-curvature="0" + style="fill:#000000" /> + </g> + </g> + <g + style="fill:#000000" + id="g4305" + transform="translate(196,72)"> + <path + id="path4295" + d="m 17,10 -3,0 0,-4 -4,0 0,4 -3,0 5,6 z m -10,7 0,1 10,0 0,-1 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccc" /> + <path + id="path4297" + d="M 0,0 H 24 V 24 H 0 z" + inkscape:connector-curvature="0" + style="fill:none" /> + </g> </svg> -
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes index 0e2cd86..79e9bde 100644 --- a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes +++ b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
@@ -1,6 +1,6 @@ { "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc", - "largeIcons.svg": "486eeb024854b5dc7ae0a13e3d8e04bd", + "largeIcons.svg": "23525deeadff5f16ca9e8af2a1176fd0", "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28", "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a", "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
diff --git a/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Panel.js b/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Panel.js index f48a3ba0..2895a6e3 100644 --- a/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Panel.js +++ b/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Panel.js
@@ -6,7 +6,7 @@ * @implements {SDK.SDKModelObserver<!SDK.ServiceWorkerManager>} * @unrestricted */ -Audits2.Audits2Panel = class extends UI.PanelWithSidebar { +Audits2.Audits2Panel = class extends UI.Panel { constructor() { super('audits2'); this.registerRequiredCSS('audits2/audits2Panel.css'); @@ -15,27 +15,26 @@ this._protocolService = new Audits2.ProtocolService(); this._protocolService.registerStatusCallback(msg => this._updateStatus(Common.UIString(msg))); - var toolbar = new UI.Toolbar('', this.panelSidebarElement()); + var toolbar = new UI.Toolbar('', this.element); var newButton = new UI.ToolbarButton(Common.UIString('New audit\u2026'), 'largeicon-add'); toolbar.appendToolbarItem(newButton); newButton.addEventListener(UI.ToolbarButton.Events.Click, this._showLauncherUI.bind(this)); - var deleteButton = new UI.ToolbarButton(Common.UIString('Delete audit'), 'largeicon-delete'); - toolbar.appendToolbarItem(deleteButton); - deleteButton.addEventListener(UI.ToolbarButton.Events.Click, this._deleteSelected.bind(this)); + var downloadButton = new UI.ToolbarButton(Common.UIString('Download report'), 'largeicon-download'); + toolbar.appendToolbarItem(downloadButton); + downloadButton.addEventListener(UI.ToolbarButton.Events.Click, this._downloadSelected.bind(this)); toolbar.appendSeparator(); + this._reportSelector = new Audits2.ReportSelector(); + toolbar.appendToolbarItem(this._reportSelector.comboBox()); + var clearButton = new UI.ToolbarButton(Common.UIString('Clear all'), 'largeicon-clear'); toolbar.appendToolbarItem(clearButton); clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._clearAll.bind(this)); - this._treeOutline = new UI.TreeOutlineInShadow(); - this._treeOutline.registerRequiredCSS('audits2/lighthouse/report-styles.css'); - this._treeOutline.registerRequiredCSS('audits2/audits2Tree.css'); - this.panelSidebarElement().appendChild(this._treeOutline.element); - + this._auditResultsElement = this.contentElement.createChild('div', 'audits2-results-container'); this._dropTarget = new UI.DropTarget( this.contentElement, [UI.DropTarget.Types.Files], Common.UIString('Drop audit file here'), this._handleDrop.bind(this)); @@ -148,22 +147,20 @@ } _clearAll() { - this._treeOutline.removeChildren(); + this._reportSelector.clearAll(); this._showLandingPage(); } - _deleteSelected() { - var selection = this._treeOutline.selectedTreeElement; - if (selection) - selection._deleteItem(); + _downloadSelected() { + this._reportSelector.downloadSelected(); } _showLandingPage() { - if (this._treeOutline.rootElement().childCount()) + if (this._reportSelector.comboBox().size()) return; - this.mainElement().removeChildren(); - var landingPage = this.mainElement().createChild('div', 'vbox audits2-landing-page'); + this._auditResultsElement.removeChildren(); + var landingPage = this._auditResultsElement.createChild('div', 'vbox audits2-landing-page'); var landingCenter = landingPage.createChild('div', 'vbox audits2-landing-center'); landingCenter.createChild('div', 'audits2-logo'); var text = landingCenter.createChild('div', 'audits2-landing-text'); @@ -220,7 +217,7 @@ this._dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.SetExactWidthMaxHeight); this._dialog.setMaxContentSize(new UI.Size(500, 400)); - this._dialog.show(this.mainElement()); + this._dialog.show(this._auditResultsElement); auditsViewElement.tabIndex = 0; auditsViewElement.focus(); } @@ -385,11 +382,9 @@ this._updateStatus(Common.UIString('Auditing failed.')); return; } - var treeElement = - new Audits2.Audits2Panel.TreeElement(lighthouseResult, this.mainElement(), this._showLandingPage.bind(this)); - this._treeOutline.appendChild(treeElement); - treeElement._populate(); - treeElement.select(); + var optionElement = + new Audits2.ReportSelector.Item(lighthouseResult, this._auditResultsElement, this._showLandingPage.bind(this)); + this._reportSelector.prepend(optionElement); this._hideDialog(); } @@ -612,80 +607,105 @@ } }; -Audits2.Audits2Panel.TreeElement = class extends UI.TreeElement { + +Audits2.ReportSelector = class { + constructor() { + this._comboBox = new UI.ToolbarComboBox(this._handleChange.bind(this), 'audits2-report'); + this._comboBox.setMaxWidth(270); + this._comboBox.setMinWidth(200); + this._itemByOptionElement = new Map(); + } + + /** + * @param {!Event} event + */ + _handleChange(event) { + var item = this._selectedItem(); + if (item) + item.select(); + } + + /** + * @return {!Audits2.ReportSelector.Item} + */ + _selectedItem() { + var option = this._comboBox.selectedOption(); + return this._itemByOptionElement.get(option); + } + + /** + * @return {!UI.ToolbarComboBox} + */ + comboBox() { + return this._comboBox; + } + + /** + * @param {!Audits2.ReportSelector.Item} item + */ + prepend(item) { + var optionEl = item.optionElement(); + var selectEl = this._comboBox.selectElement(); + + this._itemByOptionElement.set(optionEl, item); + selectEl.insertBefore(optionEl, selectEl.firstElementChild); + this._comboBox.select(optionEl); + item.select(); + } + + clearAll() { + for (var elem of this._comboBox.options()) + this._itemByOptionElement.get(elem).delete(); + } + + downloadSelected() { + var item = this._selectedItem(); + item.download(); + } +}; + +Audits2.ReportSelector.Item = class { /** * @param {!ReportRenderer.ReportJSON} lighthouseResult * @param {!Element} resultsView * @param {function()} showLandingCallback */ constructor(lighthouseResult, resultsView, showLandingCallback) { - super('', false); this._lighthouseResult = lighthouseResult; this._resultsView = resultsView; this._showLandingCallback = showLandingCallback; /** @type {?Element} */ this._reportContainer = null; + var url = new Common.ParsedURL(lighthouseResult.url); var timestamp = lighthouseResult.generatedTime; - var titleElement = this.titleElement(); - titleElement.classList.add('audits2-report-tree-item'); - titleElement.createChild('div').textContent = url.domain(); - titleElement.createChild('span', 'dimmed').textContent = new Date(timestamp).toLocaleString(); - this.listItemElement.addEventListener('contextmenu', this._handleContextMenuEvent.bind(this), false); + this._element = createElement('option'); + this._element.label = `${url.domain()} ${new Date(timestamp).toLocaleString()}`; } - _populate() { - for (var category of this._lighthouseResult.reportCategories) { - var treeElement = new Audits2.Audits2Panel.TreeSubElement(category.id, category.name, category.score); - this.appendChild(treeElement); - } - } - - /** - * @override - * @param {boolean=} selectedByUser - * @return {boolean} - */ - onselect(selectedByUser) { + select() { this._renderReport(); - return true; } /** - * @override + * @return {!Element} */ - ondelete() { - this._deleteItem(); - return true; + optionElement() { + return this._element; } - _deleteItem() { - this.treeOutline.removeChild(this); + delete() { + if (this._element) + this._element.remove(); this._showLandingCallback(); } - /** - * @param {!Event} event - */ - _handleContextMenuEvent(event) { - var contextMenu = new UI.ContextMenu(event); - contextMenu.appendItem(Common.UIString('Save as\u2026'), () => { - var url = new Common.ParsedURL(this._lighthouseResult.url).domain(); - var timestamp = this._lighthouseResult.generatedTime; - var fileName = `${url}-${new Date(timestamp).toISO8601Compact()}.json`; - Workspace.fileManager.save(fileName, JSON.stringify(this._lighthouseResult), true); - }); - contextMenu.appendItem(Common.UIString('Delete'), () => this._deleteItem()); - contextMenu.show(); - } - - /** - * @override - */ - onunbind() { - if (this._reportContainer && this._reportContainer.parentElement) - this._reportContainer.remove(); + download() { + var url = new Common.ParsedURL(this._lighthouseResult.url).domain(); + var timestamp = this._lighthouseResult.generatedTime; + var fileName = `${url}-${new Date(timestamp).toISO8601Compact()}.json`; + Workspace.fileManager.save(fileName, JSON.stringify(this._lighthouseResult), true); } _renderReport() { @@ -712,36 +732,6 @@ } }; -Audits2.Audits2Panel.TreeSubElement = class extends UI.TreeElement { - /** - * @param {string} id - * @param {string} name - * @param {number} score - */ - constructor(id, name, score) { - super(''); - this._id = id; - this.listItemElement.textContent = name; - var label = Util.calculateRating(score); - var subtitleElement = this.listItemElement.createChild('span', 'lh-vars audits2-tree-subtitle-' + label); - subtitleElement.textContent = String(Math.round(score)); - } - - /** - * @override - * @return {boolean} - */ - onselect() { - this.parent._renderReport(); - var node = this.parent._resultsView.querySelector('.lh-category[id=' + this._id + ']'); - if (node) { - node.scrollIntoView(true); - return true; - } - return false; - } -}; - Audits2.DetailsRenderer = class extends DetailsRenderer { /** * @param {!DOM} dom
diff --git a/third_party/WebKit/Source/devtools/front_end/audits2/audits2Tree.css b/third_party/WebKit/Source/devtools/front_end/audits2/audits2Tree.css deleted file mode 100644 index 68d0ebd5..0000000 --- a/third_party/WebKit/Source/devtools/front_end/audits2/audits2Tree.css +++ /dev/null
@@ -1,35 +0,0 @@ -/* - * Copyright 2017 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. - */ - -.tree-outline .audits2-report-tree-item { - min-height: 36px; - padding: 2px 3px; - line-height: 16px; -} - -.tree-outline li { - min-height: 25px; -} - -.audits2-tree-subtitle-pass, -.audits2-tree-subtitle-average, -.audits2-tree-subtitle-fail { - flex: auto; - text-align: end; - margin-right: 10px; -} - -.audits2-tree-subtitle-pass { - color: var(--pass-color); -} - -.audits2-tree-subtitle-average { - color: var(--average-color); -} - -.audits2-tree-subtitle-fail { - color: var(--fail-color); -}
diff --git a/third_party/WebKit/Source/devtools/front_end/audits2/module.json b/third_party/WebKit/Source/devtools/front_end/audits2/module.json index 4b447f97..100a73e2 100644 --- a/third_party/WebKit/Source/devtools/front_end/audits2/module.json +++ b/third_party/WebKit/Source/devtools/front_end/audits2/module.json
@@ -29,7 +29,6 @@ "resources": [ "audits2Dialog.css", "audits2Panel.css", - "audits2Tree.css", "lighthouse/report-styles.css", "lighthouse/templates.html" ]
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js index 4328ab6..0a2612d 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
@@ -174,6 +174,7 @@ 'largeicon-dock-to-bottom': {position: 'd8', spritesheet: 'largeicons', isMask: true}, 'largeicon-dock-to-left': {position: 'd7', spritesheet: 'largeicons', isMask: true}, 'largeicon-dock-to-right': {position: 'd6', spritesheet: 'largeicons', isMask: true}, + 'largeicon-download': {position: 'h6', spritesheet: 'largeicons', isMask: true}, 'largeicon-edit': {position: 'a5', spritesheet: 'largeicons', isMask: true}, 'largeicon-eyedropper': {position: 'b5', spritesheet: 'largeicons', isMask: true}, 'largeicon-filter': {position: 'c5', spritesheet: 'largeicons', isMask: true},
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js index c14bb43..f3959ec 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js
@@ -965,6 +965,13 @@ setMaxWidth(width) { this._selectElement.style.maxWidth = width + 'px'; } + + /** + * @param {number} width + */ + setMinWidth(width) { + this._selectElement.style.minWidth = width + 'px'; + } }; /**
diff --git a/third_party/WebKit/Source/platform/DEPS b/third_party/WebKit/Source/platform/DEPS index c243c07..b31a2ecb 100644 --- a/third_party/WebKit/Source/platform/DEPS +++ b/third_party/WebKit/Source/platform/DEPS
@@ -1,6 +1,7 @@ include_rules = [ # To whitelist base/ stuff Blink is allowed to include, we list up all # directories and files instead of writing 'base/'. + "+base/allocator/partition_allocator/oom.h", "+base/bind.h", "+base/bind_helpers.h", "+base/callback.h",
diff --git a/third_party/WebKit/Source/platform/exported/WebURLError.cpp b/third_party/WebKit/Source/platform/exported/WebURLError.cpp index d58d3d0..2a6f5d4 100644 --- a/third_party/WebKit/Source/platform/exported/WebURLError.cpp +++ b/third_party/WebKit/Source/platform/exported/WebURLError.cpp
@@ -54,7 +54,6 @@ domain = error.Domain(); reason = error.ErrorCode(); unreachable_url = KURL(kParsedURLString, error.FailingURL()); - is_cancellation = error.IsCancellation(); stale_copy_in_cache = error.StaleCopyInCache(); localized_description = error.LocalizedDescription(); was_ignored_by_handler = error.WasIgnoredByHandler(); @@ -68,7 +67,6 @@ return ResourceError(); ResourceError resource_error = ResourceError( domain, reason, unreachable_url.GetString(), localized_description); - resource_error.SetIsCancellation(is_cancellation); resource_error.SetStaleCopyInCache(stale_copy_in_cache); resource_error.SetWasIgnoredByHandler(was_ignored_by_handler); resource_error.SetIsAccessCheck(is_web_security_violation);
diff --git a/third_party/WebKit/Source/platform/heap/PageMemory.cpp b/third_party/WebKit/Source/platform/heap/PageMemory.cpp index 96c5e2a..a01f32d 100644 --- a/third_party/WebKit/Source/platform/heap/PageMemory.cpp +++ b/third_party/WebKit/Source/platform/heap/PageMemory.cpp
@@ -4,6 +4,7 @@ #include "platform/heap/PageMemory.h" +#include "base/allocator/partition_allocator/oom.h" #include "platform/heap/Heap.h" #include "platform/wtf/AddressSanitizer.h" #include "platform/wtf/Assertions.h"
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceError.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceError.cpp index be298b58..cc251e6 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceError.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceError.cpp
@@ -81,7 +81,6 @@ error_copy.failing_url_ = failing_url_.IsolatedCopy(); error_copy.localized_description_ = localized_description_.IsolatedCopy(); error_copy.is_null_ = is_null_; - error_copy.is_cancellation_ = is_cancellation_; error_copy.is_access_check_ = is_access_check_; error_copy.is_timeout_ = is_timeout_; error_copy.was_ignored_by_handler_ = was_ignored_by_handler_; @@ -107,9 +106,6 @@ if (a.LocalizedDescription() != b.LocalizedDescription()) return false; - if (a.IsCancellation() != b.IsCancellation()) - return false; - if (a.IsAccessCheck() != b.IsAccessCheck()) return false; @@ -133,9 +129,7 @@ error->reason = reason; error->stale_copy_in_cache = stale_copy_in_cache; error->unreachable_url = url; - if (reason == net::ERR_ABORTED) { - error->is_cancellation = true; - } else if (reason == net::ERR_TEMPORARILY_THROTTLED) { + if (reason == net::ERR_TEMPORARILY_THROTTLED) { error->localized_description = WebString::FromASCII(kThrottledErrorDescription); } else { @@ -144,6 +138,11 @@ } } +bool ResourceError::IsCancellation() const { + return domain_ == String(net::kErrorDomain) && + error_code_ == net::ERR_ABORTED; +} + bool ResourceError::IsCacheMiss() const { return domain_ == String(net::kErrorDomain) && error_code_ == net::ERR_CACHE_MISS;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceError.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceError.h index 00e88b14..25d7947a 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceError.h +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceError.h
@@ -66,7 +66,6 @@ ResourceError() : error_code_(0), is_null_(true), - is_cancellation_(false), is_access_check_(false), is_timeout_(false), stale_copy_in_cache_(false), @@ -82,7 +81,6 @@ failing_url_(failing_url), localized_description_(localized_description), is_null_(false), - is_cancellation_(false), is_access_check_(false), is_timeout_(false), stale_copy_in_cache_(false), @@ -100,10 +98,7 @@ const String& FailingURL() const { return failing_url_; } const String& LocalizedDescription() const { return localized_description_; } - void SetIsCancellation(bool is_cancellation) { - is_cancellation_ = is_cancellation; - } - bool IsCancellation() const { return is_cancellation_; } + bool IsCancellation() const; void SetIsAccessCheck(bool is_access_check) { is_access_check_ = is_access_check; @@ -145,7 +140,6 @@ String failing_url_; String localized_description_; bool is_null_; - bool is_cancellation_; bool is_access_check_; bool is_timeout_; bool stale_copy_in_cache_;
diff --git a/third_party/WebKit/Source/platform/text/ICUError.cpp b/third_party/WebKit/Source/platform/text/ICUError.cpp index c4c3b317..ce05840 100644 --- a/third_party/WebKit/Source/platform/text/ICUError.cpp +++ b/third_party/WebKit/Source/platform/text/ICUError.cpp
@@ -4,6 +4,8 @@ #include "platform/text/ICUError.h" +#include "base/allocator/partition_allocator/oom.h" + namespace blink { // Distinguish memory allocation failures from other errors.
diff --git a/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp b/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp index 7ff87ff..29478e3 100644 --- a/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp +++ b/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp
@@ -244,30 +244,48 @@ return false; } +// Computes if 'word-break:keep-all' should prevent line break. +// https://drafts.csswg.org/css-text-3/#valdef-word-break-keep-all +// The spec is not very verbose on how this should work. This logic prevents L/M +// general categories and complex line breaking since the spec says "except some +// south east aisans". +// https://github.com/w3c/csswg-drafts/issues/1619 +static inline bool ShouldKeepAfterKeepAll(UChar last_ch, + UChar ch, + UChar next_ch) { + UChar pre_ch = U_MASK(u_charType(ch)) & U_GC_M_MASK ? last_ch : ch; + return U_MASK(u_charType(pre_ch)) & (U_GC_L_MASK | U_GC_N_MASK) && + !WTF::Unicode::HasLineBreakingPropertyComplexContext(pre_ch) && + U_MASK(u_charType(next_ch)) & (U_GC_L_MASK | U_GC_N_MASK) && + !WTF::Unicode::HasLineBreakingPropertyComplexContext(next_ch); +} + inline bool NeedsLineBreakIterator(UChar ch) { return ch > kAsciiLineBreakTableLastChar && ch != kNoBreakSpaceCharacter; } template <typename CharacterType, LineBreakType lineBreakType> -static inline int NextBreakablePosition( - const LazyLineBreakIterator& lazy_break_iterator, - const CharacterType* str, - unsigned length, - int pos) { - int len = static_cast<int>(length); +inline int LazyLineBreakIterator::NextBreakablePosition( + int pos, + const CharacterType* str) const { + int len = static_cast<int>(string_.length()); int next_break = -1; - UChar last_last_ch = - pos > 1 ? str[pos - 2] : lazy_break_iterator.SecondToLastCharacter(); - UChar last_ch = pos > 0 ? str[pos - 1] : lazy_break_iterator.LastCharacter(); + UChar last_last_ch = pos > 1 ? str[pos - 2] : SecondToLastCharacter(); + UChar last_ch = pos > 0 ? str[pos - 1] : LastCharacter(); + bool is_last_space = IsBreakableSpace(last_ch); ULineBreak last_line_break; if (lineBreakType == LineBreakType::kBreakAll) last_line_break = LineBreakPropertyValue(last_last_ch, last_ch); - unsigned prior_context_length = lazy_break_iterator.PriorContextLength(); - for (int i = pos; i < len; i++) { - CharacterType ch = str[i]; + unsigned prior_context_length = PriorContextLength(); + CharacterType ch; + bool is_space; + for (int i = pos; i < len; + i++, last_last_ch = last_ch, last_ch = ch, is_last_space = is_space) { + ch = str[i]; - if (IsBreakableSpace(ch) || ShouldBreakAfter(last_last_ch, last_ch, ch)) + is_space = IsBreakableSpace(ch); + if (is_space || ShouldBreakAfter(last_last_ch, last_ch, ch)) return i; if (lineBreakType == LineBreakType::kBreakAll && !U16_IS_LEAD(ch)) { @@ -278,13 +296,18 @@ last_line_break = line_break; } + if (lineBreakType == LineBreakType::kKeepAll && + ShouldKeepAfterKeepAll(last_last_ch, last_ch, ch)) { + // word-break:keep-all prevents breaks between East Asian ideographic. + continue; + } + if (NeedsLineBreakIterator(ch) || NeedsLineBreakIterator(last_ch)) { if (next_break < i) { // Don't break if positioned at start of primary context and there is no // prior context. if (i || prior_context_length) { - TextBreakIterator* break_iterator = - lazy_break_iterator.Get(prior_context_length); + TextBreakIterator* break_iterator = Get(prior_context_length); if (break_iterator) { next_break = break_iterator->following(i - 1 + prior_context_length); @@ -294,100 +317,22 @@ } } } - if (i == next_break && !IsBreakableSpace(last_ch)) + if (i == next_break && !is_last_space) return i; } - - last_last_ch = last_ch; - last_ch = ch; - } - - return len; -} - -static inline bool ShouldKeepAfter(UChar last_ch, UChar ch, UChar next_ch) { - UChar pre_ch = U_MASK(u_charType(ch)) & U_GC_M_MASK ? last_ch : ch; - return U_MASK(u_charType(pre_ch)) & (U_GC_L_MASK | U_GC_N_MASK) && - !WTF::Unicode::HasLineBreakingPropertyComplexContext(pre_ch) && - U_MASK(u_charType(next_ch)) & (U_GC_L_MASK | U_GC_N_MASK) && - !WTF::Unicode::HasLineBreakingPropertyComplexContext(next_ch); -} - -static inline int NextBreakablePositionKeepAllInternal( - const LazyLineBreakIterator& lazy_break_iterator, - const UChar* str, - unsigned length, - int pos) { - int len = static_cast<int>(length); - int next_break = -1; - - UChar last_last_ch = - pos > 1 ? str[pos - 2] - : static_cast<UChar>(lazy_break_iterator.SecondToLastCharacter()); - UChar last_ch = pos > 0 - ? str[pos - 1] - : static_cast<UChar>(lazy_break_iterator.LastCharacter()); - unsigned prior_context_length = lazy_break_iterator.PriorContextLength(); - for (int i = pos; i < len; i++) { - UChar ch = str[i]; - - if (IsBreakableSpace(ch) || ShouldBreakAfter(last_last_ch, last_ch, ch)) - return i; - - if (!ShouldKeepAfter(last_last_ch, last_ch, ch) && - (NeedsLineBreakIterator(ch) || NeedsLineBreakIterator(last_ch))) { - if (next_break < i) { - // Don't break if positioned at start of primary context and there is no - // prior context. - if (i || prior_context_length) { - TextBreakIterator* break_iterator = - lazy_break_iterator.Get(prior_context_length); - if (break_iterator) { - next_break = - break_iterator->following(i - 1 + prior_context_length); - if (next_break >= 0) { - next_break -= prior_context_length; - } - } - } - } - if (i == next_break && !IsBreakableSpace(last_ch)) - return i; - } - - last_last_ch = last_ch; - last_ch = ch; } return len; } template <LineBreakType lineBreakType> -static inline int NextBreakablePosition( - const LazyLineBreakIterator& lazy_break_iterator, - const String& string, - int pos) { - if (string.Is8Bit()) - return NextBreakablePosition<LChar, lineBreakType>( - lazy_break_iterator, string.Characters8(), string.length(), pos); - return NextBreakablePosition<UChar, lineBreakType>( - lazy_break_iterator, string.Characters16(), string.length(), pos); -} - -int LazyLineBreakIterator::NextBreakablePositionIgnoringNBSP(int pos) const { - return NextBreakablePosition<LineBreakType::kNormal>(*this, string_, pos); -} - -int LazyLineBreakIterator::NextBreakablePositionBreakAll(int pos) const { - return NextBreakablePosition<LineBreakType::kBreakAll>(*this, string_, pos); -} - -int LazyLineBreakIterator::NextBreakablePositionKeepAll(int pos) const { - if (string_.Is8Bit()) - return NextBreakablePosition<LChar, LineBreakType::kNormal>( - *this, string_.Characters8(), string_.length(), pos); - return NextBreakablePositionKeepAllInternal(*this, string_.Characters16(), - string_.length(), pos); +inline int LazyLineBreakIterator::NextBreakablePosition(int pos) const { + if (string_.Is8Bit()) { + return NextBreakablePosition<LChar, lineBreakType>(pos, + string_.Characters8()); + } + return NextBreakablePosition<UChar, lineBreakType>(pos, + string_.Characters16()); } int LazyLineBreakIterator::NextBreakablePositionBreakCharacter(int pos) const { @@ -396,6 +341,23 @@ return next != kTextBreakDone ? next : string_.length(); } +int LazyLineBreakIterator::NextBreakablePosition( + int pos, + LineBreakType line_break_type) const { + switch (line_break_type) { + case LineBreakType::kNormal: + return NextBreakablePosition<LineBreakType::kNormal>(pos); + case LineBreakType::kBreakAll: + return NextBreakablePosition<LineBreakType::kBreakAll>(pos); + case LineBreakType::kKeepAll: + return NextBreakablePosition<LineBreakType::kKeepAll>(pos); + case LineBreakType::kBreakCharacter: + return NextBreakablePositionBreakCharacter(pos); + } + NOTREACHED(); + return NextBreakablePosition(pos, LineBreakType::kNormal); +} + unsigned LazyLineBreakIterator::NextBreakOpportunity(unsigned offset) const { int next_break = -1; IsBreakable(offset, next_break);
diff --git a/third_party/WebKit/Source/platform/text/TextBreakIterator.h b/third_party/WebKit/Source/platform/text/TextBreakIterator.h index dcf34c44..520b781 100644 --- a/third_party/WebKit/Source/platform/text/TextBreakIterator.h +++ b/third_party/WebKit/Source/platform/text/TextBreakIterator.h
@@ -214,20 +214,7 @@ int& next_breakable, LineBreakType line_break_type) const { if (pos > next_breakable) { - switch (line_break_type) { - case LineBreakType::kBreakAll: - next_breakable = NextBreakablePositionBreakAll(pos); - break; - case LineBreakType::kKeepAll: - next_breakable = NextBreakablePositionKeepAll(pos); - break; - case LineBreakType::kNormal: - next_breakable = NextBreakablePositionIgnoringNBSP(pos); - break; - case LineBreakType::kBreakCharacter: - next_breakable = NextBreakablePositionBreakCharacter(pos); - break; - } + next_breakable = NextBreakablePosition(pos, line_break_type); } return pos == next_breakable; } @@ -256,10 +243,12 @@ cached_prior_context_length_ = 0; } - int NextBreakablePositionIgnoringNBSP(int pos) const; - int NextBreakablePositionBreakAll(int pos) const; - int NextBreakablePositionKeepAll(int pos) const; + template <typename CharacterType, LineBreakType> + int NextBreakablePosition(int pos, const CharacterType* str) const; + template <LineBreakType> + int NextBreakablePosition(int pos) const; int NextBreakablePositionBreakCharacter(int pos) const; + int NextBreakablePosition(int pos, LineBreakType) const; static const unsigned kPriorContextCapacity = 2; String string_;
diff --git a/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp b/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp index 6952eba..53d3c367 100644 --- a/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp +++ b/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp
@@ -26,9 +26,9 @@ */ #include "platform/transforms/TransformationMatrix.h" -#if HAVE(MIPS_MSA_INTRINSICS) -#include "platform/cpu/mips/CommonMacrosMSA.h" -#endif + +#include <cmath> +#include <cstdlib> #include "platform/geometry/FloatBox.h" #include "platform/geometry/FloatQuad.h" @@ -37,18 +37,20 @@ #include "platform/geometry/LayoutRect.h" #include "platform/transforms/AffineTransform.h" #include "platform/transforms/Rotation.h" - #include "platform/wtf/Assertions.h" +#include "platform/wtf/CPU.h" #include "platform/wtf/MathExtras.h" +#include "platform/wtf/build_config.h" #include "platform/wtf/text/WTFString.h" -#include <cmath> -#include <cstdlib> - #if defined(ARCH_CPU_X86_64) #include <emmintrin.h> #endif +#if HAVE(MIPS_MSA_INTRINSICS) +#include "platform/cpu/mips/CommonMacrosMSA.h" +#endif + namespace blink { //
diff --git a/third_party/WebKit/Source/platform/wtf/Assertions.h b/third_party/WebKit/Source/platform/wtf/Assertions.h index a17cdd65..5637279 100644 --- a/third_party/WebKit/Source/platform/wtf/Assertions.h +++ b/third_party/WebKit/Source/platform/wtf/Assertions.h
@@ -27,23 +27,13 @@ #ifndef WTF_Assertions_h #define WTF_Assertions_h -// This file uses some GCC extensions, but it should be compatible with C++ and -// Objective C++. - #include <stdarg.h> -#include "base/allocator/partition_allocator/oom.h" +#include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/logging.h" -#include "build/build_config.h" -#include "platform/wtf/Compiler.h" #include "platform/wtf/Noncopyable.h" #include "platform/wtf/WTFExport.h" -#include "platform/wtf/build_config.h" - -#if defined(OS_WIN) -#include <windows.h> -#endif // WTFLogAlways() is deprecated. crbug.com/638849 WTF_EXPORT PRINTF_FORMAT(1, 2) // NOLINT
diff --git a/third_party/WebKit/Source/platform/wtf/DEPS b/third_party/WebKit/Source/platform/wtf/DEPS index 3e7a48e..a6f31d9 100644 --- a/third_party/WebKit/Source/platform/wtf/DEPS +++ b/third_party/WebKit/Source/platform/wtf/DEPS
@@ -1,7 +1,6 @@ include_rules = [ # To whitelist base/ stuff Blink is allowed to include, we list up all # directories and files instead of writing 'base/'. - "+base/allocator/oom.h", "+base/allocator/partition_allocator", "+base/process/process_metrics.h", "+base/atomic_ref_count.h",
diff --git a/third_party/WebKit/Source/platform/wtf/allocator/Partitions.cpp b/third_party/WebKit/Source/platform/wtf/allocator/Partitions.cpp index 3dae2e353..b0bb7db 100644 --- a/third_party/WebKit/Source/platform/wtf/allocator/Partitions.cpp +++ b/third_party/WebKit/Source/platform/wtf/allocator/Partitions.cpp
@@ -30,6 +30,7 @@ #include "platform/wtf/allocator/Partitions.h" +#include "base/allocator/partition_allocator/oom.h" #include "base/allocator/partition_allocator/page_allocator.h" #include "base/debug/alias.h" #include "platform/wtf/allocator/PartitionAllocator.h"
diff --git a/third_party/WebKit/Source/platform/wtf/text/StringToNumber.cpp b/third_party/WebKit/Source/platform/wtf/text/StringToNumber.cpp index cb6e05c..f924e61 100644 --- a/third_party/WebKit/Source/platform/wtf/text/StringToNumber.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/StringToNumber.cpp
@@ -28,7 +28,7 @@ template <typename IntegralType, typename CharType> static inline IntegralType ToIntegralType(const CharType* data, size_t length, - bool* ok, + NumberParsingState* parsing_state, int base) { static_assert(std::is_integral<IntegralType>::value, "IntegralType must be an integral type."); @@ -38,10 +38,12 @@ std::numeric_limits<IntegralType>::min(); static constexpr bool kIsSigned = std::numeric_limits<IntegralType>::is_signed; + DCHECK(parsing_state); IntegralType value = 0; - bool is_ok = false; + NumberParsingState state = NumberParsingState::kError; bool is_negative = false; + bool overflow = false; if (!data) goto bye; @@ -75,28 +77,33 @@ else digit_value = c - 'A' + 10; - bool overflow; if (is_negative) { // Overflow condition: - // value * base - digitValue < integralMin - // <=> value < (integralMin + digitValue) / base + // value * base - digit_value < kIntegralMin + // <=> value < (kIntegralMin + digit_value) / base // We must be careful of rounding errors here, but the default rounding // mode (round to zero) works well, so we can use this formula as-is. - overflow = value < (kIntegralMin + digit_value) / base; + if (value < (kIntegralMin + digit_value) / base) { + state = NumberParsingState::kOverflowMin; + overflow = true; + } } else { // Overflow condition: - // value * base + digitValue > integralMax - // <=> value > (integralMax + digitValue) / base + // value * base + digit_value > kIntegralMax + // <=> value > (kIntegralMax + digit_value) / base // Ditto regarding rounding errors. - overflow = value > (kIntegralMax - digit_value) / base; + if (value > (kIntegralMax - digit_value) / base) { + state = NumberParsingState::kOverflowMax; + overflow = true; + } } - if (overflow) - goto bye; - if (is_negative) - value = base * value - digit_value; - else - value = base * value + digit_value; + if (!overflow) { + if (is_negative) + value = base * value - digit_value; + else + value = base * value + digit_value; + } ++data; } @@ -106,12 +113,29 @@ ++data; } - if (!length) - is_ok = true; + if (length == 0) { + if (!overflow) + state = NumberParsingState::kSuccess; + } else { + // Even if we detected overflow, we return kError for trailing garbage. + state = NumberParsingState::kError; + } bye: + *parsing_state = state; + return state == NumberParsingState::kSuccess ? value : 0; +} + +template <typename IntegralType, typename CharType> +static inline IntegralType ToIntegralType(const CharType* data, + size_t length, + bool* ok, + int base) { + NumberParsingState state; + IntegralType value = + ToIntegralType<IntegralType, CharType>(data, length, &state, base); if (ok) - *ok = is_ok; - return is_ok ? value : 0; + *ok = state == NumberParsingState::kSuccess; + return value; } template <typename CharType> @@ -138,6 +162,18 @@ return i; } +unsigned CharactersToUIntStrict(const LChar* data, + size_t length, + NumberParsingState* state) { + return ToIntegralType<unsigned, LChar>(data, length, state, 10); +} + +unsigned CharactersToUIntStrict(const UChar* data, + size_t length, + NumberParsingState* state) { + return ToIntegralType<unsigned, UChar>(data, length, state, 10); +} + int CharactersToIntStrict(const LChar* data, size_t length, bool* ok,
diff --git a/third_party/WebKit/Source/platform/wtf/text/StringToNumber.h b/third_party/WebKit/Source/platform/wtf/text/StringToNumber.h index eda92e3..ad0f49b 100644 --- a/third_party/WebKit/Source/platform/wtf/text/StringToNumber.h +++ b/third_party/WebKit/Source/platform/wtf/text/StringToNumber.h
@@ -26,7 +26,18 @@ size_t, bool* ok = 0); // ignores trailing garbage +enum class NumberParsingState { + kSuccess, + kError, + // For UInt functions, kOverflowMin never happens. Negative numbers are + // treated as kError. This behavior matches to the HTML standard. + // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-non-negative-integers + kOverflowMin, + kOverflowMax, +}; + // string -> unsigned. +// These functions do not accept "-0". WTF_EXPORT unsigned CharactersToUIntStrict(const LChar*, size_t, bool* ok = 0, @@ -42,6 +53,15 @@ size_t, bool* ok = 0); // ignores trailing garbage +// NumberParsingState versions of CharactersToUIntStrict. They can detect +// overflow. |NumberParsingState*| should not be nullptr; +WTF_EXPORT unsigned CharactersToUIntStrict(const LChar*, + size_t, + NumberParsingState*); +WTF_EXPORT unsigned CharactersToUIntStrict(const UChar*, + size_t, + NumberParsingState*); + // string -> int64_t. WTF_EXPORT int64_t CharactersToInt64Strict(const LChar*, size_t, @@ -59,6 +79,7 @@ bool* ok = 0); // ignores trailing garbage // string -> uint64_t. +// These functions do not accept "-0". WTF_EXPORT uint64_t CharactersToUInt64Strict(const LChar*, size_t, bool* ok = 0,
diff --git a/third_party/WebKit/Source/platform/wtf/text/StringToNumberTest.cpp b/third_party/WebKit/Source/platform/wtf/text/StringToNumberTest.cpp index a2ca5a6d..a621cb92 100644 --- a/third_party/WebKit/Source/platform/wtf/text/StringToNumberTest.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/StringToNumberTest.cpp
@@ -123,4 +123,20 @@ #undef EXPECT_VALID #undef EXPECT_INVALID } + +NumberParsingState ParseUInt(const char* str, unsigned* value) { + NumberParsingState state; + *value = CharactersToUIntStrict(reinterpret_cast<const LChar*>(str), + std::strlen(str), &state); + return state; +} + +TEST(StringToNumberTest, NumberParsingState) { + unsigned value; + EXPECT_EQ(NumberParsingState::kOverflowMax, ParseUInt("10000000000", &value)); + EXPECT_EQ(NumberParsingState::kError, ParseUInt("10000000000abc", &value)); + EXPECT_EQ(NumberParsingState::kError, ParseUInt("-10000000000", &value)); + EXPECT_EQ(NumberParsingState::kError, ParseUInt("-0", &value)); + EXPECT_EQ(NumberParsingState::kSuccess, ParseUInt("10", &value)); +} }
diff --git a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBuffer.h b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBuffer.h index ba19c9e9..0a92483a 100644 --- a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBuffer.h +++ b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBuffer.h
@@ -26,6 +26,7 @@ #ifndef ArrayBuffer_h #define ArrayBuffer_h +#include "base/allocator/partition_allocator/oom.h" #include "platform/wtf/Assertions.h" #include "platform/wtf/HashSet.h" #include "platform/wtf/RefCounted.h"
diff --git a/third_party/WebKit/public/platform/WebURLError.h b/third_party/WebKit/public/platform/WebURLError.h index e62ccfa..cd440db 100644 --- a/third_party/WebKit/public/platform/WebURLError.h +++ b/third_party/WebKit/public/platform/WebURLError.h
@@ -54,10 +54,6 @@ // cache that was too stale to return for this request. bool stale_copy_in_cache = false; - // A flag showing whether this error should be treated as a cancellation, - // e.g. we do not show console errors for cancellations. - bool is_cancellation = false; - // A flag showing whether this error is the result of a request being // ignored (e.g. through shouldOverrideUrlLoading). bool was_ignored_by_handler = false;
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index f0f604f..c2f16ac 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -81033,6 +81033,22 @@ </summary> </histogram> +<histogram name="Translate.SourceLanguage" enum="CLD3LanguageCode"> + <owner>yyushkina@google.com</owner> + <summary> + The number of requests sent to the Translate server, grouped by source + language. + </summary> +</histogram> + +<histogram name="Translate.TargetLanguage" enum="CLD3LanguageCode"> + <owner>yyushkina@google.com</owner> + <summary> + The number of requests sent to the Translate server, grouped by target + language. + </summary> +</histogram> + <histogram name="Translate.TimeToBeReady" units="ms"> <owner>kenjibaheux@google.com</owner> <summary>
diff --git a/ui/gl/gl_image_shared_memory.cc b/ui/gl/gl_image_shared_memory.cc index 55542c91..cef422b4 100644 --- a/ui/gl/gl_image_shared_memory.cc +++ b/ui/gl/gl_image_shared_memory.cc
@@ -89,9 +89,11 @@ auto guid = gfx::GetSharedMemoryGUIDForTracing(process_tracing_id, shared_memory_id_); - auto shared_memory_guid = shared_memory_->handle().GetGUID(); - pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), guid, shared_memory_guid, - 0 /* importance */); + auto shared_memory_guid = shared_memory_->mapped_id(); + if (!shared_memory_guid.is_empty()) { + pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), guid, shared_memory_guid, + 0 /* importance */); + } } } // namespace gl